X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fsocket.c;h=874cc9169714e0f08451402494221424f145e29b;hb=5925dd3c7ab771c86036b4a91640957e5d7a0e80;hp=ef7674f46386fae40a3093316ae51a105ec1f382;hpb=871d7de47c13ee6cd78b8eefdf9128be3c740ac0;p=elogind.git diff --git a/src/socket.c b/src/socket.c index ef7674f46..874cc9169 100644 --- a/src/socket.c +++ b/src/socket.c @@ -49,7 +49,7 @@ static const UnitActiveState state_translation_table[_SOCKET_STATE_MAX] = { [SOCKET_STOP_POST] = UNIT_DEACTIVATING, [SOCKET_FINAL_SIGTERM] = UNIT_DEACTIVATING, [SOCKET_FINAL_SIGKILL] = UNIT_DEACTIVATING, - [SOCKET_MAINTAINANCE] = UNIT_INACTIVE, + [SOCKET_MAINTENANCE] = UNIT_INACTIVE, }; static void socket_init(Unit *u) { @@ -58,7 +58,6 @@ static void socket_init(Unit *u) { assert(u); assert(u->meta.load_state == UNIT_STUB); - s->timer_watch.type = WATCH_INVALID; s->backlog = SOMAXCONN; s->timeout_usec = DEFAULT_TIMEOUT_USEC; s->directory_mode = 0755; @@ -708,7 +707,7 @@ static void socket_enter_dead(Socket *s, bool success) { if (!success) s->failure = true; - socket_set_state(s, s->failure ? SOCKET_MAINTAINANCE : SOCKET_DEAD); + socket_set_state(s, s->failure ? SOCKET_MAINTENANCE : SOCKET_DEAD); } static void socket_enter_signal(Socket *s, SocketState state, bool success); @@ -996,12 +995,12 @@ static int socket_start(Unit *u) { /* If the service is alredy actvie we cannot start the * socket */ if (s->service->state != SERVICE_DEAD && - s->service->state != SERVICE_MAINTAINANCE && + s->service->state != SERVICE_MAINTENANCE && s->service->state != SERVICE_AUTO_RESTART) return -EBUSY; } - assert(s->state == SOCKET_DEAD || s->state == SOCKET_MAINTAINANCE); + assert(s->state == SOCKET_DEAD || s->state == SOCKET_MAINTENANCE); s->failure = false; socket_enter_start_pre(s); @@ -1048,7 +1047,7 @@ static int socket_serialize(Unit *u, FILE *f, FDSet *fds) { unit_serialize_item_format(u, f, "n-accepted", "%u", s->n_accepted); if (s->control_pid > 0) - unit_serialize_item_format(u, f, "control-pid", "%u", (unsigned) s->control_pid); + unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) s->control_pid); if (s->control_command_id >= 0) unit_serialize_item(u, f, "control-command", socket_exec_command_to_string(s->control_command_id)); @@ -1068,7 +1067,7 @@ static int socket_serialize(Unit *u, FILE *f, FDSet *fds) { if ((r = socket_address_print(&p->address, &t)) < 0) return r; - unit_serialize_item_format(u, f, "socket", "%i %s", copy, t); + unit_serialize_item_format(u, f, "socket", "%i %i %s", copy, p->address.type, t); free(t); } else { assert(p->type == SOCKET_FIFO); @@ -1111,12 +1110,12 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, else s->n_accepted += k; } else if (streq(key, "control-pid")) { - unsigned pid; + pid_t pid; - if ((r = safe_atou(value, &pid)) < 0 || pid <= 0) + if ((r = parse_pid(value, &pid)) < 0) log_debug("Failed to parse control-pid value %s", value); else - s->control_pid = (pid_t) pid; + s->control_pid = pid; } else if (streq(key, "control-command")) { SocketExecCommand id; @@ -1146,15 +1145,15 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, } } else if (streq(key, "socket")) { - int fd, skip = 0; + int fd, type, skip = 0; SocketPort *p; - if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd)) + if (sscanf(value, "%i %i %n", &fd, &type, &skip) < 2 || fd < 0 || type < 0 || !fdset_contains(fds, fd)) log_debug("Failed to parse socket value %s", value); else { LIST_FOREACH(port, p, s->ports) - if (socket_address_is(&p->address, value+skip)) + if (socket_address_is(&p->address, value+skip, type)) break; if (p) { @@ -1229,12 +1228,14 @@ static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) { assert(s); assert(pid >= 0); - success = is_clean_exit(code, status); - s->failure = s->failure || !success; + if (pid != s->control_pid) + return; - assert(s->control_pid == pid); s->control_pid = 0; + success = is_clean_exit(code, status); + s->failure = s->failure || !success; + if (s->control_command) exec_status_fill(&s->control_command->exec_status, pid, code, status); @@ -1330,7 +1331,7 @@ static void socket_timer_event(Unit *u, uint64_t elapsed, Watch *w) { break; case SOCKET_FINAL_SIGKILL: - log_warning("%s still around after SIGKILL (2). Entering maintainance mode.", u->meta.id); + log_warning("%s still around after SIGKILL (2). Entering maintenance mode.", u->meta.id); socket_enter_dead(s, false); break; @@ -1394,7 +1395,7 @@ static const char* const socket_state_table[_SOCKET_STATE_MAX] = { [SOCKET_STOP_POST] = "stop-post", [SOCKET_FINAL_SIGTERM] = "final-sigterm", [SOCKET_FINAL_SIGKILL] = "final-sigkill", - [SOCKET_MAINTAINANCE] = "maintainance" + [SOCKET_MAINTENANCE] = "maintenance" }; DEFINE_STRING_TABLE_LOOKUP(socket_state, SocketState);