diff options
Diffstat (limited to 'mail/spamd/files/patch-greyc')
-rw-r--r-- | mail/spamd/files/patch-greyc | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/mail/spamd/files/patch-greyc b/mail/spamd/files/patch-greyc new file mode 100644 index 000000000000..0a626e9f1737 --- /dev/null +++ b/mail/spamd/files/patch-greyc @@ -0,0 +1,131 @@ +--- spamd/grey.c Wed Apr 13 03:22:17 2005 ++++ spamd/grey.c Mon Mar 20 15:26:18 2006 +@@ -39,6 +39,10 @@ + #include <unistd.h> + #include <netdb.h> + ++#ifdef IPFW ++#include <netinet/ip_fw.h> ++#endif ++ + #include "grey.h" + + extern time_t passtime, greyexp, whiteexp, trapexp; +@@ -65,13 +69,17 @@ + char *traplist_msg = "\"Your address %A has mailed to spamtraps here\\n\""; + + pid_t db_pid = -1; +-int pfdev; + int spamdconf; + ++#ifdef IPFW ++extern int tabno; ++#else ++int pfdev; + static char *pargv[11]= { + "pfctl", "-p", "/dev/pf", "-q", "-t", + "spamd-white", "-T", "replace", "-f" "-", NULL + }; ++#endif + + /* If the parent gets a signal, kill off the children and exit */ + /* ARGSUSED */ +@@ -104,6 +112,7 @@ + return(0); + } + ++#ifndef IPFW + int + configure_pf(char **addrs, int count) + { +@@ -166,11 +175,54 @@ + for (i = 0; i < count; i++) + if (addrs[i] != NULL) + fprintf(pf, "%s/32\n", addrs[i]); ++ + fclose(pf); + waitpid(pid, NULL, 0); + sigaction(SIGCHLD, &sa, NULL); + return(0); + } ++#else ++int ++configure_pf(char **addrs, int count) ++{ ++ static int s = -1; ++ ipfw_table_entry ent; ++ int i; ++ ++ if (s == -1) ++ s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); ++ if (s < 0) ++ { ++ syslog_r(LOG_INFO, &sdata, "IPFW socket unavailable (%m)"); ++ return(-1); ++ } ++ ++ /* flush the table */ ++ ent.tbl = tabno; ++ if (setsockopt(s, IPPROTO_IP, IP_FW_TABLE_FLUSH, &ent.tbl, sizeof(ent.tbl)) < 0) ++ { ++ syslog_r(LOG_INFO, &sdata, "IPFW setsockopt(IP_FW_TABLE_FLUSH) (%m)"); ++ return(-1); ++ } ++ ++ for (i = 0; i < count; i++) ++ if (addrs[i] != NULL) ++ { ++ /* add addrs[i] to tabno */ ++ ent.tbl = tabno; ++ ent.masklen = 32; ++ ent.value = 0; ++ inet_aton(addrs[i], (struct in_addr *)&ent.addr); ++ if (setsockopt(s, IPPROTO_IP, IP_FW_TABLE_ADD, &ent, sizeof(ent)) < 0) ++ { ++ syslog_r(LOG_INFO, &sdata, "IPFW setsockopt(IP_FW_TABLE_ADD) (%m)"); ++ return(-1); ++ } ++ } ++ ++ return(0); ++} ++#endif + + void + freeaddrlists(void) +@@ -590,11 +642,13 @@ + int i; + struct sigaction sa; + ++#ifndef IPFW + pfdev = open("/dev/pf", O_RDWR); + if (pfdev == -1) { + syslog_r(LOG_ERR, &sdata, "open of /dev/pf failed (%m)"); + exit(1); + } ++#endif + + /* check to see if /var/db/spamd exists, if not, create it */ + if ((i = open(PATH_SPAMD_DB, O_RDWR, 0)) == -1 && errno == ENOENT) { +@@ -636,7 +690,9 @@ + * child, talks to jailed spamd over greypipe, + * updates db. has no access to pf. + */ ++#ifndef IPFW + close(pfdev); ++#endif + setproctitle("(%s update)", PATH_SPAMD_DB); + greyreader(); + /* NOTREACHED */ +@@ -655,7 +711,11 @@ + sigaction(SIGCHLD, &sa, NULL); + sigaction(SIGINT, &sa, NULL); + ++#ifndef IPFW + setproctitle("(pf <spamd-white> update)"); ++#else ++ setproctitle("(ipfw white table update)"); ++#endif + greyscanner(); + /* NOTREACHED */ + exit(1); |