mirror of
https://github.com/irssi/irssi.git
synced 2024-12-04 14:46:39 -05:00
Fix 'address already in use' when changing irssiproxy_ports
When changing the value of irssiproxy_ports to use a different network name in a port that was already bound (so like changing from asd=6667 to sdf=6667) it would throw "address already in use". This fixes it by delaying the add_listen() calls after all the remove_listen() were called.
This commit is contained in:
parent
a47f45b5b7
commit
51496cd09f
@ -642,7 +642,8 @@ static void remove_listen(LISTEN_REC *rec)
|
|||||||
static void read_settings(void)
|
static void read_settings(void)
|
||||||
{
|
{
|
||||||
LISTEN_REC *rec;
|
LISTEN_REC *rec;
|
||||||
GSList *remove_listens;
|
GSList *remove_listens = NULL;
|
||||||
|
GSList *add_listens = NULL;
|
||||||
char **ports, **tmp, *ircnet, *port;
|
char **ports, **tmp, *ircnet, *port;
|
||||||
int portnum;
|
int portnum;
|
||||||
|
|
||||||
@ -661,17 +662,30 @@ static void read_settings(void)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
rec = find_listen(ircnet, portnum);
|
rec = find_listen(ircnet, portnum);
|
||||||
if (rec == NULL)
|
if (rec == NULL) {
|
||||||
add_listen(ircnet, portnum);
|
rec = g_new0(LISTEN_REC, 1);
|
||||||
else
|
rec->ircnet = ircnet; /* borrow */
|
||||||
|
rec->port = portnum;
|
||||||
|
add_listens = g_slist_prepend(add_listens, rec);
|
||||||
|
} else {
|
||||||
|
/* remove from the list of listens to remove == keep it */
|
||||||
remove_listens = g_slist_remove(remove_listens, rec);
|
remove_listens = g_slist_remove(remove_listens, rec);
|
||||||
}
|
}
|
||||||
g_strfreev(ports);
|
}
|
||||||
|
|
||||||
while (remove_listens != NULL) {
|
while (remove_listens != NULL) {
|
||||||
remove_listen(remove_listens->data);
|
remove_listen(remove_listens->data);
|
||||||
remove_listens = g_slist_remove(remove_listens, remove_listens->data);
|
remove_listens = g_slist_remove(remove_listens, remove_listens->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while (add_listens != NULL) {
|
||||||
|
rec = add_listens->data;
|
||||||
|
add_listen(rec->ircnet, rec->port);
|
||||||
|
g_free(rec);
|
||||||
|
add_listens = g_slist_remove(add_listens, add_listens->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_strfreev(ports);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sig_dump(CLIENT_REC *client, const char *data)
|
static void sig_dump(CLIENT_REC *client, const char *data)
|
||||||
|
Loading…
Reference in New Issue
Block a user