summaryrefslogtreecommitdiff
path: root/utils.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2013-10-21 15:49:11 +0200
committerFelix Fietkau <nbd@openwrt.org>2013-10-22 14:10:33 +0200
commitf80b9e4acc47cf454768b44142495fdb8a68a39f (patch)
tree799f4f70ae544067ba2135746a3265a907613ef4 /utils.c
parent381f47c5af62cec173528f5f539558d7a18b6d30 (diff)
downloadnetifd-f80b9e4acc47cf454768b44142495fdb8a68a39f.tar.gz
utils: add a function for checking if a process given by pid is still alive
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Diffstat (limited to 'utils.c')
-rw-r--r--utils.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/utils.c b/utils.c
index 6b53c22..d202505 100644
--- a/utils.c
+++ b/utils.c
@@ -18,6 +18,10 @@
#include <arpa/inet.h>
#include <netinet/in.h>
+#ifdef __APPLE__
+#include <libproc.h>
+#endif
+
void
__vlist_simple_init(struct vlist_simple_tree *tree, int offset)
{
@@ -168,3 +172,26 @@ crc32_file(FILE *fp)
return c ^ 0xFFFFFFFF;
}
+
+bool check_pid_path(int pid, const char *exe)
+{
+ int proc_exe_len;
+ int exe_len = strlen(exe);
+
+#ifdef __APPLE__
+ char proc_exe_buf[PROC_PIDPATHINFO_SIZE];
+
+ proc_exe_len = proc_pidpath(pid, proc_exe_buf, sizeof(proc_exe_buf));
+#else
+ char proc_exe[32];
+ char *proc_exe_buf = alloca(exe_len);
+
+ sprintf(proc_exe, "/proc/%d/exe", pid);
+ proc_exe_len = readlink(proc_exe, proc_exe_buf, exe_len);
+#endif
+
+ if (proc_exe_len != exe_len)
+ return false;
+
+ return !memcmp(exe, proc_exe_buf, exe_len);
+}