summaryrefslogtreecommitdiff
path: root/libmailutils/url/copy.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2010-10-26 13:00:52 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2010-10-26 13:36:28 +0300
commit3327a23a49e532c068972a0b2d64021361540f7b (patch)
treeb2d6508005ac8343a54638142c4f8234f7202441 /libmailutils/url/copy.c
parent6203ae65f53758a4b893e6e176be7c153a31bef0 (diff)
downloadmailutils-3327a23a49e532c068972a0b2d64021361540f7b.tar.gz
mailutils-3327a23a49e532c068972a0b2d64021361540f7b.tar.bz2
Rewrite URL support.
The purpose is to make it modular and flexible. URLs are parsed out as they are created. Missing URL parts can be supplied via a "URL hint" at creation time (similar to the approach used in creating mu_address_t). Ports can be specified either as numbers or as service names. Original port string representation can be retrieved from the URL, as well as its numeric value. * libmailutils/url/accessor.h: New file. * libmailutils/url/copy.c: New file. * libmailutils/url/create.c: New file. * libmailutils/url/decode.c: New file. * libmailutils/url/destroy.c: New file. * libmailutils/url/dup.c: New file. * libmailutils/url/expand.c: New file. * libmailutils/url/flag.c: New file. * libmailutils/url/get-auth.c: New file. * libmailutils/url/get-host.c: New file. * libmailutils/url/get-param.c: New file. * libmailutils/url/get-path.c: New file. * libmailutils/url/get-portstr.c: New file. * libmailutils/url/get-query.c: New file. * libmailutils/url/get-scheme.c: New file. * libmailutils/url/get-secret.c: New file. * libmailutils/url/get-user.c: New file. * libmailutils/url/match.c: New file. * libmailutils/url/port.c: New file. * libmailutils/url/scheme.c: New file. * libmailutils/url/uplevel.c: New file. * libmailutils/url/urlstr.c: New file. * configure.ac (AC_CONFIG_FILES): Add libmailutils/url/Makefile * libmailutils/Makefile.am (SUBDIRS): Add url. (libmailutils_la_LIBADD): Link with liburl. * libmailutils/base/Makefile.am (libbase_la_SOURCES): Remove url.c * libmailutils/base/url.c: Remove. * libmailutils/string/Makefile.am (libstring_la_SOURCES): Add xdecode.c * libmailutils/string/xdecode.c: New file. * include/mailutils/sys/url.h (_mu_url): Change type to short. <_get_port>: Change second argument to unsigned. <_get_portstr>: New method. * include/mailutils/url.h (MU_URL_SCHEME): New flag. (MU_URL_PARSE_HEXCODE, MU_URL_PARSE_HIDEPASS) (MU_URL_PARSE_PORTSRV, MU_URL_PARSE_PORTWC) (MU_URL_PARSE_PIPE, MU_URL_PARSE_SLASH): New flags. (mu_url_create_hint, mu_url_copy_hints): New prototypes. (mu_url_parse): Remove. (mu_url_get_port): Change second argument to unsigned. (mu_url_decode_len,mu_url_decode): Remove. (mu_url_decode): New proto. (mu_url_sget_portstr, mu_url_aget_portstr) (mu_url_get_portstr): New protos. * include/mailutils/util.h (mu_str_url_decode) (mu_str_url_decode_inline): New protos. * libproto/pop/mbox.c (pop_open): Port is unsigned. * libproto/imap/folder.c: Use MU_URL_SCHEME in url_may_have. * libproto/maildir/folder.c: Likewise. * libproto/mailer/prog.c: Likewise. * libproto/mailer/remote.c: Likewise. * libproto/mailer/sendmail.c: Likewise. * libproto/mailer/smtp.c: Likewise. * libproto/mbox/folder.c: Likewise. * libproto/mh/folder.c: Likewise. * libproto/nntp/folder.c: Likewise. * libproto/pop/folder.c: Likewise. * imap4d/imap4d.c: Remove calls to mu_url_parse. * libmailutils/base/registrar.c: Likewise. * libmailutils/base/wicket.c: Likewise. * libmailutils/mailbox/folder.c: Likewise. * libmailutils/mailbox/mailbox.c: Likewise. * libmailutils/mailer/mailer.c: Likewise. * libmailutils/tests/url-parse.c: Likewise. * libmailutils/tests/wicket.c: Likewise. * libproto/mailer/smtp_auth.c: Likewise. * maidag/deliver.c: Likewise. * mu/wicket.c: Likewise. * libmailutils/mime/mimehdr.c (mu_mimehdr_decode_param): Use mu_str_url_decode, instead of mu_url_decode. * libmailutils/stream/tcp.c (_tcp_instance)<port>: Change type to unsigned short. All uses updated. (mu_tcp_stream_create_with_source_ip) (mu_tcp_stream_create_with_source_host) (mu_tcp_stream_create): Port is unsigned. * include/mailutils/stream.h (mu_tcp_stream_create_with_source_ip) (mu_tcp_stream_create_with_source_host) (mu_tcp_stream_create): Port is unsigned. * include/mailutils/cpp/url.h (get_port): Return unsigned. * libmu_cpp/url.cc (get_port): Return unsigned. (parse): Empty function. Schedule for removal. * python/libmu_py/url.c (api_url_parse): Empty function. Schedule for removal. (api_url_get_port): Port is unsigned. * libmailutils/base/wicket.c (mu_wicket_file_match_url) (mu_wicket_file_match_url): New parameter: parse_flags. * mu/wicket.c (wicket_match): Use parse_flags to control whether or not to show the plaintext password. * doc/texinfo/url.texi: Update.
Diffstat (limited to 'libmailutils/url/copy.c')
-rw-r--r--libmailutils/url/copy.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/libmailutils/url/copy.c b/libmailutils/url/copy.c
new file mode 100644
index 000000000..7190b4212
--- /dev/null
+++ b/libmailutils/url/copy.c
@@ -0,0 +1,145 @@
+/* GNU Mailutils -- a suite of utilities for electronic mail
+ Copyright (C) 2010 Free Software Foundation, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General
+ Public License along with this library. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <errno.h>
+#include <string.h>
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+
+#include <mailutils/types.h>
+#include <mailutils/argcv.h>
+#include <mailutils/secret.h>
+#include <mailutils/util.h>
+#include <mailutils/sys/url.h>
+
+struct copy_tab
+{
+ int mask;
+ int (*fun) (mu_url_t, mu_url_t, size_t);
+ size_t off;
+};
+
+static int
+_url_copy_str (mu_url_t dest_url, mu_url_t src_url, size_t off)
+{
+ char **dest = (char**) ((char*) dest_url + off);
+ char *src = *(char**) ((char*) src_url + off);
+ char *p = strdup (src);
+ if (!p)
+ return ENOMEM;
+ *dest = p;
+ return 0;
+}
+
+static int
+_url_copy_secret (mu_url_t dest, mu_url_t src, size_t off)
+{
+ return mu_secret_dup (src->secret, &dest->secret);
+}
+
+static int
+_url_copy_port (mu_url_t dest, mu_url_t src, size_t off)
+{
+ if (src->portstr)
+ {
+ dest->portstr = strdup (src->portstr);
+ if (!dest->portstr)
+ return ENOMEM;
+ }
+ dest->port = src->port;
+ return 0;
+}
+
+static char **
+argcv_copy (size_t argc, char **argv)
+{
+ size_t i;
+ char **nv = calloc (argc + 1, sizeof (nv[0]));
+ if (!nv)
+ return NULL;
+ for (i = 0; i < argc; i++)
+ if ((nv[i] = strdup (argv[i])) == NULL)
+ {
+ mu_argcv_free (i, nv);
+ free (nv);
+ return NULL;
+ }
+ return nv;
+}
+
+static int
+_url_copy_param (mu_url_t dest, mu_url_t src, size_t off)
+{
+ if ((dest->fvpairs = argcv_copy (src->fvcount, src->fvpairs)) == NULL)
+ return ENOMEM;
+ dest->fvcount = src->fvcount;
+ return 0;
+}
+
+static int
+_url_copy_query (mu_url_t dest, mu_url_t src, size_t off)
+{
+ if ((dest->qargv = argcv_copy (src->qargc, src->qargv)) == NULL)
+ return ENOMEM;
+ dest->qargc = src->qargc;
+ return 0;
+}
+
+static struct copy_tab copy_tab[] = {
+ { MU_URL_SCHEME, _url_copy_str, mu_offsetof (struct _mu_url, scheme) },
+ { MU_URL_USER, _url_copy_str, mu_offsetof (struct _mu_url, user) },
+ { MU_URL_SECRET, _url_copy_secret, 0 },
+ { MU_URL_AUTH, _url_copy_str, mu_offsetof (struct _mu_url, auth) },
+ { MU_URL_HOST, _url_copy_str, mu_offsetof (struct _mu_url, host) },
+ { MU_URL_PORT, _url_copy_port, 0 },
+ { MU_URL_PATH, _url_copy_str, mu_offsetof (struct _mu_url, path) },
+ { MU_URL_PARAM, _url_copy_param, 0 },
+ { MU_URL_QUERY, _url_copy_query, 0 }
+};
+
+int
+mu_url_copy_hints (mu_url_t url, mu_url_t hint)
+{
+ int i;
+
+ if (!url)
+ return EINVAL;
+ if (!hint)
+ return 0;
+ for (i = 0; i < MU_ARRAY_SIZE (copy_tab); i++)
+ {
+ if (!(url->flags & copy_tab[i].mask) &&
+ (hint->flags & copy_tab[i].mask))
+ {
+ int rc = copy_tab[i].fun (url, hint, copy_tab[i].off);
+ if (rc)
+ return rc;
+ url->flags |= copy_tab[i].mask;
+ }
+ }
+ return 0;
+}
+
+
+
+
+

Return to:

Send suggestions and report system problems to the System administrator.