Example #1
0
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);
}
Example #2
0
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));
	}
}
Example #3
0
const char *config_msgidhost()
{
	if (!msgidhost)
	{
	char	*f=config_localfilename("msgidhost");

		if ((msgidhost=config_read1l(f)) == 0)
			msgidhost=config_me();
		free(f);
	}
	return (msgidhost);
}
Example #4
0
const char *config_me()
{
    if (!me)
    {
        char	*f=config_localfilename("me");

        if ((me=config_read1l(f)) == 0)
            me=config_gethostname();
        free(f);
    }
    return (me);
}
Example #5
0
const char *config_defaultdomain()
{
	if (!defaultdomain)
	{
	char	*f=config_localfilename("defaultdomain");

		if ((defaultdomain=config_read1l(f)) == 0)
			defaultdomain=config_me();
		free(f);
	}
	return (defaultdomain);
}
Example #6
0
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;
	}
}
Example #7
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);
}
Example #8
0
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);
}
Example #9
0
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);
}
Example #10
0
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);
}
Example #11
0
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);
}
Example #12
0
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);
}
Example #13
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);
	}
}