Просмотр исходного кода

do not start a command if the pidfile option is used and the pid in that file is still running

Wichert Akkerman лет назад: 25
Родитель
Сommit
d2c1c54171
2 измененных файлов с 37 добавлено и 15 удалено
  1. 5 0
      ChangeLog
  2. 32 15
      utils/start-stop-daemon.c

+ 5 - 0
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

+ 32 - 15
utils/start-stop-daemon.c

@@ -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