X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Fslocal.c;h=869fa17f81a3a4ca51816059451d6e597e44af33;hb=bfad64befb4d6696fdfb63b119666eec4bac6fb3;hp=c1ee80fbb367cb2954d668436424128c406e3365;hpb=1691e80890e5d8ba258c51c214a3e91880e1db2b;p=mmh diff --git a/uip/slocal.c b/uip/slocal.c index c1ee80f..869fa17 100644 --- a/uip/slocal.c +++ b/uip/slocal.c @@ -2,7 +2,9 @@ /* * 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,34 +14,47 @@ * * 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, + * a number of other things also exist. Please check. + * Ruud de Rooij Sun, 28 May 2000 17:28:55 +0200 */ #include #include #include #include -#include -#include +#include +#include +#include +#include #include #include #include -#include #include -#include +/* Hopefully, grp.h declares initgroups(). If we run into a platform + where it doesn't, we could consider declaring it here as well. */ +#include -#ifndef UTMP_FILE -# ifdef _PATH_UTMP -# define UTMP_FILE _PATH_UTMP -# else -# define UTMP_FILE "/etc/utmp" -# endif +/* 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 DB_DBM_HSEARCH +#endif /* Use DB_DBM_HSEARCH to prevent warning from gcc -Wunused-macros. */ +#ifdef NDBM_HEADER +#include NDBM_HEADER #endif +#ifdef HAVE_GETUTXENT +#include +#endif /* HAVE_GETUTXENT */ + static struct swit switches[] = { #define ADDRSW 0 { "addr address", 0 }, @@ -70,7 +85,7 @@ static struct swit switches[] = { #define VERSIONSW 13 { "version", 0 }, #define HELPSW 14 - { "help", 4 }, + { "help", 0 }, { NULL, 0 } }; @@ -164,7 +179,7 @@ static int timely (char *, char *); static int usr_file (int, char *, int); static int usr_pipe (int, char *, char *, char **, int); static int usr_folder (int, char *); -static RETSIGTYPE alrmser (int); +static void alrmser (int); static void get_sender (char *, char **); static int copy_message (int, char *, int); static void verbose_printf (char *fmt, ...); @@ -207,13 +222,12 @@ main (int argc, char **argv) adios (NULL, "-%s unknown", cp); case HELPSW: - snprintf (buf, sizeof(buf), - "%s [switches] [address info sender]", invo_name); + snprintf (buf, sizeof(buf), "%s [switches]", invo_name); print_help (buf, switches, 0); - done (1); + done (0); case VERSIONSW: print_version(invo_name); - done (1); + done (0); case ADDRSW: if (!(addr = *argp++))/* allow -xyz arguments */ @@ -269,20 +283,8 @@ main (int argc, char **argv) debug++; continue; } - } - - switch (argp - (argv + 1)) { - case 1: - addr = cp; - break; - - case 2: - info = cp; - break; - - case 3: - sender = cp; - break; + } else { + adios (NULL, "only switch arguments are supported"); } } @@ -334,18 +336,29 @@ main (int argc, char **argv) if ((fd = copy_message (fileno (stdin), tmpfil, 1)) == -1) adios (NULL, "unable to create temporary file"); } + if (debug) debug_printf ("temporary file=\"%s\"\n", tmpfil); - else - unlink (tmpfil); + + /* Delete the temp file now or a copy of every single message passed through + slocal will be left in the /tmp directory until deleted manually! This + unlink() used to be under an 'else' of the 'if (debug)' above, but since + some people like to always run slocal with -debug and log the results, + the /tmp directory would get choked over time. Of course, now that we + always delete the temp file, the "temporary file=" message above is + somewhat pointless -- someone watching debug output wouldn't have a + chance to 'tail -f' or 'ln' the temp file before it's unlinked. The best + thing would be to delay this unlink() until later if debug == 1, but I'll + leave that for someone who cares about the temp-file-accessing + functionality (they'll have to watch out for cases where we adios()). */ + unlink (tmpfil); if (!(fp = fdopen (fd, "r+"))) adios (NULL, "unable to access temporary file"); /* * If no sender given, extract it - * from envelope information. - */ + * from envelope information. */ if (sender == NULL) get_sender (envelope, &sender); @@ -374,6 +387,7 @@ main (int argc, char **argv) status = localmail (fd, mdlvr); done (status != -1 ? RCV_MOK : RCV_MBX); + return 1; } @@ -401,11 +415,7 @@ localmail (int fd, char *mdlvr) verbose_printf ("(delivering to standard mail spool)\n"); /* last resort - deliver to standard mail spool */ -#ifdef SLOCAL_MBOX return usr_file (fd, mbox, MBOX_FORMAT); -#else - return usr_file (fd, mbox, MMDF_FORMAT); -#endif } @@ -418,7 +428,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]; @@ -515,7 +525,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) @@ -534,7 +544,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; @@ -564,7 +574,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); @@ -575,7 +585,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"; @@ -588,12 +598,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); @@ -601,12 +611,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 '>': @@ -616,12 +626,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++; } @@ -642,7 +654,7 @@ static int split (char *cp, char **vec) { int i; - char *s; + unsigned char *s; s = cp; @@ -738,9 +750,9 @@ 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 ((cp = p->p_value)) { if (p->p_flags & P_ADR) { dp = cp + strlen (cp) - 1; if (*dp == '\n') @@ -749,6 +761,7 @@ parse (int fd) } else { cp = add ("\t", cp); } + } p->p_value = add (lp, cp); } free (lp); @@ -891,7 +904,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; @@ -906,30 +919,29 @@ lookup (struct pair *pairs, char *key) static int logged_in (void) { - struct utmp ut; - FILE *uf; +#if HAVE_GETUTXENT + struct utmpx *utp; if (utmped) - return utmped; - - if ((uf = fopen (UTMP_FILE, "r")) == NULL) - return NOTOK; - - while (fread ((char *) &ut, sizeof(ut), 1, uf) == 1) { - if (ut.ut_name[0] != 0 - && strncmp (user, ut.ut_name, sizeof(ut.ut_name)) == 0) { - if (debug) - continue; - fclose (uf); - return (utmped = DONE); - } + return utmped; + + setutxent(); + + while ((utp = getutxent()) != NULL) { + if ( utp->ut_type == USER_PROCESS && utp->ut_user[0] != 0 + && strncmp (user, utp->ut_user, sizeof(utp->ut_user)) == 0) { + if (debug) + continue; + endutxent(); + return (utmped = DONE); + } } - fclose (uf); + endutxent(); +#endif /* HAVE_GETUTXENT */ return (utmped = NOTOK); } - #define check(t,a,b) if (t < a || t > b) return -1 #define cmpar(h1,m1,h2,m2) if (h1 < h2 || (h1 == h2 && m1 < m2)) return 0 @@ -994,7 +1006,11 @@ usr_file (int fd, char *mailbox, int mbx_style) } /* close and unlock file */ - mbx_close (mailbox, md); + if (mbx_close (mailbox, md) == NOTOK) { + if (verbose) + adorn ("", "error closing:"); + return -1; + } if (verbose) verbose_printf (", success.\n"); @@ -1028,18 +1044,6 @@ usr_folder (int fd, char *string) /* use rcvstore to put message in folder */ status = usr_pipe (fd, "rcvstore", rcvstoreproc, vec, 1); -#if 0 - /* - * Currently, verbose status messages are handled by usr_pipe(). - */ - if (verbose) { - if (status == 0) - verbose_printf (", success.\n"); - else - verbose_printf (", failed.\n"); - } -#endif - return status; } @@ -1098,7 +1102,7 @@ usr_pipe (int fd, char *cmd, char *pgm, char **vec, int suppress) default: /* parent process */ - if (!setjmp (myctx)) { + if (! setjmp (myctx)) { SIGNAL (SIGALRM, alrmser); bytes = fstat (fd, &st) != -1 ? (int) st.st_size : 100; @@ -1116,10 +1120,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"); @@ -1135,7 +1135,7 @@ usr_pipe (int fd, char *cmd, char *pgm, char **vec, int suppress) * Ruthlessly kill the child and anything * else in its process group. */ - KILLPG(child_id, SIGKILL); + killpg(child_id, SIGKILL); if (verbose) verbose_printf (", timed-out; terminated\n"); return -1; @@ -1144,12 +1144,10 @@ usr_pipe (int fd, char *cmd, char *pgm, char **vec, int suppress) } -static RETSIGTYPE +static void alrmser (int i) { -#ifndef RELIABLE_SIGNALS - SIGNAL (SIGALRM, alrmser); -#endif + NMH_UNUSED (i); longjmp (myctx, DONE); } @@ -1164,8 +1162,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 (""); @@ -1205,12 +1203,12 @@ copy_message (int qd, char *tmpfil, int fold) int i, first = 1, fd1, fd2; char buffer[BUFSIZ]; FILE *qfp, *ffp; + char *tfile = NULL; - strcpy (tmpfil, m_tmpfil (invo_name)); - - /* open temporary file to put message in */ - if ((fd1 = open (tmpfil, O_RDWR | O_CREAT | O_TRUNC, 0600)) == -1) - return -1; + tfile = m_mktemp2(NULL, invo_name, &fd1, NULL); + if (tfile == NULL) return -1; + fchmod(fd1, 0600); + strncpy (tmpfil, tfile, BUFSIZ); if (!fold) { while ((i = read (qd, buffer, sizeof(buffer))) > 0) @@ -1264,46 +1262,9 @@ you_lose: if (first) { first = 0; if (!strncmp (buffer, "From ", i)) { -#ifdef RPATHS - char *fp, *cp, *hp, *ep; -#endif /* get copy of envelope information ("From " line) */ envelope = getcpy (buffer); -#if 0 - /* First go ahead and put "From " line in message */ - fputs (buffer, ffp); - if (ferror (ffp)) - goto fputs_error; -#endif - -#ifdef RPATHS - /* - * Now create a "Return-Path:" line - * from the "From " line. - */ - hp = cp = strchr(fp = envelope + i, ' '); - while ((hp = strchr(++hp, 'r'))) - if (uprf (hp, "remote from")) { - hp = strrchr(hp, ' '); - break; - } - if (hp) { - /* 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); - } else { - /* return path for standard domain addressing */ - snprintf (buffer, sizeof(buffer), "Return-Path: %.*s\n", - cp - fp, fp); - } - - /* Add Return-Path header to message */ - fputs (buffer, ffp); - if (ferror (ffp)) - goto fputs_error; -#endif /* Put the delivery date in message */ fputs (ddate, ffp); if (ferror (ffp)) @@ -1344,7 +1305,7 @@ static char * trim (char *cp) { char buffer[BUFSIZ*4]; - char *bp, *sp; + unsigned char *bp, *sp; if (cp == NULL) return NULL; @@ -1469,7 +1430,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;