X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/0a49a7a4f1090b6f1ce1d0f9d969804c9226b53e..44de51a174765f7f5ecb250638cdb3fe64ec67dc:/src/src/lookups/lsearch.c diff --git a/src/src/lookups/lsearch.c b/src/src/lookups/lsearch.c index ccb4850f2..b236d8b72 100644 --- a/src/src/lookups/lsearch.c +++ b/src/src/lookups/lsearch.c @@ -1,15 +1,12 @@ -/* $Cambridge: exim/src/src/lookups/lsearch.c,v 1.11 2009/11/16 19:50:38 nm4 Exp $ */ - /************************************************* * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2009 */ +/* Copyright (c) University of Cambridge 1995 - 2017 */ /* See the file NOTICE for conditions of use and distribution. */ #include "../exim.h" #include "lf_functions.h" -#include "lsearch.h" /* Codes for the different kinds of lsearch that are supported */ @@ -28,7 +25,7 @@ enum { /* See local README for interface description */ -void * +static void * lsearch_open(uschar *filename, uschar **errmsg) { FILE *f = Ufopen(filename, "rb"); @@ -48,7 +45,7 @@ return f; * Check entry point * *************************************************/ -BOOL +static BOOL lsearch_check(void *handle, uschar *filename, int modemask, uid_t *owners, gid_t *owngroups, uschar **errmsg) { @@ -74,7 +71,7 @@ fit into the fixed sized buffer. Most of the time this will never be exercised, but people do occasionally do weird things. */ static int -internal_lsearch_find(void *handle, uschar *filename, uschar *keystring, +internal_lsearch_find(void *handle, uschar *filename, const uschar *keystring, int length, uschar **result, uschar **errmsg, int type) { FILE *f = (FILE *)handle; @@ -104,11 +101,10 @@ for (last_was_eol = TRUE; Ufgets(buffer, sizeof(buffer), f) != NULL; last_was_eol = this_is_eol) { - int ptr, size; int p = Ustrlen(buffer); int linekeylength; BOOL this_is_comment; - uschar *yield; + gstring * yield; uschar *s = buffer; /* Check whether this the final segment of a line. If it follows an @@ -149,7 +145,7 @@ for (last_was_eol = TRUE; uschar *t = s++; while (*s != 0 && *s != '\"') { - if (*s == '\\') *t++ = string_interpret_escape(&s); + if (*s == '\\') *t++ = string_interpret_escape(CUSS &s); else *t++ = *s; s++; } @@ -184,7 +180,7 @@ for (last_was_eol = TRUE; { int rc; int save = buffer[linekeylength]; - uschar *list = buffer; + const uschar *list = buffer; buffer[linekeylength] = 0; rc = match_isinlist(keystring, &list, @@ -243,7 +239,7 @@ for (last_was_eol = TRUE; /* Reset dynamic store, if we need to, and revert to the search pool */ - if (reset_point != NULL) + if (reset_point) { store_reset(reset_point); store_pool = old_pool; @@ -257,11 +253,9 @@ for (last_was_eol = TRUE; Initialize, and copy the first segment of data. */ this_is_comment = FALSE; - size = 100; - ptr = 0; - yield = store_get(size); + yield = string_get(100); if (*s != 0) - yield = string_cat(yield, &size, &ptr, s, Ustrlen(s)); + yield = string_cat(yield, s); /* Now handle continuations */ @@ -297,18 +291,17 @@ for (last_was_eol = TRUE; /* Join a physical or logical line continuation onto the result string. */ - yield = string_cat(yield, &size, &ptr, s, Ustrlen(s)); + yield = string_cat(yield, s); } - yield[ptr] = 0; - store_reset(yield + ptr + 1); - *result = yield; + store_reset(yield->s + yield->ptr + 1); + *result = string_from_gstring(yield); return OK; } /* Reset dynamic store, if we need to */ -if (reset_point != NULL) +if (reset_point) { store_reset(reset_point); store_pool = old_pool; @@ -324,9 +317,9 @@ return FAIL; /* See local README for interface description */ -int -lsearch_find(void *handle, uschar *filename, uschar *keystring, int length, - uschar **result, uschar **errmsg, BOOL *do_cache) +static int +lsearch_find(void *handle, uschar *filename, const uschar *keystring, int length, + uschar **result, uschar **errmsg, uint *do_cache) { do_cache = do_cache; /* Keep picky compilers happy */ return internal_lsearch_find(handle, filename, keystring, length, result, @@ -341,9 +334,9 @@ return internal_lsearch_find(handle, filename, keystring, length, result, /* See local README for interface description */ -int -wildlsearch_find(void *handle, uschar *filename, uschar *keystring, int length, - uschar **result, uschar **errmsg, BOOL *do_cache) +static int +wildlsearch_find(void *handle, uschar *filename, const uschar *keystring, int length, + uschar **result, uschar **errmsg, uint *do_cache) { do_cache = do_cache; /* Keep picky compilers happy */ return internal_lsearch_find(handle, filename, keystring, length, result, @@ -358,9 +351,9 @@ return internal_lsearch_find(handle, filename, keystring, length, result, /* See local README for interface description */ -int -nwildlsearch_find(void *handle, uschar *filename, uschar *keystring, int length, - uschar **result, uschar **errmsg, BOOL *do_cache) +static int +nwildlsearch_find(void *handle, uschar *filename, const uschar *keystring, int length, + uschar **result, uschar **errmsg, uint *do_cache) { do_cache = do_cache; /* Keep picky compilers happy */ return internal_lsearch_find(handle, filename, keystring, length, result, @@ -376,9 +369,9 @@ return internal_lsearch_find(handle, filename, keystring, length, result, /* See local README for interface description */ -int -iplsearch_find(void *handle, uschar *filename, uschar *keystring, int length, - uschar **result, uschar **errmsg, BOOL *do_cache) +static int +iplsearch_find(void *handle, uschar *filename, const uschar *keystring, int length, + uschar **result, uschar **errmsg, uint *do_cache) { do_cache = do_cache; /* Keep picky compilers happy */ if ((length == 1 && keystring[0] == '*') || @@ -405,10 +398,87 @@ else /* See local README for interface description */ -void +static void lsearch_close(void *handle) { (void)fclose((FILE *)handle); } + + +/************************************************* +* Version reporting entry point * +*************************************************/ + +/* See local README for interface description. */ + +#include "../version.h" + +void +lsearch_version_report(FILE *f) +{ +#ifdef DYNLOOKUP +fprintf(f, "Library version: lsearch: Exim version %s\n", EXIM_VERSION_STR); +#endif +} + + +static lookup_info iplsearch_lookup_info = { + US"iplsearch", /* lookup name */ + lookup_absfile, /* uses absolute file name */ + lsearch_open, /* open function */ + lsearch_check, /* check function */ + iplsearch_find, /* find function */ + lsearch_close, /* close function */ + NULL, /* no tidy function */ + NULL, /* no quoting function */ + NULL /* no version reporting (redundant) */ +}; + +static lookup_info lsearch_lookup_info = { + US"lsearch", /* lookup name */ + lookup_absfile, /* uses absolute file name */ + lsearch_open, /* open function */ + lsearch_check, /* check function */ + lsearch_find, /* find function */ + lsearch_close, /* close function */ + NULL, /* no tidy function */ + NULL, /* no quoting function */ + lsearch_version_report /* version reporting */ +}; + +static lookup_info nwildlsearch_lookup_info = { + US"nwildlsearch", /* lookup name */ + lookup_absfile, /* uses absolute file name */ + lsearch_open, /* open function */ + lsearch_check, /* check function */ + nwildlsearch_find, /* find function */ + lsearch_close, /* close function */ + NULL, /* no tidy function */ + NULL, /* no quoting function */ + NULL /* no version reporting (redundant) */ +}; + +static lookup_info wildlsearch_lookup_info = { + US"wildlsearch", /* lookup name */ + lookup_absfile, /* uses absolute file name */ + lsearch_open, /* open function */ + lsearch_check, /* check function */ + wildlsearch_find, /* find function */ + lsearch_close, /* close function */ + NULL, /* no tidy function */ + NULL, /* no quoting function */ + NULL /* no version reporting (redundant) */ +}; + +#ifdef DYNLOOKUP +#define lsearch_lookup_module_info _lookup_module_info +#endif + +static lookup_info *_lookup_list[] = { &iplsearch_lookup_info, + &lsearch_lookup_info, + &nwildlsearch_lookup_info, + &wildlsearch_lookup_info }; +lookup_module_info lsearch_lookup_module_info = { LOOKUP_MODULE_INFO_MAGIC, _lookup_list, 4 }; + /* End of lookups/lsearch.c */