Mercurial > dnsbl
diff src/dnsbl.cpp @ 3:7e1eb343a825
updates to use dcc conf files
author | carl |
---|---|
date | Wed, 21 Apr 2004 12:52:29 -0700 |
parents | 9bcd5ef11279 |
children | 15a7e942adec |
line wrap: on
line diff
--- a/src/dnsbl.cpp Tue Apr 20 22:11:14 2004 -0700 +++ b/src/dnsbl.cpp Wed Apr 21 12:52:29 2004 -0700 @@ -73,12 +73,6 @@ sfsistat mlfi_close(SMFICTX *ctx); } -#ifndef bool -# define bool int -# define TRUE 1 -# define FALSE 0 -#endif /* ! bool */ - struct ltstr { bool operator()(char* s1, char* s2) const { return strcmp(s1, s2) < 0; @@ -153,6 +147,8 @@ #define DEFAULT "default" #define WHITE "white" #define BLACK "black" +#define OK "ok" +#define MANY "many" //////////////////////////////////////////////// @@ -494,23 +490,22 @@ static void dumpit(from_map map); static void dumpit(from_map map) { - fprintf(stderr, "\n"); for (from_map::iterator i=map.begin(); i!=map.end(); i++) { - fprintf(stderr, "envfrom map %s\n", (*i).first); + char buf[2000]; + snprintf(buf, sizeof(buf), "envelope from map for %s", (*i).first); string_map *sm = (*i).second; - dumpit("envelope from", *sm); + dumpit(buf, *sm); } } -static void dumpit(); -static void dumpit() { - CONFIG &dc = *config; - fprintf(stderr, "dnsbls\n"); +static void dumpit(CONFIG &dc); +static void dumpit(CONFIG &dc) { + fprintf(stderr, "\ndnsbls\n"); for (dnsblp_map::iterator i=dc.dnsbls.begin(); i!=dc.dnsbls.end(); i++) { fprintf(stderr, "%s %s %s\n", (*i).first, (*i).second->suffix, (*i).second->message); } - fprintf(stderr, "dnsbl_lists\n"); + fprintf(stderr, "\ndnsbl_lists\n"); for (dnsbllp_map::iterator i=dc.dnsblls.begin(); i!=dc.dnsblls.end(); i++) { char *name = (*i).first; DNSBLL &dl = *((*i).second); @@ -521,22 +516,110 @@ } fprintf(stderr, "\n"); } + fprintf(stderr, "\nfiles\n"); + for (string_list::iterator i=dc.config_files.begin(); i!=dc.config_files.end(); i++) { + char *f = *i; + fprintf(stderr, "config includes %s\n", f); + } +} + + +//////////////////////////////////////////////// +// check for redundant or recursive include files +// +static bool ok_to_include(CONFIG &dc, char *fn); +static bool ok_to_include(CONFIG &dc, char *fn) { + if (!fn) return false; + bool ok = true; + for (string_list::iterator i=dc.config_files.begin(); i!=dc.config_files.end(); i++) { + char *f = *i; + if (strcmp(f, fn) == 0) { + my_syslog("redundant or recursive include file detected"); + ok = false; + break; + } + } + return ok; } //////////////////////////////////////////////// // load a single config file // +static void load_conf_dcc(CONFIG &dc, char *name, char *fn); +static void load_conf_dcc(CONFIG &dc, char *name, char *fn) { + dc.config_files.push_back(fn); + char *list = BLACK; + const int LINE_SIZE = 2000; + ifstream is(fn); + if (is.fail()) return; + char line[LINE_SIZE]; + char *delim = " \t"; + int curline = 0; + while (!is.eof()) { + is.getline(line, LINE_SIZE); + curline++; + int n = strlen(line); + if (!n) continue; + for (int i=0; i<n; i++) line[i] = tolower(line[i]); + if (line[0] == '#') continue; + char *head = line; + if (strspn(line, delim) == 0) { + // have a leading ok/many tag to fetch + char *cmd = strtok(line, delim); + if (strcmp(cmd, MANY) == 0) list = BLACK; + else if (strcmp(cmd, OK) == 0) list = WHITE; + head = cmd + strlen(cmd) + 1; + } + char *cmd = strtok(head, delim); + if (!cmd) continue; + if (strcmp(cmd, "env_from") == 0) { + char *from = next_token(delim); + if (from) { + string_map &fm = really_find_from_map(dc, name); + fm[from] = list; + } + } + else if (strcmp(cmd, "env_to") == 0) { + char *to = next_token(delim); + if (to) { + dc.env_to_dnsbll[to] = list; + dc.env_to_chkfrom[to] = list; + } + } + else if (strcmp(cmd, "substitute") == 0) { + char *tag = next_token(delim); + if (tag && (strcmp(tag, "mail_host") == 0)) { + char *from = next_token(delim); + if (from) { + string_map &fm = really_find_from_map(dc, name); + fm[from] = list; + } + } + } + else if (strcmp(cmd, "include") == 0) { + char *fn = next_token(delim); + if (ok_to_include(dc, fn)) { + load_conf_dcc(dc, name, fn); + } + } + + } + is.close(); +} + + static void load_conf(CONFIG &dc, char *fn); static void load_conf(CONFIG &dc, char *fn) { dc.config_files.push_back(fn); map<char*, int, ltstr> commands; - enum {dummy, dnsbl, dnsbll, envfrom, envto, include}; + enum {dummy, dnsbl, dnsbll, envfrom, envto, include, includedcc}; commands["dnsbl" ] = dnsbl; commands["dnsbl_list"] = dnsbll; commands["env_from" ] = envfrom; commands["env_to" ] = envto; commands["include" ] = include; + commands["include_dcc"] = includedcc; const int LINE_SIZE = 2000; ifstream is(fn); if (is.fail()) return; @@ -636,20 +719,19 @@ case include: { char *fn = next_token(delim); - if (fn) { - bool ok = true; - for (string_list::iterator i=dc.config_files.begin(); i!=dc.config_files.end(); i++) { - char *f = *i; - if (strcmp(f, fn) == 0) { - my_syslog("recursive include file detected"); - ok = false; - break; - } - } - if (ok) { + if (ok_to_include(dc, fn)) { load_conf(dc, fn); processed = true; } + } break; + + case includedcc: { + char *name = next_token(delim); + if (!name) break; + char *fn = next_token(delim); + if (ok_to_include(dc, fn)) { + load_conf_dcc(dc, name, fn); + processed = true; } } break; @@ -710,10 +792,6 @@ CONFIG *old = config; config = newc; pthread_mutex_unlock(&config_mutex); - // dumpit(env_from); - // dumpit("envelope to dnsbl", env_to_dnsbl); - // dumpit("envelope to check from", env_to_chkfrom); - // dumpit(); if (old) old_configs.insert(old); } // now look for old configs with zero ref counts @@ -741,9 +819,10 @@ int main(int argc, char**argv) { - bool setconn = FALSE; + bool check = false; + bool setconn = false; int c; - const char *args = "p:s:h"; + const char *args = "p:t:hc"; extern char *optarg; // Process command line options @@ -761,7 +840,7 @@ if (strncasecmp(optarg, "unix:", 5) == 0) unlink(optarg + 5); else if (strncasecmp(optarg, "local:", 6) == 0) unlink(optarg + 6); - setconn = TRUE; + setconn = true; break; case 't': @@ -775,6 +854,10 @@ } break; + case 'c': + check = true; + break; + case 'h': default: usage(argv[0]); @@ -791,6 +874,15 @@ exit(EX_UNAVAILABLE); } + if (check) { + CONFIG &dc = *new_conf(); + dumpit(dc.env_from); + dumpit("envelope to (dnsbl list)", dc.env_to_dnsbll); + dumpit("envelope to (from map)", dc.env_to_chkfrom); + dumpit(dc); + return 0; + } + // switch to background mode if (daemon(1,0) < 0) { fprintf(stderr, "daemon() call failed\n"); @@ -821,5 +913,5 @@ fclose(f); } - int rc = smfi_main(); + return smfi_main(); }