diff options
author | Gilles Chehade <gilles@cvs.openbsd.org> | 2010-04-21 20:10:25 +0000 |
---|---|---|
committer | Gilles Chehade <gilles@cvs.openbsd.org> | 2010-04-21 20:10:25 +0000 |
commit | 44e369f8aae25b46fb133a98624f3ba2042ff9e8 (patch) | |
tree | ae5c08d6d3da7cbfc70f8354a0cbb3e3a584f807 /usr.sbin/smtpd | |
parent | 483c556c961377c65bc37a43cba770bfb7f24db2 (diff) |
change prototypes for map_*_get() functions, we need the get-er function
to fill the size of value for the caller.
have map_lookup() actually lookup the parser in map_parsers table and
call it if it is set, otherwise return raw value which is similar to
current behavior. currently, no map kind has a parser set, so this is
essentially no functionnal change.
fix map_stdio_get(), it was not used yet in -current but i spotted a
bug while enabling it in my sandbox. it returns key and value instead
of key.
Diffstat (limited to 'usr.sbin/smtpd')
-rw-r--r-- | usr.sbin/smtpd/map.c | 50 |
1 files changed, 33 insertions, 17 deletions
diff --git a/usr.sbin/smtpd/map.c b/usr.sbin/smtpd/map.c index 3f99281affb..2c1927709e2 100644 --- a/usr.sbin/smtpd/map.c +++ b/usr.sbin/smtpd/map.c @@ -1,4 +1,4 @@ -/* $OpenBSD: map.c,v 1.12 2010/04/21 19:53:16 gilles Exp $ */ +/* $OpenBSD: map.c,v 1.13 2010/04/21 20:10:24 gilles Exp $ */ /* * Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org> @@ -40,13 +40,13 @@ struct map_parser *map_parser_lookup(enum map_kind); /* db(3) backend */ void *map_db_open(char *); void map_db_close(void *); -char *map_db_get(void *, char *); +char *map_db_get(void *, char *, size_t *); int map_db_put(void *, char *, char *); /* stdio(3) backend */ void *map_stdio_open(char *); void map_stdio_close(void *); -char *map_stdio_get(void *, char *); +char *map_stdio_get(void *, char *, size_t *); int map_stdio_put(void *, char *, char *); @@ -54,7 +54,7 @@ struct map_backend { enum map_src source; void *(*open)(char *); void (*close)(void *); - char *(*get)(void *, char *); + char *(*get)(void *, char *, size_t *); int (*put)(void *, char *, char *); } map_backends[] = { { S_DB, @@ -102,14 +102,18 @@ map_lookup(struct smtpd *env, objid_t mapid, char *key, enum map_kind kind) { void *hdl = NULL; char *result = NULL; + char *ret = NULL; + size_t len; struct map *map; struct map_backend *backend = NULL; + struct map_parser *parser = NULL; map = map_find(env, mapid); if (map == NULL) return NULL; backend = map_backend_lookup(map->m_src); + parser = map_parser_lookup(kind); hdl = backend->open(map->m_config); if (hdl == NULL) { @@ -117,10 +121,18 @@ map_lookup(struct smtpd *env, objid_t mapid, char *key, enum map_kind kind) return NULL; } - result = backend->get(hdl, key); - backend->close(hdl); + ret = result = backend->get(hdl, key, &len); + if (ret == NULL) + goto end; - return result; + if (parser->extract != NULL) { + ret = parser->extract(result, len); + free(result); + } + +end: + backend->close(hdl); + return ret; } struct map_backend * @@ -169,7 +181,7 @@ map_db_close(void *hdl) } char * -map_db_get(void *hdl, char *key) +map_db_get(void *hdl, char *key, size_t *len) { int ret; DBT dbk; @@ -188,6 +200,8 @@ map_db_get(void *hdl, char *key) fatal("calloc"); (void)strlcpy(result, dbv.data, dbv.size); + *len = dbv.size; + return result; } @@ -214,24 +228,24 @@ map_stdio_close(void *hdl) } char * -map_stdio_get(void *hdl, char *key) +map_stdio_get(void *hdl, char *key, size_t *len) { char *buf, *lbuf; - size_t len; + size_t flen; char *keyp; char *valp; FILE *fp = hdl; char *result = NULL; lbuf = NULL; - while ((buf = fgetln(fp, &len))) { - if (buf[len - 1] == '\n') - buf[len - 1] = '\0'; + while ((buf = fgetln(fp, &flen))) { + if (buf[flen - 1] == '\n') + buf[flen - 1] = '\0'; else { - if ((lbuf = malloc(len + 1)) == NULL) + if ((lbuf = malloc(flen + 1)) == NULL) err(1, NULL); - memcpy(lbuf, buf, len); - lbuf[len] = '\0'; + memcpy(lbuf, buf, flen); + lbuf[flen] = '\0'; buf = lbuf; } @@ -249,9 +263,11 @@ map_stdio_get(void *hdl, char *key) if (strcmp(keyp, key) != 0) continue; - result = strdup(buf); + result = strdup(valp); if (result == NULL) err(1, NULL); + *len = strlen(result); + break; } free(lbuf); |