diff options
Diffstat (limited to 'lock.c')
-rw-r--r-- | lock.c | 69 |
1 files changed, 39 insertions, 30 deletions
@@ -15,6 +15,7 @@ #if defined(HAVE_UNISTD_H) #include <unistd.h> #endif +#include <errno.h> #include <fcntl.h> #include <signal.h> @@ -70,21 +71,31 @@ void lock_dispose(void) int lock_state(void) { - int pid, st; + int pid, st; FILE *lockfp; int bkgd = FALSE; - pid = 0; - if ((lockfp = fopen(lockfile, "r")) != NULL ) + if ((lockfp = fopen(lockfile, "r")) != NULL) { - bkgd = (fscanf(lockfp, "%d %d", &pid, &st) == 2); + int args = fscanf(lockfp, "%d %d", &pid, &st); + bkgd = (args == 2); - if (pid == 0 || kill(pid, 0) == -1) { + if (ferror(lockfp)) + fprintf(stderr, GT_("fetchmail: error reading lockfile \"%s\": %s\n"), + lockfile, strerror(errno)); + + if (args == 0 || kill(pid, 0) == -1) { fprintf(stderr,GT_("fetchmail: removing stale lockfile\n")); pid = 0; - unlink(lockfile); + if (unlink(lockfile)) + perror(lockfile); } - fclose(lockfp); /* not checking should be safe, file mode was "r" */ + fclose(lockfp); /* not checking should be safe, file mode was "r" */ + } else { + pid = 0; + if (errno != ENOENT) + fprintf(stderr, GT_("fetchmail: error opening lockfile \"%s\": %s\n"), + lockfile, strerror(errno)); } return(bkgd ? -pid : pid); @@ -102,28 +113,27 @@ void lock_or_die(void) int fd; char tmpbuf[50]; -#ifndef O_SYNC -#define O_SYNC 0 /* use it if we have it */ -#endif - if (!lock_acquired) - { - if ((fd = open(lockfile, O_WRONLY|O_CREAT|O_EXCL|O_SYNC, 0666)) != -1) - { - snprintf(tmpbuf, sizeof(tmpbuf), "%ld", (long)getpid()); - write(fd, tmpbuf, strlen(tmpbuf)); - if (run.poll_interval) - { - snprintf(tmpbuf, sizeof(tmpbuf), " %d", run.poll_interval); - write(fd, tmpbuf, strlen(tmpbuf)); - } - close(fd); /* should be safe, fd was opened with O_SYNC */ - lock_acquired = TRUE; - } - else - { - fprintf(stderr, GT_("fetchmail: lock creation failed.\n")); - exit(PS_EXCLUDE); - } + if (!lock_acquired) { + int e = 0; + + if ((fd = open(lockfile, O_WRONLY|O_CREAT|O_EXCL, 0666)) != -1) { + snprintf(tmpbuf, sizeof(tmpbuf), "%ld\n", (long)getpid()); + if (write(fd, tmpbuf, strlen(tmpbuf)) < strlen(tmpbuf)) e = 1; + if (run.poll_interval) + { + snprintf(tmpbuf, sizeof(tmpbuf), "%d\n", run.poll_interval); + if (write(fd, tmpbuf, strlen(tmpbuf)) < strlen(tmpbuf)) e = 1; + } + if (fsync(fd)) e = 1; + if (close(fd)) e = 1; + } + if (e == 0) { + lock_acquired = TRUE; + } else { + perror(lockfile); + fprintf(stderr, GT_("fetchmail: lock creation failed.\n")); + exit(PS_EXCLUDE); + } } } @@ -132,5 +142,4 @@ void lock_release(void) { unlink(lockfile); } - /* lock.c ends here */ |