X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fsystemd.git;a=blobdiff_plain;f=src%2Fhome%2Fhomed-manager.c;fp=src%2Fhome%2Fhomed-manager.c;h=049003241606efdfa250cd219e1faf2aecec69db;hp=9ac375abd62f84dda2dafbdfbaa9d994682d6de1;hb=8a4024120f7847e145daa15aa70a1df19957c7a4;hpb=690ae29aeee2c554d018abb12ff56b594cd52f82 diff --git a/src/home/homed-manager.c b/src/home/homed-manager.c index 9ac375abd62..04900324160 100644 --- a/src/home/homed-manager.c +++ b/src/home/homed-manager.c @@ -232,8 +232,13 @@ int manager_new(Manager **ret) { } Manager* manager_free(Manager *m) { + Home *h; + assert(m); + HASHMAP_FOREACH(h, m->homes_by_worker_pid) + (void) home_wait_for_worker(h); + hashmap_free(m->homes_by_uid); hashmap_free(m->homes_by_name); hashmap_free(m->homes_by_worker_pid); @@ -259,6 +264,7 @@ Manager* manager_free(Manager *m) { hashmap_free(m->public_keys); varlink_server_unref(m->varlink_server); + free(m->userdb_service); free(m->default_file_system_type); @@ -910,6 +916,7 @@ int manager_enumerate_images(Manager *m) { } static int manager_connect_bus(Manager *m) { + const char *suffix, *busname; int r; assert(m); @@ -923,7 +930,13 @@ static int manager_connect_bus(Manager *m) { if (r < 0) return r; - r = sd_bus_request_name_async(m->bus, NULL, "org.freedesktop.home1", 0, NULL, NULL); + suffix = getenv("SYSTEMD_HOME_DEBUG_SUFFIX"); + if (suffix) + busname = strjoina("org.freedesktop.home1.", suffix); + else + busname = "org.freedesktop.home1"; + + r = sd_bus_request_name_async(m->bus, NULL, busname, 0, NULL, NULL); if (r < 0) return log_error_errno(r, "Failed to request name: %m"); @@ -937,6 +950,7 @@ static int manager_connect_bus(Manager *m) { } static int manager_bind_varlink(Manager *m) { + const char *suffix, *socket_path; int r; assert(m); @@ -958,7 +972,15 @@ static int manager_bind_varlink(Manager *m) { (void) mkdir_p("/run/systemd/userdb", 0755); - r = varlink_server_listen_address(m->varlink_server, "/run/systemd/userdb/io.systemd.Home", 0666); + /* To make things easier to debug, when working from a homed managed home directory, let's optionally + * use a different varlink socket name */ + suffix = getenv("SYSTEMD_HOME_DEBUG_SUFFIX"); + if (suffix) + socket_path = strjoina("/run/systemd/userdb/io.systemd.Home.", suffix); + else + socket_path = "/run/systemd/userdb/io.systemd.Home"; + + r = varlink_server_listen_address(m->varlink_server, socket_path, 0666); if (r < 0) return log_error_errno(r, "Failed to bind to varlink socket: %m"); @@ -966,6 +988,15 @@ static int manager_bind_varlink(Manager *m) { if (r < 0) return log_error_errno(r, "Failed to attach varlink connection to event loop: %m"); + assert(!m->userdb_service); + m->userdb_service = strdup(basename(socket_path)); + if (!m->userdb_service) + return log_oom(); + + /* Avoid recursion */ + if (setenv("SYSTEMD_BYPASS_USERDB", m->userdb_service, 1) < 0) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to set $SYSTEMD_BYPASS_USERDB: %m"); + return 0; } @@ -1086,11 +1117,22 @@ static int manager_listen_notify(Manager *m) { .un.sun_family = AF_UNIX, .un.sun_path = "/run/systemd/home/notify", }; + const char *suffix; int r; assert(m); assert(!m->notify_socket_event_source); + suffix = getenv("SYSTEMD_HOME_DEBUG_SUFFIX"); + if (suffix) { + const char *unix_path; + + unix_path = strjoina("/run/systemd/home/notify.", suffix); + r = sockaddr_un_set_path(&sa.un, unix_path); + if (r < 0) + return log_error_errno(r, "Socket path %s does not fit in sockaddr_un: %m", unix_path); + } + fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0); if (fd < 0) return log_error_errno(errno, "Failed to create listening socket: %m");