static void cmd_channel_add_modify(const char *data, gboolean add) { GHashTable *optlist; CHATNET_REC *chatnetrec; CHANNEL_SETUP_REC *rec; char *botarg, *botcmdarg, *chatnet, *channel, *password; void *free_arg; if (!cmd_get_params(data, &free_arg, 3 | PARAM_FLAG_OPTIONS, "channel add", &optlist, &channel, &chatnet, &password)) return; if (*chatnet == '\0' || *channel == '\0') { cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); } chatnetrec = chatnet_find(chatnet); if (chatnetrec == NULL) { printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_UNKNOWN_CHATNET, chatnet); cmd_params_free(free_arg); return; } botarg = g_hash_table_lookup(optlist, "bots"); botcmdarg = g_hash_table_lookup(optlist, "botcmd"); rec = channel_setup_find(channel, chatnet); if (rec == NULL) { if (add == FALSE) { printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_CHANSETUP_NOT_FOUND, channel, chatnet); cmd_params_free(free_arg); return; } rec = CHAT_PROTOCOL(chatnetrec)->create_channel_setup(); rec->name = g_strdup(channel); rec->chatnet = g_strdup(chatnet); } else { if (g_hash_table_lookup(optlist, "bots")) g_free_and_null(rec->botmasks); if (g_hash_table_lookup(optlist, "botcmd")) g_free_and_null(rec->autosendcmd); if (*password != '\0') g_free_and_null(rec->password); } if (g_hash_table_lookup(optlist, "auto")) rec->autojoin = TRUE; if (g_hash_table_lookup(optlist, "noauto")) rec->autojoin = FALSE; if (botarg != NULL && *botarg != '\0') rec->botmasks = g_strdup(botarg); if (botcmdarg != NULL && *botcmdarg != '\0') rec->autosendcmd = g_strdup(botcmdarg); if (*password != '\0' && g_strcmp0(password, "-") != 0) rec->password = g_strdup(password); signal_emit("channel add fill", 2, rec, optlist); channel_setup_create(rec); printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_CHANSETUP_ADDED, channel, chatnet); cmd_params_free(free_arg); }
SERVER_REC *server_connect(SERVER_CONNECT_REC *conn) { CHAT_PROTOCOL_REC *proto; SERVER_REC *server; proto = CHAT_PROTOCOL(conn); server = proto->server_init_connect(conn); proto->server_connect(server); return server; }
/* SYNTAX: QUERY [-window] <nick> */ static void cmd_query(const char *data, SERVER_REC *server, WI_ITEM_REC *item) { GHashTable *optlist; QUERY_REC *query; char *nick; void *free_arg; g_return_if_fail(data != NULL); if (*data == '\0') { /* remove current query */ cmd_unquery("", server, item); return; } if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | PARAM_FLAG_UNKNOWN_OPTIONS, "query", &optlist, &nick)) return; if (*nick == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); server = cmd_options_get_server("query", optlist, server); if (server == NULL) { cmd_params_free(free_arg); return; } if (*nick != '=' && (server == NULL || !server->connected)) cmd_param_error(CMDERR_NOT_CONNECTED); if (g_hash_table_lookup(optlist, "window") != NULL) { signal_add("query created", (SIGNAL_FUNC) signal_query_created_curwin); } query = query_find(server, nick); if (query == NULL) CHAT_PROTOCOL(server)->query_create(server->tag, nick, FALSE); else { /* query already existed - set query active / move it to this window */ window_item_set_active(active_win, (WI_ITEM_REC *) query); } if (g_hash_table_lookup(optlist, "window") != NULL) { signal_remove("query created", (SIGNAL_FUNC) signal_query_created_curwin); } cmd_params_free(free_arg); }
static CHANNEL_SETUP_REC *channel_setup_read(CONFIG_NODE *node) { CHANNEL_SETUP_REC *rec; CHATNET_REC *chatnetrec; char *channel, *chatnet; g_return_val_if_fail(node != NULL, NULL); channel = config_node_get_str(node, "name", NULL); chatnet = config_node_get_str(node, "chatnet", NULL); if (chatnet == NULL) /* FIXME: remove this after .98... */ { chatnet = g_strdup(config_node_get_str(node, "ircnet", NULL)); if (chatnet != NULL) { iconfig_node_set_str(node, "chatnet", chatnet); iconfig_node_set_str(node, "ircnet", NULL); } } chatnetrec = chatnet == NULL ? NULL : chatnet_find(chatnet); if (channel == NULL || chatnetrec == NULL) { /* missing information.. */ return NULL; } rec = CHAT_PROTOCOL(chatnetrec)->create_channel_setup(); rec->type = module_get_uniq_id("CHANNEL SETUP", 0); rec->chat_type = CHAT_PROTOCOL(chatnetrec)->id; rec->autojoin = config_node_get_bool(node, "autojoin", FALSE); rec->name = g_strdup(channel); rec->chatnet = g_strdup(chatnetrec != NULL ? chatnetrec->name : chatnet); rec->password = g_strdup(config_node_get_str(node, "password", NULL)); rec->botmasks = g_strdup(config_node_get_str(node, "botmasks", NULL)); rec->autosendcmd = g_strdup(config_node_get_str(node, "autosendcmd", NULL)); setupchannels = g_slist_append(setupchannels, rec); signal_emit("channel setup created", 2, rec, node); return rec; }
static void autolog_open(SERVER_REC *server, const char *server_tag, const char *target) { LOG_REC *log; char *fname, *dir, *fixed_target, *params; log = logs_find_item(LOG_ITEM_TARGET, target, server_tag, NULL); if (log != NULL && !log->failed) { log_start_logging(log); return; } /* '/' -> '_' - don't even accidentally try to log to #../../../file if you happen to join to such channel.. similar for some characters that are metacharacters and/or illegal in Windows filenames. '%' -> '%%' - so strftime() won't mess with them */ fixed_target = escape_target(target); if (CHAT_PROTOCOL(server)->case_insensitive) ascii_strdown(fixed_target); /* $0 = target, $1 = server tag */ params = g_strconcat(fixed_target, " ", server_tag, NULL); g_free(fixed_target); fname = parse_special_string(autolog_path, server, NULL, params, NULL, 0); g_free(params); if (log_find(fname) == NULL) { log = log_create_rec(fname, autolog_level); if (!settings_get_bool("autolog_colors")) log->colorizer = log_colorizer_strip; log_item_add(log, LOG_ITEM_TARGET, target, server_tag); dir = g_path_get_dirname(log->real_fname); #ifdef HAVE_CAPSICUM capsicum_mkdir_with_parents_wrapper(dir, log_dir_create_mode); #else g_mkdir_with_parents(dir, log_dir_create_mode); #endif g_free(dir); log->temp = TRUE; log_update(log); log_start_logging(log); } g_free(fname); }
void server_connect_unref(SERVER_CONNECT_REC *conn) { g_return_if_fail(IS_SERVER_CONNECT(conn)); if (--conn->refcount > 0) return; if (conn->refcount < 0) { g_warning("Connection '%s' refcount = %d", conn->tag, conn->refcount); } CHAT_PROTOCOL(conn)->destroy_server_connect(conn); if (conn->connect_handle != NULL) net_disconnect(conn->connect_handle); g_free_not_null(conn->proxy); g_free_not_null(conn->proxy_string); g_free_not_null(conn->proxy_string_after); g_free_not_null(conn->proxy_password); g_free_not_null(conn->tag); g_free_not_null(conn->address); g_free_not_null(conn->chatnet); g_free_not_null(conn->own_ip4); g_free_not_null(conn->own_ip6); g_free_not_null(conn->password); g_free_not_null(conn->nick); g_free_not_null(conn->username); g_free_not_null(conn->realname); g_free_not_null(conn->tls_cert); g_free_not_null(conn->tls_pkey); g_free_not_null(conn->tls_pass); g_free_not_null(conn->tls_cafile); g_free_not_null(conn->tls_capath); g_free_not_null(conn->tls_ciphers); g_free_not_null(conn->tls_pinned_cert); g_free_not_null(conn->tls_pinned_pubkey); g_free_not_null(conn->channels); g_free_not_null(conn->away_reason); conn->type = 0; g_free(conn); }
/* Return query where to put the private message. */ QUERY_REC *privmsg_get_query(SERVER_REC *server, const char *nick, int own, int level) { QUERY_REC *query; g_return_val_if_fail(IS_SERVER(server), NULL); g_return_val_if_fail(nick != NULL, NULL); query = query_find(server, nick); if (query == NULL && (querycreate_level & level) != 0 && (!own || settings_get_bool("autocreate_own_query"))) { query = CHAT_PROTOCOL(server)-> query_create(server->tag, nick, TRUE); } return query; }
static void session_restore_channel(SERVER_REC *server, CONFIG_NODE *node) { CHANNEL_REC *channel; const char *name, *visible_name; name = config_node_get_str(node, "name", NULL); if (name == NULL) return; visible_name = config_node_get_str(node, "visible_name", NULL); channel = CHAT_PROTOCOL(server)->channel_create(server, name, visible_name, TRUE); channel->topic = g_strdup(config_node_get_str(node, "topic", NULL)); channel->topic_by = g_strdup(config_node_get_str(node, "topic_by", NULL)); channel->topic_time = config_node_get_int(node, "topic_time", 0); channel->key = g_strdup(config_node_get_str(node, "key", NULL)); channel->session_rejoin = TRUE; signal_emit("session restore channel", 2, channel, node); }
void network_dialog_show(NetworkConfig *network) { GtkWidget *dialog; GtkCombo *protocol_combo; GObject *obj; GList *list; dialog = create_dialog_network_settings(); obj = G_OBJECT(dialog); g_signal_connect(obj, "response", G_CALLBACK(event_response_network), network); protocol_combo = g_object_get_data(obj, "protocol_combo"); /* set chat protocols */ list = get_chat_protocol_names(); gtk_combo_set_popdown_strings(protocol_combo, list); g_list_free(list); if (network != NULL) { /* set old values */ gtk_widget_set_sensitive(GTK_WIDGET(protocol_combo), FALSE); gtk_entry_set_text(GTK_ENTRY(protocol_combo->entry), CHAT_PROTOCOL(network)->name); gui_entry_set_from(obj, "name", network->name); gui_entry_set_from(obj, "nick", network->nick); gui_entry_set_from(obj, "username", network->username); gui_entry_set_from(obj, "realname", network->realname); gui_entry_set_from(obj, "own_host", network->own_host); gui_entry_set_from(obj, "autosendcmd", network->autosendcmd); } gtk_widget_grab_focus(g_object_get_data(obj, "name")); gtk_widget_show(dialog); }
static SERVER_SETUP_REC *server_setup_read(CONFIG_NODE *node) { SERVER_SETUP_REC *rec; CHATNET_REC *chatnetrec; char *server, *chatnet, *family; int port; g_return_val_if_fail(node != NULL, NULL); server = config_node_get_str(node, "address", NULL); if (server == NULL) return NULL; port = config_node_get_int(node, "port", 0); chatnet = config_node_get_str(node, "chatnet", NULL); if (server_setup_find(server, port, chatnet) != NULL) { return NULL; } rec = NULL; chatnetrec = chatnet == NULL ? NULL : chatnet_find(chatnet); if (chatnetrec == NULL && chatnet != NULL) { /* chat network not found, create it. */ chatnetrec = chat_protocol_get_default()->create_chatnet(); chatnetrec->chat_type = chat_protocol_get_default()->id; chatnetrec->name = g_strdup(chatnet); chatnet_create(chatnetrec); } family = config_node_get_str(node, "family", ""); rec = CHAT_PROTOCOL(chatnetrec)->create_server_setup(); rec->type = module_get_uniq_id("SERVER SETUP", 0); rec->chat_type = CHAT_PROTOCOL(chatnetrec)->id; rec->chatnet = chatnetrec == NULL ? NULL : g_strdup(chatnetrec->name); rec->family = g_ascii_strcasecmp(family, "inet6") == 0 ? AF_INET6 : (g_ascii_strcasecmp(family, "inet") == 0 ? AF_INET : 0); rec->address = g_strdup(server); rec->password = g_strdup(config_node_get_str(node, "password", NULL)); rec->use_ssl = config_node_get_bool(node, "use_ssl", FALSE); rec->ssl_cert = g_strdup(config_node_get_str(node, "ssl_cert", NULL)); rec->ssl_pkey = g_strdup(config_node_get_str(node, "ssl_pkey", NULL)); rec->ssl_verify = config_node_get_bool(node, "ssl_verify", FALSE); rec->ssl_cafile = g_strdup(config_node_get_str(node, "ssl_cafile", NULL)); rec->ssl_capath = g_strdup(config_node_get_str(node, "ssl_capath", NULL)); if (rec->ssl_cafile || rec->ssl_capath) rec->ssl_verify = TRUE; if (rec->ssl_cert != NULL || rec->ssl_verify) rec->use_ssl = TRUE; rec->port = port; rec->autoconnect = config_node_get_bool(node, "autoconnect", FALSE); rec->no_proxy = config_node_get_bool(node, "no_proxy", FALSE); rec->own_host = g_strdup(config_node_get_str(node, "own_host", NULL)); signal_emit("server setup read", 2, rec, node); setupservers = g_slist_append(setupservers, rec); return rec; }
/* SYNTAX: QUERY [-window] [-<server tag>] <nick> [<message>] */ static void cmd_query(const char *data, SERVER_REC *server, WI_ITEM_REC *item) { GHashTable *optlist; QUERY_REC *query; char *nick, *msg; void *free_arg; g_return_if_fail(data != NULL); if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST | PARAM_FLAG_OPTIONS | PARAM_FLAG_UNKNOWN_OPTIONS, "query", &optlist, &nick, &msg)) return; if (*nick == '\0') { /* remove current query */ cmd_unquery("", server, item); cmd_params_free(free_arg); return; } server = cmd_options_get_server("query", optlist, server); if (server == NULL) { cmd_params_free(free_arg); return; } if (*nick != '=' && (server == NULL || !server->connected)) cmd_param_error(CMDERR_NOT_CONNECTED); if (g_hash_table_lookup(optlist, "window") != NULL) { signal_add("query created", (SIGNAL_FUNC) signal_query_created_curwin); } query = query_find(server, nick); if (query == NULL) query = CHAT_PROTOCOL(server)-> query_create(server->tag, nick, FALSE); else { /* query already exists, set it active */ WINDOW_REC *window = window_item_window(query); if (window != active_win) window_set_active(window); window_item_set_active(active_win, (WI_ITEM_REC *) query); } if (g_hash_table_lookup(optlist, "window") != NULL) { signal_remove("query created", (SIGNAL_FUNC) signal_query_created_curwin); } if (*msg != '\0') { msg = g_strdup_printf("-nick %s %s", nick, msg); signal_emit("command msg", 3, msg, server, query); g_free(msg); } cmd_params_free(free_arg); }