[git commit] ssd: compat: match -x EXECUTABLE by /proc/pid/exe too

Denys Vlasenko vda.linux at googlemail.com
Mon Mar 5 15:28:07 UTC 2012


commit: http://git.busybox.net/busybox/commit/?id=17eedcad9406c43beddab3906c8c693626c351fb
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 debianutils/start_stop_daemon.c |   17 ++++++++++++++---
 1 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c
index 495ed0a..7dadc3c 100644
--- a/debianutils/start_stop_daemon.c
+++ b/debianutils/start_stop_daemon.c
@@ -31,7 +31,8 @@ Options controlling process matching
 [TODO: can PROCESS_NAME be a full pathname? Should we require full match then
 with /proc/$PID/exe or argv[0] (comm can't be matched, it never contains path)]
         -x,--exec EXECUTABLE    Look for processes that were started with this
-                                command in /proc/$PID/cmdline.
+                                command in /proc/$PID/exe and /proc/$PID/cmdline
+                                (/proc/$PID/cmdline is a bbox extension)
                                 Unlike -n, we match against the full path:
                                 "ntpd" != "./ntpd" != "/path/to/ntpd"
         -p,--pidfile PID_FILE   Look for processes with PID from this file
@@ -68,7 +69,7 @@ Misc options:
 //usage:     "\n	-n,--name NAME		Match processes with NAME"
 //usage:     "\n				in comm field in /proc/PID/stat"
 //usage:     "\n	-x,--exec EXECUTABLE	Match processes with this command"
-//usage:     "\n				in /proc/PID/cmdline"
+//usage:     "\n				in /proc/PID/{exe,cmdline}"
 //usage:     "\n	-p,--pidfile FILE	Match a process with PID from the file"
 //usage:     "\n	All specified conditions must match"
 //usage:     "\n-S only:"
@@ -198,8 +199,18 @@ static int pid_is_exec(pid_t pid)
 {
 	ssize_t bytes;
 	char buf[sizeof("/proc/%u/cmdline") + sizeof(int)*3];
+	char *procname, *exelink;
+	int match;
 
-	sprintf(buf, "/proc/%u/cmdline", (unsigned)pid);
+	procname = buf + sprintf(buf, "/proc/%u/exe", (unsigned)pid) - 3;
+
+	exelink = xmalloc_readlink(buf);
+	match = (exelink && strcmp(execname, exelink) == 0);
+	free(exelink);
+	if (match)
+		return match;
+
+	strcpy(procname, "cmdline");
 	bytes = open_read_close(buf, G.execname_cmpbuf, G.execname_sizeof);
 	if (bytes > 0) {
 		G.execname_cmpbuf[bytes] = '\0';


More information about the busybox-cvs mailing list