summaryrefslogtreecommitdiff
path: root/libmailutils/server
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2010-10-30 17:42:59 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2010-10-30 17:51:32 +0300
commitc66e1b8de8fd661a34f03734cbb0a559324c3075 (patch)
tree3b0c51af9e759606e36477d51953791386a8ddf4 /libmailutils/server
parent63fec21357c175772a8ca153266919c12b6f8bd5 (diff)
downloadmailutils-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.c121
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;
}

Return to:

Send suggestions and report system problems to the System administrator.