X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/59a210325d70e6a38c0ef9e5dcb105cec8bd38d2..c525020c77134b8832587755b7c05764a0516d80:/uip/dropsbr.c diff --git a/uip/dropsbr.c b/uip/dropsbr.c index 2b3d0208..937ff827 100644 --- a/uip/dropsbr.c +++ b/uip/dropsbr.c @@ -2,8 +2,6 @@ /* * dropsbr.c -- create/read/manipulate mail drops * - * $Id$ - * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for * complete copyright information. @@ -17,10 +15,6 @@ #include #include -#ifdef HAVE_ERRNO_H -# include -#endif - #ifdef NTOHLSWAP # include #else @@ -46,32 +40,23 @@ static int map_open (char *, int); int mbx_open (char *file, int mbx_style, uid_t uid, gid_t gid, mode_t mode) { - int j, count, fd; + int j, count, fd = NOTOK; struct stat st; j = 0; /* attempt to open and lock file */ for (count = 4; count > 0; count--) { - if ((fd = lkopen (file, O_RDWR | O_CREAT | O_NONBLOCK, mode)) == NOTOK) { - switch (errno) { -#if defined(FCNTL_LOCKING) || defined(LOCKF_LOCKING) - case EACCES: - case EAGAIN: -#endif - -#ifdef FLOCK_LOCKING - case EWOULDBLOCK: -#endif - case ETXTBSY: - j = errno; - sleep (5); - break; - - default: - /* just return error */ - return NOTOK; - } + int failed_to_lock = 0; + if ((fd = lkopenspool (file, O_RDWR | O_CREAT | + O_NONBLOCK, mode, &failed_to_lock)) == NOTOK) { + if (failed_to_lock) { + j = errno; + sleep (5); + continue; + } else { + return NOTOK; + } } /* good file descriptor */ @@ -95,8 +80,12 @@ mbx_open (char *file, int mbx_style, uid_t uid, gid_t gid, mode_t mode) * The stat failed. So we make sure file * has right ownership/modes */ - chown (file, uid, gid); - chmod (file, mode); + if (chown (file, uid, gid) < 0) { + advise (file, "chown"); + } + if (chmod (file, mode) < 0) { + advise (file, "chmod"); + } } else if (st.st_size > (off_t) 0) { int status; @@ -145,13 +134,12 @@ mbx_chk_mbox (int fd) static int mbx_chk_mmdf (int fd) { - size_t count; + ssize_t count; char ldelim[BUFSIZ]; count = strlen (mmdlm2); - /* casting -count to off_t, seem to break FreeBSD 2.2.6 */ - if (lseek (fd, (long) (-count), SEEK_END) == (off_t) NOTOK) + if (lseek (fd, -count, SEEK_END) == (off_t) NOTOK) return NOTOK; if (read (fd, ldelim, count) != count) return NOTOK; @@ -168,20 +156,16 @@ mbx_chk_mmdf (int fd) int -mbx_read (FILE *fp, long pos, struct drop **drops, int noisy) +mbx_read (FILE *fp, long pos, struct drop **drops) { - register int len, size; - register long ld1, ld2; - register char *bp; + int len, size; + long ld1, ld2; + char *bp; char buffer[BUFSIZ]; - register struct drop *cp, *dp, *ep, *pp; + struct drop *cp, *dp, *ep, *pp; - pp = (struct drop *) calloc ((size_t) (len = MAXFOLDER), sizeof(*dp)); - if (pp == NULL) { - if (noisy) - admonish (NULL, "unable to allocate drop storage"); - return NOTOK; - } + len = MAXFOLDER; + pp = mh_xcalloc(len, sizeof *pp); ld1 = (long) strlen (mmdlm1); ld2 = (long) strlen (mmdlm2); @@ -217,7 +201,7 @@ mbx_read (FILE *fp, long pos, struct drop **drops, int noisy) pos += ld2; if (dp >= ep) { - register int curlen = dp - pp; + int curlen = dp - pp; cp = (struct drop *) mh_xrealloc ((char *) pp, (size_t) (len += MAXFOLDER) * sizeof(*pp)); @@ -226,7 +210,7 @@ mbx_read (FILE *fp, long pos, struct drop **drops, int noisy) } if (dp == pp) - free ((char *) pp); + free(pp); else *drops = pp; return (dp - pp); @@ -237,10 +221,10 @@ int mbx_write(char *mailbox, int md, FILE *fp, int id, long last, long pos, off_t stop, int mapping, int noisy) { - register int i, j, size; + int i, j, size; off_t start; long off; - register char *cp; + char *cp; char buffer[BUFSIZ]; off = (long) lseek (md, (off_t) 0, SEEK_CUR); @@ -253,9 +237,9 @@ mbx_write(char *mailbox, int md, FILE *fp, int id, long last, fseek (fp, pos, SEEK_SET); while (fgets (buffer, sizeof(buffer), fp) && (pos < stop)) { i = strlen (buffer); - 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; if (write (md, buffer, i) != i) return NOTOK; @@ -312,13 +296,13 @@ mbx_copy (char *mailbox, int mbx_style, int md, int fd, } while ((i = read (fd, buffer, sizeof(buffer))) > 0) { - for (j = 0; - (j = stringdex (mmdlm1, buffer)) >= 0; - buffer[j]++) + /* valgrind noticed that stringdex depends on null + termination. */ + buffer[i] = '\0'; + + 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; if (write (md, buffer, i) != i) return NOTOK; @@ -366,7 +350,7 @@ mbx_copy (char *mailbox, int mbx_style, int md, int fd, * Change the "Return-Path:" field (if in first line) * back to "From ". */ - if (!strncmp (buffer, "Return-Path:", 12)) { + if (HasPrefix(buffer, "Return-Path:")) { char tmpbuffer[BUFSIZ]; char *tp, *ep, *fp; @@ -376,8 +360,8 @@ mbx_copy (char *mailbox, int mbx_style, int md, int fd, fp = strchr(ep + 1, '\n'); tp = dctime(dlocaltimenow()); snprintf (buffer, sizeof(buffer), "From %.*s %s", - fp - ep, ep, tp); - } else if (!strncmp (buffer, "X-Envelope-From:", 16)) { + (int)(fp - ep), ep, tp); + } else if (HasPrefix(buffer, "X-Envelope-From:")) { /* * Change the "X-Envelope-From:" field * (if first line) back to "From ". @@ -388,7 +372,7 @@ mbx_copy (char *mailbox, int mbx_style, int md, int fd, strncpy(tmpbuffer, buffer, sizeof(tmpbuffer)); ep = tmpbuffer + 17; snprintf (buffer, sizeof(buffer), "From %s", ep); - } else if (strncmp (buffer, "From ", 5)) { + } else if (!HasPrefix(buffer, "From ")) { /* * If there is already a "From " line, * then leave it alone. Else we add one. @@ -407,8 +391,10 @@ mbx_copy (char *mailbox, int mbx_style, int md, int fd, * If this is not first line, and begins with * "From ", then prepend line with ">". */ - if (j != 0 && strncmp (buffer, "From ", 5) == 0) { - write (md, ">", 1); + if (j != 0 && HasPrefix(buffer, "From ")) { + if (write (md, ">", 1) < 0) { + advise (mailbox, "write"); + } size++; } i = strlen (buffer); @@ -442,9 +428,9 @@ mbx_copy (char *mailbox, int mbx_style, int md, int fd, int mbx_size (int md, off_t start, off_t stop) { - register int i, fd; - register long pos; - register FILE *fp; + int i, fd; + long pos; + FILE *fp; if ((fd = dup (md)) == NOTOK || (fp = fdopen (fd, "r")) == NULL) { if (fd != NOTOK) @@ -469,8 +455,9 @@ mbx_size (int md, off_t start, off_t stop) int mbx_close (char *mailbox, int md) { - lkclose (md, mailbox); - return OK; + if (lkclosespool (md, mailbox) == 0) + return OK; + return NOTOK; } @@ -482,16 +469,16 @@ mbx_close (char *mailbox, int md) char * map_name (char *file) { - register char *cp, *dp; + char *cp, *dp; static char buffer[BUFSIZ]; if ((dp = strchr(cp = r1bindex (file, '/'), '.')) == NULL) dp = cp + strlen (cp); if (cp == file) - snprintf (buffer, sizeof(buffer), ".%.*s%s", dp - cp, cp, ".map"); + snprintf (buffer, sizeof(buffer), ".%.*s%s", (int)(dp - cp), cp, ".map"); else snprintf (buffer, sizeof(buffer), "%.*s.%.*s%s", - cp - file, file, dp - cp, cp, ".map"); + (int)(cp - file), file, (int)(dp - cp), cp, ".map"); return buffer; } @@ -500,10 +487,10 @@ map_name (char *file) int map_read (char *file, long pos, struct drop **drops, int noisy) { - register int i, md, msgp; - register char *cp; + int i, md, msgp; + char *cp; struct drop d; - register struct drop *mp, *dp; + struct drop *mp, *dp; if ((md = open (cp = map_name (file), O_RDONLY)) == NOTOK || map_chk (cp, md, mp = &d, pos, noisy)) { @@ -513,21 +500,17 @@ map_read (char *file, long pos, struct drop **drops, int noisy) } msgp = mp->d_id; - dp = (struct drop *) calloc ((size_t) (msgp + 1), sizeof(*dp)); - if (dp == NULL) { - close (md); - return 0; - } - + dp = mh_xcalloc(msgp + 1, sizeof *dp); memcpy((char *) dp, (char *) mp, sizeof(*dp)); lseek (md, (off_t) sizeof(*mp), SEEK_SET); - if ((i = read (md, (char *) (dp + 1), msgp * sizeof(*dp))) < sizeof(*dp)) { + if ((i = read (md, (char *) (dp + 1), msgp * sizeof(*dp))) < + (int) sizeof(*dp)) { i = 0; - free ((char *) dp); + free(dp); } else { #ifdef NTOHLSWAP - register struct drop *tdp; + struct drop *tdp; int j; for (j = 0, tdp = dp; j < i / sizeof(*dp); j++, tdp++) { @@ -550,12 +533,12 @@ int map_write (char *mailbox, int md, int id, long last, off_t start, off_t stop, long pos, int size, int noisy) { - register int i; + int i; int clear, fd, td; char *file; - register struct drop *dp; + struct drop *dp; struct drop d1, d2, *rp; - register FILE *fp; + FILE *fp; struct stat st; if ((fd = map_open (file = map_name (mailbox), md)) == NOTOK) @@ -567,7 +550,7 @@ map_write (char *mailbox, int md, int id, long last, off_t start, clear = 1; if (!clear && map_chk (file, fd, &d1, pos, noisy)) { - unlink (file); + (void) m_unlink (file); mbx_close (file, fd); if ((fd = map_open (file, md)) == NOTOK) return NOTOK; @@ -584,7 +567,7 @@ map_write (char *mailbox, int md, int id, long last, off_t start, return NOTOK; } - switch (i = mbx_read (fp, 0, &rp, noisy)) { + switch (i = mbx_read (fp, 0, &rp)) { case NOTOK: fclose (fp); mbx_close (file, fd); @@ -608,7 +591,7 @@ map_write (char *mailbox, int md, int id, long last, off_t start, return NOTOK; } } - free ((char *) rp); + free(rp); fclose (fp); break; } @@ -655,7 +638,7 @@ map_open (char *file, int md) mode_t mode; struct stat st; - mode = fstat (md, &st) != NOTOK ? (mode_t) (st.st_mode & 0777) : m_gmprot (); + mode = fstat (md, &st) != NOTOK ? (int) (st.st_mode & 0777) : m_gmprot (); return mbx_open (file, OTHER_FORMAT, st.st_uid, st.st_gid, mode); } @@ -663,9 +646,9 @@ map_open (char *file, int md) int map_chk (char *file, int fd, struct drop *dp, long pos, int noisy) { - long count; + ssize_t count; struct drop d, tmpd; - register struct drop *dl; + struct drop *dl; if (read (fd, (char *) &tmpd, sizeof(*dp)) != sizeof(*dp)) { #ifdef notdef @@ -704,7 +687,7 @@ map_chk (char *file, int fd, struct drop *dp, long pos, int noisy) } dl = &d; - count = (long) strlen (mmdlm2); + count = strlen (mmdlm2); lseek (fd, (off_t) (dp->d_id * sizeof(*dp)), SEEK_SET); if (read (fd, (char *) dl, sizeof(*dl)) != sizeof(*dl) || (ntohl(dl->d_stop) != dp->d_stop