Renamed -version switch to -Version to remove the conflict with -verbose.
[mmh] / uip / slocal.c
index 3713954..bd6b0a2 100644 (file)
 **
 */
 
-/* Changed to use getutent() and friends.  Assumes that when getutent() exists,
-** a number of other things also exist.  Please check.
-** Ruud de Rooij <ruud@ruud.org>  Sun, 28 May 2000 17:28:55 +0200
-*/
 
 #include <h/mh.h>
 #include <h/rcvmail.h>
 extern int  initgroups(char*, int);
 #endif
 
-#include <utmp.h>
-
-#ifndef HAVE_GETUTENT
-# ifndef UTMP_FILE
-#  ifdef _PATH_UTMP
-#   define UTMP_FILE _PATH_UTMP
-#  else
-#   define UTMP_FILE "/etc/utmp"
-#  endif
-# endif
-#endif
-
 static struct swit switches[] = {
 #define ADDRSW  0
        { "addr address", 0 },
@@ -79,20 +63,15 @@ static struct swit switches[] = {
 #define DEBUGSW  10
        { "debug", 0 },
 #define VERSIONSW  11
-       { "version", 0 },
+       { "Version", 0 },
 #define HELPSW  12
        { "help", 0 },
        { NULL, 0 }
 };
 
 
-/* global maildelivery file */
-char *maildelivery = NMHETCDIR"/maildelivery";
-
-
 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 verbose = 0;
 static int debug = 0;
@@ -174,12 +153,10 @@ static int parse(int);
 static void expand(char *, char *, int);
 static void glob(int);
 static struct pair *lookup(struct pair *, char *);
-static int logged_in(void);
-static int timely(char *, char *);
 static int usr_file(int, char *);
 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, ...);
@@ -342,7 +319,7 @@ main(int argc, char **argv)
        if (!(now = dlocaltimenow())) {
                adios(NULL, "unable to ascertain local time");
        }
-       snprintf(ddate, sizeof(ddate), "Delivery-Date: %s\n", dtimenow(0));
+       snprintf(ddate, sizeof(ddate), "Delivery-Date: %s\n", dtimenow());
 
        /*
        ** Copy the message to a temporary file
@@ -437,12 +414,15 @@ main(int argc, char **argv)
 static int
 localmail(int fd, char *mdlvr)
 {
+       char buf[BUFSIZ];
+
        /* delivery according to personal Maildelivery file */
        if (usr_delivery(fd, mdlvr ? mdlvr : ".maildelivery", 0) != -1) {
                return 0;
        }
        /* delivery according to global Maildelivery file */
