diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c index c8896c41e2..e61e0d1475 100644 --- a/src/core/unit-printf.c +++ b/src/core/unit-printf.c @@ -158,46 +158,6 @@ static int specifier_special_directory(char specifier, void *data, void *userdat return 0; } -static int specifier_user_name(char specifier, void *data, void *userdata, char **ret) { - char *t; - - /* If we are UID 0 (root), this will not result in NSS, - * otherwise it might. This is good, as we want to be able to - * run this in PID 1, where our user ID is 0, but where NSS - * lookups are not allowed. */ - - t = getusername_malloc(); - if (!t) - return -ENOMEM; - - *ret = t; - return 0; -} - -static int specifier_user_id(char specifier, void *data, void *userdata, char **ret) { - - if (asprintf(ret, UID_FMT, getuid()) < 0) - return -ENOMEM; - - return 0; -} - -static int specifier_user_home(char specifier, void *data, void *userdata, char **ret) { - - /* On PID 1 (which runs as root) this will not result in NSS, - * which is good. See above */ - - return get_home_dir(ret); -} - -static int specifier_user_shell(char specifier, void *data, void *userdata, char **ret) { - - /* On PID 1 (which runs as root) this will not result in NSS, - * which is good. See above */ - - return get_shell(ret); -} - int unit_name_printf(Unit *u, const char* format, char **ret) { /* diff --git a/src/shared/install-printf.c b/src/shared/install-printf.c index f8d0e53eca..aaab2e6665 100644 --- a/src/shared/install-printf.c +++ b/src/shared/install-printf.c @@ -103,34 +103,6 @@ static int specifier_instance(char specifier, void *data, void *userdata, char * return 0; } -static int specifier_user_name(char specifier, void *data, void *userdata, char **ret) { - char *t; - - /* If we are UID 0 (root), this will not result in NSS, - * otherwise it might. This is good, as we want to be able to - * run this in PID 1, where our user ID is 0, but where NSS - * lookups are not allowed. - - * We don't user getusername_malloc() here, because we don't want to look - * at $USER, to remain consistent with specifer_user_id() below. - */ - - t = uid_to_name(getuid()); - if (!t) - return -ENOMEM; - - *ret = t; - return 0; -} - -static int specifier_user_id(char specifier, void *data, void *userdata, char **ret) { - - if (asprintf(ret, UID_FMT, getuid()) < 0) - return -ENOMEM; - - return 0; -} - int install_full_printf(UnitFileInstallInfo *i, const char *format, char **ret) { /* This is similar to unit_full_printf() but does not support diff --git a/src/shared/specifier.c b/src/shared/specifier.c index dc7be0a993..9bef890346 100644 --- a/src/shared/specifier.c +++ b/src/shared/specifier.c @@ -33,6 +33,7 @@ #include "specifier.h" #include "string-util.h" #include "strv.h" +#include "user-util.h" /* * Generic infrastructure for replacing %x style specifiers in @@ -193,6 +194,48 @@ int specifier_kernel_release(char specifier, void *data, void *userdata, char ** return 0; } +int specifier_user_name(char specifier, void *data, void *userdata, char **ret) { + char *t; + + /* If we are UID 0 (root), this will not result in NSS, otherwise it might. This is good, as we want to be able + * to run this in PID 1, where our user ID is 0, but where NSS lookups are not allowed. + + * We don't user getusername_malloc() here, because we don't want to look at $USER, to remain consistent with + * specifer_user_id() below. + */ + + t = uid_to_name(getuid()); + if (!t) + return -ENOMEM; + + *ret = t; + return 0; +} + +int specifier_user_id(char specifier, void *data, void *userdata, char **ret) { + + if (asprintf(ret, UID_FMT, getuid()) < 0) + return -ENOMEM; + + return 0; +} + +int specifier_user_home(char specifier, void *data, void *userdata, char **ret) { + + /* On PID 1 (which runs as root) this will not result in NSS, + * which is good. See above */ + + return get_home_dir(ret); +} + +int specifier_user_shell(char specifier, void *data, void *userdata, char **ret) { + + /* On PID 1 (which runs as root) this will not result in NSS, + * which is good. See above */ + + return get_shell(ret); +} + int specifier_escape_strv(char **l, char ***ret) { char **z, **p, **q; diff --git a/src/shared/specifier.h b/src/shared/specifier.h index 0401e13e50..bd6bc55577 100644 --- a/src/shared/specifier.h +++ b/src/shared/specifier.h @@ -39,6 +39,11 @@ int specifier_boot_id(char specifier, void *data, void *userdata, char **ret); int specifier_host_name(char specifier, void *data, void *userdata, char **ret); int specifier_kernel_release(char specifier, void *data, void *userdata, char **ret); +int specifier_user_name(char specifier, void *data, void *userdata, char **ret); +int specifier_user_id(char specifier, void *data, void *userdata, char **ret); +int specifier_user_home(char specifier, void *data, void *userdata, char **ret); +int specifier_user_shell(char specifier, void *data, void *userdata, char **ret); + static inline char* specifier_escape(const char *string) { return strreplace(string, "%", "%%"); } diff --git a/src/test/test-unit-name.c b/src/test/test-unit-name.c index 013e87e73b..e24892b590 100644 --- a/src/test/test-unit-name.c +++ b/src/test/test-unit-name.c @@ -207,7 +207,7 @@ static int test_unit_printf(void) { assert_se(specifier_machine_id('m', NULL, NULL, &mid) >= 0 && mid); assert_se(specifier_boot_id('b', NULL, NULL, &bid) >= 0 && bid); assert_se(host = gethostname_malloc()); - assert_se(user = getusername_malloc()); + assert_se(user = uid_to_name(getuid())); assert_se(asprintf(&uid, UID_FMT, getuid())); assert_se(get_home_dir(&home) >= 0); assert_se(get_shell(&shell) >= 0);