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