diff --git a/daemon/media_socket.c b/daemon/media_socket.c index b8b6ce1bb..64e5b58cc 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -1176,6 +1176,23 @@ static struct socket_port_link get_any_port_link(struct intf_spec *spec) { return ret; } +static bool open_port_link_sockets(socket_port_q *out, struct intf_spec *spec, const str *label) { + for (__auto_type l = out->head; l; l = l->next) { + __auto_type spl = l->data; + unsigned int port = GPOINTER_TO_UINT(spl->links.head->data); + ilog(LOG_DEBUG, "Trying to bind the socket for port = '%d'", port); + + /* if not possible to engage this socket, try to reallocate it again */ + if (!add_socket(&spl->socket, port, spec, label)) { + /* if something has been left in the `ports_to_engage` queue, release it right away */ + release_reserved_ports(out); + /* ports which are already bound to a socket, will be freed by `free_port()` */ + return false; + } + } + return true; +} + /** * Puts a list of `socket_t` objects into the `out`. * @@ -1317,25 +1334,9 @@ new_cycle: allocation_attempts); /* at this point we consider all things before as successful */ + if (open_port_link_sockets(out, spec, label)) + break; // success - for (__auto_type l = out->head; l; l = l->next) { - __auto_type spl = l->data; - port = GPOINTER_TO_UINT(spl->links.head->data); - ilog(LOG_DEBUG, "Trying to bind the socket for port = '%d'", port); - - /* if not possible to engage this socket, try to reallocate it again */ - if (!add_socket(&spl->socket, port, spec, label)) { - /* if something has been left in the `ports_to_engage` queue, release it right away */ - release_reserved_ports(out); - /* ports which are already bound to a socket, will be freed by `free_port()` */ - goto release_restart; - } - } - - /* success */ - break; - -release_restart: /* do not re-try for specifically wanted ports */ if (wanted_start_port > 0) goto fail;