summaryrefslogtreecommitdiff
path: root/src/basic
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2023-03-23 01:05:38 +0900
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2023-03-28 17:09:15 +0200
commit201423d80144d60b48144c6283d669b63a80aabe (patch)
tree1730feed29118b18505777ef0d0aed2b6b086248 /src/basic
parent19279652c0b59efbe138c28af563e8d3968bffa1 (diff)
downloadsystemd-201423d80144d60b48144c6283d669b63a80aabe.tar.gz
process-util: introduce get_process_cmdline_strv()
The reason why get_process_cmdline() is so complicated is that we need to escape and quote arguments for building a single result string. That's necessary when we want to log or print the command line. However, when we want to parse the command line, it is not necessary that the result is a single string, but can be strv. This will be used when we parse the command line.
Diffstat (limited to 'src/basic')
-rw-r--r--src/basic/process-util.c22
-rw-r--r--src/basic/process-util.h1
2 files changed, 23 insertions, 0 deletions
diff --git a/src/basic/process-util.c b/src/basic/process-util.c
index c891f74be8..58503cf22d 100644
--- a/src/basic/process-util.c
+++ b/src/basic/process-util.c
@@ -253,6 +253,28 @@ int get_process_cmdline(pid_t pid, size_t max_columns, ProcessCmdlineFlags flags
return 0;
}
+int get_process_cmdline_strv(pid_t pid, ProcessCmdlineFlags flags, char ***ret) {
+ _cleanup_free_ char *t = NULL;
+ char **args;
+ size_t k;
+ int r;
+
+ assert(pid >= 0);
+ assert((flags & ~PROCESS_CMDLINE_COMM_FALLBACK) == 0);
+ assert(ret);
+
+ r = get_process_cmdline_nulstr(pid, SIZE_MAX, flags, &t, &k);
+ if (r < 0)
+ return r;
+
+ args = strv_parse_nulstr_full(t, k, /* drop_trailing_nuls = */ true);
+ if (!args)
+ return -ENOMEM;
+
+ *ret = args;
+ return 0;
+}
+
int container_get_leader(const char *machine, pid_t *pid) {
_cleanup_free_ char *s = NULL, *class = NULL;
const char *p;
diff --git a/src/basic/process-util.h b/src/basic/process-util.h
index 6f6fc7d94e..5188f3c605 100644
--- a/src/basic/process-util.h
+++ b/src/basic/process-util.h
@@ -40,6 +40,7 @@ typedef enum ProcessCmdlineFlags {
int get_process_comm(pid_t pid, char **ret);
int get_process_cmdline(pid_t pid, size_t max_columns, ProcessCmdlineFlags flags, char **ret);
+int get_process_cmdline_strv(pid_t pid, ProcessCmdlineFlags flags, char ***ret);
int get_process_exe(pid_t pid, char **ret);
int get_process_uid(pid_t pid, uid_t *ret);
int get_process_gid(pid_t pid, gid_t *ret);