X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/17932f7aea1c21cf17738f47996345d9d0a6ce51..9cc2510:/uip/slocal.c diff --git a/uip/slocal.c b/uip/slocal.c index ebc2c26b..a26432c5 100644 --- a/uip/slocal.c +++ b/uip/slocal.c @@ -31,7 +31,6 @@ #include #include -#include #include #include @@ -184,19 +183,12 @@ int main (int argc, char **argv) { int fd, status; - FILE *fp = stdin; + FILE *fp; char *cp, *mdlvr = NULL, buf[BUFSIZ]; char mailbox[BUFSIZ], tmpfil[BUFSIZ]; char **argp, **arguments; -#ifdef LOCALE - setlocale(LC_ALL, ""); -#endif - invo_name = r1bindex (*argv, '/'); - - /* foil search of user profile/context */ - if (context_foil (NULL) == -1) - done (1); + if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; } mts_init (invo_name); arguments = getarguments (invo_name, argc, argv, 0); @@ -287,15 +279,21 @@ main (int argc, char **argv) adios (NULL, "no such local user as %s", user); if (chdir (pw->pw_dir) == -1) - chdir ("/"); + if (chdir ("/") < 0) { + advise ("/", "chdir"); + } umask (0077); if (geteuid() == 0) { - setgid (pw->pw_gid); + if (setgid (pw->pw_gid) != 0) { + adios ("setgid", "unable to set group to %ld", (long) pw->pw_gid); + } initgroups (pw->pw_name, pw->pw_gid); - setuid (pw->pw_uid); + if (setuid (pw->pw_uid) != 0) { + adios ("setuid", "unable to set user to %ld", (long) pw->pw_uid); + } } - + if (info == NULL) info = ""; @@ -318,14 +316,16 @@ 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"); + adios(NULL, "unable to create temporary file in %s", + get_temp_dir()); close (tempfd); } else { /* getting message from stdin */ 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"); + adios(NULL, "unable to create temporary file in %s", + get_temp_dir()); } if (debug) @@ -342,7 +342,7 @@ main (int argc, char **argv) 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); + (void) m_unlink (tmpfil); if (!(fp = fdopen (fd, "r+"))) adios (NULL, "unable to access temporary file"); @@ -516,7 +516,7 @@ usr_delivery (int fd, char *delivery, int su) } if (vecp > 5) { - if (!mh_strcasecmp (vec[5], "select")) { + if (!strcasecmp (vec[5], "select")) { if (logged_in () != -1) continue; if (vecp > 7 && timely (vec[6], vec[7]) == -1) @@ -535,7 +535,7 @@ usr_delivery (int fd, char *delivery, int su) * "default" matches only if the message hasn't * been delivered yet. */ - if (!mh_strcasecmp (field, "default")) { + if (!strcasecmp (field, "default")) { if (won) continue; break; @@ -565,7 +565,7 @@ usr_delivery (int fd, char *delivery, int su) switch (*action) { case 'q': /* deliver to quoted pipe */ - if (mh_strcasecmp (action, "qpipe")) + if (strcasecmp (action, "qpipe")) continue; /* else fall */ case '^': expand (tmpbuf, string, fd); @@ -576,7 +576,7 @@ usr_delivery (int fd, char *delivery, int su) case 'p': /* deliver to pipe */ - if (mh_strcasecmp (action, "pipe")) + if (strcasecmp (action, "pipe")) continue; /* else fall */ case '|': vec[2] = "sh"; @@ -589,12 +589,12 @@ usr_delivery (int fd, char *delivery, int su) case 'f': /* mbox format */ - if (!mh_strcasecmp (action, "file")) { + if (!strcasecmp (action, "file")) { status = usr_file (fd, string, MBOX_FORMAT); break; } /* deliver to nmh folder */ - else if (mh_strcasecmp (action, "folder")) + else if (strcasecmp (action, "folder")) continue; /* else fall */ case '+': status = usr_folder (fd, string); @@ -602,12 +602,12 @@ usr_delivery (int fd, char *delivery, int su) case 'm': /* mmdf format */ - if (!mh_strcasecmp (action, "mmdf")) { + if (!strcasecmp (action, "mmdf")) { status = usr_file (fd, string, MMDF_FORMAT); break; } /* mbox format */ - else if (mh_strcasecmp (action, "mbox")) + else if (strcasecmp (action, "mbox")) continue; /* else fall */ case '>': @@ -617,7 +617,7 @@ usr_delivery (int fd, char *delivery, int su) case 'd': /* ignore message */ - if (mh_strcasecmp (action, "destroy")) + if (strcasecmp (action, "destroy")) continue; status = 0; break; @@ -743,7 +743,7 @@ parse (int fd) lp = add (field, lp); } for (p = hdrs; p->p_name; p++) { - if (!mh_strcasecmp (p->p_name, name)) { + if (!strcasecmp (p->p_name, name)) { if (!(p->p_flags & P_HID)) { if ((cp = p->p_value)) { if (p->p_flags & P_ADR) { @@ -895,7 +895,7 @@ static struct pair * lookup (struct pair *pairs, char *key) { for (; pairs->p_name; pairs++) - if (!mh_strcasecmp (pairs->p_name, key)) + if (!strcasecmp (pairs->p_name, key)) return pairs; return NULL; @@ -1043,8 +1043,9 @@ usr_folder (int fd, char *string) */ static int -usr_pipe (int fd, char *cmd, char *pgm, char **vec, int suppress) +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; struct stat st; @@ -1068,8 +1069,12 @@ usr_pipe (int fd, char *cmd, char *pgm, char **vec, int suppress) /* child process */ if (fd != 0) dup2 (fd, 0); - freopen ("/dev/null", "w", stdout); - freopen ("/dev/null", "w", stderr); + if (freopen ("/dev/null", "w", stdout) == NULL) { + advise ("stdout", "freopen"); + } + if (freopen ("/dev/null", "w", stderr) == NULL) { + advise ("stderr", "freopen"); + } if (fd != 3) dup2 (fd, 3); closefds (4); @@ -1198,7 +1203,6 @@ copy_message (int qd, char *tmpfil, int fold) tfile = m_mktemp2(NULL, invo_name, &fd1, NULL); if (tfile == NULL) return -1; - fchmod(fd1, 0600); strncpy (tmpfil, tfile, BUFSIZ); if (!fold) { @@ -1206,7 +1210,7 @@ copy_message (int qd, char *tmpfil, int fold) if (write (fd1, buffer, i) != i) { you_lose: close (fd1); - unlink (tmpfil); + (void) m_unlink (tmpfil); return -1; } if (i == -1) @@ -1416,13 +1420,14 @@ suppress_duplicates (int fd, char *file) rewind (in); for (;;) { + int failed_to_lock = 0; int bufsz = sizeof buf; state = m_getfld (&gstate, name, buf, &bufsz, in); switch (state) { case FLD: case FLDPLUS: /* Search for the message ID */ - if (mh_strcasecmp (name, "Message-ID")) { + if (strcasecmp (name, "Message-ID")) { while (state == FLDPLUS) { bufsz = sizeof buf; state = m_getfld (&gstate, name, buf, &bufsz, in); @@ -1453,7 +1458,8 @@ suppress_duplicates (int fd, char *file) * This will fail if your Maildelivery file doesn't * exist. */ - if ((lockfd = lkopendata(file, O_RDWR, 0)) == -1) { + if ((lockfd = lkopendata(file, O_RDWR, 0, &failed_to_lock)) + == -1) { advise (file, "unable to perform file locking on"); free (cp); fclose (in); @@ -1478,7 +1484,6 @@ suppress_duplicates (int fd, char *file) free (cp); fclose (in); return result; - break; case BODY: case FILEEOF: