X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/8cebca1119664be52f1cbccd0ee052ae0b8c1de0..3dee7d930cb47c5aa4c8cb0d4707debd213fefb1:/uip/inc.c diff --git a/uip/inc.c b/uip/inc.c index b76f1cd9..41e785ff 100644 --- a/uip/inc.c +++ b/uip/inc.c @@ -8,7 +8,13 @@ */ #ifdef MAILGROUP -/* Revised: Sat Apr 14 17:08:17 PDT 1990 (marvit@hplabs) +/* + * Thu Feb 12 21:00 CST 2015 Marcin Cieslak + * Replaced setgid() calls with setegid() so that it works with dot + * locking on FreeBSD. setegid() should be supported on modern POSIX + * systems. + * + * Revised: Sat Apr 14 17:08:17 PDT 1990 (marvit@hplabs) * Added hpux hacks to set and reset gid to be "mail" as needed. The reset * is necessary so inc'ed mail is the group of the inc'er, rather than * "mail". We setgid to egid only when [un]locking the mail file. This @@ -127,10 +133,16 @@ static FILE *pf = NULL; * For setting and returning to "mail" gid */ #ifdef MAILGROUP -static int return_gid; +static gid_t return_gid; #define TRYDROPGROUPPRIVS() DROPGROUPPRIVS() -#define DROPGROUPPRIVS() setgid(getgid()) -#define GETGROUPPRIVS() setgid(return_gid) +#define DROPGROUPPRIVS() \ + if (setegid(getgid()) != 0) { \ + adios ("setegid", "unable to restore group to %ld", (long) getgid()); \ + } +#define GETGROUPPRIVS() \ + if (setegid(return_gid) != 0) { \ + adios ("setegid", "unable to set group to %ld", (long) return_gid); \ + } #define SAVEGROUPPRIVS() return_gid = getegid() #else /* define *GROUPPRIVS() as null; this avoids having lots of "#ifdef MAILGROUP"s */ @@ -171,7 +183,7 @@ int main (int argc, char **argv) { int chgflag = 1, trnflag = 1; - int noisy = 1, width = 0; + int noisy = 1, width = -1; int hghnum = 0, msgnum = 0; int sasl = 0; int incerr = 0; /* <0 if inc hits an error which means it should not truncate mailspool */ @@ -572,7 +584,7 @@ go_to_it: if (errno != ENOENT) adios (packfile, "error on file"); cp = concat ("Create file \"", packfile, "\"? ", NULL); - if (noisy && !getanswer (cp)) + if (noisy && !read_yes_or_no_if_tty (cp)) done (1); free (cp); } @@ -587,12 +599,16 @@ go_to_it: } for (i = 1; i <= nmsgs; i++) { + charstring_t scanl = NULL; + msgnum++; if (packfile) { fseek (pf, 0L, SEEK_CUR); pos = ftell (pf); size = 0; - fwrite (mmdlm1, 1, strlen (mmdlm1), pf); + if (fwrite (mmdlm1, 1, strlen (mmdlm1), pf) < strlen (mmdlm1)) { + advise (mmdlm1, "fwrite"); + } start = ftell (pf); if (pop_retr (i, pop_pack) == NOTOK) @@ -619,7 +635,7 @@ go_to_it: } switch (incerr = scan (pf, msgnum, 0, nfs, width, packfile ? 0 : msgnum == mp->hghmsg + 1 && chgflag, - 1, NULL, stop - start, noisy)) { + 1, NULL, stop - start, noisy, &scanl)) { case SCNEOF: printf ("%*d empty\n", DMAXFOLDER, msgnum); break; @@ -638,14 +654,18 @@ go_to_it: case SCNENC: default: if (aud) - fputs (scanl, aud); + fputs (charstring_buffer (scanl), aud); if (noisy) fflush (stdout); break; } + charstring_free (scanl); + if (packfile) { fseek (pf, stop, SEEK_SET); - fwrite (mmdlm2, 1, strlen (mmdlm2), pf); + if (fwrite (mmdlm2, 1, strlen (mmdlm2), pf) < strlen (mmdlm1)) { + advise (mmdlm2, "fwrite"); + } if (fflush (pf) || ferror (pf)) { int e = errno; pop_quit (); @@ -666,6 +686,8 @@ go_to_it: if (trnflag && pop_dele (i) == NOTOK) adios (NULL, "%s", response); + + scan_finished(); } if (pop_quit () == NOTOK) @@ -683,9 +705,12 @@ go_to_it: scan_detect_mbox_style (in); /* the MAGIC invocation... */ hghnum = msgnum = mp->hghmsg; for (;;) { + charstring_t scanl = NULL; + /* create scanline for new message */ switch (incerr = scan (in, msgnum + 1, msgnum + 1, nfs, width, - msgnum == hghnum && chgflag, 1, NULL, 0L, noisy)) { + msgnum == hghnum && chgflag, 1, NULL, 0L, noisy, + &scanl)) { case SCNFAT: case SCNEOF: break; @@ -714,13 +739,15 @@ go_to_it: (void)ext_hook("add-hook", b, (char *)0); if (aud) - fputs (scanl, aud); + fputs (charstring_buffer (scanl), aud); if (noisy) fflush (stdout); msgnum++; continue; } + charstring_free (scanl); + /* If we get here there was some sort of error from scan(), * so stop processing anything more from the spool. */ @@ -733,6 +760,8 @@ go_to_it: hghnum = msgnum = mp->hghmsg; for (i = 0; i < num_maildir_entries; i++) { + charstring_t scanl = NULL; + msgnum++; sp = Maildir[i].filename; @@ -765,7 +794,7 @@ go_to_it: fseek (pf, 0L, SEEK_SET); switch (incerr = scan (pf, msgnum, 0, nfs, width, msgnum == mp->hghmsg + 1 && chgflag, - 1, NULL, stop - start, noisy)) { + 1, NULL, stop - start, noisy, &scanl)) { case SCNEOF: printf ("%*d empty\n", DMAXFOLDER, msgnum); break; @@ -791,11 +820,13 @@ go_to_it: (void)ext_hook("add-hook", b, (char *)0); if (aud) - fputs (scanl, aud); + fputs (charstring_buffer (scanl), aud); if (noisy) fflush (stdout); break; } + charstring_free (scanl); + if (ferror(pf) || fclose (pf)) { int e = errno; (void) m_unlink (cp); @@ -808,6 +839,8 @@ go_to_it: if (trnflag && m_unlink (sp) == NOTOK) adios (sp, "couldn't unlink"); free (sp); /* Free Maildir[i]->filename */ + + scan_finished(); } free (Maildir); /* From now on Maildir is just a flag - don't dref! */ } @@ -926,6 +959,7 @@ skip: static void inc_done (int status) { + done = exit; if (packfile && pd != NOTOK) mbx_close (packfile, pd); if (locked) @@ -952,9 +986,9 @@ pop_pack (char *s) char buffer[BUFSIZ]; snprintf (buffer, sizeof(buffer), "%s\n", s); - for (j = 0; (j = stringdex (mmdlm1, buffer)) >= 0; buffer[j]++) + for ( ; (j = stringdex (mmdlm1, buffer)) >= 0; buffer[j]++) continue; - for (j = 0; (j = stringdex (mmdlm2, buffer)) >= 0; buffer[j]++) + for ( ; (j = stringdex (mmdlm2, buffer)) >= 0; buffer[j]++) continue; fputs (buffer, pf); size += strlen (buffer) + 1;