Merge Irssi 0.8.16-rc1
[silc.git] / apps / irssi / src / fe-common / core / fe-server.c
index f2327c593959cc32f88947edb0e173422ef4a607..e4b32bdbbe9826e7683875e90a255039bc275823 100644 (file)
@@ -13,9 +13,9 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
 #include "module.h"
@@ -108,7 +108,7 @@ static void cmd_server_add(const char *data)
 {
         GHashTable *optlist;
        SERVER_SETUP_REC *rec;
-       char *addr, *portstr, *password, *value;
+       char *addr, *portstr, *password, *value, *chatnet;
        void *free_arg;
        int port;
 
@@ -117,9 +117,12 @@ 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);
+
+       chatnet = g_hash_table_lookup(optlist, "network");
+
+       rec = server_setup_find(addr, port, chatnet);
 
-       rec = server_setup_find_port(addr, port);
        if (rec == NULL) {
                rec = create_server_setup(optlist);
                if (rec == NULL) {
@@ -144,8 +147,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");
@@ -163,21 +197,30 @@ static void cmd_server_add(const char *data)
        cmd_params_free(free_arg);
 }
 
-/* SYNTAX: SERVER REMOVE <address> [<port>] */
+/* SYNTAX: SERVER REMOVE <address> [<port>] [<network>] */
 static void cmd_server_remove(const char *data)
 {
        SERVER_SETUP_REC *rec;
-       char *addr, *port;
+       char *addr, *port, *chatnet;
        void *free_arg;
 
-       if (!cmd_get_params(data, &free_arg, 2, &addr, &port))
+       if (!cmd_get_params(data, &free_arg, 3, &addr, &port, &chatnet))
                return;
        if (*addr == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
 
-        if (*port == '\0')
-               rec = server_setup_find(addr, -1);
+       if (*port == '\0') {
+               if (*chatnet == '\0')
+                       rec = server_setup_find(addr, -1, NULL);
+               else
+                       rec = server_setup_find(addr, -1, chatnet);
+       }
        else
-               rec = server_setup_find_port(addr, atoi(port));
+       {
+               if (*chatnet == '\0')
+                       rec = server_setup_find(addr, atoi(port), NULL);
+               else
+                       rec = server_setup_find(addr, atoi(port), chatnet);
+       }
 
        if (rec == NULL)
                printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_SETUPSERVER_NOT_FOUND, addr, port);
@@ -189,36 +232,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 +267,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 +290,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 +317,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 +329,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 +337,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 +345,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 +378,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 +402,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);