diff options
| author | Eric S. Raymond <esr@thyrsus.com> | 1996-10-09 15:46:13 +0000 | 
|---|---|---|
| committer | Eric S. Raymond <esr@thyrsus.com> | 1996-10-09 15:46:13 +0000 | 
| commit | cbcc7689c7ea574a18aef466d230f187a0bce58c (patch) | |
| tree | e3b028d86250572d36500a8810b40fa264b12d1d | |
| parent | f28a93b98fcd42bf55ad01d0ef9076df2c4c1a2f (diff) | |
| download | fetchmail-cbcc7689c7ea574a18aef466d230f187a0bce58c.tar.gz fetchmail-cbcc7689c7ea574a18aef466d230f187a0bce58c.tar.bz2 fetchmail-cbcc7689c7ea574a18aef466d230f187a0bce58c.zip | |
Improved lockfile handling.
svn path=/trunk/; revision=255
| -rw-r--r-- | fetchmail.c | 64 | 
1 files changed, 37 insertions, 27 deletions
| diff --git a/fetchmail.c b/fetchmail.c index 432782f1..3f97245b 100644 --- a/fetchmail.c +++ b/fetchmail.c @@ -85,7 +85,7 @@ char **argv;      struct hostrec def_opts;      int parsestatus, implicitmode;      char *servername, *user, *home, *tmpdir, tmpbuf[BUFSIZ];  -    FILE	*tmpfp; +    FILE	*lockfp;      pid_t pid;      memset(&def_opts, '\0', sizeof(struct hostrec)); @@ -265,6 +265,8 @@ char **argv;  	exit(PS_SYNTAX);      } +    /* check for another fetchmail running concurrently */ +    pid = -1;      if ((lockfile = (char *) malloc(strlen(tmpbuf) + 1)) == NULL)      {  	fprintf(stderr,"fetchmail: cannot allocate memory for lock name.\n"); @@ -272,36 +274,43 @@ char **argv;      }      else  	(void) strcpy(lockfile, tmpbuf); +    if ((lockfp = fopen(lockfile, "r")) != NULL ) +    { +	fscanf(lockfp,"%d",&pid); -    /* perhaps user asked us to remove a lock */ +	if (kill(pid, 0) == -1) { +	    fprintf(stderr,"fetchmail: removing stale lockfile\n"); +	    remove(lockfile); +	} +	fclose(lockfp); +    } + +    /* perhaps user asked us to kill the other fetchmail */      if (quitmode)      { -	FILE* fp; - -	if ( (fp = fopen(lockfile, "r")) == NULL ) { +	if (pid == -1)  +	{  	    fprintf(stderr,"fetchmail: no other fetchmail is running\n"); -	    return(PS_EXCLUDE); +	    exit(PS_EXCLUDE); +	} +	else if (kill(pid, SIGTERM) < 0) +	{ +	    fprintf(stderr,"fetchmail: error killing fetchmail at %d.\n",pid); +	    exit(PS_EXCLUDE);  	} -   -	fscanf(fp,"%d",&pid); -	fprintf(stderr,"fetchmail: killing fetchmail at PID %d\n",pid); -	if ( kill(pid,SIGTERM) < 0 ) -	    fprintf(stderr,"fetchmail: error killing the process %d.\n",pid);  	else -	    fprintf(stderr,"fetchmail: fetchmail at %d is dead.\n", pid); -   -	fclose(fp); -	remove(lockfile); -	exit(0); +	{ +	    fprintf(stderr,"fetchmail: fetchmail at %d killed.\n", pid); +	    remove(lockfile); +	    exit(0); +	}      } - -    /* beyond here we don't want more than one fetchmail running per user */ -    umask(0077); -    if ( (tmpfp = fopen(lockfile, "r")) != NULL ) { -	fscanf(tmpfp,"%d",&pid); -	fprintf(stderr,"Another session appears to be running at pid %d.\nIf you are sure that this is incorrect, remove %s file.\n",pid,lockfile); -	fclose(tmpfp); +    /* otherwise die if another fetchmail is running */ +    if (pid != -1) +    { +	fprintf(stderr, +		"fetchmail: another fetchmail is running at pid %d.\n", pid);  	return(PS_EXCLUDE);      } @@ -321,7 +330,8 @@ char **argv;      if (poll_interval)  	daemonize(logfile, termhook); -    /* if not locked, assert a lock */ +    /* beyond here we don't want more than one fetchmail running per user */ +    umask(0077);      signal(SIGABRT, termhook);      signal(SIGINT, termhook);      signal(SIGTERM, termhook); @@ -329,9 +339,9 @@ char **argv;      signal(SIGHUP, termhook);      signal(SIGPIPE, termhook);      signal(SIGQUIT, termhook); -    if ( (tmpfp = fopen(lockfile,"w")) != NULL ) { -	fprintf(tmpfp,"%d",getpid()); -	fclose(tmpfp); +    if ( (lockfp = fopen(lockfile,"w")) != NULL ) { +	fprintf(lockfp,"%d",getpid()); +	fclose(lockfp);      }      /* | 
