X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=lock.c;h=213969f1f012f323c470ceb3a1e6b1c1aec43ffa;hb=cb8d898683ffccdf8de42a5b1236a6cf3cdbb6ce;hp=e56fe344359ad8dc031b76ca1719e124150d6fe1;hpb=ca4c478270ca3645015c94c8d5195a3d4aba1d6a;p=~andy%2Ffetchmail diff --git a/lock.c b/lock.c index e56fe344..213969f1 100644 --- a/lock.c +++ b/lock.c @@ -73,13 +73,14 @@ void fm_lock_dispose(void) int fm_lock_state(void) { - int pid, st; + long pid; + int st; FILE *lockfp; int bkgd = FALSE; if ((lockfp = fopen(lockfile, "r")) != NULL) { - int args = fscanf(lockfp, "%d %d", &pid, &st); + int args = fscanf(lockfp, "%ld %d", &pid, &st); bkgd = (args == 2); if (ferror(lockfp)) { @@ -91,12 +92,27 @@ int fm_lock_state(void) fclose(lockfp); /* not checking should be safe, file mode was "r" */ if (args == EOF || args == 0 || kill(pid, 0) == -1) { + /* ^ could not read PID || process does not exist */ + /* => lockfile is stale, unlink it */ pid = 0; - fprintf(stderr,GT_("fetchmail: removing stale lockfile\n")); if (unlink(lockfile)) { if (errno != ENOENT) { perror(lockfile); + /* we complain but we don't exit; it might be + * writable for us, but in a directory we cannot + * write to. This means we can write the new PID to + * the file. Truncate to be safe in case the PID is + * recycled by another process later. + * \bug we should use fcntl() style locks or + * something else instead in a future release. */ + if (truncate(lockfile, (off_t)0)) { + /* but if we cannot truncate the file either, + * assume that we cannot write to it later, + * complain and quit. */ + perror(lockfile); + exit(PS_EXCLUDE); + } } } }