diff options
author | David Herrmann <dh.herrmann@gmail.com> | 2015-09-29 11:18:46 +0200 |
---|---|---|
committer | David Herrmann <dh.herrmann@gmail.com> | 2015-11-16 15:34:41 +0100 |
commit | b690ef12b59187074cf5a9c02a69d06fa1398789 (patch) | |
tree | c3ec12aec59cc72553b0d771a88855c9ba9cb8b2 /src/login/logind-user.c | |
parent | 157f50577fbee094eb8ca18f3f0af4e82af8558f (diff) |
login: make user->service static
Just like user->slice, there is no reason to store the unit name in /run,
nor should we allocate it dynamically on job instantiation/removal. Just
keep it statically around at all times and rely on user->started ||
user->stopping to figure out whether the unit exists or not.
Diffstat (limited to 'src/login/logind-user.c')
-rw-r--r-- | src/login/logind-user.c | 52 |
1 files changed, 20 insertions, 32 deletions
diff --git a/src/login/logind-user.c b/src/login/logind-user.c index 292a583103..b9d9d537e2 100644 --- a/src/login/logind-user.c +++ b/src/login/logind-user.c @@ -67,6 +67,7 @@ int user_new(User **out, Manager *m, uid_t uid, gid_t gid, const char *name) { u->manager = m; u->uid = uid; u->gid = gid; + xsprintf(lu, UID_FMT, uid); u->name = strdup(name); if (!u->name) @@ -78,11 +79,14 @@ int user_new(User **out, Manager *m, uid_t uid, gid_t gid, const char *name) { if (asprintf(&u->runtime_path, "/run/user/"UID_FMT, uid) < 0) return -ENOMEM; - xsprintf(lu, UID_FMT, uid); r = slice_build_subslice(SPECIAL_USER_SLICE, lu, &u->slice); if (r < 0) return r; + r = unit_name_build("user", lu, ".service", &u->service); + if (r < 0) + return r; + r = hashmap_put(m->users, UID_TO_PTR(uid), u); if (r < 0) return r; @@ -91,6 +95,10 @@ int user_new(User **out, Manager *m, uid_t uid, gid_t gid, const char *name) { if (r < 0) return r; + r = hashmap_put(m->user_units, u->service, u); + if (r < 0) + return r; + *out = u; u = NULL; return 0; @@ -155,8 +163,6 @@ static int user_save_internal(User *u) { if (u->runtime_path) fprintf(f, "RUNTIME=%s\n", u->runtime_path); - if (u->service) - fprintf(f, "SERVICE=%s\n", u->service); if (u->service_job) fprintf(f, "SERVICE_JOB=%s\n", u->service_job); @@ -297,7 +303,6 @@ int user_load(User *u) { assert(u); r = parse_env_file(u->state_file, NEWLINE, - "SERVICE", &u->service, "SERVICE_JOB", &u->service_job, "SLICE_JOB", &u->slice_job, "DISPLAY", &display, @@ -425,34 +430,20 @@ static int user_start_service(User *u) { assert(u); - if (!u->service) { - char lu[DECIMAL_STR_MAX(uid_t) + 1], *service; - - xsprintf(lu, UID_FMT, u->uid); - r = unit_name_build("user", lu, ".service", &service); - if (r < 0) - return log_error_errno(r, "Failed to build service name: %m"); + u->service_job = mfree(u->service_job); - r = manager_start_unit( - u->manager, - service, - &error, - &job); - if (r < 0) { - log_error_errno(r, "Failed to start user service, ignoring: %s", bus_error_message(&error, r)); - free(service); - /* we don't fail due to this, let's try to continue */ - } else { - u->service = service; - - free(u->service_job); - u->service_job = job; - } + r = manager_start_unit( + u->manager, + u->service, + &error, + &job); + if (r < 0) { + /* we don't fail due to this, let's try to continue */ + log_error_errno(r, "Failed to start user service, ignoring: %s", bus_error_message(&error, r)); + } else { + u->service_job = job; } - if (u->service) - (void) hashmap_put(u->manager->user_units, u->service, u); - return 0; } @@ -526,9 +517,6 @@ static int user_stop_service(User *u) { assert(u); - if (!u->service) - return 0; - r = manager_stop_unit(u->manager, u->service, &error, &job); if (r < 0) { log_error("Failed to stop user service: %s", bus_error_message(&error, r)); |