X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/f2753d64be0a74a22018e03ec9c04cc9ca45d3ab..0b7286788a95dd854d1826b8493eda431d8e8aac:/uip/slocal.c diff --git a/uip/slocal.c b/uip/slocal.c index 60b222d7..9f784f8d 100644 --- a/uip/slocal.c +++ b/uip/slocal.c @@ -19,15 +19,22 @@ * Ruud de Rooij Sun, 28 May 2000 17:28:55 +0200 */ -#include -#include -#include -#include +#include "h/mh.h" +#include "sbr/ambigsw.h" +#include "sbr/pidstatus.h" +#include "sbr/print_version.h" +#include "sbr/print_help.h" +#include "sbr/error.h" +#include "h/dropsbr.h" +#include "h/rcvmail.h" +#include "h/signals.h" #include -#include -#include -#include -#include "../sbr/m_mktemp.h" +#include "h/tws.h" +#include "h/mts.h" +#include "h/done.h" +#include "h/utils.h" +#include "sbr/lock_file.h" +#include "sbr/m_mktemp.h" #include #include @@ -81,10 +88,10 @@ DEFINE_SWITCH_ARRAY(SLOCAL, switches); static int globbed = 0; /* have we built "vars" table yet? */ static int parsed = 0; /* have we built header field table yet */ static int utmped = 0; /* have we scanned umtp(x) file yet */ -static int suppressdup = 0; /* are we suppressing duplicate messages? */ +static bool suppressdup; /* are we suppressing duplicate messages? */ -static int verbose = 0; -static int debug = 0; +static bool verbose; +static bool debug; static char *addr = NULL; static char *user = NULL; @@ -162,7 +169,7 @@ static int split (char *, char **); static int parse (int); static void expand (char *, char *, int); static void glob (int); -static struct pair *lookup (struct pair *, char *); +static struct pair *lookup (struct pair *, char *) PURE; static int logged_in (void); static int timely (char *, char *); static int usr_file (int, char *, int); @@ -171,9 +178,9 @@ static int usr_folder (int, char *); static void alrmser (int); static void get_sender (char *, char **); static int copy_message (int, char *, int); -static void verbose_printf (char *fmt, ...); -static void adorn (char *, char *, ...); -static void debug_printf (char *fmt, ...); +static void verbose_printf (char *fmt, ...) CHECK_PRINTF(1, 2); +static void adorn (char *, char *, ...) CHECK_PRINTF(2, 3); +static void debug_printf (char *fmt, ...) CHECK_PRINTF(1, 2); static int suppress_duplicates (int, char *); static char *trim (char *); @@ -187,7 +194,7 @@ main (int argc, char **argv) char mailbox[BUFSIZ], tmpfil[BUFSIZ]; char **argp, **arguments; - if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; } + if (nmh_init(argv[0], false, false)) { return 1; } mts_init (); arguments = getarguments (invo_name, argc, argv, 0); @@ -201,7 +208,7 @@ main (int argc, char **argv) ambigsw (cp, switches); done (1); case UNKWNSW: - adios (NULL, "-%s unknown", cp); + die("-%s unknown", cp); case HELPSW: snprintf (buf, sizeof(buf), "%s [switches]", invo_name); @@ -213,60 +220,60 @@ main (int argc, char **argv) case ADDRSW: if (!(addr = *argp++))/* allow -xyz arguments */ - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case INFOSW: if (!(info = *argp++))/* allow -xyz arguments */ - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case USERSW: if (!(user = *argp++))/* allow -xyz arguments */ - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case FILESW: if (!(file = *argp++) || *file == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case SENDERSW: if (!(sender = *argp++))/* allow -xyz arguments */ - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case MAILBOXSW: if (!(mbox = *argp++) || *mbox == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case HOMESW: if (!(home = *argp++) || *home == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case MAILSW: if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); if (mdlvr) - adios (NULL, "only one maildelivery file at a time!"); + die("only one maildelivery file at a time!"); mdlvr = cp; continue; case VERBSW: - verbose++; + verbose = true; continue; case NVERBSW: - verbose = 0; + verbose = false; continue; case SUPPRESSDUP: - suppressdup++; + suppressdup = true; continue; case NSUPPRESSDUP: - suppressdup = 0; + suppressdup = false; continue; case DEBUGSW: - debug++; + debug = true; continue; } } else { - adios (NULL, "only switch arguments are supported"); + die("only switch arguments are supported"); } } @@ -276,7 +283,7 @@ main (int argc, char **argv) user = getusername (); } if ((pw = getpwnam (user)) == NULL) - adios (NULL, "no such local user as %s", user); + die("no such local user as %s", user); if (chdir (pw->pw_dir) == -1) if (chdir ("/") < 0) { @@ -301,7 +308,7 @@ main (int argc, char **argv) /* Record the delivery time */ if ((now = dlocaltimenow ()) == NULL) - adios (NULL, "unable to ascertain local time"); + die("unable to ascertain local time"); snprintf (ddate, sizeof(ddate), "Delivery-Date: %s\n", dtimenow (0)); /* @@ -316,7 +323,7 @@ main (int argc, char **argv) if (debug) debug_printf ("retrieving message from file \"%s\"\n", file); if ((fd = copy_message (tempfd, tmpfil, 1)) == -1) - adios(NULL, "unable to create temporary file in %s", + die("unable to create temporary file in %s", get_temp_dir()); close (tempfd); } else { @@ -324,7 +331,7 @@ main (int argc, char **argv) if (debug) debug_printf ("retrieving message from stdin\n"); if ((fd = copy_message (fileno (stdin), tmpfil, 1)) == -1) - adios(NULL, "unable to create temporary file in %s", + die("unable to create temporary file in %s", get_temp_dir()); } @@ -345,7 +352,7 @@ main (int argc, char **argv) (void) m_unlink (tmpfil); if (!(fp = fdopen (fd, "r+"))) - adios (NULL, "unable to access temporary file"); + die("unable to access temporary file"); /* * If no sender given, extract it @@ -419,7 +426,12 @@ localmail (int fd, char *mdlvr) static int usr_delivery (int fd, char *delivery, int su) { - int i, accept, status=1, won, vecp, next; + int i; + bool accept; + int status=1; + bool won; + int vecp; + bool next; char *field, *pattern, *action, *result, *string; char buffer[BUFSIZ], tmpbuf[BUFSIZ]; char *vec[NVEC]; @@ -442,8 +454,8 @@ usr_delivery (int fd, char *delivery, int su) return -1; } - won = 0; - next = 1; + won = false; + next = true; /* read and process delivery file */ while (fgets (buffer, sizeof(buffer), fp)) { @@ -501,7 +513,7 @@ usr_delivery (int fd, char *delivery, int su) * Take action, and consider delivered if * action is successful. */ - accept = 1; + accept = true; break; case 'R': @@ -511,7 +523,7 @@ usr_delivery (int fd, char *delivery, int su) * Take action, but don't consider delivered, even * if action is successful */ - accept = 0; + accept = false; break; } @@ -554,9 +566,9 @@ usr_delivery (int fd, char *delivery, int su) */ if ((p = lookup (hdrs, field)) && (p->p_value != NULL) && matches (p->p_value, pattern)) { - next = 1; + next = true; } else { - next = 0; + next = false; continue; } break; @@ -628,14 +640,14 @@ usr_delivery (int fd, char *delivery, int su) break; } - if (status) next = 0; /* action failed, mark for 'N' result */ + if (status) next = false; /* action failed, mark for 'N' result */ if (accept && status == 0) - won++; + won = true; } fclose (fp); - return (won ? 0 : -1); + return won ? 0 : -1; } @@ -712,7 +724,7 @@ parse (int fd) char name[NAMESZ], field[NMH_BUFSIZ]; struct pair *p, *q; FILE *in; - m_getfld_state_t gstate = 0; + m_getfld_state_t gstate; if (parsed++) return 0; @@ -736,15 +748,16 @@ parse (int fd) * Scan the headers of the message and build * a lookup table. */ + gstate = m_getfld_state_init(in); for (i = 0;;) { int fieldsz = sizeof field; - switch (state = m_getfld (&gstate, name, field, &fieldsz, in)) { + switch (state = m_getfld2(&gstate, name, field, &fieldsz)) { case FLD: case FLDPLUS: lp = mh_xstrdup(field); while (state == FLDPLUS) { fieldsz = sizeof field; - state = m_getfld (&gstate, name, field, &fieldsz, in); + state = m_getfld2(&gstate, name, field, &fieldsz); lp = add (field, lp); } for (p = hdrs; p->p_name; p++) { @@ -785,7 +798,7 @@ parse (int fd) break; default: - inform("internal error in m_getfld"); + inform("internal error in m_getfld2"); fclose (in); return -1; } @@ -800,12 +813,12 @@ parse (int fd) p->p_value = getcpy (q ? q->p_value : ""); p->p_flags &= ~P_CHK; if (debug) - debug_printf ("vars[%d]: name=\"%s\" value=\"%s\"\n", - p - vars, p->p_name, trim(p->p_value)); + debug_printf ("vars[%td]: name=\"%s\" value=\"%s\"\n", + p - vars, p->p_name, trim(p->p_value)); } if (debug) { for (p = hdrs; p->p_name; p++) - debug_printf ("hdrs[%d]: name=\"%s\" value=\"%s\"\n", + debug_printf ("hdrs[%td]: name=\"%s\" value=\"%s\"\n", p - hdrs, p->p_name, p->p_value ? trim(p->p_value) : ""); } @@ -885,7 +898,7 @@ glob (int fd) if (debug) { for (p = vars; p->p_name; p++) - debug_printf ("vars[%d]: name=\"%s\" value=\"%s\"\n", + debug_printf ("vars[%td]: name=\"%s\" value=\"%s\"\n", p - vars, p->p_name, trim(p->p_value)); } } @@ -929,13 +942,13 @@ logged_in (void) if (debug) continue; endutxent(); - return (utmped = DONE); + return utmped = DONE; } } endutxent(); #endif /* HAVE_GETUTXENT */ - return (utmped = NOTOK); + return utmped = NOTOK; } #define check(t,a,b) if (t < a || t > b) return -1 @@ -970,19 +983,11 @@ timely (char *t1, char *t2) static int usr_file (int fd, char *mailbox, int mbx_style) { - int md, mapping; - - if (verbose) - verbose_printf ("delivering to file \"%s\"", mailbox); + int md; - if (mbx_style == MBOX_FORMAT) { - if (verbose) - verbose_printf (" (mbox style)"); - mapping = 0; - } else { - if (verbose) - verbose_printf (" (mmdf style)"); - mapping = 1; + if (verbose) { + verbose_printf("delivering to file \"%s\" (%s style)", mailbox, + mbx_style == MBOX_FORMAT ? "mbox" : "mmdf"); } /* open and lock the file */ @@ -992,10 +997,10 @@ usr_file (int fd, char *mailbox, int mbx_style) return -1; } - lseek (fd, (off_t) 0, SEEK_SET); + lseek(fd, 0, SEEK_SET); /* append message to file */ - if (mbx_copy (mailbox, mbx_style, md, fd, mapping, NULL, verbose) == -1) { + if (mbx_copy (mailbox, mbx_style, md, fd, NULL) == -1) { if (verbose) adorn ("", "error writing to:"); return -1; @@ -1052,17 +1057,15 @@ usr_pipe (int fd_arg, char *cmd, char *pgm, char **vec, int suppress) { volatile int fd = fd_arg; pid_t child_id; - int i, bytes, seconds, status; + int bytes, seconds, status; struct stat st; if (verbose && !suppress) verbose_printf ("delivering to pipe \"%s\"", cmd); - lseek (fd, (off_t) 0, SEEK_SET); - - for (i = 0; (child_id = fork()) == -1 && i < 5; i++) - sleep (5); + lseek(fd, 0, SEEK_SET); + child_id = fork(); switch (child_id) { case -1: /* fork error */ @@ -1091,7 +1094,7 @@ usr_pipe (int fd_arg, char *cmd, char *pgm, char **vec, int suppress) } #endif /* TIOCNOTTY */ - setpgid ((pid_t) 0, getpid ()); /* put in own process group */ + setpgid(0, getpid()); /* put in own process group */ *environ = NULL; setenv("USER", pw->pw_name, 1); @@ -1099,7 +1102,7 @@ usr_pipe (int fd_arg, char *cmd, char *pgm, char **vec, int suppress) setenv("SHELL", pw->pw_shell, 1); execvp (pgm, vec); - _exit (-1); + _exit(1); default: /* parent process */ @@ -1124,13 +1127,12 @@ usr_pipe (int fd_arg, char *cmd, char *pgm, char **vec, int suppress) if (verbose) { if (status == 0) verbose_printf (", success.\n"); - else - if ((status & 0xff00) == 0xff00) - verbose_printf (", system error\n"); - else - pidstatus (status, stdout, ", failed"); + else if ((status & 0xff00) == 0xff00) + verbose_printf (", system error\n"); + else + pidstatus (status, stdout, ", failed"); } - return (status == 0 ? 0 : -1); + return status == 0 ? 0 : -1; } /* * Ruthlessly kill the child and anything @@ -1219,7 +1221,7 @@ you_lose: } if (i == -1) goto you_lose; - lseek (fd1, (off_t) 0, SEEK_SET); + lseek(fd1, 0, SEEK_SET); return fd1; } @@ -1284,7 +1286,7 @@ you_lose: return -1; } fclose (qfp); - lseek (fd1, (off_t) 0, SEEK_SET); + lseek(fd1, 0, SEEK_SET); return fd1; @@ -1302,7 +1304,7 @@ fputs_error: static char * trim (char *cp) { - char buffer[BUFSIZ*4]; + static char buffer[BUFSIZ * 4]; char *bp, *sp; if (cp == NULL) @@ -1329,8 +1331,7 @@ trim (char *cp) if (isspace((unsigned char) *sp)) *sp = ' '; - /* now return a copy */ - return mh_xstrdup(bp); + return bp; } /* @@ -1363,7 +1364,7 @@ adorn (char *what, char *fmt, ...) char *s; eindex = errno; /* save the errno */ - printf(", "); + fputs(", ", stdout); va_start(ap, fmt); vprintf(fmt, ap); @@ -1412,7 +1413,7 @@ suppress_duplicates (int fd, char *file) datum key, value; DBM *db; FILE *in; - m_getfld_state_t gstate = 0; + m_getfld_state_t gstate; if ((fd1 = dup (fd)) == -1) return -1; @@ -1422,10 +1423,11 @@ suppress_duplicates (int fd, char *file) } rewind (in); + gstate = m_getfld_state_init(in); for (;;) { int failed_to_lock = 0; int bufsz = sizeof buf; - state = m_getfld (&gstate, name, buf, &bufsz, in); + state = m_getfld2(&gstate, name, buf, &bufsz); switch (state) { case FLD: case FLDPLUS: @@ -1433,7 +1435,7 @@ suppress_duplicates (int fd, char *file) if (strcasecmp (name, "Message-ID")) { while (state == FLDPLUS) { bufsz = sizeof buf; - state = m_getfld (&gstate, name, buf, &bufsz, in); + state = m_getfld2(&gstate, name, buf, &bufsz); } continue; } @@ -1441,7 +1443,7 @@ suppress_duplicates (int fd, char *file) cp = mh_xstrdup(buf); while (state == FLDPLUS) { bufsz = sizeof buf; - state = m_getfld (&gstate, name, buf, &bufsz, in); + state = m_getfld2(&gstate, name, buf, &bufsz); cp = add (buf, cp); } key.dptr = trimcpy (cp);