main.c revision 66494
1251881Speter/*
2251881Speter *  Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers.
3251881Speter *	All rights reserved.
4251881Speter *
5251881Speter * By using this file, you agree to the terms and conditions set
6251881Speter * forth in the LICENSE file which can be found at the top level of
7251881Speter * the sendmail distribution.
8251881Speter *
9251881Speter */
10251881Speter
11251881Speter#ifndef lint
12251881Speterstatic char id[] = "@(#)$Id: main.c,v 8.34.4.9 2000/09/09 02:23:03 gshapiro Exp $";
13251881Speter#endif /* ! lint */
14251881Speter
15251881Speter#if _FFR_MILTER
16251881Speter#define _DEFINE	1
17251881Speter#include "libmilter.h"
18251881Speter#include <fcntl.h>
19251881Speter#include <sys/stat.h>
20251881Speter
21251881Speter
22251881Speterstatic smfiDesc_ptr smfi = NULL;
23251881Speter
24251881Speter/*
25251881Speter**  SMFI_REGISTER -- register a filter description
26251881Speter**
27251881Speter**	Parameters:
28251881Speter**		smfilter -- description of filter to register
29251881Speter**
30251881Speter**	Returns:
31251881Speter**		MI_SUCCESS/MI_FAILURE
32251881Speter*/
33251881Speter
34251881Speterint
35251881Spetersmfi_register(smfilter)
36251881Speter	smfiDesc_str smfilter;
37251881Speter{
38251881Speter	size_t len;
39251881Speter
40251881Speter	if (smfi == NULL)
41251881Speter	{
42251881Speter		smfi = (smfiDesc_ptr) malloc(sizeof *smfi);
43251881Speter		if (smfi == NULL)
44251881Speter			return MI_FAILURE;
45251881Speter	}
46251881Speter	(void) memcpy(smfi, &smfilter, sizeof *smfi);
47251881Speter	if (smfilter.xxfi_name == NULL)
48251881Speter		smfilter.xxfi_name = "Unknown";
49251881Speter
50251881Speter	len = strlen(smfilter.xxfi_name) + 1;
51251881Speter	smfi->xxfi_name = (char *) malloc(len);
52251881Speter	if (smfi->xxfi_name == NULL)
53251881Speter		return MI_FAILURE;
54251881Speter	(void) strlcpy(smfi->xxfi_name, smfilter.xxfi_name, len);
55251881Speter
56251881Speter	/* compare milter version with hard coded version */
57251881Speter	if (smfi->xxfi_version != SMFI_VERSION)
58251881Speter	{
59251881Speter		/* hard failure for now! */
60251881Speter		smi_log(SMI_LOG_ERR,
61251881Speter			"%s: smfi_register: version mismatch application: %d != milter: %d",
62251881Speter			smfi->xxfi_name, smfi->xxfi_version,
63251881Speter			(int) SMFI_VERSION);
64251881Speter		return MI_FAILURE;
65251881Speter	}
66251881Speter
67251881Speter	return MI_SUCCESS;
68251881Speter}
69251881Speter
70251881Speter/*
71251881Speter**  SMFI_STOP -- stop milter
72251881Speter**
73251881Speter**	Parameters:
74251881Speter**		none.
75251881Speter**
76251881Speter**	Returns:
77251881Speter**		success.
78251881Speter*/
79251881Speter
80251881Speterint
81251881Spetersmfi_stop()
82251881Speter{
83251881Speter	mi_stop_milters(MILTER_STOP);
84251881Speter	return MI_SUCCESS;
85251881Speter}
86251881Speter
87251881Speterstatic int dbg = 0;
88251881Speterstatic char *conn = NULL;
89251881Speterstatic int timeout = MI_TIMEOUT;
90251881Speterstatic int backlog= MI_SOMAXCONN;
91251881Speter
92251881Speterint
93251881Spetersmfi_setdbg(odbg)
94251881Speter	int odbg;
95251881Speter{
96251881Speter	dbg = odbg;
97251881Speter	return MI_SUCCESS;
98251881Speter}
99251881Speter
100251881Speterint
101251881Spetersmfi_settimeout(otimeout)
102251881Speter	int otimeout;
103251881Speter{
104251881Speter	timeout = otimeout;
105251881Speter	return MI_SUCCESS;
106251881Speter}
107251881Speter
108251881Speterint
109251881Spetersmfi_setconn(oconn)
110251881Speter	char *oconn;
111251881Speter{
112251881Speter	size_t l;
113251881Speter
114251881Speter	if (oconn == NULL || *oconn == '\0')
115251881Speter		return MI_FAILURE;
116251881Speter	l = strlen(oconn) + 1;
117251881Speter	if ((conn = (char *) malloc(l)) == NULL)
118251881Speter		return MI_FAILURE;
119251881Speter	if (strlcpy(conn, oconn, l) >= l)
120251881Speter		return MI_FAILURE;
121251881Speter	return MI_SUCCESS;
122251881Speter}
123251881Speter
124251881Speterint
125251881Spetersmfi_setbacklog(obacklog)
126251881Speter	int obacklog;
127251881Speter{
128251881Speter	if (obacklog <= 0)
129251881Speter		return MI_FAILURE;
130251881Speter	backlog = obacklog;
131251881Speter	return MI_SUCCESS;
132251881Speter}
133251881Speter
134251881Speterint
135251881Spetersmfi_main()
136251881Speter{
137251881Speter	signal(SIGPIPE, SIG_IGN);
138251881Speter	if (conn == NULL)
139251881Speter	{
140251881Speter		smi_log(SMI_LOG_FATAL, "%s: missing connection information",
141251881Speter			smfi->xxfi_name);
142251881Speter		return MI_FAILURE;
143251881Speter	}
144251881Speter
145251881Speter	(void) atexit(mi_clean_signals);
146251881Speter	if (mi_control_startup(smfi->xxfi_name) != MI_SUCCESS)
147251881Speter	{
148251881Speter		smi_log(SMI_LOG_FATAL,
149251881Speter			"%s: Couldn't start signal thread",
150251881Speter			smfi->xxfi_name);
151251881Speter		return MI_FAILURE;
152251881Speter	}
153251881Speter
154251881Speter	/* Startup the listener */
155251881Speter	if (mi_listener(conn, dbg, smfi, timeout, backlog) != MI_SUCCESS)
156251881Speter		return MI_FAILURE;
157251881Speter
158251881Speter	return MI_SUCCESS;
159251881Speter}
160251881Speter#endif /* _FFR_MILTER */
161251881Speter