ssd: compat: match -x EXECUTABLE by /proc/pid/exe too
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
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 @@
[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 @@
//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 @@
{
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';