-       if (usr_delivery(fd, maildelivery, 1) != -1) {
+       snprintf(buf, sizeof buf, "%s/%s", mhetcdir, "maildelivery");
+       if (usr_delivery(fd, buf, 1) != -1) {
                return 0;
        }
        if (verbose) {
@@ -563,15 +543,6 @@ usr_delivery(int fd, char *delivery, int su)
                        break;
                }
 
-               if (vecp > 5 && mh_strcasecmp(vec[5], "select")==0) {
-                       if (logged_in() != -1) {
-                               continue;
-                       }
-                       if (vecp > 7 && timely(vec[6], vec[7]) == -1) {
-                               continue;
-                       }
-               }
-
                /* check if the field matches */
                switch (*field) {
                case '*':
@@ -967,96 +938,6 @@ lookup(struct pair *pairs, char *key)
 
 
 /*
-** Check utmp(x) file to see if user is currently
-** logged in.
-*/
-#ifdef HAVE_GETUTENT
-static int
-logged_in(void)
-{
-       struct utmp * utp;
-
-       if (utmped) {
-               return utmped;
-       }
-       setutent();
-
-       while ((utp = getutent())) {
-               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();
-                       return (utmped = DONE);
-               }
-       }
-
-       endutent();
-       return (utmped = NOTOK);
-}
-#else
-static int
-logged_in(void)
-{
-       struct utmp ut;
-       FILE *uf;
-
-       if (utmped) {
-               return utmped;
-       }
-       if (!(uf = fopen(UTMP_FILE, "r"))) {
-               return NOTOK;
-       }
-       while (fread((char *) &ut, sizeof(ut), 1, uf) == 1) {
-               if (ut.ut_name[0] && strncmp(user, ut.ut_name,
-                               sizeof(ut.ut_name))==0) {
-                       if (debug) {
-                               continue;
-                       }
-                       fclose(uf);
-                       return (utmped = DONE);
-               }
-       }
-       fclose(uf);
-       return (utmped = NOTOK);
-}
-#endif
-
-#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
-
-static int
-timely(char *t1, char *t2)
-{
-       int t1hours, t1mins, t2hours, t2mins;
-
-       if (sscanf(t1, "%d:%d", &t1hours, &t1mins) != 2) {
-               return -1;
-       }
-       check(t1hours, 0, 23);
-       check(t1mins, 0, 59);
-
-       if (sscanf(t2, "%d:%d", &t2hours, &t2mins) != 2) {
-               return -1;
-       }
-       check(t2hours, 0, 23);
-       check(t2mins, 0, 59);
-
-       cmpar(now->tw_hour, now->tw_min, t1hours, t1mins);
-       cmpar(t2hours, t2mins, now->tw_hour, now->tw_min);
-
-       return -1;
-}
-
-
-/*
 ** Deliver message by appending to a file, using rcvpack(1).
 */
 static int
@@ -1097,7 +978,7 @@ usr_folder(int fd, char *string)
        vec[1] = folder;
        vec[2] = NULL;
 
-       return usr_pipe(fd, "rcvstore", rcvstoreproc, vec, 1);
+       return usr_pipe(fd, "rcvstore", "rcvstore", vec, 1);
 }
 
 /*
@@ -1107,8 +988,9 @@ static int
 usr_pipe(int fd, char *cmd, char *pgm, char **vec, int suppress)
 {
        pid_t child_id;
-       int bytes, seconds, status;
+       int bytes, seconds, status, n;
        struct stat st;
+       char *path;
 
        if (verbose && !suppress) {
                verbose_printf("delivering to pipe \"%s\"", cmd);
@@ -1133,7 +1015,9 @@ usr_pipe(int fd, char *cmd, char *pgm, char **vec, int suppress)
                if (fd != 3) {
                        dup2(fd, 3);
                }
-               closefds(4);
+               for (n=4; n<OPEN_MAX; n++) {
+                       close(n);
+               }
 
 #ifdef TIOCNOTTY
                if ((fd = open("/dev/tty", O_RDWR)) != -1) {
@@ -1145,10 +1029,12 @@ usr_pipe(int fd, char *cmd, char *pgm, char **vec, int suppress)
                /* put in own process group */
                setpgid((pid_t) 0, getpid());
 
+               path = getenv("PATH");
                *environ = NULL;
                m_putenv("USER", pw->pw_name);
                m_putenv("HOME", pw->pw_dir);
                m_putenv("SHELL", pw->pw_shell);
+               m_putenv("PATH", path);
 
                execvp(pgm, vec);
                _exit(-1);
@@ -1160,7 +1046,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);
+                       kill(-child_id, SIGKILL);
                        if (verbose)
                                verbose_printf(", timed-out; terminated\n");
                        return -1;
@@ -1196,13 +1082,9 @@ 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
-
        longjmp(myctx, DONE);
 }
 
@@ -1225,6 +1107,7 @@ get_sender(char *envelope, char **sender)
 
        i = strlen("From ");
        strncpy(buffer, envelope + i, sizeof(buffer));
+       buffer[sizeof buffer -1] = '\0';  /* ensure termination */
        if ((cp = strchr(buffer, '\n'))) {
                *cp = '\0';
                cp -= 24;
@@ -1259,7 +1142,7 @@ copy_message(int qd, char *tmpfil, int fold)
        FILE *qfp, *ffp;
        char *tfile = NULL;
 
-       tfile = m_mktemp2(NULL, invo_name, &fd1, NULL);
+       tfile = m_mktemp2("/tmp/", invo_name, &fd1, NULL);
        if (tfile == NULL) return -1;
        fchmod(fd1, 0600);
        strncpy(tmpfil, tfile, BUFSIZ);
@@ -1318,44 +1201,12 @@ you_lose:
                if (first) {
                        first = 0;
                        if (strncmp(buffer, "From ", i)==0) {
-                               char *fp, *cp, *hp, *ep;
                                /*
                                ** get copy of envelope information
                                ** ("From " line)
                                */
                                envelope = getcpy(buffer);
 
-                               /*
-                               ** 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", (int)(ep - hp), hp, (int)(cp - fp), fp);
-                               } else {
-                                       /*
-                                       ** return path for standard domain
-                                       ** addressing
-                                       */
-                                       snprintf(buffer, sizeof(buffer), "Return-Path: %.*s\n", (int)(cp - fp), fp);
-                               }
-
-                               /* Add Return-Path header to message */
-                               fputs(buffer, ffp);
-                               if (ferror(ffp)) {
-                                       goto fputs_error;
-                               }
                                /* Put the delivery date in message */
                                fputs(ddate, ffp);
                                if (ferror(ffp)) {