const char *config_batchsize() { char *batchfilename; char *batchsizestr; unsigned batchsize; if (batchsize_buf[0] == '\0') { batchfilename=config_localfilename("batchsize"); batchsizestr=config_read1l(batchfilename); free(batchfilename); batchsize=100; if (batchsizestr) { batchsize=atoi(batchsizestr); free(batchsizestr); if (batchsize == 0) batchsize=100; /* stupid user */ } if (batchsize <= 0) batchsize=5; sprintf(batchsize_buf, "%u", batchsize); } return (batchsize_buf); }
int main(int argc, char **argv) { if (argc > 1 && strcmp(argv[1], "test") == 0) { duphash_init(&top_hash, 500, 4); duphash_init(&bottom_hash, 500, 4); return (testmode()); } else { char *fn, *f; unsigned hashsize=500; unsigned duplevel=4; unsigned nthreads=4; fn=config_localfilename("filters/dupfilter-hashsize"); if ( (f=config_read1l(fn)) != 0) { sscanf(f, "%u", &hashsize); free(f); } free(fn); fn=config_localfilename("filters/dupfilter-duplevel"); if ( (f=config_read1l(fn)) != 0) { sscanf(f, "%u", &duplevel); free(f); } free(fn); fn=config_localfilename("filters/dupfilter-nthreads"); if ( (f=config_read1l(fn)) != 0) { sscanf(f, "%u", &nthreads); free(f); } free(fn); duphash_init(&top_hash, hashsize, duplevel); duphash_init(&bottom_hash, hashsize, duplevel); return (realmode(nthreads)); } }
const char *config_msgidhost() { if (!msgidhost) { char *f=config_localfilename("msgidhost"); if ((msgidhost=config_read1l(f)) == 0) msgidhost=config_me(); free(f); } return (msgidhost); }
const char *config_me() { if (!me) { char *f=config_localfilename("me"); if ((me=config_read1l(f)) == 0) me=config_gethostname(); free(f); } return (me); }
const char *config_defaultdomain() { if (!defaultdomain) { char *f=config_localfilename("defaultdomain"); if ((defaultdomain=config_read1l(f)) == 0) defaultdomain=config_me(); free(f); } return (defaultdomain); }
void msgq::init(unsigned qs) { queue.resize(qs); queuehashfirst.resize(qs); queuehashlast.resize(qs); queuehead=0; queuetail=0; queuefree=0; queuedelivering=0; queuewaiting=0; inprogress=0; backup_relay_driver=0; char *filename=config_localfilename("backuprelay"); char *buf=config_read1l(filename); free(filename); if (buf) { const char *h=strtok(buf, " \t\r\n"); if (h) { backup_relay=h; h=strtok(0, " \t\r\n"); if (!h) h="esmtp"; struct rw_transport *t=rw_search_transport(h); if (!t) { clog_msg_start_err(); clog_msg_str("BACKUP RELAY DRIVER NOT FOUND: "); clog_msg_str(h); clog_msg_send(); exit(1); } backup_relay_driver=(drvinfo *)t->udata; } } unsigned i; for (i=0; i<qs; i++) { queue[i].next=queuefree; queuefree=&queue[i]; queuehashfirst[i]=0; queuehashlast[i]=0; } }
size_t config_dsnlimit() { char *f=config_localfilename("dsnlimit"); char *p=config_read1l(f); size_t l=32768; if (p) { l=atol(p); free(p); } return (l); }
char *ulocallower(const char *c) { static int islocallower=0; if (islocallower == 0) { char *s=config_localfilename("locallowercase"); islocallower = access(s, 0) == 0 ? 1:-1; free(s); } if ( islocallower > 0 || ( #if HAVE_STRNCASECMP strncasecmp(c, "postmaster", 10) #else strnicmp(c, "postmaster", 10) #endif == 0 && (c[10] == '\0' || c[10] == '@'))) { char *c_copy=courier_strdup(c); char *at=strchr(c_copy, '@'); char save; char *lower_username; if (!at) at=c_copy+strlen(c_copy); save=*at; *at=0; lower_username= unicode_convert_tocase(c_copy, "utf-8", unicode_lc, unicode_lc); *at=save; if (lower_username) { char *buf=courier_malloc(strlen(lower_username)+ strlen(at)+1); strcat(strcpy(buf, lower_username), at); free(c_copy); free(lower_username); return buf; } free(c_copy); } return courier_strdup(c); }
char *config_dsnfrom() { char *f=config_localfilename("dsnfrom"); char *p=config_read1l(f); static const char defaultdsnfrom[]="\"Courier mail server at %s\" <@>"; free(f); if (!p) { const char *me=config_me(); p=courier_malloc(sizeof(defaultdsnfrom)+strlen(me)); sprintf(p, defaultdsnfrom, me); } return (p); }
void AliasSearch::Open( const char *module ) { char *p; modulename="local"; if (module) { modulename=SYSCONFDIR "/aliases-"; modulename += module; modulename += ".dat"; if (module_alias.Open(modulename, "R") && errno != ENOENT) clog_msg_errno(); modulename=module; } p=config_localfilename("aliases.dat"); if (local_alias.Open(p, "R") && errno != ENOENT) clog_msg_errno(); free(p); }
char *config_dsnfrom() { char *f=config_localfilename("dsnfrom"); char *p=config_read1l(f); static const char defaultdsnfrom[]="Courier mail server at %s <@>"; free(f); if (!p) { const char *me=config_me(); char *me_encoded=rfc2047_encode_str(me, RFC2045CHARSET, rfc2047_qp_allow_word); if (me_encoded) me=me_encoded; p=courier_malloc(sizeof(defaultdsnfrom)+strlen(me)); sprintf(p, defaultdsnfrom, me); if (me_encoded) free(me_encoded); } return (p); }
int main(int argc, char **argv, char **env) { char *fn, *f; int rc; char buffer[1]; int waitstat; struct stat stat_buf; fn=config_localfilename("filters/perlfilter-numprocs"); if ( (f=config_read1l(fn)) != 0) { sscanf(f, "%u", &nchildren); free(f); } free(fn); if (nchildren <= 0) nchildren=1; fn=config_localfilename("filters/perlfilter"); if ( (f=config_read1l(fn)) == 0) { fprintf(stderr, "filters/perlfilter: not defined.\n"); exit(1); } filter=f; if (stat(filter, &stat_buf)) { perror(filter); exit(1); } listen_sock=lf_init("filters/perlfilter-mode", ALLFILTERSOCKETDIR "/perlfilter", ALLFILTERSOCKETDIR "/.perlfilter", FILTERSOCKETDIR "/perlfilter", FILTERSOCKETDIR "/.perlfilter"); if (listen_sock < 0) { perror("socket"); exit(1); } rc=wait_startchildren(nchildren, &children); if (rc < 0) { perror("fork"); exit(1); } if (rc > 0) { lf_init_completed(listen_sock); perlfilter(); } signal(SIGCHLD, reap_children); lf_init_completed(listen_sock); while (read(0, &buffer, 1) != 0) { ; } wait_restore(); /* Wait for all child processes to terminate */ while (wait(&waitstat) > 0) ; exit(0); return (0); }
void drvinfo::init() { unsigned cnt, i; struct rw_transport *p; module_dsn=0; queuelo=0; for (cnt=0, p=rw_transport_first; p; p=p->next) ++cnt; if ((modules=new drvinfo[cnt]) == 0) clog_msg_errno(); cnt=0; for (p=rw_transport_first; p; p=p->next) { char *namebuf=(char *)courier_malloc( sizeof( SYSCONFDIR "/module.")+strlen(p->name)); strcat(strcpy(namebuf, SYSCONFDIR "/module."), p->name); FILE *config=fopen(namebuf, "r"); if (!config) { clog_msg_start_err(); clog_msg_str("Cannot open "); clog_msg_str(namebuf); clog_msg_send(); exit(1); } free(namebuf); unsigned maxdels=1; unsigned maxhost=1; unsigned maxrcpt=1; char *prog=0; char buf[BUFSIZ]; while (fgets(buf, sizeof(buf), config) != 0) { char *p; if ((p=strchr(buf, '#')) != 0) *p=0; p=strtok(buf, " \t\r\n="); if (strcmp(p, "MAXDELS") == 0) { p=strtok(NULL, " \t\r\n="); if (p) maxdels=atoi(p); } else if (strcmp(p, "MAXHOST") == 0) { p=strtok(NULL, " \t\r\n="); if (p) maxhost=atoi(p); } else if (strcmp(p, "MAXRCPT") == 0) { p=strtok(NULL, " \t\r\n="); if (p) maxrcpt=atoi(p); } else if (strcmp(p, "PROG") == 0 && !prog) { p=strtok(NULL, "\t\r\n="); if (p) { prog=(char *) courier_malloc(strlen(p)+1); strcpy(prog, p); } } } fclose(config); if (!prog) continue; // Input only module modules[cnt].module=p; p->udata=(void *)&modules[cnt]; modules[cnt].delinfo_list.resize(maxdels); modules[cnt].hosts_list.resize(maxdels); queuelo += maxdels; modules[cnt].maxhost=maxhost; modules[cnt].maxrcpt=maxrcpt; modules[cnt].delpfreefirst=0; if (strcmp(p->name, DSN) == 0) module_dsn= &modules[cnt]; for (i=0; i<maxdels; i++) { modules[cnt].delinfo_list[i].delid=i; modules[cnt].delinfo_list[i].freenext= modules[cnt].delpfreefirst; modules[cnt].delpfreefirst= &modules[cnt].delinfo_list[i]; } modules[cnt].hdlvrpfree=0; for (i=0; i<maxdels; i++) { modules[cnt].hosts_list[i].next= modules[cnt].hdlvrpfree; modules[cnt].hdlvrpfree=&modules[cnt].hosts_list[i]; } modules[cnt].hdlvrpfirst=0; modules[cnt].hdlvrplast=0; int pipe0[2], pipe1[2]; if (pipe(pipe0) || pipe(pipe1)) clog_msg_errno(); switch (modules[cnt].module_pid=fork()) { case 0: #if 0 // replaced by close-on-exec, below for (i=cnt; i; ) { --i; fclose(modules[i].module_to); close(modules[i].module_from.fd); } #endif close(pipe0[1]); close(pipe1[0]); dup2(pipe0[0], 0); dup2(pipe1[1], 1); close(pipe0[0]); close(pipe1[1]); signal(SIGCHLD, SIG_DFL); if (chdir(MODULEDIR) || chdir(modules[cnt].module->name)) { clog_msg_start_err(); clog_msg_str(MODULEDIR "/"); clog_msg_str(modules[cnt].module->name); clog_msg_str(" does not exist."); clog_msg_send(); clog_msg_errno(); } { char maxdels_buf[MAXLONGSIZE+15]; char maxhost_buf[MAXLONGSIZE+15]; char maxrcpt_buf[MAXLONGSIZE+15]; const char *sh=getenv("SHELL"); sprintf(maxdels_buf, "MAXDELS=%ld", (long)maxdels); sprintf(maxhost_buf, "MAXHOST=%ld", (long)maxhost); sprintf(maxrcpt_buf, "MAXRCPT=%ld", (long)maxrcpt); putenv(maxdels_buf); putenv(maxhost_buf); putenv(maxrcpt_buf); const char *ch=courierdir(); char *p=(char *)courier_malloc(strlen(ch)+ sizeof("COURIER_HOME=")); strcat(strcpy(p,"COURIER_HOME="), ch); putenv(p); if (!sh) sh="/bin/sh"; execl(sh, sh, "-c", prog, (char *)0); clog_msg_start_err(); clog_msg_str(MODULEDIR "/"); clog_msg_str(modules[cnt].module->name); clog_msg_str(": "); clog_msg_str(prog); clog_msg_send(); clog_msg_errno(); } case -1: clog_msg_errno(); break; } close(pipe0[0]); close(pipe1[1]); if (fcntl(pipe0[1], F_SETFD, FD_CLOEXEC) || fcntl(pipe1[0], F_SETFD, FD_CLOEXEC)) clog_msg_errno(); if ((modules[cnt].module_to=fdopen(pipe0[1], "w")) == NULL) clog_msg_errno(); mybuf_init( &modules[cnt].module_from, pipe1[0] ); clog_msg_start_info(); clog_msg_str("Started "); clog_msg_str(prog); clog_msg_str(", pid="); clog_msg_int(modules[cnt].module_pid); clog_msg_str(", maxdels="); clog_msg_int(maxdels); clog_msg_str(", maxhost="); clog_msg_int(maxhost); clog_msg_str(", maxrcpt="); clog_msg_int(maxrcpt); clog_msg_send(); free(prog); cnt++; } nmodules=cnt; if (queuelo < 200) queuelo=200; char *cfname=config_localfilename("queuelo"); char *conf=config_read1l(cfname); if (conf) { queuelo=atoi(conf); free(conf); } free(cfname); if (queuelo < 20) queuelo=20; cfname=config_localfilename("queuehi"); conf=config_read1l(cfname); if (conf) { queuehi=atoi(conf); free(conf); } else queuehi=queuelo < 500 ? queuelo * 2:queuelo+1000; if (queuehi < queuelo) queuehi=queuelo; free(cfname); clog_msg_start_info(); clog_msg_str("queuelo="); clog_msg_int(queuelo); clog_msg_str(", queuehi="); clog_msg_int(queuehi); clog_msg_send(); if (module_dsn == 0) { clog_msg_start_err(); clog_msg_str("Driver dsn not found."); clog_msg_send(); exit(1); } }