]> err.no Git - dpkg/commitdiff
do not start a command if the pidfile option is used and the pid in that file is...
authorWichert Akkerman <wakkerma@debian.org>
Sun, 19 Aug 2001 13:22:23 +0000 (13:22 +0000)
committerWichert Akkerman <wakkerma@debian.org>
Sun, 19 Aug 2001 13:22:23 +0000 (13:22 +0000)
ChangeLog
utils/start-stop-daemon.c

index e776bdbdfb94ebfea4c5fdbefa604c6bbd72f43e..93428f341e1b734439b831bdae4215893cbdc0f9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sun Aug 19 15:20:53 CEST 2001 Wichert Akkerman <wakkerma@debian.org>
+
+  * utils/start-stop-daemon.c: do not start a command if the pidfile
+    option is used and the pid in that file is still running
+
 Sun Aug 19 00:25:12 CEST 2001 Wichert Akkerman <wakkerma@debian.org>
 
   * doc/fr/dpkg-{query,split,statoverride}.8: added
index 6e76286736a4d903300532e7c0bb72be63e4dd11..c23deef6bc8aa4e816f691b63336010b405858e0 100644 (file)
@@ -321,7 +321,7 @@ const struct sigpair siglist[] = {
        { "TTOU",       SIGTTOU }
 };
 
-static int parse_integer (const char *string, int *value_r) {
+static int parse_integer(const char *string, int *value_r) {
        unsigned long ul;
        char *ep;
 
@@ -336,7 +336,7 @@ static int parse_integer (const char *string, int *value_r) {
        return 0;
 }
 
-static int parse_signal (const char *signal_str, int *signal_nr)
+static int parse_signal(const char *signal_str, int *signal_nr)
 {
        unsigned int i;
 
@@ -647,6 +647,21 @@ pid_is_cmd(pid_t pid, const char *name)
 #endif /* OSHURD */
 
 
+static int
+pid_is_running(pid_t pid)
+{
+       struct stat sb;
+       char buf[32];
+
+       sprintf(buf, "/proc/%d", pid);
+       if (stat(buf, &sb) != 0) {
+               if (errno!=ENOENT)
+                       fatal("Error stating %s: %s", buf, strerror(errno));
+               return 0;
+       }
+
+       return 1;
+}
 
 static void
 check(pid_t pid)
@@ -662,6 +677,8 @@ check(pid_t pid)
                return;
        if (cmdname && !pid_is_cmd(pid, cmdname))
                return;
+       if (start && pid_is_running(pid))
+               return;
        push(&found, pid);
 }
 
@@ -712,12 +729,12 @@ do_procinit(void)
 
 #if defined(OSHURD)
 error_t
-check_all (void *ptr)
+check_all(void *ptr)
 {
        struct proc_stat *pstat = ptr;
 
-       check (pstat->pid);
-       return (0);
+       check(pstat->pid);
+       return 0;
 }
 
 static void
@@ -726,20 +743,20 @@ do_procinit(void)
        struct ps_context *context;
        error_t err;
 
-       err = ps_context_create (getproc (), &context);
+       err = ps_context_create(getproc(), &context);
        if (err)
-               error (1, err, "ps_context_create");
+               error(1, err, "ps_context_create");
 
-       err = proc_stat_list_create (context, &procset);
+       err = proc_stat_list_create(context, &procset);
        if (err)
-               error (1, err, "proc_stat_list_create");
+               error(1, err, "proc_stat_list_create");
 
-       err = proc_stat_list_add_all (procset, 0, 0);
+       err = proc_stat_list_add_all(procset, 0, 0);
        if (err)
-               error (1, err, "proc_stat_list_add_all");
+               error(1, err, "proc_stat_list_add_all");
 
        /* Check all pids */
-       ihash_iterate (context->procs, check_all);
+       ihash_iterate(context->procs, check_all);
 }
 #endif /* OSHURD */
 
@@ -761,14 +778,14 @@ pid_is_cmd(pid_t pid, const char *name)
                 errx(1, "%s", errbuf);
         if ((kp = kvm_getprocs(kd, KERN_PROC_PID, pid, &nentries)) == 0)
                 errx(1, "%s", kvm_geterr(kd));
-       if ( ( pid_argv_p = kvm_getargv(kd, kp, argv_len)) == 0)
+       if ((pid_argv_p = kvm_getargv(kd, kp, argv_len)) == 0)
                errx(1, "%s", kvm_geterr(kd)); 
 
        start_argv_0_p = *pid_argv_p;
        /* find and compare string */
          
        /* find end of argv[0] then copy and cut of str there. */
-       if ( (end_argv_0_p = strchr(*pid_argv_p, ' ')) == 0 )   
+       if ((end_argv_0_p = strchr(*pid_argv_p, ' ')) == 0 )    
        /* There seems to be no space, so we have the command
         * allready in its desired form. */
          start_argv_0_p = *pid_argv_p;
@@ -801,7 +818,7 @@ pid_is_user(pid_t pid, int uid)
                errx(1, "%s", errbuf);
        if ((kp = kvm_getprocs(kd, KERN_PROC_PID, pid, &nentries)) == 0)
                errx(1, "%s", kvm_geterr(kd));
-       if ( kp->kp_proc.p_cred )
+       if (kp->kp_proc.p_cred )
                kvm_read(kd, (u_long)&(kp->kp_proc.p_cred->p_ruid),
                        &proc_uid, sizeof(uid_t));
        else