/* Create server connection record. `dest' is required, rest can be NULL. `dest' is either a server address or irc network */ IRC_SERVER_CONNECT_REC * irc_server_create_conn(const char *dest, int port, const char *password, const char *nick) { GSList *tmp; time_t now; int n; g_return_val_if_fail(dest != NULL, NULL); /* check if `dest' is IRC network */ if (ircnet_find(dest) == NULL) return create_addr_conn(dest, port, password, nick); /* first try to find a server that hasn't had any connection failures for the past half an hour. If that isn't found, try any server. */ now = time(NULL); for (n = 0; n < 2; n++) { for (tmp = setupservers; tmp != NULL; tmp = tmp->next) { SETUP_SERVER_REC *rec = tmp->data; if (rec->ircnet == NULL || g_strcasecmp(rec->ircnet, dest) != 0) continue; if (n == 1 || !rec->last_failed || rec->last_connect < now-FAILED_RECONNECT_WAIT) return create_addr_conn(rec->address, port, password, nick); } } return NULL; }
/* NOTE: -network replaces the old -ircnet flag. */ static void sig_server_add_fill(IRC_SERVER_SETUP_REC *rec, GHashTable *optlist) { IRC_CHATNET_REC *ircnet; char *value; value = g_hash_table_lookup(optlist, "network"); /* For backwards compatibility, also allow the old name 'ircnet'. But of course only if -network was not given. */ if (!value) value = g_hash_table_lookup(optlist, "ircnet"); if (value != NULL) { g_free_and_null(rec->chatnet); if (*value != '\0') { ircnet = ircnet_find(value); rec->chatnet = ircnet != NULL ? g_strdup(ircnet->name) : g_strdup(value); } } value = g_hash_table_lookup(optlist, "cmdspeed"); if (value != NULL && *value != '\0') rec->cmd_queue_speed = atoi(value); value = g_hash_table_lookup(optlist, "cmdmax"); if (value != NULL && *value != '\0') rec->max_cmds_at_once = atoi(value); value = g_hash_table_lookup(optlist, "querychans"); if (value != NULL && *value != '\0') rec->max_query_chans = atoi(value); }
/* SYNTAX: NETWORK REMOVE <network> */ static void cmd_network_remove(const char *data) { IRC_CHATNET_REC *rec; if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); rec = ircnet_find(data); if (rec == NULL) printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_NETWORK_NOT_FOUND, data); else { printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_NETWORK_REMOVED, data); chatnet_remove(CHATNET(rec)); } }
/* SYNTAX: IRCNET REMOVE <ircnet> */ static void cmd_ircnet_remove(const char *data) { IRCNET_REC *rec; if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); rec = ircnet_find(data); if (rec == NULL) printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_IRCNET_NOT_FOUND, data); else { printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_IRCNET_REMOVED, data); ircnet_destroy(rec); } }
/* SYNTAX: SERVER ADD [-4 | -6] [-ssl] [-ssl_cert <cert>] [-ssl_pkey <pkey>] [-ssl_verify] [-ssl_cafile <cafile>] [-ssl_capath <capath>] [-auto | -noauto] [-ircnet <ircnet>] [-host <hostname>] [-cmdspeed <ms>] [-cmdmax <count>] [-port <port>] <address> [<port> [<password>]] */ static void sig_server_add_fill(IRC_SERVER_SETUP_REC *rec, GHashTable *optlist) { IRC_CHATNET_REC *ircnet; char *value; value = g_hash_table_lookup(optlist, "ircnet"); if (value != NULL) { g_free_and_null(rec->chatnet); if (*value != '\0') { ircnet = ircnet_find(value); rec->chatnet = ircnet != NULL ? g_strdup(ircnet->name) : g_strdup(value); } } value = g_hash_table_lookup(optlist, "cmdspeed"); if (value != NULL && *value != '\0') rec->cmd_queue_speed = atoi(value); value = g_hash_table_lookup(optlist, "cmdmax"); if (value != NULL && *value != '\0') rec->max_cmds_at_once = atoi(value); value = g_hash_table_lookup(optlist, "querychans"); if (value != NULL && *value != '\0') rec->max_query_chans = atoi(value); }
/* SYNTAX: NETWORK ADD [-nick <nick>] [-user <user>] [-realname <name>] [-host <host>] [-autosendcmd <cmd>] [-querychans <count>] [-whois <count>] [-msgs <count>] [-kicks <count>] [-modes <count>] [-cmdspeed <ms>] [-cmdmax <count>] <name> */ static void cmd_network_add(const char *data) { GHashTable *optlist; char *name, *value; void *free_arg; IRC_CHATNET_REC *rec; if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS, "network add", &optlist, &name)) return; if (*name == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); rec = ircnet_find(name); if (rec == NULL) { rec = g_new0(IRC_CHATNET_REC, 1); rec->name = g_strdup(name); } else { if (g_hash_table_lookup(optlist, "nick")) g_free_and_null(rec->nick); if (g_hash_table_lookup(optlist, "user")) g_free_and_null(rec->username); if (g_hash_table_lookup(optlist, "realname")) g_free_and_null(rec->realname); if (g_hash_table_lookup(optlist, "host")) { g_free_and_null(rec->own_host); rec->own_ip4 = rec->own_ip6 = NULL; } if (g_hash_table_lookup(optlist, "usermode")) g_free_and_null(rec->usermode); if (g_hash_table_lookup(optlist, "autosendcmd")) g_free_and_null(rec->autosendcmd); } value = g_hash_table_lookup(optlist, "kicks"); if (value != NULL) rec->max_kicks = atoi(value); value = g_hash_table_lookup(optlist, "msgs"); if (value != NULL) rec->max_msgs = atoi(value); value = g_hash_table_lookup(optlist, "modes"); if (value != NULL) rec->max_modes = atoi(value); value = g_hash_table_lookup(optlist, "whois"); if (value != NULL) rec->max_whois = atoi(value); value = g_hash_table_lookup(optlist, "cmdspeed"); if (value != NULL) rec->cmd_queue_speed = atoi(value); value = g_hash_table_lookup(optlist, "cmdmax"); if (value != NULL) rec->max_cmds_at_once = atoi(value); value = g_hash_table_lookup(optlist, "querychans"); if (value != NULL) rec->max_query_chans = atoi(value); value = g_hash_table_lookup(optlist, "nick"); if (value != NULL && *value != '\0') rec->nick = g_strdup(value); value = g_hash_table_lookup(optlist, "user"); if (value != NULL && *value != '\0') rec->username = g_strdup(value); value = g_hash_table_lookup(optlist, "realname"); if (value != NULL && *value != '\0') rec->realname = g_strdup(value); value = g_hash_table_lookup(optlist, "host"); if (value != NULL && *value != '\0') { rec->own_host = g_strdup(value); rec->own_ip4 = rec->own_ip6 = NULL; } value = g_hash_table_lookup(optlist, "usermode"); if (value != NULL && *value != '\0') rec->usermode = g_strdup(value); value = g_hash_table_lookup(optlist, "autosendcmd"); if (value != NULL && *value != '\0') rec->autosendcmd = g_strdup(value); ircnet_create(rec); printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_NETWORK_ADDED, name); cmd_params_free(free_arg); }
/* Create server connection record. `address' is required, rest can be NULL */ static IRC_SERVER_CONNECT_REC * create_addr_conn(const char *address, int port, const char *password, const char *nick) { IRC_SERVER_CONNECT_REC *conn; SETUP_SERVER_REC *sserver; IRCNET_REC *ircnet; g_return_val_if_fail(address != NULL, NULL); conn = g_new0(IRC_SERVER_CONNECT_REC, 1); conn->address = g_strdup(address); conn->port = port > 0 ? port : 6667; if (password && *password) conn->password = g_strdup(password); if (nick && *nick) conn->nick = g_strdup(nick); if (!conn->nick) conn->nick = g_strdup(settings_get_str("default_nick")); conn->alternate_nick = g_strdup(settings_get_str("alternate_nick")); conn->username = g_strdup(settings_get_str("user_name")); conn->realname = g_strdup(settings_get_str("real_name")); /* proxy settings */ if (settings_get_bool("use_ircproxy")) { conn->proxy = g_strdup(settings_get_str("proxy_address")); conn->proxy_port = settings_get_int("proxy_port"); conn->proxy_string = g_strdup(settings_get_str("proxy_string")); } /* source IP */ get_source_host_ip(); if (source_host_ok) { conn->own_ip = g_new(IPADDR, 1); memcpy(conn->own_ip, source_host_ip, sizeof(IPADDR)); } /* fill the information from setup */ sserver = server_setup_find(address, -1); if (sserver == NULL) return conn; server_setup_fill_conn(conn, sserver); /* fill the rest from IRC network settings */ ircnet = sserver->ircnet == NULL ? NULL : ircnet_find(sserver->ircnet); if (ircnet == NULL) return conn; if (ircnet->nick && !(nick && *nick)) { g_free(conn->nick); conn->nick = g_strdup(ircnet->nick);; } if (ircnet->username) { g_free(conn->username); conn->username = g_strdup(ircnet->username);; } if (ircnet->realname) { g_free(conn->realname); conn->realname = g_strdup(ircnet->realname);; } if (ircnet->max_kicks > 0) conn->max_kicks = ircnet->max_kicks; if (ircnet->max_msgs > 0) conn->max_msgs = ircnet->max_msgs; if (ircnet->max_modes > 0) conn->max_modes = ircnet->max_modes; if (ircnet->max_whois > 0) conn->max_whois = ircnet->max_whois; if (ircnet->max_cmds_at_once > 0 && sserver->max_cmds_at_once <= 0) conn->max_cmds_at_once = ircnet->max_cmds_at_once; if (ircnet->cmd_queue_speed > 0 && sserver->cmd_queue_speed <= 0) conn->cmd_queue_speed = ircnet->cmd_queue_speed; if (sserver->own_host == NULL && ircnet->own_host != NULL) conn_set_ip(conn, &ircnet->own_ip, ircnet->own_host); return conn; }