X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fmanager.c;h=62847061a27319be99daebe533c49afd0352d20e;hp=b1eac57fab0630dfab9b8ecd177a0d6b4fb07e83;hb=06d4c99ab3d479c1a7c087a87e82fe01626128f6;hpb=c5fd1e57e4ae44be039dbfd7ab7f6eed9ca600c5 diff --git a/src/manager.c b/src/manager.c index b1eac57fa..62847061a 100644 --- a/src/manager.c +++ b/src/manager.c @@ -222,6 +222,9 @@ int manager_new(ManagerRunningAs running_as, Manager **_m) { if (!(m->environment = strv_copy(environ))) goto fail; + if (!(m->default_controllers = strv_new("cpu", NULL))) + goto fail; + if (!(m->units = hashmap_new(string_hash_func, string_compare_func))) goto fail; @@ -461,6 +464,8 @@ void manager_free(Manager *m) { lookup_paths_free(&m->lookup_paths); strv_free(m->environment); + strv_free(m->default_controllers); + hashmap_free(m->cgroup_bondings); set_free_free(m->unit_path_cache); @@ -907,7 +912,7 @@ static void transaction_drop_redundant(Manager *m) { LIST_FOREACH(transaction, k, j) { if (!job_is_anchor(k) && - job_type_is_redundant(k->type, unit_active_state(k->unit))) + (j->installed || job_type_is_redundant(k->type, unit_active_state(k->unit)))) continue; changes_something = true; @@ -917,7 +922,7 @@ static void transaction_drop_redundant(Manager *m) { if (changes_something) continue; - log_debug("Found redundant job %s/%s, dropping.", j->unit->meta.id, job_type_to_string(j->type)); + /* log_debug("Found redundant job %s/%s, dropping.", j->unit->meta.id, job_type_to_string(j->type)); */ transaction_delete_job(m, j, false); again = true; break; @@ -1069,10 +1074,15 @@ static void transaction_collect_garbage(Manager *m) { again = false; HASHMAP_FOREACH(j, m->transaction_jobs, i) { - if (j->object_list) + if (j->object_list) { + /* log_debug("Keeping job %s/%s because of %s/%s", */ + /* j->unit->meta.id, job_type_to_string(j->type), */ + /* j->object_list->subject ? j->object_list->subject->unit->meta.id : "root", */ + /* j->object_list->subject ? job_type_to_string(j->object_list->subject->type) : "root"); */ continue; + } - log_debug("Garbage collecting job %s/%s", j->unit->meta.id, job_type_to_string(j->type)); + /* log_debug("Garbage collecting job %s/%s", j->unit->meta.id, job_type_to_string(j->type)); */ transaction_delete_job(m, j, true); again = true; break; @@ -1184,8 +1194,10 @@ static int transaction_apply(Manager *m) { } while ((j = hashmap_steal_first(m->transaction_jobs))) { - if (j->installed) + if (j->installed) { + /* log_debug("Skipping already installed job %s/%s as %u", j->unit->meta.id, job_type_to_string(j->type), (unsigned) j->id); */ continue; + } if (j->unit->meta.job) job_free(j->unit->meta.job); @@ -1352,7 +1364,7 @@ static Job* transaction_add_one_job(Manager *m, JobType type, Unit *unit, bool o if (is_new) *is_new = true; - log_debug("Added job %s/%s to transaction.", unit->meta.id, job_type_to_string(type)); + /* log_debug("Added job %s/%s to transaction.", unit->meta.id, job_type_to_string(type)); */ return j; } @@ -1445,18 +1457,45 @@ static int transaction_add_job_and_dependencies( return -ENOMEM; if (is_new) { + Set *following; + + /* If we are following some other unit, make sure we + * add all dependencies of everybody following. */ + if (unit_following_set(ret->unit, &following) > 0) { + SET_FOREACH(dep, following, i) + if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, false, override, false, e, NULL)) < 0) { + log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->meta.id, bus_error(e, r)); + + if (e) + dbus_error_free(e); + } + + set_free(following); + } + /* Finally, recursively add in all dependencies. */ if (type == JOB_START || type == JOB_RELOAD_OR_START) { SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_REQUIRES], i) - if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, true, override, false, e, NULL)) < 0 && r != -EBADR) - goto fail; + if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, true, override, false, e, NULL)) < 0) { + if (r != -EBADR) + goto fail; + + if (e) + dbus_error_free(e); + } SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_BIND_TO], i) - if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, true, override, false, e, NULL)) < 0 && r != -EBADR) - goto fail; + if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, true, override, false, e, NULL)) < 0) { + + if (r != -EBADR) + goto fail; + + if (e) + dbus_error_free(e); + } SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_REQUIRES_OVERRIDABLE], i) - if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, !override, override, false, e, NULL)) < 0 && r != -EBADR) { + if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, !override, override, false, e, NULL)) < 0) { log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->meta.id, bus_error(e, r)); if (e) @@ -1472,11 +1511,17 @@ static int transaction_add_job_and_dependencies( } SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_REQUISITE], i) - if ((r = transaction_add_job_and_dependencies(m, JOB_VERIFY_ACTIVE, dep, ret, true, override, false, e, NULL)) < 0 && r != -EBADR) - goto fail; + if ((r = transaction_add_job_and_dependencies(m, JOB_VERIFY_ACTIVE, dep, ret, true, override, false, e, NULL)) < 0) { + + if (r != -EBADR) + goto fail; + + if (e) + dbus_error_free(e); + } SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_REQUISITE_OVERRIDABLE], i) - if ((r = transaction_add_job_and_dependencies(m, JOB_VERIFY_ACTIVE, dep, ret, !override, override, false, e, NULL)) < 0 && r != -EBADR) { + if ((r = transaction_add_job_and_dependencies(m, JOB_VERIFY_ACTIVE, dep, ret, !override, override, false, e, NULL)) < 0) { log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->meta.id, bus_error(e, r)); if (e) @@ -1484,22 +1529,44 @@ static int transaction_add_job_and_dependencies( } SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_CONFLICTS], i) - if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, dep, ret, true, override, true, e, NULL)) < 0 && r != -EBADR) - goto fail; + if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, dep, ret, true, override, true, e, NULL)) < 0) { + + if (r != -EBADR) + goto fail; + + if (e) + dbus_error_free(e); + } SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_CONFLICTED_BY], i) - if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, dep, ret, false, override, false, e, NULL)) < 0 && r != -EBADR) - goto fail; + if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, dep, ret, false, override, false, e, NULL)) < 0) { + log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->meta.id, bus_error(e, r)); + + if (e) + dbus_error_free(e); + } } else if (type == JOB_STOP || type == JOB_RESTART || type == JOB_TRY_RESTART) { SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_REQUIRED_BY], i) - if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, true, override, false, e, NULL)) < 0 && r != -EBADR) - goto fail; + if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, true, override, false, e, NULL)) < 0) { + + if (r != -EBADR) + goto fail; + + if (e) + dbus_error_free(e); + } SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_BOUND_BY], i) - if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, true, override, false, e, NULL)) < 0 && r != -EBADR) - goto fail; + if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, true, override, false, e, NULL)) < 0) { + + if (r != -EBADR) + goto fail; + + if (e) + dbus_error_free(e); + } } /* JOB_VERIFY_STARTED, JOB_RELOAD require no dependency handling */ @@ -1953,7 +2020,7 @@ static int manager_start_target(Manager *m, const char *name, JobMode mode) { dbus_error_init(&error); - log_info("Activating special unit %s", name); + log_debug("Activating special unit %s", name); if ((r = manager_add_job_by_name(m, JOB_START, name, mode, true, &error, NULL)) < 0) log_error("Failed to enqueue %s job: %s", name, bus_error(&error, r)); @@ -2130,6 +2197,9 @@ static int process_event(Manager *m, struct epoll_event *ev) { assert(w = ev->data.ptr); + if (w->type == WATCH_INVALID) + return 0; + switch (w->type) { case WATCH_SIGNAL: @@ -2382,8 +2452,8 @@ void manager_send_unit_plymouth(Manager *m, Unit *u) { zero(sa); sa.sa.sa_family = AF_UNIX; - strncpy(sa.un.sun_path+1, "/ply-boot-protocol", sizeof(sa.un.sun_path)-1); - if (connect(fd, &sa.sa, sizeof(sa.un)) < 0) { + strncpy(sa.un.sun_path+1, "/org/freedesktop/plymouthd", sizeof(sa.un.sun_path)-1); + if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) { if (errno != EPIPE && errno != EAGAIN && @@ -2774,7 +2844,7 @@ void manager_run_generators(Manager *m) { assert(m); - generator_path = m->running_as == MANAGER_SYSTEM ? SYSTEM_GENERATOR_PATH : SESSION_GENERATOR_PATH; + generator_path = m->running_as == MANAGER_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH; if (!(d = opendir(generator_path))) { if (errno == ENOENT) @@ -2787,9 +2857,9 @@ void manager_run_generators(Manager *m) { if (!m->generator_unit_path) { char *p; char system_path[] = "/dev/.systemd/generator-XXXXXX", - session_path[] = "/tmp/systemd-generator-XXXXXX"; + user_path[] = "/tmp/systemd-generator-XXXXXX"; - if (!(p = mkdtemp(m->running_as == MANAGER_SYSTEM ? system_path : session_path))) { + if (!(p = mkdtemp(m->running_as == MANAGER_SYSTEM ? system_path : user_path))) { log_error("Failed to generate generator directory: %m"); goto finish; } @@ -2923,9 +2993,23 @@ void manager_undo_generators(Manager *m) { m->generator_unit_path = NULL; } +int manager_set_default_controllers(Manager *m, char **controllers) { + char **l; + + assert(m); + + if (!(l = strv_copy(controllers))) + return -ENOMEM; + + strv_free(m->default_controllers); + m->default_controllers = l; + + return 0; +} + static const char* const manager_running_as_table[_MANAGER_RUNNING_AS_MAX] = { [MANAGER_SYSTEM] = "system", - [MANAGER_SESSION] = "session" + [MANAGER_USER] = "user" }; DEFINE_STRING_TABLE_LOOKUP(manager_running_as, ManagerRunningAs);