Added SILC Thread Queue API
[runtime.git] / apps / irssi / src / fe-common / core / fe-server.c
index f2327c593959cc32f88947edb0e173422ef4a607..5ecacbbc871f49b8d25196a74838fca4ebaac303 100644 (file)
@@ -117,7 +117,7 @@ static void cmd_server_add(const char *data)
                return;
 
        if (*addr == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
-       port = *portstr == '\0' ? 6667 : atoi(portstr);
+       port = *portstr == '\0' ? DEFAULT_SERVER_ADD_PORT : atoi(portstr);
 
        rec = server_setup_find_port(addr, port);
        if (rec == NULL) {
@@ -144,8 +144,39 @@ static void cmd_server_add(const char *data)
         else if (g_hash_table_lookup(optlist, "4"))
                rec->family = AF_INET;
 
+       if (g_hash_table_lookup(optlist, "ssl"))
+               rec->use_ssl = TRUE;
+
+       value = g_hash_table_lookup(optlist, "ssl_cert");
+       if (value != NULL && *value != '\0')
+               rec->ssl_cert = g_strdup(value);
+
+       value = g_hash_table_lookup(optlist, "ssl_pkey");
+       if (value != NULL && *value != '\0')
+               rec->ssl_pkey = g_strdup(value);
+
+       if (g_hash_table_lookup(optlist, "ssl_verify"))
+               rec->ssl_verify = TRUE;
+
+       value = g_hash_table_lookup(optlist, "ssl_cafile");
+       if (value != NULL && *value != '\0')
+               rec->ssl_cafile = g_strdup(value);
+
+       value = g_hash_table_lookup(optlist, "ssl_capath");
+       if (value != NULL && *value != '\0')
+               rec->ssl_capath = g_strdup(value);
+
+       if ((rec->ssl_cafile != NULL && rec->ssl_cafile[0] != '\0')
+       ||  (rec->ssl_capath != NULL && rec->ssl_capath[0] != '\0'))
+               rec->ssl_verify = TRUE;
+
+       if ((rec->ssl_cert != NULL && rec->ssl_cert[0] != '\0') || rec->ssl_verify == TRUE)
+               rec->use_ssl = TRUE;
+
        if (g_hash_table_lookup(optlist, "auto")) rec->autoconnect = TRUE;
        if (g_hash_table_lookup(optlist, "noauto")) rec->autoconnect = FALSE;
+       if (g_hash_table_lookup(optlist, "proxy")) rec->no_proxy = FALSE;
+       if (g_hash_table_lookup(optlist, "noproxy")) rec->no_proxy = TRUE;
 
        if (*password != '\0' && strcmp(password, "-") != 0) rec->password = g_strdup(password);
        value = g_hash_table_lookup(optlist, "host");
@@ -175,7 +206,7 @@ static void cmd_server_remove(const char *data)
        if (*addr == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
 
         if (*port == '\0')
-               rec = server_setup_find(addr, -1);
+               rec = server_setup_find(addr, -1, NULL);
        else
                rec = server_setup_find_port(addr, atoi(port));
 
@@ -189,36 +220,30 @@ static void cmd_server_remove(const char *data)
        cmd_params_free(free_arg);
 }
 
-static void cmd_server(const char *data, SERVER_REC *server, void *item)
+static void cmd_server(const char *data)
 {
-       GHashTable *optlist;
-       char *addr;
-       void *free_arg;
-
-       if (*data == '\0') {
-               if (servers == NULL && lookup_servers == NULL &&
-                   reconnects == NULL) {
-                       printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
-                                    TXT_NO_CONNECTED_SERVERS);
-               } else {
-                       print_servers();
-                       print_lookup_servers();
-                       print_reconnects();
-               }
-
-               signal_stop();
+       if (*data != '\0')
                return;
-       }
 
-       if (g_strncasecmp(data, "add ", 4) == 0 ||
-           g_strncasecmp(data, "remove ", 7) == 0 ||
-           g_strcasecmp(data, "list") == 0 ||
-           g_strncasecmp(data, "list ", 5) == 0) {
-               command_runsub("server", data, server, item);
-               signal_stop();
-               return;
+       if (servers == NULL && lookup_servers == NULL &&
+           reconnects == NULL) {
+               printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
+                           TXT_NO_CONNECTED_SERVERS);
+       } else {
+               print_servers();
+               print_lookup_servers();
+               print_reconnects();
        }
 
+        signal_stop();
+}
+
+static void cmd_server_connect(const char *data)
+{
+       GHashTable *optlist;
+       char *addr;
+       void *free_arg;
+
        if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS,
                            "connect", &optlist, &addr))
                return;
@@ -230,6 +255,17 @@ static void cmd_server(const char *data, SERVER_REC *server, void *item)
        cmd_params_free(free_arg);
 }
 
