static void read_settings(void) { LISTEN_REC *rec; GSList *remove_listens; char **ports, **tmp, *ircnet, *port; int portnum; remove_listens = g_slist_copy(proxy_listens); ports = g_strsplit(settings_get_str("irssiproxy_ports"), " ", -1); for (tmp = ports; *tmp != NULL; tmp++) { ircnet = *tmp; port = strchr(ircnet, '='); if (port == NULL) continue; *port++ = '\0'; portnum = atoi(port); if (portnum <= 0) continue; rec = find_listen(ircnet, portnum); if (rec == NULL) add_listen(ircnet, portnum); else remove_listens = g_slist_remove(remove_listens, rec); } g_strfreev(ports); while (remove_listens != NULL) { remove_listen(remove_listens->data); remove_listens = g_slist_remove(remove_listens, remove_listens->data); } }
static void read_settings(void) { LISTEN_REC *rec; GSList *remove_listens = NULL; GSList *add_listens = NULL; char **ports, **tmp, *ircnet, *port; int portnum; remove_listens = g_slist_copy(proxy_listens); ports = g_strsplit(settings_get_str("irssiproxy_ports"), " ", -1); for (tmp = ports; *tmp != NULL; tmp++) { ircnet = *tmp; port = strchr(ircnet, '='); if (port == NULL) continue; *port++ = '\0'; portnum = atoi(port); if (portnum <= 0) continue; rec = find_listen(ircnet, portnum); if (rec == NULL) { rec = g_new0(LISTEN_REC, 1); 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); } } while (remove_listens != NULL) { remove_listen(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); add_listens = g_slist_remove(add_listens, rec); g_free(rec); } g_strfreev(ports); }
void proxy_listen_deinit(void) { while (proxy_listens != NULL) remove_listen(proxy_listens->data); g_string_free(next_line, TRUE); signal_remove("server incoming", (SIGNAL_FUNC) sig_incoming); signal_remove("server event", (SIGNAL_FUNC) sig_server_event); signal_remove("event connected", (SIGNAL_FUNC) event_connected); signal_remove("server disconnected", (SIGNAL_FUNC) sig_server_disconnected); signal_remove("event nick", (SIGNAL_FUNC) event_nick); signal_remove("message own_public", (SIGNAL_FUNC) sig_message_own_public); signal_remove("message own_private", (SIGNAL_FUNC) sig_message_own_private); signal_remove("message irc own_action", (SIGNAL_FUNC) sig_message_own_action); signal_remove("setup changed", (SIGNAL_FUNC) read_settings); signal_remove("proxy client dump", (SIGNAL_FUNC) sig_dump); }