X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/61ccf1dbeea93978803303d2cd43efa5da2cc7d1..3bd5ce286fa6983f3f3f9fda4ff7f2f96c2a22a2:/uip/dropsbr.c?ds=sidebyside diff --git a/uip/dropsbr.c b/uip/dropsbr.c index 5fcef29e..0d87a06d 100644 --- a/uip/dropsbr.c +++ b/uip/dropsbr.c @@ -40,33 +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--) { + int failed_to_lock = 0; if ((fd = lkopenspool (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; - } + O_NONBLOCK, mode, &failed_to_lock)) == NOTOK) { + if (failed_to_lock) { + j = errno; + sleep (5); + continue; + } else { + return NOTOK; + } } /* good file descriptor */ @@ -90,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; @@ -162,7 +156,7 @@ 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; @@ -170,12 +164,8 @@ mbx_read (FILE *fp, long pos, struct drop **drops, int noisy) char buffer[BUFSIZ]; register 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); @@ -247,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; @@ -306,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; @@ -402,7 +392,9 @@ mbx_copy (char *mailbox, int mbx_style, int md, int fd, * "From ", then prepend line with ">". */ if (j != 0 && strncmp (buffer, "From ", 5) == 0) { - write (md, ">", 1); + if (write (md, ">", 1) < 0) { + advise (mailbox, "write"); + } size++; } i = strlen (buffer); @@ -508,12 +500,7 @@ 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); @@ -563,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; @@ -580,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);