summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2018-04-06 23:37:31 +0200
committerThomas Haller <thaller@redhat.com>2018-04-16 16:03:14 +0200
commite5e8f86c3dcc0c5a64169f92089f6354c6a0cf60 (patch)
treef41f6b53e209226355c73d84160bfb26205900e6
parent313f47c9155846950602351330f2f25c299775d5 (diff)
downloadNetworkManager-e5e8f86c3dcc0c5a64169f92089f6354c6a0cf60.tar.gz
shared: move nm_utils_get_start_time_for_pid() to shared/nm-utils
We will also use it in nmcli later. It will be needed when we replace polkit_unix_process_new_for_owner(). Which is still far down the road.
-rw-r--r--shared/nm-utils/nm-shared-utils.c79
-rw-r--r--shared/nm-utils/nm-shared-utils.h4
-rw-r--r--src/nm-auth-subject.c1
-rw-r--r--src/nm-core-utils.c77
-rw-r--r--src/nm-core-utils.h2
5 files changed, 83 insertions, 80 deletions
diff --git a/shared/nm-utils/nm-shared-utils.c b/shared/nm-utils/nm-shared-utils.c
index 556594aca3..ca5238b42b 100644
--- a/shared/nm-utils/nm-shared-utils.c
+++ b/shared/nm-utils/nm-shared-utils.c
@@ -1195,3 +1195,82 @@ nm_utils_strv_make_deep_copied (const char **strv)
return (char **) strv;
}
+
+/*****************************************************************************/
+
+/**
+ * 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.
+ *
+ * Returns: the timestamp when the process started (by parsing /proc/$PID/stat).
+ * If an error occurs (e.g. the process does not exist), 0 is returned.
+ *
+ * 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, pid_t *out_ppid)
+{
+ guint64 start_time;
+ char filename[256];
+ gs_free gchar *contents = NULL;
+ size_t length;
+ gs_strfreev gchar **tokens = NULL;
+ guint num_tokens;
+ gchar *p;
+ char state = ' ';
+ gint64 ppid = 0;
+
+ start_time = 0;
+ contents = NULL;
+
+ g_return_val_if_fail (pid > 0, 0);
+
+ nm_sprintf_buf (filename, "/proc/%"G_GUINT64_FORMAT"/stat", (guint64) pid);
+
+ if (!g_file_get_contents (filename, &contents, &length, NULL))
+ goto fail;
+
+ /* start time is the token at index 19 after the '(process name)' entry - since only this
+ * field can contain the ')' character, search backwards for this to avoid malicious
+ * processes trying to fool us
+ */
+ p = strrchr (contents, ')');
+ if (p == NULL)
+ goto fail;
+ p += 2; /* skip ') ' */
+ if (p - contents >= (int) length)
+ goto fail;
+
+ state = p[0];
+
+ tokens = g_strsplit (p, " ", 0);
+
+ num_tokens = g_strv_length (tokens);
+
+ if (num_tokens < 20)
+ goto fail;
+
+ if (out_ppid) {
+ ppid = _nm_utils_ascii_str_to_int64 (tokens[1], 10, 1, G_MAXINT, 0);
+ if (ppid == 0)
+ goto fail;
+ }
+
+ start_time = _nm_utils_ascii_str_to_int64 (tokens[19], 10, 1, G_MAXINT64, 0);
+ if (start_time == 0)
+ goto fail;
+
+ NM_SET_OUT (out_state, state);
+ NM_SET_OUT (out_ppid, ppid);
+ return start_time;
+
+fail:
+ NM_SET_OUT (out_state, ' ');
+ NM_SET_OUT (out_ppid, 0);
+ return 0;
+}
diff --git a/shared/nm-utils/nm-shared-utils.h b/shared/nm-utils/nm-shared-utils.h
index 37f0621389..af897171ed 100644
--- a/shared/nm-utils/nm-shared-utils.h
+++ b/shared/nm-utils/nm-shared-utils.h
@@ -586,4 +586,8 @@ int nm_utils_fd_read_loop_exact (int fd, void *buf, size_t nbytes, bool do_poll)
/*****************************************************************************/
+guint64 nm_utils_get_start_time_for_pid (pid_t pid, char *out_state, pid_t *out_ppid);
+
+/*****************************************************************************/
+
#endif /* __NM_SHARED_UTILS_H__ */
diff --git a/src/nm-auth-subject.c b/src/nm-auth-subject.c
index 24a55f81d7..6e75ecfe8b 100644
--- a/src/nm-auth-subject.c
+++ b/src/nm-auth-subject.c
@@ -34,7 +34,6 @@
#include <stdlib.h>
#include "nm-dbus-manager.h"
-#include "NetworkManagerUtils.h"
enum {
PROP_0,
diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c
index 2a50f8f816..ad20e2aa4f 100644
--- a/src/nm-core-utils.c
+++ b/src/nm-core-utils.c
@@ -452,83 +452,6 @@ nm_utils_modprobe (GError **error, gboolean suppress_error_logging, const char *
return exit_status;
}
-/**
- * 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.
- *
- * Returns: the timestamp when the process started (by parsing /proc/$PID/stat).
- * If an error occurs (e.g. the process does not exist), 0 is returned.
- *
- * 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, pid_t *out_ppid)
-{
- guint64 start_time;
- char filename[256];
- gs_free gchar *contents = NULL;
- size_t length;
- gs_strfreev gchar **tokens = NULL;
- guint num_tokens;
- gchar *p;
- char state = ' ';
- gint64 ppid = 0;
-
- start_time = 0;
- contents = NULL;
-
- g_return_val_if_fail (pid > 0, 0);
-
- nm_sprintf_buf (filename, "/proc/%"G_GUINT64_FORMAT"/stat", (guint64) pid);
-
- if (!g_file_get_contents (filename, &contents, &length, NULL))
- goto fail;
-
- /* start time is the token at index 19 after the '(process name)' entry - since only this
- * field can contain the ')' character, search backwards for this to avoid malicious
- * processes trying to fool us
- */
- p = strrchr (contents, ')');
- if (p == NULL)
- goto fail;
- p += 2; /* skip ') ' */
- if (p - contents >= (int) length)
- goto fail;
-
- state = p[0];
-
- tokens = g_strsplit (p, " ", 0);
-
- num_tokens = g_strv_length (tokens);
-
- if (num_tokens < 20)
- goto fail;
-
- if (out_ppid) {
- ppid = _nm_utils_ascii_str_to_int64 (tokens[1], 10, 1, G_MAXINT, 0);
- if (ppid == 0)
- goto fail;
- }
-
- start_time = _nm_utils_ascii_str_to_int64 (tokens[19], 10, 1, G_MAXINT64, 0);
- if (start_time == 0)
- goto fail;
-
- NM_SET_OUT (out_state, state);
- NM_SET_OUT (out_ppid, ppid);
- return start_time;
-
-fail:
- NM_SET_OUT (out_state, ' ');
- NM_SET_OUT (out_ppid, 0);
- return 0;
-}
-
/*****************************************************************************/
typedef struct {
diff --git a/src/nm-core-utils.h b/src/nm-core-utils.h
index 6b3682aa8f..ec9e294772 100644
--- a/src/nm-core-utils.h
+++ b/src/nm-core-utils.h
@@ -178,8 +178,6 @@ nm_utils_ip_route_metric_penalize (int addr_family, guint32 metric, guint32 pena
int nm_utils_modprobe (GError **error, gboolean suppress_error_loggin, const char *arg1, ...) G_GNUC_NULL_TERMINATED;
-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,
guint32 sleep_duration_msec, guint32 max_wait_msec);