//
//
-// $Id: spamass-milter.cpp,v 1.90 2006/03/23 21:41:36 dnelson Exp $
+// $Id: spamass-milter.cpp,v 1.94 2011/02/14 21:50:53 dnelson Exp $
//
// SpamAss-Milter
// - a rather trivial SpamAssassin Sendmail Milter plugin
// }}}
-static const char Id[] = "$Id: spamass-milter.cpp,v 1.90 2006/03/23 21:41:36 dnelson Exp $";
+static const char Id[] = "$Id: spamass-milter.cpp,v 1.94 2011/02/14 21:50:53 dnelson Exp $";
struct smfiDesc smfilter =
{
bool dofork = false;
char *pidfilename = NULL;
FILE *pidfile = NULL;
- struct sigaction children_sigaction;
#ifdef HAVE_VERBOSE_TERMINATE_HANDLER
std::set_terminate (__gnu_cxx::__verbose_terminate_handler);
if (stat(sock,&junk) == 0) unlink(sock);
}
- /* We don't care about any of our children, so ignore all of them */
- /* Set up sigaction to avoid having to reap children */
- memset(&children_sigaction, 0, sizeof children_sigaction);
- children_sigaction.sa_flags = SA_NOCLDWAIT;
- sigaction(SIGCHLD,&children_sigaction,0);
-
-
(void) smfi_setconn(sock);
if (smfi_register(smfilter) == MI_FAILURE) {
fprintf(stderr, "smfi_register failed\n");
// }}}
/* Update a header if SA changes it, or add it if it is new. */
-void update_or_insert(SpamAssassin* assassin, SMFICTX* ctx, string oldstring, t_setter setter, char *header )
+void update_or_insert(SpamAssassin* assassin, SMFICTX* ctx, string oldstring, t_setter setter, const char *header )
{
string::size_type eoh1 = assassin->d().find("\n\n");
string::size_type eoh2 = assassin->d().find("\n\r\n");
{
/* change if old one was present, append if non-null */
char* cstr = const_cast<char*>(newstring.c_str());
+ char* hstr = const_cast<char*>(header);
if (oldsize > 0)
{
debug(D_UORI, "u_or_i: changing");
- smfi_chgheader(ctx, header, 1, newstring.size() > 0 ?
+ smfi_chgheader(ctx, hstr, 1, newstring.size() > 0 ?
cstr : NULL );
} else if (newstring.size() > 0)
{
debug(D_UORI, "u_or_i: inserting");
- smfi_addheader(ctx, header, cstr);
+ smfi_addheader(ctx, hstr, cstr);
}
} else
{
the only way to do it. */
char *popen_argv[3];
FILE *p;
+ pid_t pid;
popen_argv[0] = SENDMAIL;
popen_argv[1] = spambucket;
popen_argv[2] = NULL;
debug(D_COPY, "calling %s %s", SENDMAIL, spambucket);
- p = popenv(popen_argv, "w");
+ p = popenv(popen_argv, "w",&pid);
if (!p)
{
debug(D_COPY, "popenv failed(%s). Will not send a copy to spambucket", strerror(errno));
// Send message provided by SpamAssassin
fwrite(assassin->d().c_str(), assassin->d().size(), 1, p);
fclose(p); p = NULL;
+ waitpid(pid,0,0);
}
}
return SMFIS_REJECT;
struct context *sctx = (struct context*)smfi_getpriv(ctx);
SpamAssassin* assassin = sctx->assassin;
FILE *p;
-#if defined(__FreeBSD__)
- int rv;
-#endif
debug(D_FUNC, "mlfi_envrcpt: enter");
char buf[1024];
char *popen_argv[4];
+ pid_t pid;
popen_argv[0] = SENDMAIL;
popen_argv[1] = "-bv";
debug(D_RCPT, "calling %s -bv %s", SENDMAIL, envrcpt[0]);
- p = popenv(popen_argv, "r");
+ p = popenv(popen_argv, "r", &pid);
if (!p)
{
debug(D_RCPT, "popenv failed(%s). Will not expand aliases", strerror(errno));
}
}
fclose(p); p = NULL;
+ waitpid(pid,0,0);
+
}
} else
{
for simplicity, and always reads stdout and stderr in "r" mode. Call
fclose to close the FILE.
*/
-FILE *popenv(char *const argv[], const char *type)
+FILE *popenv(char *const argv[], const char *type, pid_t *pid)
{
FILE *iop;
int pdes[2];
int save_errno;
- pid_t pid;
if ((*type != 'r' && *type != 'w') || type[1])
{
if (pipe(pdes) < 0)
return (NULL);
- pid = fork();
- switch (pid) {
+ *pid = fork();
+ switch (*pid) {
case -1: /* Error. */
save_errno = errno;