From fa9f7fe6e3530779d9bf762fa2cb0be001a3322a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 30 Jun 2015 14:51:42 +0200 Subject: [PATCH] core: return parent pid from nm_utils_get_start_time_for_pid() (cherry picked from commit 7c9eefa7677dce5a36b7a9ee303b2098a11f0efc) --- src/NetworkManagerUtils.c | 13 ++++++++++--- src/NetworkManagerUtils.h | 2 +- src/dhcp-manager/nm-dhcp-client.c | 2 +- src/nm-auth-subject.c | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c index 4b17afa046..a870f51751 100644 --- a/src/NetworkManagerUtils.c +++ b/src/NetworkManagerUtils.c @@ -304,6 +304,7 @@ nm_utils_modprobe (GError **error, gboolean suppress_error_logging, const char * * nm_utils_get_start_time_for_pid: * @pid: the process identifier * @out_state: return the state character, like R, S, Z. See `man 5 proc`. + * @out_ppid: parent process id * * Originally copied from polkit source (src/polkit/polkitunixprocess.c) * and adjusted. @@ -314,7 +315,7 @@ nm_utils_modprobe (GError **error, gboolean suppress_error_logging, const char * * The returned start time counts since boot, in the unit HZ (with HZ usually being (1/100) seconds) **/ guint64 -nm_utils_get_start_time_for_pid (pid_t pid, char *out_state) +nm_utils_get_start_time_for_pid (pid_t pid, char *out_state, pid_t *out_ppid) { guint64 start_time; gs_free gchar *filename = NULL; @@ -325,6 +326,7 @@ nm_utils_get_start_time_for_pid (pid_t pid, char *out_state) gchar *p; gchar *endp; char state = '\0'; + gint64 ppid = 0; start_time = 0; contents = NULL; @@ -356,6 +358,9 @@ nm_utils_get_start_time_for_pid (pid_t pid, char *out_state) if (num_tokens < 20) goto out; + if (out_ppid) + ppid = _nm_utils_ascii_str_to_int64 (tokens[1], 10, 1, G_MAXINT, 0); + errno = 0; start_time = strtoull (tokens[19], &endp, 10); if (*endp != '\0' || errno != 0) @@ -364,6 +369,8 @@ nm_utils_get_start_time_for_pid (pid_t pid, char *out_state) out: if (out_state) *out_state = state; + if (out_ppid) + *out_ppid = ppid; return start_time; } @@ -841,7 +848,7 @@ nm_utils_kill_process_sync (pid_t pid, guint64 start_time, int sig, guint64 log_ g_return_if_fail (log_name != NULL); g_return_if_fail (wait_before_kill_msec > 0); - start_time0 = nm_utils_get_start_time_for_pid (pid, &p_state); + start_time0 = nm_utils_get_start_time_for_pid (pid, &p_state, NULL); if (start_time0 == 0) { nm_log_dbg (log_domain, LOG_NAME_PROCESS_FMT ": cannot kill process %ld because it seems already gone", LOG_NAME_ARGS, (long int) pid); @@ -894,7 +901,7 @@ nm_utils_kill_process_sync (pid_t pid, guint64 start_time, int sig, guint64 log_ max_wait_until = 0; while (TRUE) { - start_time = nm_utils_get_start_time_for_pid (pid, &p_state); + start_time = nm_utils_get_start_time_for_pid (pid, &p_state, NULL); if (start_time != start_time0) { nm_log_dbg (log_domain, LOG_NAME_PROCESS_FMT ": process is gone after sending signal %s%s", diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h index 42c0bcfe19..c1512176fc 100644 --- a/src/NetworkManagerUtils.h +++ b/src/NetworkManagerUtils.h @@ -69,7 +69,7 @@ str_if_set (const char *str, const char *fallback) return str ? str : fallback; } -guint64 nm_utils_get_start_time_for_pid (pid_t pid, char *out_state); +guint64 nm_utils_get_start_time_for_pid (pid_t pid, char *out_state, pid_t *out_ppid); void nm_utils_kill_process_sync (pid_t pid, guint64 start_time, int sig, guint64 log_domain, const char *log_name, guint32 wait_before_kill_msec, diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c index 0817d51b1c..cab3776ac3 100644 --- a/src/dhcp-manager/nm-dhcp-client.c +++ b/src/dhcp-manager/nm-dhcp-client.c @@ -592,7 +592,7 @@ nm_dhcp_client_stop_existing (const char *pid_file, const char *binary_name) const char *exe; /* Ensure the process is a DHCP client */ - start_time = nm_utils_get_start_time_for_pid (tmp, NULL); + start_time = nm_utils_get_start_time_for_pid (tmp, NULL, NULL); proc_path = g_strdup_printf ("/proc/%ld/cmdline", tmp); if ( start_time && g_file_get_contents (proc_path, &proc_contents, NULL, NULL)) { diff --git a/src/nm-auth-subject.c b/src/nm-auth-subject.c index 3fc0e64a1d..c67424e788 100644 --- a/src/nm-auth-subject.c +++ b/src/nm-auth-subject.c @@ -360,7 +360,7 @@ constructed (GObject *object) if (!priv->unix_process.dbus_sender || !*priv->unix_process.dbus_sender) break; - priv->unix_process.start_time = nm_utils_get_start_time_for_pid (priv->unix_process.pid, NULL); + priv->unix_process.start_time = nm_utils_get_start_time_for_pid (priv->unix_process.pid, NULL, NULL); if (!priv->unix_process.start_time) { /* could not detect the process start time. The subject is invalid, but don't