X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/13ae9ba066e6b8c114daa6714895a56816465f49..592b3e1bc2a812515c5e2d01f087ec0aa2d4e8e4:/uip/dropsbr.c diff --git a/uip/dropsbr.c b/uip/dropsbr.c index 7771b6b8..915e71e6 100644 --- a/uip/dropsbr.c +++ b/uip/dropsbr.c @@ -14,7 +14,6 @@ #include #include #include -#include #ifdef NTOHLSWAP # include @@ -41,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 */ @@ -306,6 +296,10 @@ mbx_copy (char *mailbox, int mbx_style, int md, int fd, } while ((i = read (fd, buffer, sizeof(buffer))) > 0) { + /* valgrind noticed that stringdex depends on null + termination. */ + buffer[i] = '\0'; + for (j = 0; (j = stringdex (mmdlm1, buffer)) >= 0; buffer[j]++) @@ -463,7 +457,7 @@ mbx_size (int md, off_t start, off_t stop) int mbx_close (char *mailbox, int md) { - if (lkclose (md, mailbox) == 0) + if (lkclosespool (md, mailbox) == 0) return OK; return NOTOK; } @@ -563,7 +557,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;