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); }