3 * $Id: qmail-checkspam.c,v 1.2 2004/04/08 01:36:26 mdw Exp $
5 * Filter messages for spam
7 * (c) 2003 Mark Wooding
10 /*----- Licensing notice --------------------------------------------------*
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software Foundation,
24 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 /*----- Header files ------------------------------------------------------*/
35 #include <sys/types.h>
36 #include <sys/unistd.h>
40 /*----- Main code ---------------------------------------------------------*/
42 static const char *strenv(const char *e, const char *d)
44 const char *p = getenv(e);
49 static double dblenv(const char *e, double d)
51 const char *p = getenv(e);
58 if (errno) return (d);
63 static int intenv(const char *e, int d)
65 const char *p = getenv(e);
72 if (errno) return (d);
74 if (l < 0 || l > INT_MAX) return (d);
78 int shovel(int from, int to)
86 n = read(from, buf, sizeof(buf));
87 if (n < 0 && errno != EINTR && errno != EAGAIN)
95 if (n <= 0 && errno != EINTR && errno != EAGAIN)
103 int main(int argc, char *argv[])
107 int fd_m[2], fd_e[2];
111 m.max_len = intenv("QMAIL_CHECKSPAM_MAXLEN", 2 * 1024 * 1024);
112 m.timeout = intenv("QMAIL_CHECKSPAM_TIMEOUT", 300);
113 rc = message_read(0, 0, &m);
114 if (rc != 0 && rc != EX_TOOBIG)
117 if (lookup_host(strenv("QMAIL_CHECKSPAM_SPAMDHOST", "localhost"),
118 intenv("QMAIL_CHECKSPAM_SPAMDPORT", 783),
121 if (message_filter(&sa, "spamd", 0, &m))
123 if (m.score >= dblenv("QMAIL_CHECKSPAM_THRESH", m.threshold))
126 if (pipe(fd_m) || pipe(fd_e))
128 if ((kid = fork()) < 0)
133 if (message_write(fd_m[1], &m) < 0)
135 if (rc == EX_TOOBIG && shovel(0, fd_m[1]))
138 if (shovel(1, fd_e[1]))
150 execlp(strenv("QMAIL_CHECKSPAM_QUEUE", "/var/qmail/bin/qmail-queue"),
152 fprintf(stderr, "failed to exec: %s\n", strerror(errno));
156 /*----- That's all, folks -------------------------------------------------*/