s3-pid: Catch with pid filename's change when config file is not smb.conf
authorMatthieu Patou <mat@matws.net>
Wed, 25 Jan 2012 05:29:11 +0000 (21:29 -0800)
committerKarolin Seeger <kseeger@samba.org>
Thu, 31 May 2012 19:22:39 +0000 (21:22 +0200)
This is what is done in pidfile_create
(cherry picked from commit 9b43ad4fcac1eb6796973336c5614b18a054080d)

Fix bug #8714 (smbcontrol can't find the pid file of winbindd because the later
is created with a different name).

source3/lib/pidfile.c

index 88d0fb07ea76a0e3b728ff0037c44f01c8f7e671..06fca91165d70c7b2996dd2fb3edeb7ae5f7ae2a 100644 (file)
@@ -30,18 +30,42 @@ 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)
+pid_t pidfile_pid(const char *program_name)
 {
        int fd;
        char pidstr[20];
        pid_t pid;
        unsigned int ret;
+       char *name;
+       const char *short_configfile;
        char * pidFile;
 
+       /* Add a suffix to the program name if this is a process with a
+        * none default configuration file name. */
+       if (strcmp( CONFIGFILE, get_dyn_CONFIGFILE()) == 0) {
+               name = SMB_STRDUP(program_name);
+       } else {
+               short_configfile = strrchr( get_dyn_CONFIGFILE(), '/');
+               if (short_configfile == NULL) {
+                       /* conf file in current directory */
+                       short_configfile = get_dyn_CONFIGFILE();
+               } else {
+                       /* full/relative path provided */
+                       short_configfile++;
+               }
+               if (asprintf(&name, "%s-%s", program_name,
+                               short_configfile) == -1) {
+                       smb_panic("asprintf failed");
+               }
+       }
+
        if (asprintf(&pidFile, "%s/%s.pid", lp_piddir(), name) == -1) {
+               SAFE_FREE(name);
                return 0;
        }
 
+       SAFE_FREE(name);
+
        fd = sys_open(pidFile, O_NONBLOCK | O_RDONLY, 0644);
        if (fd == -1) {
                SAFE_FREE(pidFile);