From: Denys Vlasenko Date: Mon, 5 Mar 2012 15:28:07 +0000 (+0100) Subject: ssd: compat: match -x EXECUTABLE by /proc/pid/exe too X-Git-Tag: 1_20_0~50 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=17eedcad9406c43beddab3906c8c693626c351fb;p=oweals%2Fbusybox.git ssd: compat: match -x EXECUTABLE by /proc/pid/exe too Signed-off-by: Denys Vlasenko --- diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c index 495ed0a09..7dadc3c9e 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';