X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fsocket.c;h=075b51966f81b948c404a83b250791f97853b0a9;hp=7e62dbce9639d59f8ca7c37f07fbb21c9267424b;hb=b8131a87ccdd9376882ca0a8dd3cfe45172e4c46;hpb=032ff4afc953cae076ce0ee6a0b85020eeb1a75a diff --git a/src/socket.c b/src/socket.c index 7e62dbce9..075b51966 100644 --- a/src/socket.c +++ b/src/socket.c @@ -37,6 +37,8 @@ #include "unit-name.h" #include "dbus-socket.h" #include "missing.h" +#include "special.h" +#include "bus-errors.h" static const UnitActiveState state_translation_table[_SOCKET_STATE_MAX] = { [SOCKET_DEAD] = UNIT_INACTIVE, @@ -66,15 +68,10 @@ static void socket_init(Unit *u) { s->max_connections = 64; - s->keep_alive = false; s->priority = -1; - s->receive_buffer = 0; - s->send_buffer = 0; s->ip_tos = -1; s->ip_ttl = -1; - s->pipe_size = 0; s->mark = -1; - s->free_bind = false; exec_context_init(&s->exec_context); @@ -209,10 +206,7 @@ int socket_add_one_mount_link(Socket *s, Mount *m) { if (!socket_needs_mount(s, m->where)) return 0; - if ((r = unit_add_dependency(UNIT(m), UNIT_BEFORE, UNIT(s), true)) < 0) - return r; - - if ((r = unit_add_dependency(UNIT(s), UNIT_REQUIRES, UNIT(m), true)) < 0) + if ((r = unit_add_two_dependencies(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true)) < 0) return r; return 0; @@ -249,6 +243,17 @@ static int socket_add_device_link(Socket *s) { return r; } +static int socket_add_default_dependencies(Socket *s) { + int r; + assert(s); + + if (s->meta.manager->running_as == MANAGER_SYSTEM) + if ((r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, NULL, true)) < 0) + return r; + + return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true); +} + static int socket_load(Unit *u) { Socket *s = SOCKET(u); int r; @@ -263,7 +268,7 @@ static int socket_load(Unit *u) { if (u->meta.load_state == UNIT_LOADED) { if (have_non_accept_socket(s)) { - if ((r = unit_load_related_unit(u, ".service", (Unit**) &s->service))) + if ((r = unit_load_related_unit(u, ".service", (Unit**) &s->service)) < 0) return r; if ((r = unit_add_dependency(u, UNIT_BEFORE, UNIT(s->service), true)) < 0) @@ -281,6 +286,10 @@ static int socket_load(Unit *u) { if ((r = unit_add_default_cgroup(u)) < 0) return r; + + if (s->meta.default_dependencies) + if ((r = socket_add_default_dependencies(s)) < 0) + return r; } return socket_verify(s); @@ -577,9 +586,15 @@ static void socket_apply_socket_options(Socket *s, int fd) { if (setsockopt(fd, IPPROTO_IP, IP_TOS, &s->ip_tos, sizeof(s->ip_tos)) < 0) log_warning("IP_TOS failed: %m"); - if (s->ip_ttl >= 0) - if (setsockopt(fd, IPPROTO_IP, IP_TTL, &s->ip_ttl, sizeof(s->ip_ttl)) < 0) - log_warning("IP_TTL failed: %m"); + if (s->ip_ttl >= 0) { + int r, x; + + r = setsockopt(fd, IPPROTO_IP, IP_TTL, &s->ip_ttl, sizeof(s->ip_ttl)); + x = setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &s->ip_ttl, sizeof(s->ip_ttl)); + + if (r < 0 && x < 0) + log_warning("IP_TTL/IPV6_UNICAST_HOPS failed: %m"); + } } static void socket_apply_pipe_options(Socket *s, int fd) { @@ -807,6 +822,7 @@ static int socket_spawn(Socket *s, ExecCommand *c, pid_t *_pid) { s->meta.manager->environment, true, true, + true, s->meta.manager->confirm_spawn, s->meta.cgroup_bondings, &pid); @@ -1011,17 +1027,19 @@ fail: static void socket_enter_running(Socket *s, int cfd) { int r; + DBusError error; assert(s); + dbus_error_init(&error); if (cfd < 0) { - if ((r = manager_add_job(s->meta.manager, JOB_START, UNIT(s->service), JOB_REPLACE, true, NULL)) < 0) + if ((r = manager_add_job(s->meta.manager, JOB_START, UNIT(s->service), JOB_REPLACE, true, &error, NULL)) < 0) goto fail; socket_set_state(s, SOCKET_RUNNING); } else { Unit *u; - char *prefix, *instance, *name; + char *prefix, *instance = NULL, *name; if (s->n_connections >= s->max_connections) { log_warning("Too many incoming connections (%u)", s->n_connections); @@ -1047,7 +1065,7 @@ static void socket_enter_running(Socket *s, int cfd) { goto fail; } - r = manager_load_unit(s->meta.manager, name, NULL, &u); + r = manager_load_unit(s->meta.manager, name, NULL, NULL, &u); free(name); if (r < 0) @@ -1060,18 +1078,20 @@ static void socket_enter_running(Socket *s, int cfd) { s->n_connections ++; - if ((r = manager_add_job(u->meta.manager, JOB_START, u, JOB_REPLACE, true, NULL)) < 0) + if ((r = manager_add_job(u->meta.manager, JOB_START, u, JOB_REPLACE, true, &error, NULL)) < 0) goto fail; } return; fail: - log_warning("%s failed to queue socket startup job: %s", s->meta.id, strerror(-r)); + log_warning("%s failed to queue socket startup job: %s", s->meta.id, bus_error(&error, r)); socket_enter_stop_pre(s, false); if (cfd >= 0) close_nointr_nofail(cfd); + + dbus_error_free(&error); } static void socket_run_next(Socket *s, bool success) { @@ -1383,7 +1403,7 @@ static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) { s->failure = s->failure || !success; if (s->control_command) - exec_status_fill(&s->control_command->exec_status, pid, code, status); + exec_status_exit(&s->control_command->exec_status, pid, code, status); log_debug("%s control process exited, code=%s status=%i", u->meta.id, sigchld_code_to_string(code), status);