diff --git a/src/libei.c b/src/libei.c index ed24ea0..623cc25 100644 --- a/src/libei.c +++ b/src/libei.c @@ -113,19 +113,8 @@ DEFINE_UNREF_CLEANUP_FUNC(ei_region); static void set_prop_cmdline(struct ei *ei) { - char path[PATH_MAX]; - - xsnprintf(path, sizeof(path), "/proc/%d/cmdline", getpid()); - _cleanup_close_ int fd = open(path, O_RDONLY); - if (fd < 0) - return; - - int len; - if ((len = read(fd, path, sizeof(path) - 1)) < 0) - return; - path[len] = '\0'; - - ei_property_update(ei, "ei.application.cmdline", path, EI_PROPERTY_PERM_NONE); + _cleanup_free_ char *cmdline = cmdline_as_str(); + ei_property_update(ei, "ei.application.cmdline", cmdline, EI_PROPERTY_PERM_NONE); } static void diff --git a/src/util-strings.c b/src/util-strings.c index 758c97d..486f2dc 100644 --- a/src/util-strings.c +++ b/src/util-strings.c @@ -471,4 +471,22 @@ MUNIT_TEST(test_strreplace) return MUNIT_OK; } + +MUNIT_TEST(test_cmdline_as_str) +{ + _cleanup_free_ char *from_function = cmdline_as_str(); + char cmdline[PATH_MAX]; + + xsnprintf(cmdline, sizeof(cmdline), "/proc/%i/cmdline", getpid()); + + int fd = open(cmdline, O_RDONLY); + munit_assert_int(fd, >=, 0); + int len = read(fd, cmdline, sizeof(cmdline) - 1); + munit_assert_int(len, >=, 0); + cmdline[len] = '\0'; + + munit_assert_string_equal(cmdline, from_function); + + return MUNIT_OK; +} #endif diff --git a/src/util-strings.h b/src/util-strings.h index 0758e24..5e257f7 100644 --- a/src/util-strings.h +++ b/src/util-strings.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -380,3 +381,19 @@ strstartswith(const char *str, const char *prefix) return prefixlen > 0 ? strneq(str, prefix, strlen(prefix)) : false; } + +/** + * Return the content of /proc/$pid/cmdline as newly allocated string. + */ +static inline char * +cmdline_as_str(void) +{ + int fd = open("/proc/self/cmdline", O_RDONLY); + if (fd > 0) { + char buffer[1024] = {0}; + int len = read(fd, buffer, sizeof(buffer) - 1); + close(fd); + return len > 0 ? xstrdup(buffer) : NULL; + } + return NULL; +} diff --git a/test/test-ei.c b/test/test-ei.c index 8272d12..bde7bc7 100644 --- a/test/test-ei.c +++ b/test/test-ei.c @@ -54,16 +54,9 @@ MUNIT_TEST(test_ei_initial_properties) { _unref_(peck) *peck = peck_new(); char pid[64]; - char cmdline[PATH_MAX]; + _cleanup_free_ char *cmdline = cmdline_as_str(); xsnprintf(pid, sizeof(pid), "%i", getpid()); - xsnprintf(cmdline, sizeof(cmdline), "/proc/%i/cmdline", getpid()); - - int fd = open(cmdline, O_RDONLY); - munit_assert_int(fd, >=, 0); - int len = read(fd, cmdline, sizeof(cmdline) - 1); - munit_assert_int(len, >=, 0); - cmdline[len] = '\0'; peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE); peck_dispatch_until_stable(peck); diff --git a/tools/eis-fake-impl-portal.c b/tools/eis-fake-impl-portal.c index d235a56..9843e13 100644 --- a/tools/eis-fake-impl-portal.c +++ b/tools/eis-fake-impl-portal.c @@ -189,19 +189,8 @@ portal_create_session(sd_bus_message *m, void *userdata, static void set_prop_cmdline(struct reis *reis) { - char path[PATH_MAX]; - - xsnprintf(path, sizeof(path), "/proc/%i/cmdline", getpid()); - _cleanup_close_ int fd = open(path, O_RDONLY); - if (fd < 0) - return; - - int len; - if ((len = read(fd, path, sizeof(path) - 1)) < 0) - return; - path[len] = '\0'; - - reis_set_property_with_permissions(reis, "ei.application.cmdline", path, REIS_PROPERTY_PERM_NONE); + _cleanup_free_ char *cmdline = cmdline_as_str(); + reis_set_property_with_permissions(reis, "ei.application.cmdline", cmdline, REIS_PROPERTY_PERM_NONE); } static void diff --git a/tools/eis-fake-portal.c b/tools/eis-fake-portal.c index 8503bcb..abfdf75 100644 --- a/tools/eis-fake-portal.c +++ b/tools/eis-fake-portal.c @@ -230,19 +230,8 @@ portal_create_session(sd_bus_message *m, void *userdata, static void set_prop_cmdline(struct reis *reis) { - char path[PATH_MAX]; - - xsnprintf(path, sizeof(path), "/proc/%i/cmdline", getpid()); - _cleanup_close_ int fd = open(path, O_RDONLY); - if (fd < 0) - return; - - int len; - if ((len = read(fd, path, sizeof(path) - 1)) < 0) - return; - path[len] = '\0'; - - reis_set_property_with_permissions(reis, "ei.application.cmdline", path, REIS_PROPERTY_PERM_NONE); + _cleanup_free_ char *cmdline = cmdline_as_str(); + reis_set_property_with_permissions(reis, "ei.application.cmdline", cmdline, REIS_PROPERTY_PERM_NONE); } static void