X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/61e09274bb3338efbd9c50f797751853c99dba3b..5be8db81:/uip/slocal.c?ds=inline diff --git a/uip/slocal.c b/uip/slocal.c index f570aaaf..8afef253 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); @@ -291,11 +283,15 @@ main (int argc, char **argv) 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 +314,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 +340,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 +514,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 +533,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 +563,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 +574,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 +587,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 +600,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 +615,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 +741,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 +893,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 +1041,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; @@ -1198,7 +1197,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 +1204,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 +1414,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 +1452,8 @@ suppress_duplicates (int fd, char *file) * This will fail if your Maildelivery file doesn't * exist. */ - if ((lockfd = lkopen(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); @@ -1474,11 +1474,10 @@ suppress_duplicates (int fd, char *file) } dbm_close (db); - lkclose(lockfd, file); + lkclosedata(lockfd, file); free (cp); fclose (in); return result; - break; case BODY: case FILEEOF: