X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=manager.c;h=1691719a66b72bd48eea4dfa58331409c0070e09;hb=6c78be3c3c63b59f18311b2d2b0e8d745f6ba131;hp=200bbfa006e38c6e0e1632713d3fe2b8e9ace24e;hpb=eced69b3016f32bda93030f31c0e334cc1e043f2;p=elogind.git diff --git a/manager.c b/manager.c index 200bbfa00..1691719a6 100644 --- a/manager.c +++ b/manager.c @@ -1536,15 +1536,15 @@ unsigned manager_dispatch_load_queue(Manager *m) { return n; } -int manager_load_unit(Manager *m, const char *name, const char *path, Unit **_ret) { +int manager_load_unit_prepare(Manager *m, const char *name, const char *path, Unit **_ret) { Unit *ret; int r; assert(m); assert(name || path); - /* This will load the service information files, but not actually - * start any services or anything. */ + /* This will prepare the unit for loading, but not actually + * load anything from disk. */ if (path && !is_path(path)) return -EINVAL; @@ -1577,6 +1577,24 @@ int manager_load_unit(Manager *m, const char *name, const char *path, Unit **_re unit_add_to_load_queue(ret); unit_add_to_dbus_queue(ret); + if (_ret) + *_ret = ret; + + return 0; +} + +int manager_load_unit(Manager *m, const char *name, const char *path, Unit **_ret) { + Unit *ret; + int r; + + assert(m); + + /* This will load the service information files, but not actually + * start any services or anything. */ + + if ((r = manager_load_unit_prepare(m, name, path, &ret)) < 0) + return r; + manager_dispatch_load_queue(m); if (_ret) @@ -1765,9 +1783,17 @@ static int manager_process_signal_fd(Manager *m) { sigchld = true; break; - case SIGINT: case SIGTERM: + if (m->running_as == MANAGER_INIT) + /* This is for compatibility with the + * original sysvinit */ + m->exit_code = MANAGER_REEXECUTE; + else + m->exit_code = MANAGER_EXIT; + return 0; + + case SIGINT: if (m->running_as == MANAGER_INIT) { manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET); break; @@ -1777,7 +1803,6 @@ static int manager_process_signal_fd(Manager *m) { return 0; case SIGWINCH: - if (m->running_as == MANAGER_INIT) manager_start_target(m, SPECIAL_KBREQUEST_TARGET); @@ -1791,12 +1816,7 @@ static int manager_process_signal_fd(Manager *m) { /* This is a nop on non-init */ break; - case SIGUSR1: - manager_dump_units(m, stdout, "\t"); - manager_dump_jobs(m, stdout, "\t"); - break; - - case SIGUSR2: { + case SIGUSR1: { Unit *u; u = manager_get_unit(m, SPECIAL_DBUS_SERVICE); @@ -1815,6 +1835,11 @@ static int manager_process_signal_fd(Manager *m) { break; } + case SIGUSR2: + manager_dump_units(m, stdout, "\t"); + manager_dump_jobs(m, stdout, "\t"); + break; + case SIGHUP: m->exit_code = MANAGER_RELOAD; break; @@ -1938,7 +1963,7 @@ int manager_loop(Manager *m) { if ((n = epoll_wait(m->epoll_fd, &event, 1, -1)) < 0) { - if (errno == -EINTR) + if (errno == EINTR) continue; return -errno;