+static void server_command(const char *data, SERVER_REC *server,
+                          WI_ITEM_REC *item)
+{
+       if (server == NULL) {
+               /* this command accepts non-connected server too */
+               server = active_win->connect_server;
+       }
+
+       signal_continue(3, data, server, item);
+}
+
 static void sig_server_looking(SERVER_REC *server)
 {
        g_return_if_fail(server != NULL);
@@ -242,10 +278,15 @@ static void sig_server_connecting(SERVER_REC *server, IPADDR *ip)
        char ipaddr[MAX_IP_LEN];
 
        g_return_if_fail(server != NULL);
-       g_return_if_fail(ip != NULL);
 
-       net_ip2host(ip, ipaddr);
-       printformat(server, NULL, MSGLEVEL_CLIENTNOTICE, TXT_CONNECTING,
+       if (ip == NULL)
+               ipaddr[0] = '\0';
+       else
+               net_ip2host(ip, ipaddr);
+
+       printformat(server, NULL, MSGLEVEL_CLIENTNOTICE,
+                   !server->connrec->reconnecting ?
+                   TXT_CONNECTING : TXT_RECONNECTING,
                    server->connrec->address, ipaddr, server->connrec->port);
 }
 
@@ -264,10 +305,10 @@ static void sig_connect_failed(SERVER_REC *server, gchar *msg)
        if (msg == NULL) {
                /* no message so this wasn't unexpected fail - send
                   connection_lost message instead */
-               printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
+               printformat(server, NULL, MSGLEVEL_CLIENTNOTICE,
                            TXT_CONNECTION_LOST, server->connrec->address);
        } else {
-               printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
+               printformat(server, NULL, MSGLEVEL_CLIENTERROR,
                            TXT_CANT_CONNECT, server->connrec->address, server->connrec->port, msg);
        }
 }
@@ -276,7 +317,7 @@ static void sig_server_disconnected(SERVER_REC *server)
 {
        g_return_if_fail(server != NULL);
 
-       printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
+       printformat(server, NULL, MSGLEVEL_CLIENTNOTICE,
                    TXT_CONNECTION_LOST, server->connrec->address);
 }
 
@@ -284,7 +325,7 @@ static void sig_server_quit(SERVER_REC *server, const char *msg)
 {
        g_return_if_fail(server != NULL);
 
-       printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
+       printformat(server, NULL, MSGLEVEL_CLIENTNOTICE,
                    TXT_SERVER_QUIT, server->connrec->address, msg);
 }
 
@@ -292,8 +333,9 @@ static void sig_server_lag_disconnected(SERVER_REC *server)
 {
        g_return_if_fail(server != NULL);
 
-       printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
-                   TXT_LAG_DISCONNECTED, server->connrec->address, time(NULL)-server->lag_sent);
+       printformat(server, NULL, MSGLEVEL_CLIENTNOTICE,
+                   TXT_LAG_DISCONNECTED, server->connrec->address,
+                   time(NULL)-server->lag_sent.tv_sec);
 }
 
 static void sig_server_reconnect_removed(RECONNECT_REC *reconnect)
@@ -324,9 +366,12 @@ static void sig_chat_protocol_unknown(const char *protocol)
 void fe_server_init(void)
 {
        command_bind("server", NULL, (SIGNAL_FUNC) cmd_server);
+       command_bind("server connect", NULL, (SIGNAL_FUNC) cmd_server_connect);
        command_bind("server add", NULL, (SIGNAL_FUNC) cmd_server_add);
        command_bind("server remove", NULL, (SIGNAL_FUNC) cmd_server_remove);
-       command_set_options("server add", "4 6 auto noauto -host -port");
+       command_bind_first("server", NULL, (SIGNAL_FUNC) server_command);
+       command_bind_first("disconnect", NULL, (SIGNAL_FUNC) server_command);
+       command_set_options("server add", "4 6 ssl +ssl_cert +ssl_pkey ssl_verify +ssl_cafile +ssl_capath auto noauto proxy noproxy -host -port");
 
        signal_add("server looking", (SIGNAL_FUNC) sig_server_looking);
        signal_add("server connecting", (SIGNAL_FUNC) sig_server_connecting);
@@ -345,8 +390,11 @@ void fe_server_init(void)
 void fe_server_deinit(void)
 {
        command_unbind("server", (SIGNAL_FUNC) cmd_server);
+       command_unbind("server connect", (SIGNAL_FUNC) cmd_server_connect);
        command_unbind("server add", (SIGNAL_FUNC) cmd_server_add);
        command_unbind("server remove", (SIGNAL_FUNC) cmd_server_remove);
+       command_unbind("server", (SIGNAL_FUNC) server_command);
+       command_unbind("disconnect", (SIGNAL_FUNC) server_command);
 
        signal_remove("server looking", (SIGNAL_FUNC) sig_server_looking);
        signal_remove("server connecting", (SIGNAL_FUNC) sig_server_connecting);