From c2d7a5e3d96e78c5a3d7232d6ce7730843e5e6d1 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 18 Jun 2009 11:45:57 +0200 Subject: [PATCH] Fix bug 4699: Remove pidfile on clean shutdown --- source3/include/proto.h | 1 + source3/lib/pidfile.c | 26 ++++++++++++++++++-------- source3/nmbd/nmbd.c | 2 ++ source3/smbd/server.c | 3 +++ source3/winbindd/winbindd.c | 4 ++++ 5 files changed, 28 insertions(+), 8 deletions(-) diff --git a/source3/include/proto.h b/source3/include/proto.h index 4ae141e..99172a6 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -583,6 +583,7 @@ int nt_status_to_pam(NTSTATUS nt_status); pid_t pidfile_pid(const char *name); void pidfile_create(const char *program_name); +void pidfile_unlink(void); /* The following definitions come from lib/popt_common.c */ diff --git a/source3/lib/pidfile.c b/source3/lib/pidfile.c index 3495dae..37b36af 100644 --- a/source3/lib/pidfile.c +++ b/source3/lib/pidfile.c @@ -25,6 +25,8 @@ #define O_NONBLOCK #endif +static char *pidFile_name = NULL; + /* return the pid in a pidfile. return 0 if the process (or pidfile) does not exist */ pid_t pidfile_pid(const char *name) @@ -88,7 +90,6 @@ void pidfile_create(const char *program_name) char buf[20]; const char *short_configfile; char *name; - char *pidFile; pid_t pid; /* Add a suffix to the program name if this is a process with a @@ -110,27 +111,28 @@ void pidfile_create(const char *program_name) } } - if (asprintf(&pidFile, "%s/%s.pid", lp_piddir(), name) == -1) { + if (asprintf(&pidFile_name, "%s/%s.pid", lp_piddir(), name) == -1) { smb_panic("asprintf failed"); } pid = pidfile_pid(name); if (pid != 0) { DEBUG(0,("ERROR: %s is already running. File %s exists and process id %d is running.\n", - name, pidFile, (int)pid)); + name, pidFile_name, (int)pid)); exit(1); } - fd = sys_open(pidFile, O_NONBLOCK | O_CREAT | O_WRONLY | O_EXCL, 0644); + fd = sys_open(pidFile_name, O_NONBLOCK | O_CREAT | O_WRONLY | O_EXCL, + 0644); if (fd == -1) { - DEBUG(0,("ERROR: can't open %s: Error was %s\n", pidFile, + DEBUG(0,("ERROR: can't open %s: Error was %s\n", pidFile_name, strerror(errno))); exit(1); } if (fcntl_lock(fd,SMB_F_SETLK,0,1,F_WRLCK)==False) { DEBUG(0,("ERROR: %s : fcntl lock of file %s failed. Error was %s\n", - name, pidFile, strerror(errno))); + name, pidFile_name, strerror(errno))); exit(1); } @@ -138,10 +140,18 @@ void pidfile_create(const char *program_name) slprintf(buf, sizeof(buf) - 1, "%u\n", (unsigned int) sys_getpid()); if (write(fd, buf, strlen(buf)) != (ssize_t)strlen(buf)) { DEBUG(0,("ERROR: can't write to file %s: %s\n", - pidFile, strerror(errno))); + pidFile_name, strerror(errno))); exit(1); } /* Leave pid file open & locked for the duration... */ SAFE_FREE(name); - SAFE_FREE(pidFile); +} + +void pidfile_unlink(void) +{ + if (pidFile_name == NULL) { + return; + } + unlink(pidFile_name); + SAFE_FREE(pidFile_name); } diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c index 903dc36..848baef 100644 --- a/source3/nmbd/nmbd.c +++ b/source3/nmbd/nmbd.c @@ -82,6 +82,8 @@ static void terminate(void) /* If there was an async dns child - kill it. */ kill_async_dns_child(); + pidfile_unlink(); + exit(0); } diff --git a/source3/smbd/server.c b/source3/smbd/server.c index d3ce4b6..5b474d8 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -854,6 +854,9 @@ static void exit_server_common(enum server_exit_reason how, } else { DEBUG(3,("Server exit (%s)\n", (reason ? reason : "normal exit"))); + if (am_parent) { + pidfile_unlink(); + } } /* if we had any open SMB connections when we exited then we diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index 0a73c0e..d617fe1 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -173,6 +173,10 @@ static void terminate(bool is_parent) } #endif + if (is_parent) { + pidfile_unlink(); + } + exit(0); } -- 1.5.5