static void sig_listen(LISTEN_REC *listen) { CLIENT_REC *rec; IPADDR ip; NET_SENDBUF_REC *sendbuf; GIOChannel *handle; char host[MAX_IP_LEN]; int port; g_return_if_fail(listen != NULL); /* accept connection */ handle = net_accept(listen->handle, &ip, &port); if (handle == NULL) return; net_ip2host(&ip, host); sendbuf = net_sendbuffer_create(handle, 0); rec = g_new0(CLIENT_REC, 1); rec->listen = listen; rec->handle = sendbuf; rec->host = g_strdup(host); rec->port = port; if (g_strcmp0(listen->ircnet, "*") == 0) { rec->proxy_address = g_strdup("irc.proxy"); rec->server = servers == NULL ? NULL : IRC_SERVER(servers->data); } else { rec->proxy_address = g_strdup_printf("%s.proxy", listen->ircnet); rec->server = servers == NULL ? NULL : IRC_SERVER(server_find_chatnet(listen->ircnet)); } rec->recv_tag = g_input_add(handle, G_INPUT_READ, (GInputFunction) sig_listen_client, rec); proxy_clients = g_slist_prepend(proxy_clients, rec); rec->listen->clients = g_slist_prepend(rec->listen->clients, rec); signal_emit("proxy client connecting", 1, rec); printtext(rec->server, NULL, MSGLEVEL_CLIENTNOTICE, "Proxy: New client %s:%d on port %d (%s)", rec->host, rec->port, listen->port, listen->ircnet); }
static IRC_SERVER_REC *notifylist_ison_serverlist(const char *nick, const char *taglist) { IRC_SERVER_REC *server; char **list, **tmp; g_return_val_if_fail(nick != NULL, NULL); g_return_val_if_fail(taglist != NULL, NULL); list = g_strsplit(taglist, " ", -1); server = NULL; for (tmp = list; *tmp != NULL; tmp++) { server = (IRC_SERVER_REC *) server_find_chatnet(*tmp); if (IS_IRC_SERVER(server) && notifylist_ison_server(server, nick)) break; } g_strfreev(list); return tmp == NULL ? NULL : server; }
/* Server disconnected, remove it from all dcc records */ static void dcc_server_disconnected(IRC_SERVER_REC *server) { GSList *tmp; g_return_if_fail(server != NULL); for (tmp = dcc_conns; tmp != NULL; tmp = tmp->next) { DCC_REC *dcc = tmp->data; if (dcc->server != server) continue; if (dcc->ircnet == NULL) dcc->server = NULL; else { dcc->server = (IRC_SERVER_REC *) server_find_chatnet(dcc->ircnet); if (dcc->server != NULL) { g_free(dcc->mynick); dcc->mynick = g_strdup(dcc->server->nick); } } } }