Browse Source

save the pid as well, and only do the atexit in the same pid

OPENBSD_3_1
deraadt 23 years ago
parent
commit
b7edc160a2
1 changed files with 13 additions and 9 deletions
  1. +13
    -9
      src/lib/libutil/pidfile.c

+ 13
- 9
src/lib/libutil/pidfile.c View File

@ -1,4 +1,4 @@
/* $OpenBSD: pidfile.c,v 1.1 2001/09/28 20:16:42 jakob Exp $ */
/* $OpenBSD: pidfile.c,v 1.2 2001/12/08 02:25:06 deraadt Exp $ */
/* $NetBSD: pidfile.c,v 1.4 2001/02/19 22:43:42 cgd Exp $ */ /* $NetBSD: pidfile.c,v 1.4 2001/02/19 22:43:42 cgd Exp $ */
/*- /*-
@ -38,7 +38,7 @@
*/ */
#if defined(LIBC_SCCS) && !defined(lint) #if defined(LIBC_SCCS) && !defined(lint)
static const char rcsid[] = "$OpenBSD: pidfile.c,v 1.1 2001/09/28 20:16:42 jakob Exp $";
static const char rcsid[] = "$OpenBSD: pidfile.c,v 1.2 2001/12/08 02:25:06 deraadt Exp $";
#endif /* LIBC_SCCS and not lint */ #endif /* LIBC_SCCS and not lint */
#include <sys/param.h> #include <sys/param.h>
@ -50,6 +50,7 @@ static const char rcsid[] = "$OpenBSD: pidfile.c,v 1.1 2001/09/28 20:16:42 jakob
#include <util.h> #include <util.h>
static char *pidfile_path; static char *pidfile_path;
static int pidfile_pid;
static void pidfile_cleanup(void); static void pidfile_cleanup(void);
@ -60,19 +61,20 @@ pidfile(const char *basename)
{ {
FILE *f; FILE *f;
int save_errno; int save_errno;
pid_t pid;
if (basename == NULL) if (basename == NULL)
basename = __progname; basename = __progname;
if (pidfile_path != NULL) {
free(pidfile_path);
pidfile_path = NULL;
}
if (pidfile_path != NULL) {
free(pidfile_path);
pidfile_path = NULL;
}
/* _PATH_VARRUN includes trailing / */ /* _PATH_VARRUN includes trailing / */
(void) asprintf(&pidfile_path, "%s%s.pid", _PATH_VARRUN, basename); (void) asprintf(&pidfile_path, "%s%s.pid", _PATH_VARRUN, basename);
if (pidfile_path == NULL) if (pidfile_path == NULL)
return (-1);
return (-1);
if ((f = fopen(pidfile_path, "w")) == NULL) { if ((f = fopen(pidfile_path, "w")) == NULL) {
save_errno = errno; save_errno = errno;
@ -82,7 +84,8 @@ pidfile(const char *basename)
return (-1); return (-1);
} }
if (fprintf(f, "%d\n", getpid()) <= 0 || fclose(f) != 0) {
pid = getpid();
if (fprintf(f, "%d\n", pid) <= 0 || fclose(f) != 0) {
save_errno = errno; save_errno = errno;
(void) unlink(pidfile_path); (void) unlink(pidfile_path);
free(pidfile_path); free(pidfile_path);
@ -91,6 +94,7 @@ pidfile(const char *basename)
return (-1); return (-1);
} }
pidfile_pid = pid;
(void) atexit(pidfile_cleanup); (void) atexit(pidfile_cleanup);
return (0); return (0);
@ -100,6 +104,6 @@ static void
pidfile_cleanup(void) pidfile_cleanup(void)
{ {
if (pidfile_path != NULL)
if (pidfile_path != NULL && pidfile_pid == getpid())
(void) unlink(pidfile_path); (void) unlink(pidfile_path);
} }

Loading…
Cancel
Save