X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fslocal.c;h=4a8875e7c2cbbe8054f97c82eb6fb284ea200139;hp=8a3f5f7c5f58fc8811b94f689ebf576b836a634f;hb=d8916ff5d389de5ab225cd6f40aeda1b285d0f28;hpb=8f4c5da8971926f7eccc912f7998c343aef3c33b diff --git a/uip/slocal.c b/uip/slocal.c index 8a3f5f7..4a8875e 100644 --- a/uip/slocal.c +++ b/uip/slocal.c @@ -3,6 +3,10 @@ * slocal.c -- asynchronously filter and deliver new mail * * $Id$ + * + * This code is Copyright (c) 2002, by the authors of nmh. See the + * COPYRIGHT file in the root directory of the nmh distribution for + * complete copyright information. */ /* @@ -12,9 +16,6 @@ * * to their $HOME/.forward file. * - * Under MMDF-I, users should (symbolically) link - * /usr/local/nmh/lib/slocal to $HOME/bin/rcvmail. - * */ /* Changed to use getutent() and friends. Assumes that when getutent() exists, @@ -27,7 +28,8 @@ #include #include #include -#include +#include +#include #include #include @@ -44,11 +46,14 @@ extern int initgroups(char*, int); #endif - -#ifdef HAVE_DB1_NDBM_H -#include -#else -#include +/* This define is needed for Berkeley db v2 and above to + * make the header file expose the 'historical' ndbm APIs. + * We define it unconditionally because this is simple and + * harmless. + */ +#define DB_DBM_HSEARCH 1 +#ifdef NDBM_HEADER +#include NDBM_HEADER #endif #include @@ -407,7 +412,8 @@ main (int argc, char **argv) /* deliver the message */ status = localmail (fd, mdlvr); - return done (status != -1 ? RCV_MOK : RCV_MBX); + done (status != -1 ? RCV_MOK : RCV_MBX); + return 1; } @@ -452,7 +458,7 @@ localmail (int fd, char *mdlvr) static int usr_delivery (int fd, char *delivery, int su) { - int i, accept, status, won, vecp, next; + int i, accept, status=1, won, vecp, next; char *field, *pattern, *action, *result, *string; char buffer[BUFSIZ], tmpbuf[BUFSIZ]; char *cp, *vec[NVEC]; @@ -549,7 +555,7 @@ usr_delivery (int fd, char *delivery, int su) } if (vecp > 5) { - if (!strcasecmp (vec[5], "select")) { + if (!mh_strcasecmp (vec[5], "select")) { if (logged_in () != -1) continue; if (vecp > 7 && timely (vec[6], vec[7]) == -1) @@ -568,7 +574,7 @@ usr_delivery (int fd, char *delivery, int su) * "default" matches only if the message hasn't * been delivered yet. */ - if (!strcasecmp (field, "default")) { + if (!mh_strcasecmp (field, "default")) { if (won) continue; break; @@ -598,7 +604,7 @@ usr_delivery (int fd, char *delivery, int su) switch (*action) { case 'q': /* deliver to quoted pipe */ - if (strcasecmp (action, "qpipe")) + if (mh_strcasecmp (action, "qpipe")) continue; /* else fall */ case '^': expand (tmpbuf, string, fd); @@ -609,7 +615,7 @@ usr_delivery (int fd, char *delivery, int su) case 'p': /* deliver to pipe */ - if (strcasecmp (action, "pipe")) + if (mh_strcasecmp (action, "pipe")) continue; /* else fall */ case '|': vec[2] = "sh"; @@ -622,12 +628,12 @@ usr_delivery (int fd, char *delivery, int su) case 'f': /* mbox format */ - if (!strcasecmp (action, "file")) { + if (!mh_strcasecmp (action, "file")) { status = usr_file (fd, string, MBOX_FORMAT); break; } /* deliver to nmh folder */ - else if (strcasecmp (action, "folder")) + else if (mh_strcasecmp (action, "folder")) continue; /* else fall */ case '+': status = usr_folder (fd, string); @@ -635,12 +641,12 @@ usr_delivery (int fd, char *delivery, int su) case 'm': /* mmdf format */ - if (!strcasecmp (action, "mmdf")) { + if (!mh_strcasecmp (action, "mmdf")) { status = usr_file (fd, string, MMDF_FORMAT); break; } /* mbox format */ - else if (strcasecmp (action, "mbox")) + else if (mh_strcasecmp (action, "mbox")) continue; /* else fall */ case '>': @@ -650,12 +656,14 @@ usr_delivery (int fd, char *delivery, int su) case 'd': /* ignore message */ - if (strcasecmp (action, "destroy")) + if (mh_strcasecmp (action, "destroy")) continue; status = 0; break; } + if (status) next = 0; /* action failed, mark for 'N' result */ + if (accept && status == 0) won++; } @@ -676,7 +684,7 @@ static int split (char *cp, char **vec) { int i; - char *s; + unsigned char *s; s = cp; @@ -772,7 +780,7 @@ parse (int fd) lp = add (field, lp); } for (p = hdrs; p->p_name; p++) { - if (!strcasecmp (p->p_name, name)) { + if (!mh_strcasecmp (p->p_name, name)) { if (!(p->p_flags & P_HID)) { if ((cp = p->p_value)) { if (p->p_flags & P_ADR) { @@ -926,7 +934,7 @@ static struct pair * lookup (struct pair *pairs, char *key) { for (; pairs->p_name; pairs++) - if (!strcasecmp (pairs->p_name, key)) + if (!mh_strcasecmp (pairs->p_name, key)) return pairs; return NULL; @@ -950,9 +958,13 @@ logged_in (void) setutent(); while ((utp = getutent()) != NULL) { - if (utp->ut_type == USER_PROCESS - && utp->ut_user[0] != 0 - && strncmp (user, utp->ut_user, sizeof(utp->ut_user)) == 0) { + if ( +#ifdef HAVE_STRUCT_UTMP_UT_TYPE + utp->ut_type == USER_PROCESS + && +#endif + utp->ut_name[0] != 0 + && strncmp (user, utp->ut_name, sizeof(utp->ut_name)) == 0) { if (debug) continue; endutent(); @@ -1177,10 +1189,6 @@ usr_pipe (int fd, char *cmd, char *pgm, char **vec, int suppress) status = pidwait (child_id, 0); alarm (0); -#ifdef MMDFI - if (status == RP_MOK || status == RP_OK) - status = 0; -#endif if (verbose) { if (status == 0) verbose_printf (", success.\n"); @@ -1225,8 +1233,8 @@ static void get_sender (char *envelope, char **sender) { int i; - char *cp; - char buffer[BUFSIZ]; + unsigned char *cp; + unsigned char buffer[BUFSIZ]; if (envelope == NULL) { *sender = getcpy (""); @@ -1353,11 +1361,11 @@ you_lose: /* return path for UUCP style addressing */ ep = strchr(++hp, '\n'); snprintf (buffer, sizeof(buffer), "Return-Path: %.*s!%.*s\n", - ep - hp, hp, cp - fp, fp); + (int)(ep - hp), hp, (int)(cp - fp), fp); } else { /* return path for standard domain addressing */ snprintf (buffer, sizeof(buffer), "Return-Path: %.*s\n", - cp - fp, fp); + (int)(cp - fp), fp); } /* Add Return-Path header to message */ @@ -1405,7 +1413,7 @@ static char * trim (char *cp) { char buffer[BUFSIZ*4]; - char *bp, *sp; + unsigned char *bp, *sp; if (cp == NULL) return NULL; @@ -1530,7 +1538,7 @@ suppress_duplicates (int fd, char *file) case FLDPLUS: case FLDEOF: /* Search for the message ID */ - if (strcasecmp (name, "Message-ID")) { + if (mh_strcasecmp (name, "Message-ID")) { while (state == FLDPLUS) state = m_getfld (state, name, buf, sizeof(buf), in); continue;