Found myself in a need of better pidof than is currently
available. This helps find tricky things (hald addons are
closest examples) that can't be found otherwise.

Signed-off-by: Alexander Shishkin <[email protected]>
---
 include/libbb.h          |    3 ++-
 libbb/find_pid_by_name.c |    4 ++--
 libbb/procps.c           |   10 ++++++++++
 3 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/include/libbb.h b/include/libbb.h
index c7b4de1..51ac69e 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1280,6 +1280,7 @@ typedef struct procps_status_t {
 /* Fields are set to 0/NULL if failed to determine (or not requested) */
        uint16_t argv_len;
        char *argv0;
+       char *exe;
        IF_SELINUX(char *context;)
        /* Everything below must contain no ptrs to malloc'ed data:
         * it is memset(0) for each process in procps_scan() */
@@ -1327,7 +1328,7 @@ enum {
        PSSCAN_COMM     = 1 << 5,
        /* PSSCAN_CMD      = 1 << 6, - use read_cmdline instead */
        PSSCAN_ARGV0    = 1 << 7,
-       /* PSSCAN_EXE      = 1 << 8, - not implemented */
+       PSSCAN_EXE      = 1 << 8,
        PSSCAN_STATE    = 1 << 9,
        PSSCAN_VSZ      = 1 << 10,
        PSSCAN_RSS      = 1 << 11,
diff --git a/libbb/find_pid_by_name.c b/libbb/find_pid_by_name.c
index 600d4e1..6a57fb1 100644
--- a/libbb/find_pid_by_name.c
+++ b/libbb/find_pid_by_name.c
@@ -83,11 +83,11 @@ pid_t* FAST_FUNC find_pid_by_name(const char *procName)
        procps_status_t* p = NULL;
 
        pidList = xzalloc(sizeof(*pidList));
-       while ((p = procps_scan(p, PSSCAN_PID|PSSCAN_COMM|PSSCAN_ARGVN))) {
+       while ((p = procps_scan(p, 
PSSCAN_PID|PSSCAN_COMM|PSSCAN_ARGVN|PSSCAN_EXE))) {
                if (comm_match(p, procName)
                /* or we require argv0 to match (essential for matching 
reexeced /proc/self/exe)*/
                 || (p->argv0 && strcmp(bb_basename(p->argv0), procName) == 0)
-               /* TODO: we can also try /proc/NUM/exe link, do we want that? */
+                || (p->exe && strcmp(bb_basename(p->exe), procName) == 0)
                ) {
                        pidList = xrealloc_vector(pidList, 2, i);
                        pidList[i++] = p->pid;
diff --git a/libbb/procps.c b/libbb/procps.c
index 6e122c4..db2a216 100644
--- a/libbb/procps.c
+++ b/libbb/procps.c
@@ -111,6 +111,8 @@ void FAST_FUNC free_procps_scan(procps_status_t* sp)
 {
        closedir(sp->dir);
        free(sp->argv0);
+       if (sp->exe)
+               free(sp->exe);
        IF_SELINUX(free(sp->context);)
        free(sp);
 }
@@ -450,6 +452,14 @@ procps_status_t* FAST_FUNC procps_scan(procps_status_t* 
sp, int flags)
                                sp->argv0 = xstrdup(buf);
                        }
                }
+
+               if (flags & PSSCAN_EXE) {
+                       if (sp->exe)
+                               free(sp->exe);
+
+                       strcpy(filename_tail, "/exe");
+                       sp->exe = xmalloc_readlink(filename);
+               }
 #endif
                break;
        }
-- 
1.6.3.3

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to