From a6538e8d3030067b01ae436c59d7fc70559a40ac Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 8 Aug 2018 14:50:57 +0200 Subject: logind: change user-runtime-dir to query runtime dir size from logind via the bus I think this is a slightly cleaner approach than parsing the configuration file at multiple places, as this way there's only a single reload cycle for logind.conf, and that's systemd-logind.service's runtime. This means that logind and dbus become a requirement of user-runtime-dir, but given that XDG_RUNTIME_DIR is not set anyway without logind and dbus around this isn't really any limitation. This also simplifies linking a bit as this means user-runtime-dir doesn't have to link against any code of logind itself. (cherry picked from commit 07ee5adb356b9fde500c8a5226f24a314789832b) --- meson.build | 18 ++++++++---------- src/login/meson.build | 1 - src/login/user-runtime-dir.c | 37 ++++++++++++++++++++++++------------- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/meson.build b/meson.build index ec4d37bf6..38312a56f 100644 --- a/meson.build +++ b/meson.build @@ -1967,16 +1967,6 @@ test_dlopen = executable( # test_dlopen, # args : [pam_systemd.full_path()]) # path to dlopen must include a slash # endif -# endif -# -# executable('systemd-user-runtime-dir', -# user_runtime_dir_sources, -# include_directories : includes, -# link_with : [libshared, liblogind_core], -# install_rpath : rootlibexecdir, -# install : true, -# install_dir : rootlibexecdir) -# #else executable('elogind', @@ -2011,6 +2001,14 @@ exe = executable('elogind-inhibit', install : true, install_dir : rootbindir) public_programs += [exe] + executable('elogind-user-runtime-dir', + user_runtime_dir_sources, + include_directories : includes, + link_with : [libshared], + install_rpath : rootlibexecdir, + install : true, + install_dir : rootlibexecdir) +endif if conf.get('HAVE_PAM') == 1 version_script_arg = join_paths(meson.current_source_dir(), pam_elogind_sym) diff --git a/src/login/meson.build b/src/login/meson.build index f8c536464..81f39e1ea 100644 --- a/src/login/meson.build +++ b/src/login/meson.build @@ -83,7 +83,6 @@ loginctl_sources = files(''' #if 0 /// UNNEEDED by elogind # user_runtime_dir_sources = files(''' # user-runtime-dir.c -# logind.h # '''.split()) #endif // 0 diff --git a/src/login/user-runtime-dir.c b/src/login/user-runtime-dir.c index 3ba4af3f2..d482f8237 100644 --- a/src/login/user-runtime-dir.c +++ b/src/login/user-runtime-dir.c @@ -3,9 +3,11 @@ #include #include +//#include "sd-bus.h" + +//#include "bus-error.h" #include "fs-util.h" #include "label.h" -//#include "logind.h" #include "mkdir.h" #include "mount-util.h" #include "path-util.h" @@ -20,22 +22,29 @@ #include "user-runtime-dir.h" #if 0 /// UNNEEDED by elogind -static int gather_configuration(size_t *runtime_dir_size) { - Manager m = {}; +static int acquire_runtime_dir_size(uint64_t *ret) { + _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; + _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL; int r; - manager_reset_config(&m); + r = sd_bus_default_system(&bus); + if (r < 0) + return log_error_errno(r, "Failed to connect to system bus: %m"); - r = manager_parse_config_file(&m); + r = sd_bus_get_property_trivial(bus, "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", "RuntimeDirectorySize", &error, 't', ret); if (r < 0) - log_warning_errno(r, "Failed to parse logind.conf: %m"); + return log_error_errno(r, "Failed to acquire runtime directory size: %s", bus_error_message(&error, r)); - *runtime_dir_size = m.runtime_dir_size; return 0; } #endif // 0 -static int user_mkdir_runtime_path(const char *runtime_path, uid_t uid, gid_t gid, size_t runtime_dir_size) { +static int user_mkdir_runtime_path( + const char *runtime_path, + uid_t uid, + gid_t gid, + uint64_t runtime_dir_size) { + int r; assert(runtime_path); @@ -53,10 +62,10 @@ static int user_mkdir_runtime_path(const char *runtime_path, uid_t uid, gid_t gi char options[sizeof("mode=0700,uid=,gid=,size=,smackfsroot=*") + DECIMAL_STR_MAX(uid_t) + DECIMAL_STR_MAX(gid_t) - + DECIMAL_STR_MAX(size_t)]; + + DECIMAL_STR_MAX(uint64_t)]; xsprintf(options, - "mode=0700,uid=" UID_FMT ",gid=" GID_FMT ",size=%zu%s", + "mode=0700,uid=" UID_FMT ",gid=" GID_FMT ",size=%" PRIu64 "%s", uid, gid, runtime_dir_size, mac_smack_use() ? ",smackfsroot=*" : ""); @@ -118,7 +127,7 @@ static int user_remove_runtime_path(const char *runtime_path) { #if 0 /// having a User instance, elogind can ask its manager directly. static int do_mount(const char *user) { char runtime_path[sizeof("/run/user") + DECIMAL_STR_MAX(uid_t)]; - size_t runtime_dir_size; + uint64_t runtime_dir_size; uid_t uid; gid_t gid; int r; @@ -131,9 +140,11 @@ static int do_mount(const char *user) { : "Failed to look up user \"%s\": %m", user); - xsprintf(runtime_path, "/run/user/" UID_FMT, uid); + r = acquire_runtime_dir_size(&runtime_dir_size); + if (r < 0) + return r; - assert_se(gather_configuration(&runtime_dir_size) == 0); + xsprintf(runtime_path, "/run/user/" UID_FMT, uid); #else static int do_mount(const char *runtime_path, size_t runtime_dir_size, uid_t uid, gid_t gid) { #endif // 0 -- cgit v1.2.3