r23784: use the GPLv3 boilerplate as recommended by the FSF and the license text
[tprouty/samba.git] / source / lib / pidfile.c
index 1a462bf12876a53db13d47ba69945728bf774274..5506b46961ddbbe9305a4d0fcabed52bb905b7ee 100644 (file)
@@ -7,7 +7,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -16,8 +16,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
@@ -32,13 +31,17 @@ pid_t pidfile_pid(const char *name)
 {
        int fd;
        char pidstr[20];
-       unsigned ret;
-       pstring pidFile;
+       pid_t pid;
+       unsigned int ret;
+       char * pidFile;
 
-       slprintf(pidFile, sizeof(pidFile)-1, "%s/%s.pid", lp_piddir(), name);
+       if (asprintf(&pidFile, "%s/%s.pid", lp_piddir(), name) == -1) {
+               return 0;
+       }
 
        fd = sys_open(pidFile, O_NONBLOCK | O_RDONLY, 0644);
        if (fd == -1) {
+               SAFE_FREE(pidFile);
                return 0;
        }
 
@@ -49,8 +52,16 @@ pid_t pidfile_pid(const char *name)
        }
 
        ret = atoi(pidstr);
+
+       if (ret == 0) {
+               /* Obviously we had some garbage in the pidfile... */
+               DEBUG(1, ("Could not parse contents of pidfile %s\n",
+                         pidFile));
+               goto noproc;
+       }
        
-       if (!process_exists((pid_t)ret)) {
+       pid = (pid_t)ret;
+       if (!process_exists_by_pid(pid)) {
                goto noproc;
        }
 
@@ -59,24 +70,49 @@ pid_t pidfile_pid(const char *name)
                goto noproc;
        }
 
+       SAFE_FREE(pidFile);
        close(fd);
        return (pid_t)ret;
 
  noproc:
        close(fd);
        unlink(pidFile);
+       SAFE_FREE(pidFile);
        return 0;
 }
 
 /* create a pid file in the pid directory. open it and leave it locked */
-void pidfile_create(const char *name)
+void pidfile_create(const char *program_name)
 {
        int     fd;
        char    buf[20];
-       pstring pidFile;
+       char    *short_configfile;
+       char *name;
+       char *pidFile;
        pid_t pid;
 
-       slprintf(pidFile, sizeof(pidFile)-1, "%s/%s.pid", lp_piddir(), name);
+       /* Add a suffix to the program name if this is a process with a
+        * none default configuration file name. */
+       if (strcmp( CONFIGFILE, dyn_CONFIGFILE) == 0) {
+               name = SMB_STRDUP(program_name);
+       } else {
+               short_configfile = strrchr( dyn_CONFIGFILE, '/');
+               if (short_configfile == NULL) {
+                       /* conf file in current directory */
+                       short_configfile = dyn_CONFIGFILE;
+               } else {
+                       /* full/relative path provided */
+                       short_configfile++;
+               }
+               if (asprintf(&name, "%s-%s", program_name,
+                            short_configfile+1) == -1) {
+                       smb_panic("asprintf failed");
+               }
+       }
+
+       if (asprintf(&pidFile, "%s/%s.pid", lp_piddir(), name) == -1) {
+               smb_panic("asprintf failed");
+       }
 
        pid = pidfile_pid(name);
        if (pid != 0) {
@@ -106,4 +142,6 @@ void pidfile_create(const char *name)
                exit(1);
        }
        /* Leave pid file open & locked for the duration... */
+       SAFE_FREE(name);
+       SAFE_FREE(pidFile);
 }