/* Destroy DCC record */ void dcc_destroy(DCC_REC *dcc) { g_return_if_fail(dcc != NULL); if (dcc->destroyed) return; dcc_conns = g_slist_remove(dcc_conns, dcc); dcc_remove_chat_refs(dcc); dcc->destroyed = TRUE; signal_emit("dcc destroyed", 1, dcc); if (dcc->fhandle != -1) close(dcc->fhandle); if (dcc->handle != -1) net_disconnect(dcc->handle); if (dcc->tagconn != -1) g_source_remove(dcc->tagconn); if (dcc->tagread != -1) g_source_remove(dcc->tagread); if (dcc->tagwrite != -1) g_source_remove(dcc->tagwrite); if (dcc->sendbuf != NULL) net_sendbuffer_destroy(dcc->sendbuf, FALSE); if (dcc->type == DCC_TYPE_CHAT) line_split_free((LINEBUF_REC *) dcc->databuf); else if (dcc->databuf != NULL) g_free(dcc->databuf); g_free_not_null(dcc->file); g_free_not_null(dcc->ircnet); g_free(dcc->mynick); g_free(dcc->nick); g_free(dcc->arg); g_free(dcc); }
/* connection to server failed */ void server_connect_failed(SERVER_REC *server, const char *msg) { g_return_if_fail(IS_SERVER(server)); lookup_servers = g_slist_remove(lookup_servers, server); signal_emit("server connect failed", 2, server, msg); if (server->connect_tag != -1) { g_source_remove(server->connect_tag); server->connect_tag = -1; } if (server->handle != NULL) { net_sendbuffer_destroy(server->handle, TRUE); server->handle = NULL; } if (server->connect_pipe[0] != NULL) { g_io_channel_close(server->connect_pipe[0]); g_io_channel_unref(server->connect_pipe[0]); g_io_channel_close(server->connect_pipe[1]); g_io_channel_unref(server->connect_pipe[1]); server->connect_pipe[0] = NULL; server->connect_pipe[1] = NULL; } server_unref(server); }
static void session_save_server(SERVER_REC *server, CONFIG_REC *config, CONFIG_NODE *node) { int handle; node = config_node_section(node, NULL, NODE_TYPE_BLOCK); config_node_set_str(config, node, "chat_type", chat_protocol_find_id(server->chat_type)->name); config_node_set_str(config, node, "address", server->connrec->address); config_node_set_int(config, node, "port", server->connrec->port); config_node_set_str(config, node, "chatnet", server->connrec->chatnet); config_node_set_str(config, node, "password", server->connrec->password); config_node_set_str(config, node, "nick", server->nick); config_node_set_bool(config, node, "use_ssl", server->connrec->use_ssl); handle = g_io_channel_unix_get_fd(net_sendbuffer_handle(server->handle)); config_node_set_int(config, node, "handle", handle); signal_emit("session save server", 3, server, config, node); /* fake the server disconnection */ g_io_channel_unref(net_sendbuffer_handle(server->handle)); net_sendbuffer_destroy(server->handle, FALSE); server->handle = NULL; server->connection_lost = TRUE; server->no_reconnect = TRUE; server_disconnect(server); }
static void sig_dcc_destroyed(SERVER_DCC_REC *dcc) { if (!IS_DCC_SERVER(dcc)) return; if (dcc->sendbuf != NULL) net_sendbuffer_destroy(dcc->sendbuf, FALSE); }
void server_disconnect(SERVER_REC *server) { int chans; g_return_if_fail(IS_SERVER(server)); if (server->disconnected) return; if (server->connect_tag != -1) { /* still connecting to server.. */ if (server->connect_pid != -1) net_disconnect_nonblock(server->connect_pid); server_connect_failed(server, NULL); return; } servers = g_slist_remove(servers, server); server->disconnected = TRUE; signal_emit("server disconnected", 1, server); /* close all channels */ chans = server_remove_channels(server); if (server->handle != NULL) { if (!chans || server->connection_lost) net_sendbuffer_destroy(server->handle, TRUE); else { /* we were on some channels, try to let the server disconnect so that our quit message is guaranteed to get displayed */ net_disconnect_later(net_sendbuffer_handle(server->handle)); net_sendbuffer_destroy(server->handle, FALSE); } server->handle = NULL; } if (server->readtag > 0) { g_source_remove(server->readtag); server->readtag = -1; } server_unref(server); }
static void sig_dcc_destroyed(CHAT_DCC_REC *dcc) { if (!IS_DCC_CHAT(dcc)) return; dcc_remove_chat_refs(dcc); if (dcc->sendbuf != NULL) net_sendbuffer_destroy(dcc->sendbuf, FALSE); g_free(dcc->id); }
static void remove_client(CLIENT_REC *rec) { g_return_if_fail(rec != NULL); proxy_clients = g_slist_remove(proxy_clients, rec); rec->listen->clients = g_slist_remove(rec->listen->clients, rec); signal_emit("proxy client disconnected", 1, rec); printtext(NULL, NULL, MSGLEVEL_CLIENTNOTICE, "Proxy: Client disconnected from %s", rec->host); g_free(rec->proxy_address); net_sendbuffer_destroy(rec->handle, TRUE); g_source_remove(rec->recv_tag); g_free_not_null(rec->nick); g_free_not_null(rec->host); g_free(rec); }
static void process_destroy(PROCESS_REC *rec, int status) { processes = g_slist_remove(processes, rec); signal_emit("exec remove", 2, rec, GINT_TO_POINTER(status)); if (rec->read_tag != -1) g_source_remove(rec->read_tag); if (rec->target_item != NULL) exec_wi_destroy(rec->target_item); line_split_free(rec->databuf); g_io_channel_close(rec->in); g_io_channel_unref(rec->in); net_sendbuffer_destroy(rec->out, TRUE); g_free_not_null(rec->name); g_free_not_null(rec->target); g_free(rec->args); g_free(rec); }