From: Pierre Habouzit Date: Tue, 20 Nov 2007 21:34:14 +0000 (+0100) Subject: Only use fcntl, simplify locking. X-Git-Url: http://git.madism.org/?a=commitdiff_plain;h=68fabfdd78a08d3896ef25fe99e76c32beb56761;p=apps%2Fmadmutt.git Only use fcntl, simplify locking. Signed-off-by: Pierre Habouzit --- diff --git a/CMakeLists.txt b/CMakeLists.txt index b818ed6..68bcb36 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,9 +37,6 @@ ADD_DEFINITIONS("-DMUTTLOCALEDIR=\\\"${DATADIR}/locale\\\"") SET(MAILPATH CACHE STRING "Where new mail is spooled") OPTION(WITH_GPGME "Use GPGME [default: on]" ON) OPTION(WITH_IDN "Use GNU libidn for domain names [default: off]") - -OPTION(USE_FLOCK "Use flock to lock files [default: off]") -OPTION(USE_FCNTL "Use fcntl to lock files [default: on]" ON) OPTION(USE_HCACHE "Enable headers caching [default: off]") FIND_FILE(SENDMAIL sendmail diff --git a/lib-mx/compress.c b/lib-mx/compress.c index 22fe01e..1b6d4f0 100644 --- a/lib-mx/compress.c +++ b/lib-mx/compress.c @@ -38,7 +38,7 @@ static int mbox_lock_compressed (CONTEXT * ctx, FILE * fp, int excl, int retry) { int r; - if ((r = mx_lock_file (ctx->realpath, fileno (fp), excl, 1, retry)) == 0) + if ((r = mx_lock_file (ctx->realpath, fileno (fp), excl, retry)) == 0) ctx->locked = 1; else if (retry && !excl) { ctx->readonly = 1; @@ -52,8 +52,7 @@ static void mbox_unlock_compressed (CONTEXT * ctx, FILE * fp) { if (ctx->locked) { fflush (fp); - - mx_unlock_file (ctx->realpath, fileno (fp), 1); + mx_unlock_file(ctx->realpath, fileno(fp)); ctx->locked = 0; } } diff --git a/lib-mx/mbox.c b/lib-mx/mbox.c index a1f1fcc..9fd7a40 100644 --- a/lib-mx/mbox.c +++ b/lib-mx/mbox.c @@ -50,7 +50,7 @@ int mbox_lock_mailbox(CONTEXT *ctx, int excl, int retry) { int r; - if ((r = mx_lock_file(ctx->path, fileno(ctx->fp), excl, 1, retry)) == 0) + if ((r = mx_lock_file(ctx->path, fileno(ctx->fp), excl, retry)) == 0) ctx->locked = 1; else if (retry && !excl) { ctx->readonly = 1; @@ -65,7 +65,7 @@ static void mbox_unlock_mailbox (CONTEXT * ctx) if (ctx->locked) { fflush (ctx->fp); - mx_unlock_file (ctx->path, fileno (ctx->fp), 1); + mx_unlock_file(ctx->path, fileno(ctx->fp)); ctx->locked = 0; } } @@ -649,7 +649,7 @@ bail: /* Come here in case of disaster */ /* close a mailbox opened in write-mode */ int mbox_close_mailbox (CONTEXT * ctx) { - mx_unlock_file (ctx->path, fileno (ctx->fp), 1); + mx_unlock_file(ctx->path, fileno(ctx->fp)); if (ctx->cinfo) mutt_slow_close_compressed (ctx); diff --git a/lib-mx/mx.c b/lib-mx/mx.c index 23997aa..baae76f 100644 --- a/lib-mx/mx.c +++ b/lib-mx/mx.c @@ -33,6 +33,9 @@ #include #include "pop.h" +#define MAXLOCKATTEMPT 5 + + static mx_t const *mxfmts[] = { &mbox_mx, &mh_mx, @@ -91,132 +94,49 @@ static int mx_get_idx (const char* path) { /* Args: * excl if excl != 0, request an exclusive lock - * dot if dot != 0, try to dotlock the file * time_out should retry locking? */ -int mx_lock_file (const char *path, int fd, int excl, int dot, int time_out) +int mx_lock_file(const char *path, int fd, int excl, int time_out) { -#if defined (USE_FCNTL) || defined (USE_FLOCK) - int count; - int attempt; - struct stat prev_sb; -#endif - int r = 0; - -#ifdef USE_FCNTL - struct flock lck; - - p_clear(&lck, 1); - lck.l_type = excl ? F_WRLCK : F_RDLCK; - lck.l_whence = SEEK_SET; - - count = 0; - attempt = 0; - prev_sb.st_size = 0; - while (fcntl (fd, F_SETLK, &lck) == -1) { - struct stat sb; + int count = 0, attempt = 0; + struct flock lck = { + .l_type = excl ? F_WRLCK : F_RDLCK, + .l_whence = SEEK_SET, + }; + + if (dotlock_file(path, time_out) < 0) + return -1; + while (fcntl(fd, F_SETLK, &lck) == -1) { if (errno != EAGAIN && errno != EACCES) { - mutt_perror ("fcntl"); - return (-1); + mutt_perror("fcntl"); + goto error; } - if (fstat (fd, &sb) != 0) - sb.st_size = 0; - - if (count == 0) - prev_sb = sb; - - /* only unlock file if it is unchanged */ - if (prev_sb.st_size == sb.st_size - && ++count >= (time_out ? MAXLOCKATTEMPT : 0)) { + if (++count >= (time_out ? MAXLOCKATTEMPT : 0)) { if (time_out) mutt_error _("Timeout exceeded while attempting fcntl lock!"); - - return (-1); - } - - prev_sb = sb; - - mutt_message (_("Waiting for fcntl lock... %d"), ++attempt); - mutt_sleep (1); - } -#endif /* USE_FCNTL */ - -#ifdef USE_FLOCK - count = 0; - attempt = 0; - while (flock (fd, (excl ? LOCK_EX : LOCK_SH) | LOCK_NB) == -1) { - struct stat sb; - - if (errno != EWOULDBLOCK) { - mutt_perror ("flock"); - r = -1; - break; - } - - if (fstat (fd, &sb) != 0) - sb.st_size = 0; - - if (count == 0) - prev_sb = sb; - - /* only unlock file if it is unchanged */ - if (prev_sb.st_size == sb.st_size - && ++count >= (time_out ? MAXLOCKATTEMPT : 0)) { - if (time_out) - mutt_error _("Timeout exceeded while attempting flock lock!"); - - r = -1; - break; + goto error; } - - prev_sb = sb; - - mutt_message (_("Waiting for flock attempt... %d"), ++attempt); - mutt_sleep (1); - } -#endif /* USE_FLOCK */ - - if (r == 0 && dot) - r = dotlock_file(path, time_out); - - if (r == -1) { - /* release any other locks obtained in this routine */ - -#ifdef USE_FCNTL - lck.l_type = F_UNLCK; - fcntl (fd, F_SETLK, &lck); -#endif /* USE_FCNTL */ - -#ifdef USE_FLOCK - flock (fd, LOCK_UN); -#endif /* USE_FLOCK */ - - return (-1); + mutt_message(_("Waiting for fcntl lock... %d"), ++attempt); + mutt_sleep(1); } - return 0; + + error: + undotlock_file(path); + return -1; } -int mx_unlock_file (const char *path, int fd, int dot) +int mx_unlock_file(const char *path, int fd) { -#ifdef USE_FCNTL struct flock unlockit; p_clear(&unlockit, 1); unlockit.l_type = F_UNLCK; unlockit.l_whence = SEEK_SET; - fcntl (fd, F_SETLK, &unlockit); -#endif - -#ifdef USE_FLOCK - flock (fd, LOCK_UN); -#endif - - if (dot) - undotlock_file (path); - + fcntl(fd, F_SETLK, &unlockit); + undotlock_file(path); return 0; } @@ -351,7 +271,7 @@ static int mx_open_mailbox_append (CONTEXT * ctx, int flags) case M_MBOX: if ((ctx->fp = safe_fopen (ctx->path, flags & M_NEWFOLDER ? "w" : "a")) == NULL - || mbox_lock_mailbox (ctx, 1, 1) != 0) { + || mbox_lock_mailbox(ctx, 1, 1) != 0) { if (!ctx->fp) mutt_perror (ctx->path); else { diff --git a/lib-mx/mx.h b/lib-mx/mx.h index 64068f7..c40b031 100644 --- a/lib-mx/mx.h +++ b/lib-mx/mx.h @@ -153,8 +153,8 @@ void mx_alloc_memory (CONTEXT *); void mx_update_context (CONTEXT *, int); void mx_update_tables (CONTEXT *, int); -int mx_lock_file (const char *, int, int, int, int); -int mx_unlock_file (const char *path, int fd, int dot); +int mx_lock_file(const char *, int, int, int); +int mx_unlock_file(const char *path, int fd); void mutt_parse_mime_message (CONTEXT * ctx, HEADER *); #endif /* !_MX_H */ diff --git a/main.c b/main.c index 017e9b8..1db6a40 100644 --- a/main.c +++ b/main.c @@ -129,16 +129,6 @@ static void show_version (void) puts (_("Compile Options:")); puts ( -#ifdef USE_FCNTL - " +USE_FCNTL" -#else - " -USE_FCNTL" -#endif -#ifdef USE_FLOCK - " +USE_FLOCK" -#else - " -USE_FLOCK" -#endif #ifdef USE_HCACHE " +USE_HCACHE" #else