X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fslocal.c;h=bd6b0a2714dc49c5e0b2a904bb68be518cb1de63;hp=3713954abcdef817ba9ed5e22d4f4ce19d3fb73f;hb=32b2354dbaf4bf934936eb5b102a4a3d2fdd209a;hpb=e954d689b5adafa4ec74e7dbd1e087dbf998f6d6 diff --git a/uip/slocal.c b/uip/slocal.c index 3713954..bd6b0a2 100644 --- a/uip/slocal.c +++ b/uip/slocal.c @@ -15,10 +15,6 @@ ** */ -/* 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 @@ -43,18 +39,6 @@ extern int initgroups(char*, int); #endif -#include - -#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; npw_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)) {