diff --git a/src/core/socket.c b/src/core/socket.c index 1a2256c867..66cee64853 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -2640,13 +2640,6 @@ static int socket_serialize(Unit *u, FILE *f, FDSet *fds) { return 0; } -static void socket_port_take_fd(SocketPort *p, FDSet *fds, int fd) { - assert(p); - - safe_close(p->fd); - p->fd = fdset_remove(fds, fd); -} - static int socket_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) { Socket *s = SOCKET(u); @@ -2708,13 +2701,20 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd)) log_unit_debug(u, "Failed to parse fifo value: %s", value); - else + else { + bool found = false; + LIST_FOREACH(port, p, s->ports) - if (p->type == SOCKET_FIFO && + if (p->fd < 0 && + p->type == SOCKET_FIFO && path_equal_or_files_same(p->path, value+skip, 0)) { - socket_port_take_fd(p, fds, fd); + p->fd = fdset_remove(fds, fd); + found = true; break; } + if (!found) + log_unit_debug(u, "No matching fifo socket found: %s", value+skip); + } } else if (streq(key, "special")) { int fd, skip = 0; @@ -2722,13 +2722,20 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd)) log_unit_debug(u, "Failed to parse special value: %s", value); - else + else { + bool found = false; + LIST_FOREACH(port, p, s->ports) - if (p->type == SOCKET_SPECIAL && + if (p->fd < 0 && + p->type == SOCKET_SPECIAL && path_equal_or_files_same(p->path, value+skip, 0)) { - socket_port_take_fd(p, fds, fd); + p->fd = fdset_remove(fds, fd); + found = true; break; } + if (!found) + log_unit_debug(u, "No matching special socket found: %s", value+skip); + } } else if (streq(key, "mqueue")) { int fd, skip = 0; @@ -2736,13 +2743,20 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd)) log_unit_debug(u, "Failed to parse mqueue value: %s", value); - else + else { + bool found = false; + LIST_FOREACH(port, p, s->ports) - if (p->type == SOCKET_MQUEUE && + if (p->fd < 0 && + p->type == SOCKET_MQUEUE && streq(p->path, value+skip)) { - socket_port_take_fd(p, fds, fd); + p->fd = fdset_remove(fds, fd); + found = true; break; } + if (!found) + log_unit_debug(u, "No matching mqueue socket found: %s", value+skip); + } } else if (streq(key, "socket")) { int fd, type, skip = 0; @@ -2750,12 +2764,20 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, if (sscanf(value, "%i %i %n", &fd, &type, &skip) < 2 || fd < 0 || type < 0 || !fdset_contains(fds, fd)) log_unit_debug(u, "Failed to parse socket value: %s", value); - else + else { + bool found = false; + LIST_FOREACH(port, p, s->ports) - if (socket_address_is(&p->address, value+skip, type)) { - socket_port_take_fd(p, fds, fd); + if (p->fd < 0 && + socket_address_is(&p->address, value+skip, type)) { + p->fd = fdset_remove(fds, fd); + found = true; break; } + if (!found) + log_unit_debug(u, "No matching %s socket found: %s", + socket_address_type_to_string(type), value+skip); + } } else if (streq(key, "netlink")) { int fd, skip = 0; @@ -2763,12 +2785,19 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd)) log_unit_debug(u, "Failed to parse socket value: %s", value); - else + else { + bool found = false; + LIST_FOREACH(port, p, s->ports) - if (socket_address_is_netlink(&p->address, value+skip)) { - socket_port_take_fd(p, fds, fd); + if (p->fd < 0 && + socket_address_is_netlink(&p->address, value+skip)) { + p->fd = fdset_remove(fds, fd); + found = true; break; } + if (!found) + log_unit_debug(u, "No matching netlink socket found: %s", value+skip); + } } else if (streq(key, "ffs")) { int fd, skip = 0; @@ -2776,13 +2805,20 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd)) log_unit_debug(u, "Failed to parse ffs value: %s", value); - else + else { + bool found = false; + LIST_FOREACH(port, p, s->ports) - if (p->type == SOCKET_USB_FUNCTION && + if (p->fd < 0 && + p->type == SOCKET_USB_FUNCTION && path_equal_or_files_same(p->path, value+skip, 0)) { - socket_port_take_fd(p, fds, fd); + p->fd = fdset_remove(fds, fd); + found = true; break; } + if (!found) + log_unit_debug(u, "No matching ffs socket found: %s", value+skip); + } } else log_unit_debug(UNIT(s), "Unknown serialization key: %s", key);