X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fsocket.c;h=64d1028d4f1e42f90ba440fcbdde1a0f588bbaa8;hp=364d3169217d3b18a59de46c870255ec2372235c;hb=d605b2fd41b671f93ae5cb67488978846427dda9;hpb=916abb21d0a6653e0187b91591e492026886b0a4 diff --git a/src/socket.c b/src/socket.c index 364d31692..64d1028d4 100644 --- a/src/socket.c +++ b/src/socket.c @@ -69,7 +69,7 @@ static void socket_init(Unit *u) { s->backlog = SOMAXCONN; s->timeout_usec = DEFAULT_TIMEOUT_USEC; s->directory_mode = 0755; - s->socket_mode = 0777; + s->socket_mode = 0666; s->max_connections = 64; @@ -131,7 +131,7 @@ static void socket_done(Unit *u) { unit_unwatch_timer(u, &s->timer_watch); /* Make sure no service instance refers to us anymore. */ - LIST_FOREACH(units_per_type, i, u->meta.manager->units_per_type[UNIT_SERVICE]) { + LIST_FOREACH(units_by_type, i, u->meta.manager->units_by_type[UNIT_SERVICE]) { Service *service = (Service *) i; if (service->accept_socket == s) @@ -283,7 +283,7 @@ static int socket_add_mount_links(Socket *s) { assert(s); - LIST_FOREACH(units_per_type, other, s->meta.manager->units_per_type[UNIT_MOUNT]) + LIST_FOREACH(units_by_type, other, s->meta.manager->units_by_type[UNIT_MOUNT]) if ((r = socket_add_one_mount_link(s, (Mount*) other)) < 0) return r; @@ -404,6 +404,8 @@ static void socket_dump(Unit *u, FILE *f, const char *prefix) { "%sDirectoryMode: %04o\n" "%sKeepAlive: %s\n" "%sFreeBind: %s\n" + "%sTransparent: %s\n" + "%sBroadcast: %s\n" "%sTCPCongestion: %s\n", prefix, socket_state_to_string(s->state), prefix, socket_address_bind_ipv6_only_to_string(s->bind_ipv6_only), @@ -412,6 +414,8 @@ static void socket_dump(Unit *u, FILE *f, const char *prefix) { prefix, s->directory_mode, prefix, yes_no(s->keep_alive), prefix, yes_no(s->free_bind), + prefix, yes_no(s->transparent), + prefix, yes_no(s->broadcast), prefix, strna(s->tcp_congestion)); if (s->control_pid > 0) @@ -647,20 +651,26 @@ static void socket_apply_socket_options(Socket *s, int fd) { log_warning("SO_KEEPALIVE failed: %m"); } + if (s->broadcast) { + int one = 1; + if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one)) < 0) + log_warning("SO_BROADCAST failed: %m"); + } + if (s->priority >= 0) if (setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &s->priority, sizeof(s->priority)) < 0) log_warning("SO_PRIORITY failed: %m"); if (s->receive_buffer > 0) { int value = (int) s->receive_buffer; - if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &value, sizeof(value)) < 0) - log_warning("SO_RCVBUF failed: %m"); + if (setsockopt(fd, SOL_SOCKET, SO_RCVBUFFORCE, &value, sizeof(value)) < 0) + log_warning("SO_RCVBUFFORCE failed: %m"); } if (s->send_buffer > 0) { int value = (int) s->send_buffer; - if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &value, sizeof(value)) < 0) - log_warning("SO_SNDBUF failed: %m"); + if (setsockopt(fd, SOL_SOCKET, SO_SNDBUFFORCE, &value, sizeof(value)) < 0) + log_warning("SO_SNDBUFFORCE failed: %m"); } if (s->mark >= 0) @@ -897,6 +907,7 @@ static int socket_open_fds(Socket *s) { s->bind_ipv6_only, s->bind_to_device, s->free_bind, + s->transparent, s->directory_mode, s->socket_mode, label, @@ -1350,7 +1361,7 @@ static void socket_enter_running(Socket *s, int cfd) { /* If there's already a start pending don't bother to * do anything */ - LIST_FOREACH(units_per_type, i, s->meta.manager->units_per_type[UNIT_SERVICE]) { + LIST_FOREACH(units_by_type, i, s->meta.manager->units_by_type[UNIT_SERVICE]) { Service *service = (Service *) i; if (!set_get(service->configured_sockets, s)) @@ -1808,7 +1819,7 @@ static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) { success = is_clean_exit(code, status); if (s->control_command) { - exec_status_exit(&s->control_command->exec_status, pid, code, status, s->exec_context.utmp_id); + exec_status_exit(&s->control_command->exec_status, &s->exec_context, pid, code, status); if (s->control_command->ignore) success = true; @@ -2011,19 +2022,20 @@ static int socket_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError if (who == KILL_MAIN) { dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "Socket units have no main processes"); - return -EINVAL; + return -ESRCH; } if (s->control_pid <= 0 && who == KILL_CONTROL) { dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill"); - return -ENOENT; + return -ESRCH; } - if (s->control_pid > 0) - if (kill(s->control_pid, signo) < 0) - r = -errno; + if (who == KILL_CONTROL || who == KILL_ALL) + if (s->control_pid > 0) + if (kill(s->control_pid, signo) < 0) + r = -errno; - if (mode == KILL_CONTROL_GROUP) { + if (who == KILL_ALL && mode == KILL_CONTROL_GROUP) { int q; if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) @@ -2037,7 +2049,7 @@ static int socket_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError } if ((q = cgroup_bonding_kill_list(s->meta.cgroup_bondings, signo, false, pid_set)) < 0) - if (r != -EAGAIN && r != -ESRCH && r != -ENOENT) + if (q != -EAGAIN && q != -ESRCH && q != -ENOENT) r = q; }