X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fsocket.c;h=8b78a3fd25a0644d961feef1284fcb212370ec56;hp=2b9362db77e00b505d0c0a518e517fb5acc0f92e;hb=8092a428d40ac682df9e80c36988043854579679;hpb=9131f660eedb29d18a29e6efff49c485e683c56c diff --git a/src/socket.c b/src/socket.c index 2b9362db7..8b78a3fd2 100644 --- a/src/socket.c +++ b/src/socket.c @@ -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;