summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2009-06-18 11:45:57 +0200
committerJeremy Allison <jra@samba.org>2009-06-18 16:17:57 -0700
commit5a9ca3db032af5938e9709f3355a1f45b1e08d27 (patch)
tree5f12936d01b8c62531b07f307fdfee51ea65bcd3
parent31885822ae0744582fb145f541bd4cfc590173d6 (diff)
downloadsamba-5a9ca3db032af5938e9709f3355a1f45b1e08d27.tar.gz
Fix bug 4699: Remove pidfile on clean shutdown
-rw-r--r--source3/include/proto.h1
-rw-r--r--source3/lib/pidfile.c26
-rw-r--r--source3/nmbd/nmbd.c2
-rw-r--r--source3/smbd/server.c3
-rw-r--r--source3/winbindd/winbindd.c4
5 files changed, 28 insertions, 8 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 598d83aee60..74406fdeac7 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 3495dae5c28..37b36af2771 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 903dc36d533..848baeff3db 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 d3ce4b6f2d7..5b474d84b44 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 0a73c0ebc6c..d617fe1f0b5 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);
}