X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/43a65e9777214029046fe7a1427493e6e503a717..ef1ba39e8dae81091b6c3e73e72825ef6edea3c6:/uip/slocal.c?ds=sidebyside diff --git a/uip/slocal.c b/uip/slocal.c index c944cd69..772c4e2b 100644 --- a/uip/slocal.c +++ b/uip/slocal.c @@ -183,21 +183,14 @@ 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); + mts_init (); arguments = getarguments (invo_name, argc, argv, 0); argp = arguments; @@ -280,21 +273,28 @@ main (int argc, char **argv) if (addr == NULL) addr = getusername (); - if (user == NULL) - user = (cp = strchr(addr, '.')) ? ++cp : addr; + if (user == NULL) { + user = getusername (); + } if ((pw = getpwnam (user)) == NULL) 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 = ""; @@ -317,14 +317,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) @@ -341,7 +343,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"); @@ -421,7 +423,7 @@ usr_delivery (int fd, char *delivery, int su) int i, accept, status=1, won, vecp, next; char *field, *pattern, *action, *result, *string; char buffer[BUFSIZ], tmpbuf[BUFSIZ]; - char *cp, *vec[NVEC]; + char *vec[NVEC]; struct stat st; struct pair *p; FILE *fp; @@ -450,9 +452,7 @@ usr_delivery (int fd, char *delivery, int su) if (*buffer == '#' || *buffer == '\n') continue; - /* zap trailing newline */ - if ((cp = strchr(buffer, '\n'))) - *cp = 0; + TrimSuffixC(buffer, '\n'); /* split buffer into fields */ vecp = split (buffer, vec); @@ -761,7 +761,7 @@ parse (int fd) } } if (p->p_name == NULL && i < NVEC) { - p->p_name = getcpy (name); + p->p_name = mh_xstrdup(name); p->p_value = lp; p->p_flags = P_NIL; p++, i++; @@ -872,7 +872,7 @@ glob (int fd) if ((p = lookup (vars, "size"))) { snprintf (buffer, sizeof(buffer), "%d", fstat (fd, &st) != -1 ? (int) st.st_size : 0); - p->p_value = getcpy (buffer); + p->p_value = mh_xstrdup(buffer); } if ((p = lookup (vars, "info"))) p->p_value = getcpy (info); @@ -1042,8 +1042,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; @@ -1067,8 +1068,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); @@ -1120,16 +1125,15 @@ usr_pipe (int fd, char *cmd, char *pgm, char **vec, int suppress) pidstatus (status, stdout, ", failed"); } return (status == 0 ? 0 : -1); - } else { - /* - * Ruthlessly kill the child and anything - * else in its process group. - */ - killpg(child_id, SIGKILL); - if (verbose) - verbose_printf (", timed-out; terminated\n"); - return -1; } + /* + * Ruthlessly kill the child and anything + * else in its process group. + */ + killpg(child_id, SIGKILL); + if (verbose) + verbose_printf (", timed-out; terminated\n"); + return -1; } } @@ -1156,11 +1160,11 @@ get_sender (char *envelope, char **sender) char buffer[BUFSIZ]; if (envelope == NULL) { - *sender = getcpy (""); + *sender = mh_xstrdup(""); return; } - i = strlen ("From "); + i = LEN("From "); strncpy (buffer, envelope + i, sizeof(buffer)); if ((cp = strchr(buffer, '\n'))) { *cp = 0; @@ -1177,7 +1181,7 @@ get_sender (char *envelope, char **sender) *cp = 0; else break; - *sender = getcpy (buffer); + *sender = mh_xstrdup(buffer); } @@ -1197,7 +1201,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) { @@ -1205,7 +1208,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) @@ -1247,13 +1250,13 @@ you_lose: * and massage the headers. Save * a copy of the "From " line for later. */ - i = strlen ("From "); + i = LEN("From "); while (fgets (buffer, sizeof(buffer), qfp)) { if (first) { first = 0; if (!strncmp (buffer, "From ", i)) { /* get copy of envelope information ("From " line) */ - envelope = getcpy (buffer); + envelope = mh_xstrdup(buffer); /* Put the delivery date in message */ fputs (ddate, ffp); @@ -1322,7 +1325,7 @@ trim (char *cp) *sp = ' '; /* now return a copy */ - return getcpy(bp); + return mh_xstrdup(bp); } /* @@ -1415,6 +1418,7 @@ 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) { @@ -1452,7 +1456,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);