diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2010-10-30 17:42:59 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2010-10-30 17:51:32 +0300 |
commit | c66e1b8de8fd661a34f03734cbb0a559324c3075 (patch) | |
tree | 3b0c51af9e759606e36477d51953791386a8ddf4 /libmailutils/server | |
parent | 63fec21357c175772a8ca153266919c12b6f8bd5 (diff) | |
download | mailutils-c66e1b8de8fd661a34f03734cbb0a559324c3075.tar.gz mailutils-c66e1b8de8fd661a34f03734cbb0a559324c3075.tar.bz2 |
Remove all uses of vartab, replacing them with wordsplit.
* libmailutils/string/wordsplit.c (mu_wordsplit_init): Call
mu_wordsplit_free_words to reclaim the memory.
(mu_wordsplit_free_words): New function.
(mu_wordsplit_free): Use mu_wordsplit_free_words.
* imap4d/imap4d.c (imap4d_session_setup0): Use wordsplit instead of
vartab.
* imap4d/imap4d.h: Don't include vartab.h.
* imap4d/preauth.c (do_preauth_ident): Use mu_str_stripws instead of
the static trimcrlf, which is removed.
(do_preauth_program): Use wordsplit instead of
vartab and mu_prog_stream_create instead of popen.
* libmailutils/mailbox/mbx_default.c: Include nls.h
Don't include vartab.h
(mu_construct_user_mailbox_url): Use wordsplit instead of
vartab.
* libmailutils/server/acl.c (expand_arg): Use wordsplit instead of
vartab.
* libmu_auth/ldap.c (_mu_ldap_search):L Likewise.
* libmu_auth/radius.c (_expand_query): Likewise.
* libmu_auth/sql.c (mu_sql_expand_query): Likewise.
* libproto/mailer/prog.c (_expand_sender, _expand_rcpt): Rewrite.
(url_to_argv): : Use wordsplit instead of
vartab.
* po/POTFILES.in: Add more files.
Diffstat (limited to 'libmailutils/server')
-rw-r--r-- | libmailutils/server/acl.c | 121 |
1 files changed, 84 insertions, 37 deletions
diff --git a/libmailutils/server/acl.c b/libmailutils/server/acl.c index d7a13629a..27d2352a1 100644 --- a/libmailutils/server/acl.c +++ b/libmailutils/server/acl.c @@ -36,7 +36,6 @@ #include <mailutils/error.h> #include <mailutils/errno.h> #include <mailutils/kwd.h> -#include <mailutils/vartab.h> #include <mailutils/io.h> struct _mu_acl_entry @@ -500,18 +499,12 @@ struct run_closure unsigned idx; mu_debug_t debug; struct sockaddr *sa; + char *numbuf; + char *portbuf; int salen; mu_acl_result_t *result; }; -static int -_expand_aclno (const char *name, void *data, char **p) -{ - struct run_closure *rp = data; - /*FIXME: memory leak*/ - return mu_asprintf (p, "%u", rp->idx); -} - #if defined (HAVE_SYSCONF) && defined (_SC_OPEN_MAX) # define getmaxfd() sysconf (_SC_OPEN_MAX) #elif defined (HAVE_GETDTABLESIZE) @@ -520,52 +513,103 @@ _expand_aclno (const char *name, void *data, char **p) # define getmaxfd() 64 #endif -static int -expand_arg (const char *cmdline, struct run_closure *rp, char **s) +#define SEQ(s, n, l) \ + (((l) == (sizeof(s) - 1)) && memcmp (s, n, l) == 0) + +static const char * +acl_getvar (const char *name, size_t nlen, void *data) { - int rc; - mu_vartab_t vtab; - - MU_DEBUG1 (rp->debug, MU_DEBUG_TRACE0, "Expanding \"%s\" => ", cmdline); + struct run_closure *rp = data; + + if (SEQ ("aclno", name, nlen)) + { + if (!rp->numbuf && mu_asprintf (&rp->numbuf, "%u", rp->idx)) + return NULL; + return rp->numbuf; + } - mu_vartab_create (&vtab); - mu_vartab_define_exp (vtab, "aclno", _expand_aclno, NULL, rp); switch (rp->sa->sa_family) { case AF_INET: { struct sockaddr_in *s_in = (struct sockaddr_in *)rp->sa; - struct in_addr addr = s_in->sin_addr; - char *p; + + if (SEQ ("address", name, nlen)) + { + struct in_addr addr = s_in->sin_addr; + addr.s_addr = htonl (addr.s_addr); + return inet_ntoa (addr); + } + + if (SEQ ("port", name, nlen)) + { + if (!rp->portbuf && + mu_asprintf (&rp->portbuf, "%hu", ntohs (s_in->sin_port))) + return NULL; + return rp->portbuf; + } + break; - mu_vartab_define (vtab, "family", "AF_INET", 1); - addr.s_addr = htonl (addr.s_addr); - mu_vartab_define (vtab, "address", inet_ntoa (addr), 0); - if (mu_asprintf (&p, "%hu", ntohs (s_in->sin_port)) == 0) + case AF_UNIX: + if (SEQ ("address", name, nlen)) { - mu_vartab_define (vtab, "port", p, 0); - free (p); + struct sockaddr_un *s_un = (struct sockaddr_un *)rp->sa; + if (rp->salen == sizeof (s_un->sun_family)) + return NULL; + else + return s_un->sun_path; } } break; - + } + return NULL; +} + +static int +expand_arg (const char *cmdline, struct run_closure *rp, char **s) +{ + int rc; + struct mu_wordsplit ws; + const char *env[3]; + + MU_DEBUG1 (rp->debug, MU_DEBUG_TRACE0, "Expanding \"%s\" => ", cmdline); + env[0] = "family"; + switch (rp->sa->sa_family) + { + case AF_INET: + env[1] = "AF_INET"; + break; + case AF_UNIX: - { - struct sockaddr_un *s_un = (struct sockaddr_un *)rp->sa; - - mu_vartab_define (vtab, "family", "AF_UNIX", 1); - mu_vartab_define (vtab, "address", s_un->sun_path, 1); - } + env[1] = "AF_UNIX"; break; } - - rc = mu_vartab_expand (vtab, cmdline, s); - mu_vartab_destroy (&vtab); + env[2] = NULL; + ws.ws_env = env; + ws.ws_getvar = acl_getvar; + ws.ws_closure = rp; + rc = mu_wordsplit (cmdline, &ws, + MU_WRDSF_NOSPLIT | MU_WRDSF_NOCMD | + MU_WRDSF_ENV | MU_WRDSF_ENV_KV | + MU_WRDSF_GETVAR | MU_WRDSF_CLOSURE); if (rc == 0) - MU_DEBUG1 (rp->debug, MU_DEBUG_TRACE0, "\"%s\". ", *s); + { + *s = strdup (ws.ws_wordv[0]); + mu_wordsplit_free (&ws); + if (!*s) + { + MU_DEBUG (rp->debug, MU_DEBUG_TRACE0, "failed: not enough memory. "); + return ENOMEM; + } + MU_DEBUG1 (rp->debug, MU_DEBUG_TRACE0, "\"%s\". ", *s); + } else - MU_DEBUG (rp->debug, MU_DEBUG_TRACE0, "failed. "); + { + MU_DEBUG1 (rp->debug, MU_DEBUG_TRACE0, "failed: %s", + mu_wordsplit_strerror (&ws)); + rc = errno; + } return rc; } @@ -744,7 +788,10 @@ mu_acl_check_sockaddr (mu_acl_t acl, const struct sockaddr *sa, int salen, r.debug = acl->debug; r.result = pres; *r.result = mu_acl_result_undefined; + r.numbuf = r.portbuf = NULL; mu_list_do (acl->aclist, _run_entry, &r); + free (r.numbuf); + free (r.portbuf); free (r.sa); return 0; } |