From 73f66067718f691c7a385814d0785079dbf4c469 Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Sun, 20 Feb 2005 13:37:47 +0000 Subject: [PATCH] Connection to IRC server is now made by child process (non blocking) --- ChangeLog | 1 + TODO | 7 +- po/fr.po | 260 ++++++++++++---------- po/weechat.pot | 248 +++++++++++---------- src/common/command.c | 47 ++-- src/gui/curses/gui-input.c | 23 +- src/irc/irc-recv.c | 2 +- src/irc/irc-server.c | 345 +++++++++++++++++++---------- src/irc/irc.h | 11 +- weechat/ChangeLog | 1 + weechat/TODO | 7 +- weechat/po/fr.po | 260 ++++++++++++---------- weechat/po/weechat.pot | 248 +++++++++++---------- weechat/src/common/command.c | 47 ++-- weechat/src/gui/curses/gui-input.c | 23 +- weechat/src/irc/irc-recv.c | 2 +- weechat/src/irc/irc-server.c | 345 +++++++++++++++++++---------- weechat/src/irc/irc.h | 11 +- 18 files changed, 1106 insertions(+), 782 deletions(-) diff --git a/ChangeLog b/ChangeLog index afd889b3b..63a9cda5e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,7 @@ ChangeLog - 2005-02-20 Version 0.1.1 (under dev!): * added DCC send + * connection to IRC server is now made by child process (non blocking) * added support for UnrealIrcd ("~" for chan owner, "&" for chan admin) * on server buffer, only server messages are logged * improved /help command output diff --git a/TODO b/TODO index 001349752..07c7c5e3c 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,7 @@ WeeChat - Wee Enhanced Environment for Chat =========================================== -TODO - 2005-02-12 +TODO - 2005-02-20 Legend: # done @@ -19,7 +19,7 @@ v0.1.1: - *BSD version * IRC protocol: - + "/dcc" command (for chat and sending/receiving files) + # "/dcc send" command - customizable CTCP version reply * Interface: @@ -27,13 +27,14 @@ v0.1.1: + internationalization (traduce WeeChat in many languages) * TCP/IP communication: - - connect to server with child process (background) + # connect to server with child process (background) Future versions: --------------- * IRC protocol: + - "/dcc chat" command (and incoming DCC chats) - complete "/list" command: add regexp search, display only channels that match regexp - "/ignore" and "/unignore" commands: hide all that is write by a given diff --git a/po/fr.po b/po/fr.po index d6ee7ffeb..f37ca6427 100644 --- a/po/fr.po +++ b/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WeeChat 0.1.1-cvs\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2005-02-20 01:03+0100\n" +"POT-Creation-Date: 2005-02-20 14:34+0100\n" "PO-Revision-Date: 2005-02-12 12:00+0100\n" "Last-Translator: FlashCode \n" "Language-Team: weechat-dev \n" @@ -20,107 +20,107 @@ msgstr "" msgid "%s cannot allocate new nick\n" msgstr "%s ompossible d'allouer un nouveau pseudo\n" -#: src/irc/irc-server.c:139 src/common/weeconfig.c:1471 +#: src/irc/irc-server.c:146 src/common/weeconfig.c:1471 msgid "Unable to get user's name" msgstr "Impossible de déterminer le nom d'utilisateur" -#: src/irc/irc-server.c:204 +#: src/irc/irc-server.c:211 #, c-format msgid "%s cannot allocate new server\n" msgstr "%s impossible d'allouer un nouveau serveur\n" -#: src/irc/irc-server.c:405 +#: src/irc/irc-server.c:412 #, c-format msgid "%s error sending data to IRC server\n" msgstr "%s erreur d'envoi de données au serveur IRC\n" -#: src/irc/irc-server.c:425 src/irc/irc-server.c:438 src/irc/irc-server.c:504 +#: src/irc/irc-server.c:432 src/irc/irc-server.c:445 src/irc/irc-server.c:511 #, c-format msgid "%s not enough memory for received IRC message\n" msgstr "%s mémoire insuffisante pour un message IRC reçu\n" -#: src/irc/irc-server.c:513 +#: src/irc/irc-server.c:520 #, c-format msgid "%s unable to explode received buffer\n" msgstr "%s impossible d'exploser le tampon de réception\n" -#: src/irc/irc-server.c:587 +#: src/irc/irc-server.c:594 #, c-format msgid "%s Command '%s' failed!\n" msgstr "%s La commande '%s' a échoué !\n" -#: src/irc/irc-server.c:592 +#: src/irc/irc-server.c:599 #, c-format msgid "%s No command to execute!\n" msgstr "%s Pas de commande à exécuter !\n" -#: src/irc/irc-server.c:597 +#: src/irc/irc-server.c:604 #, c-format msgid "%s Unknown command: cmd=%s, args=%s\n" msgstr "%s Commande inconnue: cmd=%s, params=%s\n" -#: src/irc/irc-server.c:639 +#: src/irc/irc-server.c:646 #, c-format msgid "%s cannot read data from socket, disconnecting from server...\n" msgstr "" "%s impossible de lire des données sur la socket, déconnexion du serveur...\n" -#: src/irc/irc-server.c:661 -#, c-format -msgid "%s: connecting to %s:%d...\n" -msgstr "%s: connexion à %s:%d...\n" - -#: src/irc/irc-server.c:663 -#, c-format -msgid "connecting to server %s:%d...\n" -msgstr "connexion au serveur %s:%d...\n" - -#: src/irc/irc-server.c:672 -#, c-format -msgid "%s cannot create pipe\n" -msgstr "%s impossible de créer le pipe\n" - -#: src/irc/irc-server.c:688 -#, c-format -msgid "%s cannot set socket option \"SO_REUSEADDR\"\n" -msgstr "%s impossible de paramétrer l'option socket \"SO_REUSEADDR\"\n" - -#: src/irc/irc-server.c:698 -#, c-format -msgid "%s cannot set socket option \"SO_KEEPALIVE\"\n" -msgstr "%s impossible de paramétrer l'option socket \"SO_KEEPALIVE\"\n" - -#: src/irc/irc-server.c:708 -#, c-format -msgid "%s address \"%s\" not found\n" -msgstr "%s adresse \"%s\" introuvable\n" - -#: src/irc/irc-server.c:733 -#, c-format -msgid "%s IP address not found\n" -msgstr "%s adresse IP introuvable\n" - -#: src/irc/irc-server.c:744 -#, c-format -msgid "%s: server IP is: %s\n" -msgstr "%s: l'adresse IP du serveur est : %s\n" - -#: src/irc/irc-server.c:751 -#, c-format -msgid "%s cannot connect to irc server\n" -msgstr "%s connexion au serveur irc impossible\n" - -#: src/irc/irc-server.c:770 -#, c-format -msgid "%s: Reconnecting to server...\n" -msgstr "%s: Reconnexion au serveur...\n" - -#: src/irc/irc-server.c:783 src/irc/irc-server.c:860 +#: src/irc/irc-server.c:718 #, c-format msgid "%s: Reconnecting to server in %d seconds\n" msgstr "%s: Reconnexion au serveur dans %d secondes\n" -#: src/irc/irc-server.c:827 +#: src/irc/irc-server.c:749 +#, c-format +msgid "%s address \"%s\" not found\n" +msgstr "%s adresse \"%s\" introuvable\n" + +#: src/irc/irc-server.c:758 +#, c-format +msgid "%s IP address not found\n" +msgstr "%s adresse IP introuvable\n" + +#: src/irc/irc-server.c:766 +#, c-format +msgid "%s connection refused\n" +msgstr "%s connexion refusée\n" + +#: src/irc/irc-server.c:832 +#, c-format +msgid "%s: connecting to %s:%d...\n" +msgstr "%s: connexion à %s:%d...\n" + +#: src/irc/irc-server.c:834 +#, c-format +msgid "connecting to server %s:%d...\n" +msgstr "connexion au serveur %s:%d...\n" + +#: src/irc/irc-server.c:845 +#, c-format +msgid "%s cannot create pipe\n" +msgstr "%s impossible de créer le pipe\n" + +#: src/irc/irc-server.c:857 +#, c-format +msgid "%s cannot create socket\n" +msgstr "%s impossible de créer la socket\n" + +#: src/irc/irc-server.c:869 +#, c-format +msgid "%s cannot set socket option \"SO_REUSEADDR\"\n" +msgstr "%s impossible de paramétrer l'option socket \"SO_REUSEADDR\"\n" + +#: src/irc/irc-server.c:880 +#, c-format +msgid "%s cannot set socket option \"SO_KEEPALIVE\"\n" +msgstr "%s impossible de paramétrer l'option socket \"SO_KEEPALIVE\"\n" + +#: src/irc/irc-server.c:911 +#, c-format +msgid "%s: Reconnecting to server...\n" +msgstr "%s: Reconnexion au serveur...\n" + +#: src/irc/irc-server.c:960 src/irc/irc-server.c:965 msgid "Disconnected from server!\n" msgstr "Déconnecté du serveur !\n" @@ -1204,7 +1204,7 @@ msgid "%s: using local hostname \"%s\"\n" msgstr "%s: utilisation du nom de machine local \"%s\"\n" #: src/irc/irc-send.c:267 src/irc/irc-send.c:278 src/irc/irc-send.c:748 -#: src/irc/irc-send.c:822 src/common/command.c:1355 +#: src/irc/irc-send.c:822 src/common/command.c:1365 #, c-format msgid "%s wrong argument count for \"%s\" command\n" msgstr "%s nombre de paramètres erroné pour la commande \"%s\"\n" @@ -1948,8 +1948,8 @@ msgid "connect to a server" msgstr "se connecter à un serveur" #: src/common/command.c:61 src/common/command.c:65 -msgid "servername" -msgstr "nom_serveur" +msgid "[servername]" +msgstr "[nom_serveur]" #: src/common/command.c:62 msgid "servername: server name to connect" @@ -2119,10 +2119,10 @@ msgstr "" "%s nombre de paramètres incorrect pour la commande %s \"%s\" (attendu: entre " "%d et %d paramètre%s)\n" -#: src/common/command.c:509 +#: src/common/command.c:509 src/common/command.c:579 #, c-format -msgid "%s %s command \"%s\" failed\n" -msgstr "%s %s la commande \"%s\" a échoué\n" +msgid "%s command \"%s\" failed\n" +msgstr "%s la commande \"%s\" a échoué\n" #: src/common/command.c:537 #, c-format @@ -2145,11 +2145,6 @@ msgstr "" msgid "%s command \"%s\" needs a server connection!\n" msgstr "%s la commande \"%s\" nécessite une connexion au serveur !\n" -#: src/common/command.c:579 -#, c-format -msgid "%s IRC command \"%s\" failed\n" -msgstr "%s la commande IRC \"%s\" a échoué\n" - #: src/common/command.c:628 #, c-format msgid "%s unknown command \"%s\" (type /help for help)\n" @@ -2239,78 +2234,82 @@ msgstr "%s buffer \"%s\" non trouv msgid "unknown parameter \"%s\" for \"%s\" command\n" msgstr "paramètre inconnu \"%s\" pour la commande \"%s\"\n" -#: src/common/command.c:1070 +#: src/common/command.c:1073 #, c-format msgid "%s already connected to server \"%s\"!\n" msgstr "%s déjà connecté au serveur \"%s\" !\n" -#: src/common/command.c:1090 src/common/command.c:1133 -#: src/common/command.c:1783 +#: src/common/command.c:1081 #, c-format -msgid "%s server \"%s\" not found\n" -msgstr "%s serveur \"%s\" non trouvé\n" +msgid "%s currently connecting to server \"%s\"!\n" +msgstr "%s une connexion vers le serveur \"%s\" est en cours !\n" -#: src/common/command.c:1116 +#: src/common/command.c:1099 src/common/command.c:1144 +#, c-format +msgid "%s server not found\n" +msgstr "%s serveur non trouvé\n" + +#: src/common/command.c:1128 #, c-format msgid "%s not connected to server \"%s\"!\n" msgstr "%s non connecté au serveur \"%s\" !\n" -#: src/common/command.c:1124 +#: src/common/command.c:1136 msgid "Auto-reconnection is cancelled\n" msgstr "La reconnexion automatique est annulée\n" -#: src/common/command.c:1153 +#: src/common/command.c:1163 #, c-format msgid "%s internal commands:\n" msgstr "Commandes internes %s :\n" -#: src/common/command.c:1164 +#: src/common/command.c:1174 msgid "IRC commands:\n" msgstr "Commandes IRC :\n" -#: src/common/command.c:1224 +#: src/common/command.c:1234 #, c-format msgid "No help available, \"%s\" is an unknown command\n" msgstr "Pas d'aide disponible, la commande \"%s\" est inconnue\n" -#: src/common/command.c:1249 +#: src/common/command.c:1259 msgid "Registered Perl scripts:\n" msgstr "Scripts Perl enregistrés :\n" -#: src/common/command.c:1266 src/common/command.c:1288 -#: src/common/command.c:1310 +#: src/common/command.c:1276 src/common/command.c:1298 +#: src/common/command.c:1320 msgid " (none)\n" msgstr " (aucun)\n" -#: src/common/command.c:1271 +#: src/common/command.c:1281 msgid "Perl message handlers:\n" msgstr "Fonctions Perl pour messages :\n" -#: src/common/command.c:1280 +#: src/common/command.c:1290 #, c-format msgid " IRC(%s) => Perl(%s)\n" msgstr " IRC(%s) => Perl(%s)\n" -#: src/common/command.c:1293 +#: src/common/command.c:1303 msgid "Perl command handlers:\n" msgstr "Commandes Perl :\n" -#: src/common/command.c:1302 +#: src/common/command.c:1312 #, c-format msgid " Command /%s => Perl(%s)\n" msgstr " Commande /%s => Perl(%s)\n" -#: src/common/command.c:1322 +#: src/common/command.c:1332 msgid "Perl scripts unloaded\n" msgstr "Scripts Perl déchargés\n" -#: src/common/command.c:1348 src/common/command.c:2054 -#: src/common/command.c:2066 +#: src/common/command.c:1358 src/common/command.c:2063 +#: src/common/command.c:2075 #, c-format msgid "%s unknown option for \"%s\" command\n" msgstr "%s option inconnue pour la commande \"%s\"\n" -#: src/common/command.c:1361 +#: src/common/command.c:1371 msgid "" "WeeChat was build without Perl support.\n" "Please rebuild WeeChat with \"--enable-perl\" option for ./configure script\n" @@ -2319,31 +2318,31 @@ msgstr "" "Merci de reconstruire WeeChat avec l'option \"--enable-perl\" pour le " "script ./configure\n" -#: src/common/command.c:1415 +#: src/common/command.c:1425 msgid "No server.\n" msgstr "Pas de serveur.\n" -#: src/common/command.c:1426 +#: src/common/command.c:1436 #, c-format msgid "Server '%s' not found.\n" msgstr "Serveur '%s' non trouvé.\n" -#: src/common/command.c:1438 +#: src/common/command.c:1448 #, c-format msgid "%s missing servername for \"%s\" command\n" msgstr "%s il manque le nom du serveur pour la commande \"%s\"\n" -#: src/common/command.c:1446 +#: src/common/command.c:1456 #, c-format msgid "%s too much arguments for \"%s\" command, ignoring arguments\n" msgstr "%s trop de paramètres pour la commande \"%s\", paramètres ignorés\n" -#: src/common/command.c:1465 +#: src/common/command.c:1475 #, c-format msgid "%s server \"%s\" not found for \"%s\" command\n" msgstr "%s le serveur \"%s\" n'existe pas pour la commande \"%s\"\n" -#: src/common/command.c:1473 +#: src/common/command.c:1483 #, c-format msgid "" "%s you can not delete server \"%s\" because you are connected to. Try /" @@ -2352,101 +2351,106 @@ msgstr "" "%s vous ne pouvez pas supprimer le server \"%s\" car vous êtes connecté " "dessus. Essayez /disconnect %s avant.\n" -#: src/common/command.c:1489 src/common/command.c:1630 +#: src/common/command.c:1499 src/common/command.c:1640 msgid "Server" msgstr "Serveur" -#: src/common/command.c:1492 +#: src/common/command.c:1502 msgid "has been deleted\n" msgstr "a été supprimé\n" -#: src/common/command.c:1507 +#: src/common/command.c:1517 #, c-format msgid "%s missing parameters for \"%s\" command\n" msgstr "%s paramètres manquants pour la commande \"%s\"\n" -#: src/common/command.c:1517 +#: src/common/command.c:1527 #, c-format msgid "%s server \"%s\" already exists, can't create it!\n" msgstr "%s le serveur \"%s\" existe déjà, impossible de le créer !\n" -#: src/common/command.c:1542 src/common/command.c:1570 -#: src/common/command.c:1583 src/common/command.c:1609 +#: src/common/command.c:1552 src/common/command.c:1580 +#: src/common/command.c:1593 src/common/command.c:1619 #, c-format msgid "%s missing password for \"%s\" parameter\n" msgstr "%s mot de passe manquant pour le paramètre \"%s\"\n" -#: src/common/command.c:1555 +#: src/common/command.c:1565 #, c-format msgid "%s missing nick(s) for \"%s\" parameter\n" msgstr "%s pseudo(s) manquant(s) pour le paramètre \"%s\"\n" -#: src/common/command.c:1596 +#: src/common/command.c:1606 #, c-format msgid "%s missing command for \"%s\" parameter\n" msgstr "%s commande manquante pour le paramètre \"%s\"\n" -#: src/common/command.c:1633 +#: src/common/command.c:1643 msgid "created\n" msgstr "créé\n" -#: src/common/command.c:1639 +#: src/common/command.c:1649 #, c-format msgid "%s unable to create server\n" msgstr "%s impossible de créer le serveur\n" -#: src/common/command.c:1696 +#: src/common/command.c:1705 msgid "(unknown)" msgstr "(inconnu)" -#: src/common/command.c:1719 +#: src/common/command.c:1728 msgid "(password hidden) " msgstr "(mot de passe caché)" -#: src/common/command.c:1815 src/common/command.c:1862 +#: src/common/command.c:1792 +#, c-format +msgid "%s server \"%s\" not found\n" +msgstr "%s serveur \"%s\" non trouvé\n" + +#: src/common/command.c:1824 src/common/command.c:1871 #, c-format msgid "%s config option \"%s\" not found\n" msgstr "%s option de configuration \"%s\" non trouvée\n" -#: src/common/command.c:1820 src/common/command.c:1854 +#: src/common/command.c:1829 src/common/command.c:1863 #, c-format msgid "%s incorrect value for option \"%s\"\n" msgstr "%s valeur incorrecte pour l'option \"%s\"\n" -#: src/common/command.c:1836 +#: src/common/command.c:1845 #, c-format msgid "%s option \"%s\" can not be changed while WeeChat is running\n" msgstr "%s l'option \"%s\" ne peut pas être changée lorsque WeeChat tourne\n" -#: src/common/command.c:1938 +#: src/common/command.c:1947 #, c-format msgid "No config option found with \"%s\"\n" msgstr "Aucune option de configuration trouvée avec \"%s\"\n" -#: src/common/command.c:1941 +#: src/common/command.c:1950 msgid "No config option found\n" msgstr "Aucune option de configuration trouvée\n" -#: src/common/command.c:1948 +#: src/common/command.c:1957 #, c-format msgid "config option(s) found with \"%s\"\n" msgstr "option(s) de configuration trouvée(s) avec \"%s\"\n" -#: src/common/command.c:1951 +#: src/common/command.c:1960 msgid "config option(s) found\n" msgstr "option(s) de configuration trouvée(s)\n" -#: src/common/command.c:1971 +#: src/common/command.c:1980 #, c-format msgid "%s alias or command \"%s\" not found\n" msgstr "%s alias ou commande \"%s\" non trouvé\n" -#: src/common/command.c:1981 +#: src/common/command.c:1990 #, c-format msgid "Alias \"%s\" removed\n" msgstr "Alias \"%s\" supprimé\n" -#: src/common/command.c:2001 +#: src/common/command.c:2010 msgid "Opened windows:\n" msgstr "Fenêtres ouvertes:\n" @@ -3477,5 +3481,17 @@ msgstr "" msgid "saving config to disk\n" msgstr "sauvegarde de la configuration sur disque\n" +#~ msgid "servername" +#~ msgstr "nom_serveur" + +#~ msgid "%s cannot connect to irc server\n" +#~ msgstr "%s connexion au serveur irc impossible\n" + +#~ msgid "%s: server IP is: %s\n" +#~ msgstr "%s: l'adresse IP du serveur est : %s\n" + +#~ msgid "%s IRC command \"%s\" failed\n" +#~ msgstr "%s la commande IRC \"%s\" a échoué\n" + #~ msgid ") from " #~ msgstr ") de " diff --git a/po/weechat.pot b/po/weechat.pot index 4c45d7210..56f81c8af 100644 --- a/po/weechat.pot +++ b/po/weechat.pot @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2005-02-20 01:03+0100\n" +"POT-Creation-Date: 2005-02-20 14:34+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -20,106 +20,106 @@ msgstr "" msgid "%s cannot allocate new nick\n" msgstr "" -#: src/irc/irc-server.c:139 src/common/weeconfig.c:1471 +#: src/irc/irc-server.c:146 src/common/weeconfig.c:1471 msgid "Unable to get user's name" msgstr "" -#: src/irc/irc-server.c:204 +#: src/irc/irc-server.c:211 #, c-format msgid "%s cannot allocate new server\n" msgstr "" -#: src/irc/irc-server.c:405 +#: src/irc/irc-server.c:412 #, c-format msgid "%s error sending data to IRC server\n" msgstr "" -#: src/irc/irc-server.c:425 src/irc/irc-server.c:438 src/irc/irc-server.c:504 +#: src/irc/irc-server.c:432 src/irc/irc-server.c:445 src/irc/irc-server.c:511 #, c-format msgid "%s not enough memory for received IRC message\n" msgstr "" -#: src/irc/irc-server.c:513 +#: src/irc/irc-server.c:520 #, c-format msgid "%s unable to explode received buffer\n" msgstr "" -#: src/irc/irc-server.c:587 +#: src/irc/irc-server.c:594 #, c-format msgid "%s Command '%s' failed!\n" msgstr "" -#: src/irc/irc-server.c:592 +#: src/irc/irc-server.c:599 #, c-format msgid "%s No command to execute!\n" msgstr "" -#: src/irc/irc-server.c:597 +#: src/irc/irc-server.c:604 #, c-format msgid "%s Unknown command: cmd=%s, args=%s\n" msgstr "" -#: src/irc/irc-server.c:639 +#: src/irc/irc-server.c:646 #, c-format msgid "%s cannot read data from socket, disconnecting from server...\n" msgstr "" -#: src/irc/irc-server.c:661 -#, c-format -msgid "%s: connecting to %s:%d...\n" -msgstr "" - -#: src/irc/irc-server.c:663 -#, c-format -msgid "connecting to server %s:%d...\n" -msgstr "" - -#: src/irc/irc-server.c:672 -#, c-format -msgid "%s cannot create pipe\n" -msgstr "" - -#: src/irc/irc-server.c:688 -#, c-format -msgid "%s cannot set socket option \"SO_REUSEADDR\"\n" -msgstr "" - -#: src/irc/irc-server.c:698 -#, c-format -msgid "%s cannot set socket option \"SO_KEEPALIVE\"\n" -msgstr "" - -#: src/irc/irc-server.c:708 -#, c-format -msgid "%s address \"%s\" not found\n" -msgstr "" - -#: src/irc/irc-server.c:733 -#, c-format -msgid "%s IP address not found\n" -msgstr "" - -#: src/irc/irc-server.c:744 -#, c-format -msgid "%s: server IP is: %s\n" -msgstr "" - -#: src/irc/irc-server.c:751 -#, c-format -msgid "%s cannot connect to irc server\n" -msgstr "" - -#: src/irc/irc-server.c:770 -#, c-format -msgid "%s: Reconnecting to server...\n" -msgstr "" - -#: src/irc/irc-server.c:783 src/irc/irc-server.c:860 +#: src/irc/irc-server.c:718 #, c-format msgid "%s: Reconnecting to server in %d seconds\n" msgstr "" -#: src/irc/irc-server.c:827 +#: src/irc/irc-server.c:749 +#, c-format +msgid "%s address \"%s\" not found\n" +msgstr "" + +#: src/irc/irc-server.c:758 +#, c-format +msgid "%s IP address not found\n" +msgstr "" + +#: src/irc/irc-server.c:766 +#, c-format +msgid "%s connection refused\n" +msgstr "" + +#: src/irc/irc-server.c:832 +#, c-format +msgid "%s: connecting to %s:%d...\n" +msgstr "" + +#: src/irc/irc-server.c:834 +#, c-format +msgid "connecting to server %s:%d...\n" +msgstr "" + +#: src/irc/irc-server.c:845 +#, c-format +msgid "%s cannot create pipe\n" +msgstr "" + +#: src/irc/irc-server.c:857 +#, c-format +msgid "%s cannot create socket\n" +msgstr "" + +#: src/irc/irc-server.c:869 +#, c-format +msgid "%s cannot set socket option \"SO_REUSEADDR\"\n" +msgstr "" + +#: src/irc/irc-server.c:880 +#, c-format +msgid "%s cannot set socket option \"SO_KEEPALIVE\"\n" +msgstr "" + +#: src/irc/irc-server.c:911 +#, c-format +msgid "%s: Reconnecting to server...\n" +msgstr "" + +#: src/irc/irc-server.c:960 src/irc/irc-server.c:965 msgid "Disconnected from server!\n" msgstr "" @@ -1110,7 +1110,7 @@ msgid "%s: using local hostname \"%s\"\n" msgstr "" #: src/irc/irc-send.c:267 src/irc/irc-send.c:278 src/irc/irc-send.c:748 -#: src/irc/irc-send.c:822 src/common/command.c:1355 +#: src/irc/irc-send.c:822 src/common/command.c:1365 #, c-format msgid "%s wrong argument count for \"%s\" command\n" msgstr "" @@ -1822,7 +1822,7 @@ msgid "connect to a server" msgstr "" #: src/common/command.c:61 src/common/command.c:65 -msgid "servername" +msgid "[servername]" msgstr "" #: src/common/command.c:62 @@ -1968,9 +1968,9 @@ msgid "" "arg%s)\n" msgstr "" -#: src/common/command.c:509 +#: src/common/command.c:509 src/common/command.c:579 #, c-format -msgid "%s %s command \"%s\" failed\n" +msgid "%s command \"%s\" failed\n" msgstr "" #: src/common/command.c:537 @@ -1990,11 +1990,6 @@ msgstr "" msgid "%s command \"%s\" needs a server connection!\n" msgstr "" -#: src/common/command.c:579 -#, c-format -msgid "%s IRC command \"%s\" failed\n" -msgstr "" - #: src/common/command.c:628 #, c-format msgid "%s unknown command \"%s\" (type /help for help)\n" @@ -2082,209 +2077,218 @@ msgstr "" msgid "unknown parameter \"%s\" for \"%s\" command\n" msgstr "" -#: src/common/command.c:1070 +#: src/common/command.c:1073 #, c-format msgid "%s already connected to server \"%s\"!\n" msgstr "" -#: src/common/command.c:1090 src/common/command.c:1133 -#: src/common/command.c:1783 +#: src/common/command.c:1081 #, c-format -msgid "%s server \"%s\" not found\n" +msgid "%s currently connecting to server \"%s\"!\n" msgstr "" -#: src/common/command.c:1116 +#: src/common/command.c:1099 src/common/command.c:1144 +#, c-format +msgid "%s server not found\n" +msgstr "" + +#: src/common/command.c:1128 #, c-format msgid "%s not connected to server \"%s\"!\n" msgstr "" -#: src/common/command.c:1124 +#: src/common/command.c:1136 msgid "Auto-reconnection is cancelled\n" msgstr "" -#: src/common/command.c:1153 +#: src/common/command.c:1163 #, c-format msgid "%s internal commands:\n" msgstr "" -#: src/common/command.c:1164 +#: src/common/command.c:1174 msgid "IRC commands:\n" msgstr "" -#: src/common/command.c:1224 +#: src/common/command.c:1234 #, c-format msgid "No help available, \"%s\" is an unknown command\n" msgstr "" -#: src/common/command.c:1249 +#: src/common/command.c:1259 msgid "Registered Perl scripts:\n" msgstr "" -#: src/common/command.c:1266 src/common/command.c:1288 -#: src/common/command.c:1310 +#: src/common/command.c:1276 src/common/command.c:1298 +#: src/common/command.c:1320 msgid " (none)\n" msgstr "" -#: src/common/command.c:1271 +#: src/common/command.c:1281 msgid "Perl message handlers:\n" msgstr "" -#: src/common/command.c:1280 +#: src/common/command.c:1290 #, c-format msgid " IRC(%s) => Perl(%s)\n" msgstr "" -#: src/common/command.c:1293 +#: src/common/command.c:1303 msgid "Perl command handlers:\n" msgstr "" -#: src/common/command.c:1302 +#: src/common/command.c:1312 #, c-format msgid " Command /%s => Perl(%s)\n" msgstr "" -#: src/common/command.c:1322 +#: src/common/command.c:1332 msgid "Perl scripts unloaded\n" msgstr "" -#: src/common/command.c:1348 src/common/command.c:2054 -#: src/common/command.c:2066 +#: src/common/command.c:1358 src/common/command.c:2063 +#: src/common/command.c:2075 #, c-format msgid "%s unknown option for \"%s\" command\n" msgstr "" -#: src/common/command.c:1361 +#: src/common/command.c:1371 msgid "" "WeeChat was build without Perl support.\n" "Please rebuild WeeChat with \"--enable-perl\" option for ./configure script\n" msgstr "" -#: src/common/command.c:1415 +#: src/common/command.c:1425 msgid "No server.\n" msgstr "" -#: src/common/command.c:1426 +#: src/common/command.c:1436 #, c-format msgid "Server '%s' not found.\n" msgstr "" -#: src/common/command.c:1438 +#: src/common/command.c:1448 #, c-format msgid "%s missing servername for \"%s\" command\n" msgstr "" -#: src/common/command.c:1446 +#: src/common/command.c:1456 #, c-format msgid "%s too much arguments for \"%s\" command, ignoring arguments\n" msgstr "" -#: src/common/command.c:1465 +#: src/common/command.c:1475 #, c-format msgid "%s server \"%s\" not found for \"%s\" command\n" msgstr "" -#: src/common/command.c:1473 +#: src/common/command.c:1483 #, c-format msgid "" "%s you can not delete server \"%s\" because you are connected to. Try /" "disconnect %s before.\n" msgstr "" -#: src/common/command.c:1489 src/common/command.c:1630 +#: src/common/command.c:1499 src/common/command.c:1640 msgid "Server" msgstr "" -#: src/common/command.c:1492 +#: src/common/command.c:1502 msgid "has been deleted\n" msgstr "" -#: src/common/command.c:1507 -#, c-format -msgid "%s missing parameters for \"%s\" command\n" -msgstr "" - #: src/common/command.c:1517 #, c-format +msgid "%s missing parameters for \"%s\" command\n" +msgstr "" + +#: src/common/command.c:1527 +#, c-format msgid "%s server \"%s\" already exists, can't create it!\n" msgstr "" -#: src/common/command.c:1542 src/common/command.c:1570 -#: src/common/command.c:1583 src/common/command.c:1609 +#: src/common/command.c:1552 src/common/command.c:1580 +#: src/common/command.c:1593 src/common/command.c:1619 #, c-format msgid "%s missing password for \"%s\" parameter\n" msgstr "" -#: src/common/command.c:1555 +#: src/common/command.c:1565 #, c-format msgid "%s missing nick(s) for \"%s\" parameter\n" msgstr "" -#: src/common/command.c:1596 +#: src/common/command.c:1606 #, c-format msgid "%s missing command for \"%s\" parameter\n" msgstr "" -#: src/common/command.c:1633 +#: src/common/command.c:1643 msgid "created\n" msgstr "" -#: src/common/command.c:1639 +#: src/common/command.c:1649 #, c-format msgid "%s unable to create server\n" msgstr "" -#: src/common/command.c:1696 +#: src/common/command.c:1705 msgid "(unknown)" msgstr "" -#: src/common/command.c:1719 +#: src/common/command.c:1728 msgid "(password hidden) " msgstr "" -#: src/common/command.c:1815 src/common/command.c:1862 +#: src/common/command.c:1792 +#, c-format +msgid "%s server \"%s\" not found\n" +msgstr "" + +#: src/common/command.c:1824 src/common/command.c:1871 #, c-format msgid "%s config option \"%s\" not found\n" msgstr "" -#: src/common/command.c:1820 src/common/command.c:1854 +#: src/common/command.c:1829 src/common/command.c:1863 #, c-format msgid "%s incorrect value for option \"%s\"\n" msgstr "" -#: src/common/command.c:1836 +#: src/common/command.c:1845 #, c-format msgid "%s option \"%s\" can not be changed while WeeChat is running\n" msgstr "" -#: src/common/command.c:1938 +#: src/common/command.c:1947 #, c-format msgid "No config option found with \"%s\"\n" msgstr "" -#: src/common/command.c:1941 +#: src/common/command.c:1950 msgid "No config option found\n" msgstr "" -#: src/common/command.c:1948 +#: src/common/command.c:1957 #, c-format msgid "config option(s) found with \"%s\"\n" msgstr "" -#: src/common/command.c:1951 +#: src/common/command.c:1960 msgid "config option(s) found\n" msgstr "" -#: src/common/command.c:1971 +#: src/common/command.c:1980 #, c-format msgid "%s alias or command \"%s\" not found\n" msgstr "" -#: src/common/command.c:1981 +#: src/common/command.c:1990 #, c-format msgid "Alias \"%s\" removed\n" msgstr "" -#: src/common/command.c:2001 +#: src/common/command.c:2010 msgid "Opened windows:\n" msgstr "" diff --git a/src/common/command.c b/src/common/command.c index 48e3f85f0..74d4af84c 100644 --- a/src/common/command.c +++ b/src/common/command.c @@ -58,13 +58,13 @@ t_weechat_command weechat_commands[] = N_("-all: clear all windows"), 0, 1, weechat_cmd_clear, NULL }, { "connect", N_("connect to a server"), - N_("servername"), + N_("[servername]"), N_("servername: server name to connect"), - 1, 1, weechat_cmd_connect, NULL }, + 0, 1, weechat_cmd_connect, NULL }, { "disconnect", N_("disconnect from a server"), - N_("servername"), + N_("[servername]"), N_("servername: server name to disconnect"), - 1, 1, weechat_cmd_disconnect, NULL }, + 0, 1, weechat_cmd_disconnect, NULL }, { "help", N_("display help about commands"), N_("[command]"), N_("command: name of a WeeChat or IRC command"), 0, 1, weechat_cmd_help, NULL }, @@ -506,8 +506,8 @@ exec_weechat_command (t_irc_server *server, char *string) { irc_display_prefix (NULL, PREFIX_ERROR); gui_printf (NULL, - _("%s %s command \"%s\" failed\n"), - WEECHAT_ERROR, PACKAGE_NAME, command + 1); + _("%s command \"%s\" failed\n"), + WEECHAT_ERROR, command + 1); } } if (argv) @@ -576,7 +576,7 @@ exec_weechat_command (t_irc_server *server, char *string) { irc_display_prefix (NULL, PREFIX_ERROR); gui_printf (NULL, - _("%s IRC command \"%s\" failed\n"), + _("%s command \"%s\" failed\n"), WEECHAT_ERROR, command + 1); } } @@ -1060,7 +1060,10 @@ weechat_cmd_connect (int argc, char **argv) /* make gcc happy */ (void) argc; - ptr_server = server_search (argv[0]); + if (argc == 1) + ptr_server = server_search (argv[0]); + else + ptr_server = SERVER(gui_current_window->buffer); if (ptr_server) { if (ptr_server->is_connected) @@ -1071,6 +1074,14 @@ weechat_cmd_connect (int argc, char **argv) WEECHAT_ERROR, argv[0]); return -1; } + if (ptr_server->child_pid > 0) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("%s currently connecting to server \"%s\"!\n"), + WEECHAT_ERROR, argv[0]); + return -1; + } if (!ptr_server->buffer) { if (!gui_buffer_new (gui_current_window, ptr_server, NULL, 0, 1)) @@ -1080,15 +1091,12 @@ weechat_cmd_connect (int argc, char **argv) { ptr_server->reconnect_start = 0; ptr_server->reconnect_join = (ptr_server->channels) ? 1 : 0; - irc_login (ptr_server); } } else { irc_display_prefix (NULL, PREFIX_ERROR); - gui_printf (NULL, - _("%s server \"%s\" not found\n"), - WEECHAT_ERROR, argv[0]); + gui_printf (NULL, _("%s server not found\n"), WEECHAT_ERROR); return -1; } return 0; @@ -1106,10 +1114,14 @@ weechat_cmd_disconnect (int argc, char **argv) /* make gcc happy */ (void) argc; - ptr_server = server_search (argv[0]); + if (argc == 1) + ptr_server = server_search (argv[0]); + else + ptr_server = SERVER(gui_current_window->buffer); if (ptr_server) { - if ((!ptr_server->is_connected) && (ptr_server->reconnect_start == 0)) + if ((!ptr_server->is_connected) && (ptr_server->child_pid == 0) + && (ptr_server->reconnect_start == 0)) { irc_display_prefix (ptr_server->buffer, PREFIX_ERROR); gui_printf (ptr_server->buffer, @@ -1129,9 +1141,7 @@ weechat_cmd_disconnect (int argc, char **argv) else { irc_display_prefix (NULL, PREFIX_ERROR); - gui_printf (NULL, - _("%s server \"%s\" not found\n"), - WEECHAT_ERROR, argv[0]); + gui_printf (NULL, _("%s server not found\n"), WEECHAT_ERROR); return -1; } return 0; @@ -1645,8 +1655,7 @@ weechat_cmd_server (int argc, char **argv) if (new_server->autoconnect) { (void) gui_buffer_new (gui_current_window, new_server, NULL, 0, 1); - if (server_connect (new_server)) - irc_login (new_server); + server_connect (new_server); } server_destroy (&server); diff --git a/src/gui/curses/gui-input.c b/src/gui/curses/gui-input.c index 1ca34b5b6..472103e90 100644 --- a/src/gui/curses/gui-input.c +++ b/src/gui/curses/gui-input.c @@ -768,8 +768,13 @@ gui_main_loop () } } - if (ptr_server->sock4 >= 0) - FD_SET (ptr_server->sock4, &read_fd); + if (!ptr_server->is_connected && (ptr_server->child_pid > 0)) + FD_SET (ptr_server->child_read, &read_fd); + else + { + if (ptr_server->sock4 >= 0) + FD_SET (ptr_server->sock4, &read_fd); + } } } if (select (FD_SETSIZE, &read_fd, NULL, NULL, &timeout) > 0) @@ -783,9 +788,17 @@ gui_main_loop () for (ptr_server = irc_servers; ptr_server; ptr_server = ptr_server->next_server) { - if ((ptr_server->sock4 >= 0) && - (FD_ISSET (ptr_server->sock4, &read_fd))) - server_recv (ptr_server); + if (!ptr_server->is_connected && (ptr_server->child_pid > 0)) + { + if (FD_ISSET (ptr_server->child_read, &read_fd)) + server_child_read (ptr_server); + } + else + { + if ((ptr_server->sock4 >= 0) && + (FD_ISSET (ptr_server->sock4, &read_fd))) + server_recv (ptr_server); + } } } } diff --git a/src/irc/irc-recv.c b/src/irc/irc-recv.c index 8e83dee93..1195d7c71 100644 --- a/src/irc/irc-recv.c +++ b/src/irc/irc-recv.c @@ -1600,7 +1600,7 @@ irc_cmd_recv_004 (t_irc_server *server, char *host, char *arguments) } /* auto-join after disconnection (only rejoins opened channels) */ - if (server->reconnect_join) + if (server->reconnect_join && server->channels) { for (ptr_channel = server->channels; ptr_channel; ptr_channel = ptr_channel->next_channel) diff --git a/src/irc/irc-server.c b/src/irc/irc-server.c index 2edf085d2..3bb93686d 100644 --- a/src/irc/irc-server.c +++ b/src/irc/irc-server.c @@ -27,12 +27,14 @@ #include #include #include +#include #include #include #include #include -#include #include +#include +#include #include #include #include @@ -57,6 +59,7 @@ int check_away = 0; void server_init (t_irc_server *server) { + /* user choices */ server->name = NULL; server->autoconnect = 0; server->autoreconnect = 1; @@ -73,14 +76,18 @@ server_init (t_irc_server *server) server->command = NULL; server->command_delay = 1; server->autojoin = NULL; + server->autorejoin = 0; + + /* internal vars */ + server->child_pid = 0; + server->child_read = -1; + server->child_write = -1; + server->sock4 = -1; + server->is_connected = 0; server->unterminated_message = NULL; server->nick = NULL; - server->is_connected = 0; server->reconnect_start = 0; server->reconnect_join = 0; - server->sock4 = -1; - server->server_read = -1; - server->server_write = -1; server->is_away = 0; server->away_time = 0; server->lag = 0; @@ -642,6 +649,174 @@ server_recv (t_irc_server *server) } } +/* + * server_kill_child: kill child process and close pipe + */ + +void +server_kill_child (t_irc_server *server) +{ + /* kill process */ + if (server->child_pid > 0) + { + kill (server->child_pid, SIGKILL); + waitpid (server->child_pid, NULL, 0); + server->child_pid = 0; + } + + /* close pipe used with child */ + if (server->child_read != -1) + { + close (server->child_read); + server->child_read = -1; + } + if (server->child_write != -1) + { + close (server->child_write); + server->child_write = -1; + } +} + +/* + * server_close_connection: close server connection (kill child, close socket/pipes) + */ + +void +server_close_connection (t_irc_server *server) +{ + server_kill_child (server); + + /* close network socket */ + if (server->sock4 != -1) + { + close (server->sock4); + server->sock4 = -1; + } + + /* free any pending message */ + if (server->unterminated_message) + { + free (server->unterminated_message); + server->unterminated_message = NULL; + } + + /* server is now disconnected */ + server->is_connected = 0; +} + +/* + * server_reconnect_schedule: schedule reconnect for a server + */ + +void +server_reconnect_schedule (t_irc_server *server) +{ + if (server->autoreconnect) + { + server->reconnect_start = time (NULL); + irc_display_prefix (server->buffer, PREFIX_INFO); + gui_printf (server->buffer, _("%s: Reconnecting to server in %d seconds\n"), + PACKAGE_NAME, server->autoreconnect_delay); + } + else + server->reconnect_start = 0; +} + +/* + * server_child_read: read connection progress from child process + */ + +void +server_child_read (t_irc_server *server) +{ + char buffer[1]; + int num_read; + + num_read = read (server->child_read, buffer, sizeof (buffer)); + if (num_read != -1) + { + switch (buffer[0]) + { + /* connection OK */ + case '0': + server_kill_child (server); + irc_login (server); + break; + /* adress not found */ + case '1': + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s address \"%s\" not found\n"), + WEECHAT_ERROR, server->address); + server_close_connection (server); + server_reconnect_schedule (server); + break; + /* IP address not found */ + case '2': + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s IP address not found\n"), WEECHAT_ERROR); + server_close_connection (server); + server_reconnect_schedule (server); + break; + /* connection refused */ + case '3': + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s connection refused\n"), WEECHAT_ERROR); + server_close_connection (server); + server_reconnect_schedule (server); + break; + } + } +} + +/* + * server_child: child process trying to connect to server + */ + +int +server_child (t_irc_server *server) +{ + struct hostent *ip4_hostent; + struct sockaddr_in addr; + char *ip_address; + int error; + + /* bind to hostname */ + ip4_hostent = gethostbyname (server->address); + if (!ip4_hostent) + { + write (server->child_write, "1", 1); + return 0; + } + memset (&addr, 0, sizeof (addr)); + memcpy (&addr.sin_addr, ip4_hostent->h_addr, ip4_hostent->h_length); + addr.sin_port = htons (server->port); + addr.sin_family = AF_INET; + + /* find IP address */ + ip_address = inet_ntoa (addr.sin_addr); + if (!ip_address) + { + write (server->child_write, "2", 1); + return 0; + } + + /* connect to server */ + error = connect (server->sock4, (struct sockaddr *) &addr, sizeof (addr)); + if (error != 0) + { + write (server->child_write, "3", 1); + return 0; + } + + /* connection OK */ + write (server->child_write, "0", 1); + + return 0; +} + /* * server_connect: connect to an IRC server */ @@ -649,12 +824,8 @@ server_recv (t_irc_server *server) int server_connect (t_irc_server *server) { - int set; - struct hostent *ip4_hostent; - struct sockaddr_in addr; - char *ip_address; - int error; - int server_pipe[2]; + int child_pipe[2], set; + pid_t pid; irc_display_prefix (server->buffer, PREFIX_INFO); gui_printf (server->buffer, @@ -662,100 +833,70 @@ server_connect (t_irc_server *server) PACKAGE_NAME, server->address, server->port); wee_log_printf (_("connecting to server %s:%d...\n"), server->address, server->port); - server->is_connected = 0; - - /* create pipe */ - if (pipe (server_pipe) < 0) + + /* close any opened connection and kill child process if running */ + server_close_connection (server); + + /* create pipe for child process */ + if (pipe (child_pipe) < 0) { irc_display_prefix (server->buffer, PREFIX_ERROR); gui_printf (server->buffer, _("%s cannot create pipe\n"), WEECHAT_ERROR); - server_free (server); return 0; } - server->server_read = server_pipe[0]; - server->server_write = server_pipe[1]; - + server->child_read = child_pipe[0]; + server->child_write = child_pipe[1]; + /* create socket and set options */ server->sock4 = socket (AF_INET, SOCK_STREAM, 0); + if (server->sock4 == -1) + { + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s cannot create socket\n"), WEECHAT_ERROR); + server_close_connection (server); + return 0; + } + + /* set SO_REUSEADDR option for socket */ set = 1; - if (setsockopt - (server->sock4, SOL_SOCKET, SO_REUSEADDR, (char *) &set, - sizeof (set)) == -1) + if (setsockopt (server->sock4, SOL_SOCKET, SO_REUSEADDR, + (void *) &set, sizeof (set)) == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); gui_printf (server->buffer, _("%s cannot set socket option \"SO_REUSEADDR\"\n"), - WEECHAT_ERROR); + WEECHAT_WARNING); } + + /* set SO_KEEPALIVE option for socket */ set = 1; - if (setsockopt - (server->sock4, SOL_SOCKET, SO_KEEPALIVE, (char *) &set, - sizeof (set)) == -1) + if (setsockopt (server->sock4, SOL_SOCKET, SO_KEEPALIVE, + (void *) &set, sizeof (set)) == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); gui_printf (server->buffer, _("%s cannot set socket option \"SO_KEEPALIVE\"\n"), - WEECHAT_ERROR); + WEECHAT_WARNING); } - - /* bind to hostname */ - ip4_hostent = gethostbyname (server->address); - if (!ip4_hostent) + + switch (pid = fork ()) { - irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf (server->buffer, - _("%s address \"%s\" not found\n"), - WEECHAT_ERROR, server->address); - close (server->server_read); - close (server->server_write); - close (server->sock4); - server->sock4 = -1; - return 0; - } - memset (&addr, 0, sizeof (addr)); - memcpy (&addr.sin_addr, ip4_hostent->h_addr, ip4_hostent->h_length); - addr.sin_port = htons (server->port); - addr.sin_family = AF_INET; - /*error = bind(server->sock4, (struct sockaddr *)(&addr), sizeof(addr)); - if (error != 0) - { - irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf (server->buffer, - _("%s can't bind to hostname\n"), WEECHAT_ERROR); - return 0; - }*/ - ip_address = inet_ntoa (addr.sin_addr); - if (!ip_address) - { - irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf (server->buffer, - _("%s IP address not found\n"), WEECHAT_ERROR); - close (server->server_read); - close (server->server_write); - close (server->sock4); - server->sock4 = -1; - return 0; - } - - /* connection to server */ - irc_display_prefix (server->buffer, PREFIX_INFO); - gui_printf (server->buffer, - _("%s: server IP is: %s\n"), PACKAGE_NAME, ip_address); - - error = connect (server->sock4, (struct sockaddr *) &addr, sizeof (addr)); - if (error != 0) - { - irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf (server->buffer, - _("%s cannot connect to irc server\n"), WEECHAT_ERROR); - close (server->server_read); - close (server->server_write); - close (server->sock4); - server->sock4 = -1; - return 0; + /* fork failed */ + case -1: + server_close_connection (server); + return 0; + /* child process */ + case 0: + setuid (getuid ()); + server_child (server); + _exit (EXIT_SUCCESS); } + /* parent process go on here */ + server->child_pid = pid; + return 1; } @@ -772,17 +913,9 @@ server_reconnect (t_irc_server *server) server->reconnect_start = 0; if (server_connect (server)) - { server->reconnect_join = 1; - irc_login (server); - } else - { - server->reconnect_start = time (NULL); - irc_display_prefix (server->buffer, PREFIX_INFO); - gui_printf (server->buffer, _("%s: Reconnecting to server in %d seconds\n"), - PACKAGE_NAME, server->autoreconnect_delay); - } + server_reconnect_schedule (server); } /* @@ -801,8 +934,8 @@ server_auto_connect (int command_line) || ((!command_line) && (ptr_server->autoconnect)) ) { (void) gui_buffer_new (gui_current_window, ptr_server, NULL, 0, 1); - if (server_connect (ptr_server)) - irc_login (ptr_server); + gui_redraw_buffer (gui_current_window->buffer); + server_connect (ptr_server); } } } @@ -828,24 +961,11 @@ server_disconnect (t_irc_server *server, int reconnect) } } - /* close communication with server */ - if (server->server_read >= 0) - close (server->server_read); - server->server_read = -1; + irc_display_prefix (server->buffer, PREFIX_INFO); + gui_printf (server->buffer, _("Disconnected from server!\n")); - if (server->server_write >= 0) - close (server->server_write); - server->server_write = -1; + server_close_connection (server); - if (server->sock4 >= 0) - close (server->sock4); - server->sock4 = -1; - - if (server->unterminated_message) - free (server->unterminated_message); - server->unterminated_message = NULL; - - server->is_connected = 0; server->is_away = 0; server->away_time = 0; server->lag = 0; @@ -854,12 +974,7 @@ server_disconnect (t_irc_server *server, int reconnect) server->lag_next_check = time (NULL) + cfg_irc_lag_check; if ((reconnect) && (server->autoreconnect)) - { - server->reconnect_start = time (NULL); - irc_display_prefix (server->buffer, PREFIX_INFO); - gui_printf (server->buffer, _("%s: Reconnecting to server in %d seconds\n"), - PACKAGE_NAME, server->autoreconnect_delay); - } + server_reconnect_schedule (server); else server->reconnect_start = 0; diff --git a/src/irc/irc.h b/src/irc/irc.h index e48ff289c..828bca973 100644 --- a/src/irc/irc.h +++ b/src/irc/irc.h @@ -23,6 +23,7 @@ #include #include +#include #include "../gui/gui.h" /* prefixes for chat window */ @@ -138,14 +139,15 @@ struct t_irc_server int autorejoin; /* auto rejoin channels when kicked */ /* internal vars */ + pid_t child_pid; /* pid of child process (connecting) */ + int child_read; /* to read into child pipe */ + int child_write; /* to write into child pipe */ + int sock4; /* socket for server */ + int is_connected; /* 1 if WeeChat is connected to server */ char *unterminated_message; /* beginning of a message in input buf */ char *nick; /* current nickname */ - int is_connected; /* 1 if WeeChat is connected to server */ time_t reconnect_start; /* this time + delay = reconnect time */ int reconnect_join; /* 1 if channels opened to rejoin */ - int sock4; /* socket for server */ - int server_read; /* pipe for reading server data */ - int server_write; /* pipe for sending data to server */ int is_away; /* 1 is user is marker as away */ time_t away_time; /* time() when user marking as away */ int lag; /* lag (in milliseconds) */ @@ -235,6 +237,7 @@ extern t_irc_server *server_new (char *, int, int, int, int, char *, int, char * extern int server_send (t_irc_server *, char *, int); extern void server_sendf (t_irc_server *, char *, ...); extern void server_recv (t_irc_server *); +extern void server_child_read (t_irc_server *); extern int server_connect (t_irc_server *); extern void server_reconnect (t_irc_server *); extern void server_auto_connect (int); diff --git a/weechat/ChangeLog b/weechat/ChangeLog index afd889b3b..63a9cda5e 100644 --- a/weechat/ChangeLog +++ b/weechat/ChangeLog @@ -6,6 +6,7 @@ ChangeLog - 2005-02-20 Version 0.1.1 (under dev!): * added DCC send + * connection to IRC server is now made by child process (non blocking) * added support for UnrealIrcd ("~" for chan owner, "&" for chan admin) * on server buffer, only server messages are logged * improved /help command output diff --git a/weechat/TODO b/weechat/TODO index 001349752..07c7c5e3c 100644 --- a/weechat/TODO +++ b/weechat/TODO @@ -1,7 +1,7 @@ WeeChat - Wee Enhanced Environment for Chat =========================================== -TODO - 2005-02-12 +TODO - 2005-02-20 Legend: # done @@ -19,7 +19,7 @@ v0.1.1: - *BSD version * IRC protocol: - + "/dcc" command (for chat and sending/receiving files) + # "/dcc send" command - customizable CTCP version reply * Interface: @@ -27,13 +27,14 @@ v0.1.1: + internationalization (traduce WeeChat in many languages) * TCP/IP communication: - - connect to server with child process (background) + # connect to server with child process (background) Future versions: --------------- * IRC protocol: + - "/dcc chat" command (and incoming DCC chats) - complete "/list" command: add regexp search, display only channels that match regexp - "/ignore" and "/unignore" commands: hide all that is write by a given diff --git a/weechat/po/fr.po b/weechat/po/fr.po index d6ee7ffeb..f37ca6427 100644 --- a/weechat/po/fr.po +++ b/weechat/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WeeChat 0.1.1-cvs\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2005-02-20 01:03+0100\n" +"POT-Creation-Date: 2005-02-20 14:34+0100\n" "PO-Revision-Date: 2005-02-12 12:00+0100\n" "Last-Translator: FlashCode \n" "Language-Team: weechat-dev \n" @@ -20,107 +20,107 @@ msgstr "" msgid "%s cannot allocate new nick\n" msgstr "%s ompossible d'allouer un nouveau pseudo\n" -#: src/irc/irc-server.c:139 src/common/weeconfig.c:1471 +#: src/irc/irc-server.c:146 src/common/weeconfig.c:1471 msgid "Unable to get user's name" msgstr "Impossible de déterminer le nom d'utilisateur" -#: src/irc/irc-server.c:204 +#: src/irc/irc-server.c:211 #, c-format msgid "%s cannot allocate new server\n" msgstr "%s impossible d'allouer un nouveau serveur\n" -#: src/irc/irc-server.c:405 +#: src/irc/irc-server.c:412 #, c-format msgid "%s error sending data to IRC server\n" msgstr "%s erreur d'envoi de données au serveur IRC\n" -#: src/irc/irc-server.c:425 src/irc/irc-server.c:438 src/irc/irc-server.c:504 +#: src/irc/irc-server.c:432 src/irc/irc-server.c:445 src/irc/irc-server.c:511 #, c-format msgid "%s not enough memory for received IRC message\n" msgstr "%s mémoire insuffisante pour un message IRC reçu\n" -#: src/irc/irc-server.c:513 +#: src/irc/irc-server.c:520 #, c-format msgid "%s unable to explode received buffer\n" msgstr "%s impossible d'exploser le tampon de réception\n" -#: src/irc/irc-server.c:587 +#: src/irc/irc-server.c:594 #, c-format msgid "%s Command '%s' failed!\n" msgstr "%s La commande '%s' a échoué !\n" -#: src/irc/irc-server.c:592 +#: src/irc/irc-server.c:599 #, c-format msgid "%s No command to execute!\n" msgstr "%s Pas de commande à exécuter !\n" -#: src/irc/irc-server.c:597 +#: src/irc/irc-server.c:604 #, c-format msgid "%s Unknown command: cmd=%s, args=%s\n" msgstr "%s Commande inconnue: cmd=%s, params=%s\n" -#: src/irc/irc-server.c:639 +#: src/irc/irc-server.c:646 #, c-format msgid "%s cannot read data from socket, disconnecting from server...\n" msgstr "" "%s impossible de lire des données sur la socket, déconnexion du serveur...\n" -#: src/irc/irc-server.c:661 -#, c-format -msgid "%s: connecting to %s:%d...\n" -msgstr "%s: connexion à %s:%d...\n" - -#: src/irc/irc-server.c:663 -#, c-format -msgid "connecting to server %s:%d...\n" -msgstr "connexion au serveur %s:%d...\n" - -#: src/irc/irc-server.c:672 -#, c-format -msgid "%s cannot create pipe\n" -msgstr "%s impossible de créer le pipe\n" - -#: src/irc/irc-server.c:688 -#, c-format -msgid "%s cannot set socket option \"SO_REUSEADDR\"\n" -msgstr "%s impossible de paramétrer l'option socket \"SO_REUSEADDR\"\n" - -#: src/irc/irc-server.c:698 -#, c-format -msgid "%s cannot set socket option \"SO_KEEPALIVE\"\n" -msgstr "%s impossible de paramétrer l'option socket \"SO_KEEPALIVE\"\n" - -#: src/irc/irc-server.c:708 -#, c-format -msgid "%s address \"%s\" not found\n" -msgstr "%s adresse \"%s\" introuvable\n" - -#: src/irc/irc-server.c:733 -#, c-format -msgid "%s IP address not found\n" -msgstr "%s adresse IP introuvable\n" - -#: src/irc/irc-server.c:744 -#, c-format -msgid "%s: server IP is: %s\n" -msgstr "%s: l'adresse IP du serveur est : %s\n" - -#: src/irc/irc-server.c:751 -#, c-format -msgid "%s cannot connect to irc server\n" -msgstr "%s connexion au serveur irc impossible\n" - -#: src/irc/irc-server.c:770 -#, c-format -msgid "%s: Reconnecting to server...\n" -msgstr "%s: Reconnexion au serveur...\n" - -#: src/irc/irc-server.c:783 src/irc/irc-server.c:860 +#: src/irc/irc-server.c:718 #, c-format msgid "%s: Reconnecting to server in %d seconds\n" msgstr "%s: Reconnexion au serveur dans %d secondes\n" -#: src/irc/irc-server.c:827 +#: src/irc/irc-server.c:749 +#, c-format +msgid "%s address \"%s\" not found\n" +msgstr "%s adresse \"%s\" introuvable\n" + +#: src/irc/irc-server.c:758 +#, c-format +msgid "%s IP address not found\n" +msgstr "%s adresse IP introuvable\n" + +#: src/irc/irc-server.c:766 +#, c-format +msgid "%s connection refused\n" +msgstr "%s connexion refusée\n" + +#: src/irc/irc-server.c:832 +#, c-format +msgid "%s: connecting to %s:%d...\n" +msgstr "%s: connexion à %s:%d...\n" + +#: src/irc/irc-server.c:834 +#, c-format +msgid "connecting to server %s:%d...\n" +msgstr "connexion au serveur %s:%d...\n" + +#: src/irc/irc-server.c:845 +#, c-format +msgid "%s cannot create pipe\n" +msgstr "%s impossible de créer le pipe\n" + +#: src/irc/irc-server.c:857 +#, c-format +msgid "%s cannot create socket\n" +msgstr "%s impossible de créer la socket\n" + +#: src/irc/irc-server.c:869 +#, c-format +msgid "%s cannot set socket option \"SO_REUSEADDR\"\n" +msgstr "%s impossible de paramétrer l'option socket \"SO_REUSEADDR\"\n" + +#: src/irc/irc-server.c:880 +#, c-format +msgid "%s cannot set socket option \"SO_KEEPALIVE\"\n" +msgstr "%s impossible de paramétrer l'option socket \"SO_KEEPALIVE\"\n" + +#: src/irc/irc-server.c:911 +#, c-format +msgid "%s: Reconnecting to server...\n" +msgstr "%s: Reconnexion au serveur...\n" + +#: src/irc/irc-server.c:960 src/irc/irc-server.c:965 msgid "Disconnected from server!\n" msgstr "Déconnecté du serveur !\n" @@ -1204,7 +1204,7 @@ msgid "%s: using local hostname \"%s\"\n" msgstr "%s: utilisation du nom de machine local \"%s\"\n" #: src/irc/irc-send.c:267 src/irc/irc-send.c:278 src/irc/irc-send.c:748 -#: src/irc/irc-send.c:822 src/common/command.c:1355 +#: src/irc/irc-send.c:822 src/common/command.c:1365 #, c-format msgid "%s wrong argument count for \"%s\" command\n" msgstr "%s nombre de paramètres erroné pour la commande \"%s\"\n" @@ -1948,8 +1948,8 @@ msgid "connect to a server" msgstr "se connecter à un serveur" #: src/common/command.c:61 src/common/command.c:65 -msgid "servername" -msgstr "nom_serveur" +msgid "[servername]" +msgstr "[nom_serveur]" #: src/common/command.c:62 msgid "servername: server name to connect" @@ -2119,10 +2119,10 @@ msgstr "" "%s nombre de paramètres incorrect pour la commande %s \"%s\" (attendu: entre " "%d et %d paramètre%s)\n" -#: src/common/command.c:509 +#: src/common/command.c:509 src/common/command.c:579 #, c-format -msgid "%s %s command \"%s\" failed\n" -msgstr "%s %s la commande \"%s\" a échoué\n" +msgid "%s command \"%s\" failed\n" +msgstr "%s la commande \"%s\" a échoué\n" #: src/common/command.c:537 #, c-format @@ -2145,11 +2145,6 @@ msgstr "" msgid "%s command \"%s\" needs a server connection!\n" msgstr "%s la commande \"%s\" nécessite une connexion au serveur !\n" -#: src/common/command.c:579 -#, c-format -msgid "%s IRC command \"%s\" failed\n" -msgstr "%s la commande IRC \"%s\" a échoué\n" - #: src/common/command.c:628 #, c-format msgid "%s unknown command \"%s\" (type /help for help)\n" @@ -2239,78 +2234,82 @@ msgstr "%s buffer \"%s\" non trouv msgid "unknown parameter \"%s\" for \"%s\" command\n" msgstr "paramètre inconnu \"%s\" pour la commande \"%s\"\n" -#: src/common/command.c:1070 +#: src/common/command.c:1073 #, c-format msgid "%s already connected to server \"%s\"!\n" msgstr "%s déjà connecté au serveur \"%s\" !\n" -#: src/common/command.c:1090 src/common/command.c:1133 -#: src/common/command.c:1783 +#: src/common/command.c:1081 #, c-format -msgid "%s server \"%s\" not found\n" -msgstr "%s serveur \"%s\" non trouvé\n" +msgid "%s currently connecting to server \"%s\"!\n" +msgstr "%s une connexion vers le serveur \"%s\" est en cours !\n" -#: src/common/command.c:1116 +#: src/common/command.c:1099 src/common/command.c:1144 +#, c-format +msgid "%s server not found\n" +msgstr "%s serveur non trouvé\n" + +#: src/common/command.c:1128 #, c-format msgid "%s not connected to server \"%s\"!\n" msgstr "%s non connecté au serveur \"%s\" !\n" -#: src/common/command.c:1124 +#: src/common/command.c:1136 msgid "Auto-reconnection is cancelled\n" msgstr "La reconnexion automatique est annulée\n" -#: src/common/command.c:1153 +#: src/common/command.c:1163 #, c-format msgid "%s internal commands:\n" msgstr "Commandes internes %s :\n" -#: src/common/command.c:1164 +#: src/common/command.c:1174 msgid "IRC commands:\n" msgstr "Commandes IRC :\n" -#: src/common/command.c:1224 +#: src/common/command.c:1234 #, c-format msgid "No help available, \"%s\" is an unknown command\n" msgstr "Pas d'aide disponible, la commande \"%s\" est inconnue\n" -#: src/common/command.c:1249 +#: src/common/command.c:1259 msgid "Registered Perl scripts:\n" msgstr "Scripts Perl enregistrés :\n" -#: src/common/command.c:1266 src/common/command.c:1288 -#: src/common/command.c:1310 +#: src/common/command.c:1276 src/common/command.c:1298 +#: src/common/command.c:1320 msgid " (none)\n" msgstr " (aucun)\n" -#: src/common/command.c:1271 +#: src/common/command.c:1281 msgid "Perl message handlers:\n" msgstr "Fonctions Perl pour messages :\n" -#: src/common/command.c:1280 +#: src/common/command.c:1290 #, c-format msgid " IRC(%s) => Perl(%s)\n" msgstr " IRC(%s) => Perl(%s)\n" -#: src/common/command.c:1293 +#: src/common/command.c:1303 msgid "Perl command handlers:\n" msgstr "Commandes Perl :\n" -#: src/common/command.c:1302 +#: src/common/command.c:1312 #, c-format msgid " Command /%s => Perl(%s)\n" msgstr " Commande /%s => Perl(%s)\n" -#: src/common/command.c:1322 +#: src/common/command.c:1332 msgid "Perl scripts unloaded\n" msgstr "Scripts Perl déchargés\n" -#: src/common/command.c:1348 src/common/command.c:2054 -#: src/common/command.c:2066 +#: src/common/command.c:1358 src/common/command.c:2063 +#: src/common/command.c:2075 #, c-format msgid "%s unknown option for \"%s\" command\n" msgstr "%s option inconnue pour la commande \"%s\"\n" -#: src/common/command.c:1361 +#: src/common/command.c:1371 msgid "" "WeeChat was build without Perl support.\n" "Please rebuild WeeChat with \"--enable-perl\" option for ./configure script\n" @@ -2319,31 +2318,31 @@ msgstr "" "Merci de reconstruire WeeChat avec l'option \"--enable-perl\" pour le " "script ./configure\n" -#: src/common/command.c:1415 +#: src/common/command.c:1425 msgid "No server.\n" msgstr "Pas de serveur.\n" -#: src/common/command.c:1426 +#: src/common/command.c:1436 #, c-format msgid "Server '%s' not found.\n" msgstr "Serveur '%s' non trouvé.\n" -#: src/common/command.c:1438 +#: src/common/command.c:1448 #, c-format msgid "%s missing servername for \"%s\" command\n" msgstr "%s il manque le nom du serveur pour la commande \"%s\"\n" -#: src/common/command.c:1446 +#: src/common/command.c:1456 #, c-format msgid "%s too much arguments for \"%s\" command, ignoring arguments\n" msgstr "%s trop de paramètres pour la commande \"%s\", paramètres ignorés\n" -#: src/common/command.c:1465 +#: src/common/command.c:1475 #, c-format msgid "%s server \"%s\" not found for \"%s\" command\n" msgstr "%s le serveur \"%s\" n'existe pas pour la commande \"%s\"\n" -#: src/common/command.c:1473 +#: src/common/command.c:1483 #, c-format msgid "" "%s you can not delete server \"%s\" because you are connected to. Try /" @@ -2352,101 +2351,106 @@ msgstr "" "%s vous ne pouvez pas supprimer le server \"%s\" car vous êtes connecté " "dessus. Essayez /disconnect %s avant.\n" -#: src/common/command.c:1489 src/common/command.c:1630 +#: src/common/command.c:1499 src/common/command.c:1640 msgid "Server" msgstr "Serveur" -#: src/common/command.c:1492 +#: src/common/command.c:1502 msgid "has been deleted\n" msgstr "a été supprimé\n" -#: src/common/command.c:1507 +#: src/common/command.c:1517 #, c-format msgid "%s missing parameters for \"%s\" command\n" msgstr "%s paramètres manquants pour la commande \"%s\"\n" -#: src/common/command.c:1517 +#: src/common/command.c:1527 #, c-format msgid "%s server \"%s\" already exists, can't create it!\n" msgstr "%s le serveur \"%s\" existe déjà, impossible de le créer !\n" -#: src/common/command.c:1542 src/common/command.c:1570 -#: src/common/command.c:1583 src/common/command.c:1609 +#: src/common/command.c:1552 src/common/command.c:1580 +#: src/common/command.c:1593 src/common/command.c:1619 #, c-format msgid "%s missing password for \"%s\" parameter\n" msgstr "%s mot de passe manquant pour le paramètre \"%s\"\n" -#: src/common/command.c:1555 +#: src/common/command.c:1565 #, c-format msgid "%s missing nick(s) for \"%s\" parameter\n" msgstr "%s pseudo(s) manquant(s) pour le paramètre \"%s\"\n" -#: src/common/command.c:1596 +#: src/common/command.c:1606 #, c-format msgid "%s missing command for \"%s\" parameter\n" msgstr "%s commande manquante pour le paramètre \"%s\"\n" -#: src/common/command.c:1633 +#: src/common/command.c:1643 msgid "created\n" msgstr "créé\n" -#: src/common/command.c:1639 +#: src/common/command.c:1649 #, c-format msgid "%s unable to create server\n" msgstr "%s impossible de créer le serveur\n" -#: src/common/command.c:1696 +#: src/common/command.c:1705 msgid "(unknown)" msgstr "(inconnu)" -#: src/common/command.c:1719 +#: src/common/command.c:1728 msgid "(password hidden) " msgstr "(mot de passe caché)" -#: src/common/command.c:1815 src/common/command.c:1862 +#: src/common/command.c:1792 +#, c-format +msgid "%s server \"%s\" not found\n" +msgstr "%s serveur \"%s\" non trouvé\n" + +#: src/common/command.c:1824 src/common/command.c:1871 #, c-format msgid "%s config option \"%s\" not found\n" msgstr "%s option de configuration \"%s\" non trouvée\n" -#: src/common/command.c:1820 src/common/command.c:1854 +#: src/common/command.c:1829 src/common/command.c:1863 #, c-format msgid "%s incorrect value for option \"%s\"\n" msgstr "%s valeur incorrecte pour l'option \"%s\"\n" -#: src/common/command.c:1836 +#: src/common/command.c:1845 #, c-format msgid "%s option \"%s\" can not be changed while WeeChat is running\n" msgstr "%s l'option \"%s\" ne peut pas être changée lorsque WeeChat tourne\n" -#: src/common/command.c:1938 +#: src/common/command.c:1947 #, c-format msgid "No config option found with \"%s\"\n" msgstr "Aucune option de configuration trouvée avec \"%s\"\n" -#: src/common/command.c:1941 +#: src/common/command.c:1950 msgid "No config option found\n" msgstr "Aucune option de configuration trouvée\n" -#: src/common/command.c:1948 +#: src/common/command.c:1957 #, c-format msgid "config option(s) found with \"%s\"\n" msgstr "option(s) de configuration trouvée(s) avec \"%s\"\n" -#: src/common/command.c:1951 +#: src/common/command.c:1960 msgid "config option(s) found\n" msgstr "option(s) de configuration trouvée(s)\n" -#: src/common/command.c:1971 +#: src/common/command.c:1980 #, c-format msgid "%s alias or command \"%s\" not found\n" msgstr "%s alias ou commande \"%s\" non trouvé\n" -#: src/common/command.c:1981 +#: src/common/command.c:1990 #, c-format msgid "Alias \"%s\" removed\n" msgstr "Alias \"%s\" supprimé\n" -#: src/common/command.c:2001 +#: src/common/command.c:2010 msgid "Opened windows:\n" msgstr "Fenêtres ouvertes:\n" @@ -3477,5 +3481,17 @@ msgstr "" msgid "saving config to disk\n" msgstr "sauvegarde de la configuration sur disque\n" +#~ msgid "servername" +#~ msgstr "nom_serveur" + +#~ msgid "%s cannot connect to irc server\n" +#~ msgstr "%s connexion au serveur irc impossible\n" + +#~ msgid "%s: server IP is: %s\n" +#~ msgstr "%s: l'adresse IP du serveur est : %s\n" + +#~ msgid "%s IRC command \"%s\" failed\n" +#~ msgstr "%s la commande IRC \"%s\" a échoué\n" + #~ msgid ") from " #~ msgstr ") de " diff --git a/weechat/po/weechat.pot b/weechat/po/weechat.pot index 4c45d7210..56f81c8af 100644 --- a/weechat/po/weechat.pot +++ b/weechat/po/weechat.pot @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2005-02-20 01:03+0100\n" +"POT-Creation-Date: 2005-02-20 14:34+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -20,106 +20,106 @@ msgstr "" msgid "%s cannot allocate new nick\n" msgstr "" -#: src/irc/irc-server.c:139 src/common/weeconfig.c:1471 +#: src/irc/irc-server.c:146 src/common/weeconfig.c:1471 msgid "Unable to get user's name" msgstr "" -#: src/irc/irc-server.c:204 +#: src/irc/irc-server.c:211 #, c-format msgid "%s cannot allocate new server\n" msgstr "" -#: src/irc/irc-server.c:405 +#: src/irc/irc-server.c:412 #, c-format msgid "%s error sending data to IRC server\n" msgstr "" -#: src/irc/irc-server.c:425 src/irc/irc-server.c:438 src/irc/irc-server.c:504 +#: src/irc/irc-server.c:432 src/irc/irc-server.c:445 src/irc/irc-server.c:511 #, c-format msgid "%s not enough memory for received IRC message\n" msgstr "" -#: src/irc/irc-server.c:513 +#: src/irc/irc-server.c:520 #, c-format msgid "%s unable to explode received buffer\n" msgstr "" -#: src/irc/irc-server.c:587 +#: src/irc/irc-server.c:594 #, c-format msgid "%s Command '%s' failed!\n" msgstr "" -#: src/irc/irc-server.c:592 +#: src/irc/irc-server.c:599 #, c-format msgid "%s No command to execute!\n" msgstr "" -#: src/irc/irc-server.c:597 +#: src/irc/irc-server.c:604 #, c-format msgid "%s Unknown command: cmd=%s, args=%s\n" msgstr "" -#: src/irc/irc-server.c:639 +#: src/irc/irc-server.c:646 #, c-format msgid "%s cannot read data from socket, disconnecting from server...\n" msgstr "" -#: src/irc/irc-server.c:661 -#, c-format -msgid "%s: connecting to %s:%d...\n" -msgstr "" - -#: src/irc/irc-server.c:663 -#, c-format -msgid "connecting to server %s:%d...\n" -msgstr "" - -#: src/irc/irc-server.c:672 -#, c-format -msgid "%s cannot create pipe\n" -msgstr "" - -#: src/irc/irc-server.c:688 -#, c-format -msgid "%s cannot set socket option \"SO_REUSEADDR\"\n" -msgstr "" - -#: src/irc/irc-server.c:698 -#, c-format -msgid "%s cannot set socket option \"SO_KEEPALIVE\"\n" -msgstr "" - -#: src/irc/irc-server.c:708 -#, c-format -msgid "%s address \"%s\" not found\n" -msgstr "" - -#: src/irc/irc-server.c:733 -#, c-format -msgid "%s IP address not found\n" -msgstr "" - -#: src/irc/irc-server.c:744 -#, c-format -msgid "%s: server IP is: %s\n" -msgstr "" - -#: src/irc/irc-server.c:751 -#, c-format -msgid "%s cannot connect to irc server\n" -msgstr "" - -#: src/irc/irc-server.c:770 -#, c-format -msgid "%s: Reconnecting to server...\n" -msgstr "" - -#: src/irc/irc-server.c:783 src/irc/irc-server.c:860 +#: src/irc/irc-server.c:718 #, c-format msgid "%s: Reconnecting to server in %d seconds\n" msgstr "" -#: src/irc/irc-server.c:827 +#: src/irc/irc-server.c:749 +#, c-format +msgid "%s address \"%s\" not found\n" +msgstr "" + +#: src/irc/irc-server.c:758 +#, c-format +msgid "%s IP address not found\n" +msgstr "" + +#: src/irc/irc-server.c:766 +#, c-format +msgid "%s connection refused\n" +msgstr "" + +#: src/irc/irc-server.c:832 +#, c-format +msgid "%s: connecting to %s:%d...\n" +msgstr "" + +#: src/irc/irc-server.c:834 +#, c-format +msgid "connecting to server %s:%d...\n" +msgstr "" + +#: src/irc/irc-server.c:845 +#, c-format +msgid "%s cannot create pipe\n" +msgstr "" + +#: src/irc/irc-server.c:857 +#, c-format +msgid "%s cannot create socket\n" +msgstr "" + +#: src/irc/irc-server.c:869 +#, c-format +msgid "%s cannot set socket option \"SO_REUSEADDR\"\n" +msgstr "" + +#: src/irc/irc-server.c:880 +#, c-format +msgid "%s cannot set socket option \"SO_KEEPALIVE\"\n" +msgstr "" + +#: src/irc/irc-server.c:911 +#, c-format +msgid "%s: Reconnecting to server...\n" +msgstr "" + +#: src/irc/irc-server.c:960 src/irc/irc-server.c:965 msgid "Disconnected from server!\n" msgstr "" @@ -1110,7 +1110,7 @@ msgid "%s: using local hostname \"%s\"\n" msgstr "" #: src/irc/irc-send.c:267 src/irc/irc-send.c:278 src/irc/irc-send.c:748 -#: src/irc/irc-send.c:822 src/common/command.c:1355 +#: src/irc/irc-send.c:822 src/common/command.c:1365 #, c-format msgid "%s wrong argument count for \"%s\" command\n" msgstr "" @@ -1822,7 +1822,7 @@ msgid "connect to a server" msgstr "" #: src/common/command.c:61 src/common/command.c:65 -msgid "servername" +msgid "[servername]" msgstr "" #: src/common/command.c:62 @@ -1968,9 +1968,9 @@ msgid "" "arg%s)\n" msgstr "" -#: src/common/command.c:509 +#: src/common/command.c:509 src/common/command.c:579 #, c-format -msgid "%s %s command \"%s\" failed\n" +msgid "%s command \"%s\" failed\n" msgstr "" #: src/common/command.c:537 @@ -1990,11 +1990,6 @@ msgstr "" msgid "%s command \"%s\" needs a server connection!\n" msgstr "" -#: src/common/command.c:579 -#, c-format -msgid "%s IRC command \"%s\" failed\n" -msgstr "" - #: src/common/command.c:628 #, c-format msgid "%s unknown command \"%s\" (type /help for help)\n" @@ -2082,209 +2077,218 @@ msgstr "" msgid "unknown parameter \"%s\" for \"%s\" command\n" msgstr "" -#: src/common/command.c:1070 +#: src/common/command.c:1073 #, c-format msgid "%s already connected to server \"%s\"!\n" msgstr "" -#: src/common/command.c:1090 src/common/command.c:1133 -#: src/common/command.c:1783 +#: src/common/command.c:1081 #, c-format -msgid "%s server \"%s\" not found\n" +msgid "%s currently connecting to server \"%s\"!\n" msgstr "" -#: src/common/command.c:1116 +#: src/common/command.c:1099 src/common/command.c:1144 +#, c-format +msgid "%s server not found\n" +msgstr "" + +#: src/common/command.c:1128 #, c-format msgid "%s not connected to server \"%s\"!\n" msgstr "" -#: src/common/command.c:1124 +#: src/common/command.c:1136 msgid "Auto-reconnection is cancelled\n" msgstr "" -#: src/common/command.c:1153 +#: src/common/command.c:1163 #, c-format msgid "%s internal commands:\n" msgstr "" -#: src/common/command.c:1164 +#: src/common/command.c:1174 msgid "IRC commands:\n" msgstr "" -#: src/common/command.c:1224 +#: src/common/command.c:1234 #, c-format msgid "No help available, \"%s\" is an unknown command\n" msgstr "" -#: src/common/command.c:1249 +#: src/common/command.c:1259 msgid "Registered Perl scripts:\n" msgstr "" -#: src/common/command.c:1266 src/common/command.c:1288 -#: src/common/command.c:1310 +#: src/common/command.c:1276 src/common/command.c:1298 +#: src/common/command.c:1320 msgid " (none)\n" msgstr "" -#: src/common/command.c:1271 +#: src/common/command.c:1281 msgid "Perl message handlers:\n" msgstr "" -#: src/common/command.c:1280 +#: src/common/command.c:1290 #, c-format msgid " IRC(%s) => Perl(%s)\n" msgstr "" -#: src/common/command.c:1293 +#: src/common/command.c:1303 msgid "Perl command handlers:\n" msgstr "" -#: src/common/command.c:1302 +#: src/common/command.c:1312 #, c-format msgid " Command /%s => Perl(%s)\n" msgstr "" -#: src/common/command.c:1322 +#: src/common/command.c:1332 msgid "Perl scripts unloaded\n" msgstr "" -#: src/common/command.c:1348 src/common/command.c:2054 -#: src/common/command.c:2066 +#: src/common/command.c:1358 src/common/command.c:2063 +#: src/common/command.c:2075 #, c-format msgid "%s unknown option for \"%s\" command\n" msgstr "" -#: src/common/command.c:1361 +#: src/common/command.c:1371 msgid "" "WeeChat was build without Perl support.\n" "Please rebuild WeeChat with \"--enable-perl\" option for ./configure script\n" msgstr "" -#: src/common/command.c:1415 +#: src/common/command.c:1425 msgid "No server.\n" msgstr "" -#: src/common/command.c:1426 +#: src/common/command.c:1436 #, c-format msgid "Server '%s' not found.\n" msgstr "" -#: src/common/command.c:1438 +#: src/common/command.c:1448 #, c-format msgid "%s missing servername for \"%s\" command\n" msgstr "" -#: src/common/command.c:1446 +#: src/common/command.c:1456 #, c-format msgid "%s too much arguments for \"%s\" command, ignoring arguments\n" msgstr "" -#: src/common/command.c:1465 +#: src/common/command.c:1475 #, c-format msgid "%s server \"%s\" not found for \"%s\" command\n" msgstr "" -#: src/common/command.c:1473 +#: src/common/command.c:1483 #, c-format msgid "" "%s you can not delete server \"%s\" because you are connected to. Try /" "disconnect %s before.\n" msgstr "" -#: src/common/command.c:1489 src/common/command.c:1630 +#: src/common/command.c:1499 src/common/command.c:1640 msgid "Server" msgstr "" -#: src/common/command.c:1492 +#: src/common/command.c:1502 msgid "has been deleted\n" msgstr "" -#: src/common/command.c:1507 -#, c-format -msgid "%s missing parameters for \"%s\" command\n" -msgstr "" - #: src/common/command.c:1517 #, c-format +msgid "%s missing parameters for \"%s\" command\n" +msgstr "" + +#: src/common/command.c:1527 +#, c-format msgid "%s server \"%s\" already exists, can't create it!\n" msgstr "" -#: src/common/command.c:1542 src/common/command.c:1570 -#: src/common/command.c:1583 src/common/command.c:1609 +#: src/common/command.c:1552 src/common/command.c:1580 +#: src/common/command.c:1593 src/common/command.c:1619 #, c-format msgid "%s missing password for \"%s\" parameter\n" msgstr "" -#: src/common/command.c:1555 +#: src/common/command.c:1565 #, c-format msgid "%s missing nick(s) for \"%s\" parameter\n" msgstr "" -#: src/common/command.c:1596 +#: src/common/command.c:1606 #, c-format msgid "%s missing command for \"%s\" parameter\n" msgstr "" -#: src/common/command.c:1633 +#: src/common/command.c:1643 msgid "created\n" msgstr "" -#: src/common/command.c:1639 +#: src/common/command.c:1649 #, c-format msgid "%s unable to create server\n" msgstr "" -#: src/common/command.c:1696 +#: src/common/command.c:1705 msgid "(unknown)" msgstr "" -#: src/common/command.c:1719 +#: src/common/command.c:1728 msgid "(password hidden) " msgstr "" -#: src/common/command.c:1815 src/common/command.c:1862 +#: src/common/command.c:1792 +#, c-format +msgid "%s server \"%s\" not found\n" +msgstr "" + +#: src/common/command.c:1824 src/common/command.c:1871 #, c-format msgid "%s config option \"%s\" not found\n" msgstr "" -#: src/common/command.c:1820 src/common/command.c:1854 +#: src/common/command.c:1829 src/common/command.c:1863 #, c-format msgid "%s incorrect value for option \"%s\"\n" msgstr "" -#: src/common/command.c:1836 +#: src/common/command.c:1845 #, c-format msgid "%s option \"%s\" can not be changed while WeeChat is running\n" msgstr "" -#: src/common/command.c:1938 +#: src/common/command.c:1947 #, c-format msgid "No config option found with \"%s\"\n" msgstr "" -#: src/common/command.c:1941 +#: src/common/command.c:1950 msgid "No config option found\n" msgstr "" -#: src/common/command.c:1948 +#: src/common/command.c:1957 #, c-format msgid "config option(s) found with \"%s\"\n" msgstr "" -#: src/common/command.c:1951 +#: src/common/command.c:1960 msgid "config option(s) found\n" msgstr "" -#: src/common/command.c:1971 +#: src/common/command.c:1980 #, c-format msgid "%s alias or command \"%s\" not found\n" msgstr "" -#: src/common/command.c:1981 +#: src/common/command.c:1990 #, c-format msgid "Alias \"%s\" removed\n" msgstr "" -#: src/common/command.c:2001 +#: src/common/command.c:2010 msgid "Opened windows:\n" msgstr "" diff --git a/weechat/src/common/command.c b/weechat/src/common/command.c index 48e3f85f0..74d4af84c 100644 --- a/weechat/src/common/command.c +++ b/weechat/src/common/command.c @@ -58,13 +58,13 @@ t_weechat_command weechat_commands[] = N_("-all: clear all windows"), 0, 1, weechat_cmd_clear, NULL }, { "connect", N_("connect to a server"), - N_("servername"), + N_("[servername]"), N_("servername: server name to connect"), - 1, 1, weechat_cmd_connect, NULL }, + 0, 1, weechat_cmd_connect, NULL }, { "disconnect", N_("disconnect from a server"), - N_("servername"), + N_("[servername]"), N_("servername: server name to disconnect"), - 1, 1, weechat_cmd_disconnect, NULL }, + 0, 1, weechat_cmd_disconnect, NULL }, { "help", N_("display help about commands"), N_("[command]"), N_("command: name of a WeeChat or IRC command"), 0, 1, weechat_cmd_help, NULL }, @@ -506,8 +506,8 @@ exec_weechat_command (t_irc_server *server, char *string) { irc_display_prefix (NULL, PREFIX_ERROR); gui_printf (NULL, - _("%s %s command \"%s\" failed\n"), - WEECHAT_ERROR, PACKAGE_NAME, command + 1); + _("%s command \"%s\" failed\n"), + WEECHAT_ERROR, command + 1); } } if (argv) @@ -576,7 +576,7 @@ exec_weechat_command (t_irc_server *server, char *string) { irc_display_prefix (NULL, PREFIX_ERROR); gui_printf (NULL, - _("%s IRC command \"%s\" failed\n"), + _("%s command \"%s\" failed\n"), WEECHAT_ERROR, command + 1); } } @@ -1060,7 +1060,10 @@ weechat_cmd_connect (int argc, char **argv) /* make gcc happy */ (void) argc; - ptr_server = server_search (argv[0]); + if (argc == 1) + ptr_server = server_search (argv[0]); + else + ptr_server = SERVER(gui_current_window->buffer); if (ptr_server) { if (ptr_server->is_connected) @@ -1071,6 +1074,14 @@ weechat_cmd_connect (int argc, char **argv) WEECHAT_ERROR, argv[0]); return -1; } + if (ptr_server->child_pid > 0) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("%s currently connecting to server \"%s\"!\n"), + WEECHAT_ERROR, argv[0]); + return -1; + } if (!ptr_server->buffer) { if (!gui_buffer_new (gui_current_window, ptr_server, NULL, 0, 1)) @@ -1080,15 +1091,12 @@ weechat_cmd_connect (int argc, char **argv) { ptr_server->reconnect_start = 0; ptr_server->reconnect_join = (ptr_server->channels) ? 1 : 0; - irc_login (ptr_server); } } else { irc_display_prefix (NULL, PREFIX_ERROR); - gui_printf (NULL, - _("%s server \"%s\" not found\n"), - WEECHAT_ERROR, argv[0]); + gui_printf (NULL, _("%s server not found\n"), WEECHAT_ERROR); return -1; } return 0; @@ -1106,10 +1114,14 @@ weechat_cmd_disconnect (int argc, char **argv) /* make gcc happy */ (void) argc; - ptr_server = server_search (argv[0]); + if (argc == 1) + ptr_server = server_search (argv[0]); + else + ptr_server = SERVER(gui_current_window->buffer); if (ptr_server) { - if ((!ptr_server->is_connected) && (ptr_server->reconnect_start == 0)) + if ((!ptr_server->is_connected) && (ptr_server->child_pid == 0) + && (ptr_server->reconnect_start == 0)) { irc_display_prefix (ptr_server->buffer, PREFIX_ERROR); gui_printf (ptr_server->buffer, @@ -1129,9 +1141,7 @@ weechat_cmd_disconnect (int argc, char **argv) else { irc_display_prefix (NULL, PREFIX_ERROR); - gui_printf (NULL, - _("%s server \"%s\" not found\n"), - WEECHAT_ERROR, argv[0]); + gui_printf (NULL, _("%s server not found\n"), WEECHAT_ERROR); return -1; } return 0; @@ -1645,8 +1655,7 @@ weechat_cmd_server (int argc, char **argv) if (new_server->autoconnect) { (void) gui_buffer_new (gui_current_window, new_server, NULL, 0, 1); - if (server_connect (new_server)) - irc_login (new_server); + server_connect (new_server); } server_destroy (&server); diff --git a/weechat/src/gui/curses/gui-input.c b/weechat/src/gui/curses/gui-input.c index 1ca34b5b6..472103e90 100644 --- a/weechat/src/gui/curses/gui-input.c +++ b/weechat/src/gui/curses/gui-input.c @@ -768,8 +768,13 @@ gui_main_loop () } } - if (ptr_server->sock4 >= 0) - FD_SET (ptr_server->sock4, &read_fd); + if (!ptr_server->is_connected && (ptr_server->child_pid > 0)) + FD_SET (ptr_server->child_read, &read_fd); + else + { + if (ptr_server->sock4 >= 0) + FD_SET (ptr_server->sock4, &read_fd); + } } } if (select (FD_SETSIZE, &read_fd, NULL, NULL, &timeout) > 0) @@ -783,9 +788,17 @@ gui_main_loop () for (ptr_server = irc_servers; ptr_server; ptr_server = ptr_server->next_server) { - if ((ptr_server->sock4 >= 0) && - (FD_ISSET (ptr_server->sock4, &read_fd))) - server_recv (ptr_server); + if (!ptr_server->is_connected && (ptr_server->child_pid > 0)) + { + if (FD_ISSET (ptr_server->child_read, &read_fd)) + server_child_read (ptr_server); + } + else + { + if ((ptr_server->sock4 >= 0) && + (FD_ISSET (ptr_server->sock4, &read_fd))) + server_recv (ptr_server); + } } } } diff --git a/weechat/src/irc/irc-recv.c b/weechat/src/irc/irc-recv.c index 8e83dee93..1195d7c71 100644 --- a/weechat/src/irc/irc-recv.c +++ b/weechat/src/irc/irc-recv.c @@ -1600,7 +1600,7 @@ irc_cmd_recv_004 (t_irc_server *server, char *host, char *arguments) } /* auto-join after disconnection (only rejoins opened channels) */ - if (server->reconnect_join) + if (server->reconnect_join && server->channels) { for (ptr_channel = server->channels; ptr_channel; ptr_channel = ptr_channel->next_channel) diff --git a/weechat/src/irc/irc-server.c b/weechat/src/irc/irc-server.c index 2edf085d2..3bb93686d 100644 --- a/weechat/src/irc/irc-server.c +++ b/weechat/src/irc/irc-server.c @@ -27,12 +27,14 @@ #include #include #include +#include #include #include #include #include -#include #include +#include +#include #include #include #include @@ -57,6 +59,7 @@ int check_away = 0; void server_init (t_irc_server *server) { + /* user choices */ server->name = NULL; server->autoconnect = 0; server->autoreconnect = 1; @@ -73,14 +76,18 @@ server_init (t_irc_server *server) server->command = NULL; server->command_delay = 1; server->autojoin = NULL; + server->autorejoin = 0; + + /* internal vars */ + server->child_pid = 0; + server->child_read = -1; + server->child_write = -1; + server->sock4 = -1; + server->is_connected = 0; server->unterminated_message = NULL; server->nick = NULL; - server->is_connected = 0; server->reconnect_start = 0; server->reconnect_join = 0; - server->sock4 = -1; - server->server_read = -1; - server->server_write = -1; server->is_away = 0; server->away_time = 0; server->lag = 0; @@ -642,6 +649,174 @@ server_recv (t_irc_server *server) } } +/* + * server_kill_child: kill child process and close pipe + */ + +void +server_kill_child (t_irc_server *server) +{ + /* kill process */ + if (server->child_pid > 0) + { + kill (server->child_pid, SIGKILL); + waitpid (server->child_pid, NULL, 0); + server->child_pid = 0; + } + + /* close pipe used with child */ + if (server->child_read != -1) + { + close (server->child_read); + server->child_read = -1; + } + if (server->child_write != -1) + { + close (server->child_write); + server->child_write = -1; + } +} + +/* + * server_close_connection: close server connection (kill child, close socket/pipes) + */ + +void +server_close_connection (t_irc_server *server) +{ + server_kill_child (server); + + /* close network socket */ + if (server->sock4 != -1) + { + close (server->sock4); + server->sock4 = -1; + } + + /* free any pending message */ + if (server->unterminated_message) + { + free (server->unterminated_message); + server->unterminated_message = NULL; + } + + /* server is now disconnected */ + server->is_connected = 0; +} + +/* + * server_reconnect_schedule: schedule reconnect for a server + */ + +void +server_reconnect_schedule (t_irc_server *server) +{ + if (server->autoreconnect) + { + server->reconnect_start = time (NULL); + irc_display_prefix (server->buffer, PREFIX_INFO); + gui_printf (server->buffer, _("%s: Reconnecting to server in %d seconds\n"), + PACKAGE_NAME, server->autoreconnect_delay); + } + else + server->reconnect_start = 0; +} + +/* + * server_child_read: read connection progress from child process + */ + +void +server_child_read (t_irc_server *server) +{ + char buffer[1]; + int num_read; + + num_read = read (server->child_read, buffer, sizeof (buffer)); + if (num_read != -1) + { + switch (buffer[0]) + { + /* connection OK */ + case '0': + server_kill_child (server); + irc_login (server); + break; + /* adress not found */ + case '1': + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s address \"%s\" not found\n"), + WEECHAT_ERROR, server->address); + server_close_connection (server); + server_reconnect_schedule (server); + break; + /* IP address not found */ + case '2': + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s IP address not found\n"), WEECHAT_ERROR); + server_close_connection (server); + server_reconnect_schedule (server); + break; + /* connection refused */ + case '3': + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s connection refused\n"), WEECHAT_ERROR); + server_close_connection (server); + server_reconnect_schedule (server); + break; + } + } +} + +/* + * server_child: child process trying to connect to server + */ + +int +server_child (t_irc_server *server) +{ + struct hostent *ip4_hostent; + struct sockaddr_in addr; + char *ip_address; + int error; + + /* bind to hostname */ + ip4_hostent = gethostbyname (server->address); + if (!ip4_hostent) + { + write (server->child_write, "1", 1); + return 0; + } + memset (&addr, 0, sizeof (addr)); + memcpy (&addr.sin_addr, ip4_hostent->h_addr, ip4_hostent->h_length); + addr.sin_port = htons (server->port); + addr.sin_family = AF_INET; + + /* find IP address */ + ip_address = inet_ntoa (addr.sin_addr); + if (!ip_address) + { + write (server->child_write, "2", 1); + return 0; + } + + /* connect to server */ + error = connect (server->sock4, (struct sockaddr *) &addr, sizeof (addr)); + if (error != 0) + { + write (server->child_write, "3", 1); + return 0; + } + + /* connection OK */ + write (server->child_write, "0", 1); + + return 0; +} + /* * server_connect: connect to an IRC server */ @@ -649,12 +824,8 @@ server_recv (t_irc_server *server) int server_connect (t_irc_server *server) { - int set; - struct hostent *ip4_hostent; - struct sockaddr_in addr; - char *ip_address; - int error; - int server_pipe[2]; + int child_pipe[2], set; + pid_t pid; irc_display_prefix (server->buffer, PREFIX_INFO); gui_printf (server->buffer, @@ -662,100 +833,70 @@ server_connect (t_irc_server *server) PACKAGE_NAME, server->address, server->port); wee_log_printf (_("connecting to server %s:%d...\n"), server->address, server->port); - server->is_connected = 0; - - /* create pipe */ - if (pipe (server_pipe) < 0) + + /* close any opened connection and kill child process if running */ + server_close_connection (server); + + /* create pipe for child process */ + if (pipe (child_pipe) < 0) { irc_display_prefix (server->buffer, PREFIX_ERROR); gui_printf (server->buffer, _("%s cannot create pipe\n"), WEECHAT_ERROR); - server_free (server); return 0; } - server->server_read = server_pipe[0]; - server->server_write = server_pipe[1]; - + server->child_read = child_pipe[0]; + server->child_write = child_pipe[1]; + /* create socket and set options */ server->sock4 = socket (AF_INET, SOCK_STREAM, 0); + if (server->sock4 == -1) + { + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s cannot create socket\n"), WEECHAT_ERROR); + server_close_connection (server); + return 0; + } + + /* set SO_REUSEADDR option for socket */ set = 1; - if (setsockopt - (server->sock4, SOL_SOCKET, SO_REUSEADDR, (char *) &set, - sizeof (set)) == -1) + if (setsockopt (server->sock4, SOL_SOCKET, SO_REUSEADDR, + (void *) &set, sizeof (set)) == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); gui_printf (server->buffer, _("%s cannot set socket option \"SO_REUSEADDR\"\n"), - WEECHAT_ERROR); + WEECHAT_WARNING); } + + /* set SO_KEEPALIVE option for socket */ set = 1; - if (setsockopt - (server->sock4, SOL_SOCKET, SO_KEEPALIVE, (char *) &set, - sizeof (set)) == -1) + if (setsockopt (server->sock4, SOL_SOCKET, SO_KEEPALIVE, + (void *) &set, sizeof (set)) == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); gui_printf (server->buffer, _("%s cannot set socket option \"SO_KEEPALIVE\"\n"), - WEECHAT_ERROR); + WEECHAT_WARNING); } - - /* bind to hostname */ - ip4_hostent = gethostbyname (server->address); - if (!ip4_hostent) + + switch (pid = fork ()) { - irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf (server->buffer, - _("%s address \"%s\" not found\n"), - WEECHAT_ERROR, server->address); - close (server->server_read); - close (server->server_write); - close (server->sock4); - server->sock4 = -1; - return 0; - } - memset (&addr, 0, sizeof (addr)); - memcpy (&addr.sin_addr, ip4_hostent->h_addr, ip4_hostent->h_length); - addr.sin_port = htons (server->port); - addr.sin_family = AF_INET; - /*error = bind(server->sock4, (struct sockaddr *)(&addr), sizeof(addr)); - if (error != 0) - { - irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf (server->buffer, - _("%s can't bind to hostname\n"), WEECHAT_ERROR); - return 0; - }*/ - ip_address = inet_ntoa (addr.sin_addr); - if (!ip_address) - { - irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf (server->buffer, - _("%s IP address not found\n"), WEECHAT_ERROR); - close (server->server_read); - close (server->server_write); - close (server->sock4); - server->sock4 = -1; - return 0; - } - - /* connection to server */ - irc_display_prefix (server->buffer, PREFIX_INFO); - gui_printf (server->buffer, - _("%s: server IP is: %s\n"), PACKAGE_NAME, ip_address); - - error = connect (server->sock4, (struct sockaddr *) &addr, sizeof (addr)); - if (error != 0) - { - irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf (server->buffer, - _("%s cannot connect to irc server\n"), WEECHAT_ERROR); - close (server->server_read); - close (server->server_write); - close (server->sock4); - server->sock4 = -1; - return 0; + /* fork failed */ + case -1: + server_close_connection (server); + return 0; + /* child process */ + case 0: + setuid (getuid ()); + server_child (server); + _exit (EXIT_SUCCESS); } + /* parent process go on here */ + server->child_pid = pid; + return 1; } @@ -772,17 +913,9 @@ server_reconnect (t_irc_server *server) server->reconnect_start = 0; if (server_connect (server)) - { server->reconnect_join = 1; - irc_login (server); - } else - { - server->reconnect_start = time (NULL); - irc_display_prefix (server->buffer, PREFIX_INFO); - gui_printf (server->buffer, _("%s: Reconnecting to server in %d seconds\n"), - PACKAGE_NAME, server->autoreconnect_delay); - } + server_reconnect_schedule (server); } /* @@ -801,8 +934,8 @@ server_auto_connect (int command_line) || ((!command_line) && (ptr_server->autoconnect)) ) { (void) gui_buffer_new (gui_current_window, ptr_server, NULL, 0, 1); - if (server_connect (ptr_server)) - irc_login (ptr_server); + gui_redraw_buffer (gui_current_window->buffer); + server_connect (ptr_server); } } } @@ -828,24 +961,11 @@ server_disconnect (t_irc_server *server, int reconnect) } } - /* close communication with server */ - if (server->server_read >= 0) - close (server->server_read); - server->server_read = -1; + irc_display_prefix (server->buffer, PREFIX_INFO); + gui_printf (server->buffer, _("Disconnected from server!\n")); - if (server->server_write >= 0) - close (server->server_write); - server->server_write = -1; + server_close_connection (server); - if (server->sock4 >= 0) - close (server->sock4); - server->sock4 = -1; - - if (server->unterminated_message) - free (server->unterminated_message); - server->unterminated_message = NULL; - - server->is_connected = 0; server->is_away = 0; server->away_time = 0; server->lag = 0; @@ -854,12 +974,7 @@ server_disconnect (t_irc_server *server, int reconnect) server->lag_next_check = time (NULL) + cfg_irc_lag_check; if ((reconnect) && (server->autoreconnect)) - { - server->reconnect_start = time (NULL); - irc_display_prefix (server->buffer, PREFIX_INFO); - gui_printf (server->buffer, _("%s: Reconnecting to server in %d seconds\n"), - PACKAGE_NAME, server->autoreconnect_delay); - } + server_reconnect_schedule (server); else server->reconnect_start = 0; diff --git a/weechat/src/irc/irc.h b/weechat/src/irc/irc.h index e48ff289c..828bca973 100644 --- a/weechat/src/irc/irc.h +++ b/weechat/src/irc/irc.h @@ -23,6 +23,7 @@ #include #include +#include #include "../gui/gui.h" /* prefixes for chat window */ @@ -138,14 +139,15 @@ struct t_irc_server int autorejoin; /* auto rejoin channels when kicked */ /* internal vars */ + pid_t child_pid; /* pid of child process (connecting) */ + int child_read; /* to read into child pipe */ + int child_write; /* to write into child pipe */ + int sock4; /* socket for server */ + int is_connected; /* 1 if WeeChat is connected to server */ char *unterminated_message; /* beginning of a message in input buf */ char *nick; /* current nickname */ - int is_connected; /* 1 if WeeChat is connected to server */ time_t reconnect_start; /* this time + delay = reconnect time */ int reconnect_join; /* 1 if channels opened to rejoin */ - int sock4; /* socket for server */ - int server_read; /* pipe for reading server data */ - int server_write; /* pipe for sending data to server */ int is_away; /* 1 is user is marker as away */ time_t away_time; /* time() when user marking as away */ int lag; /* lag (in milliseconds) */ @@ -235,6 +237,7 @@ extern t_irc_server *server_new (char *, int, int, int, int, char *, int, char * extern int server_send (t_irc_server *, char *, int); extern void server_sendf (t_irc_server *, char *, ...); extern void server_recv (t_irc_server *); +extern void server_child_read (t_irc_server *); extern int server_connect (t_irc_server *); extern void server_reconnect (t_irc_server *); extern void server_auto_connect (int);