api: connect with IPv6 by default in hook_connect (with fallback to IPv4), shuffle list of hosts for a same address (task #11205)

v2.8-utf8proc
Simon Arlott 2012-10-14 10:59:00 +02:00 committed by Sebastien Helleu
parent 70ce7fe3b6
commit 248aa8d73a
53 changed files with 1139 additions and 664 deletions

View File

@ -1,7 +1,7 @@
WeeChat ChangeLog
=================
Sébastien Helleu <flashcode@flashtux.org>
v0.4.0-dev, 2012-10-12
v0.4.0-dev, 2012-10-14
Version 0.4.0 (under dev!)
@ -9,6 +9,10 @@ Version 0.4.0 (under dev!)
* core: fix wrapping of words with wide chars (the break was made before the
correct position)
* api: connect with IPv6 by default in hook_connect (with fallback to IPv4),
shuffle list of hosts for a same address, add argument "retry" for
hook_connect, move "sock" from hook_connect arguments to callback of
hook_connect (task #11205)
* aspell: add bar item "aspell_dict" (dictionary used on current buffer)
* irc: add option "-noswitch" for command /join (task #12275)
* irc: fix crash when message 352 has too few arguments (bug #37513)

9
NEWS
View File

@ -1,13 +1,18 @@
WeeChat Release Notes
=====================
Sébastien Helleu <flashcode@flashtux.org>
v0.4.0-dev, 2012-09-29
v0.4.0-dev, 2012-10-14
Version 0.4.0 (under dev!)
--------------------------
No release note.
Important release notes:
* IPv6 is now used by default to connect to IRC servers, with fallback to IPv4.
The option irc.server_default.ipv6 is now "on" by default. If IPv6 is not
enabled or fails, IPv4 will be used. The "ipv6" option in server is now used
to disable IPv6 and force IPv6 (if option is turned "off").
Version 0.3.9 (2012-09-29)
--------------------------

View File

@ -139,10 +139,12 @@
'addresses_count' (integer) +
'addresses_array' (string, array_size: "addresses_count") +
'ports_array' (integer, array_size: "addresses_count") +
'retry_array' (integer, array_size: "addresses_count") +
'index_current_address' (integer) +
'current_address' (string) +
'current_ip' (string) +
'current_port' (integer) +
'current_retry' (integer) +
'sock' (integer) +
'hook_connect' (pointer, hdata: "hook") +
'hook_fd' (pointer, hdata: "hook") +

View File

@ -459,9 +459,9 @@
** Werte: beliebige Zeichenkette (Standardwert: `"WeeChat %v"`)
* [[option_irc.server_default.ipv6]] *irc.server_default.ipv6*
** Beschreibung: `Server über IPv6 ansprechen`
** Beschreibung: `use IPv6 protocol for server communication (try IPv6 then fallback to IPv4); if disabled, only IPv4 is used`
** Typ: boolesch
** Werte: on, off (Standardwert: `off`)
** Werte: on, off (Standardwert: `on`)
* [[option_irc.server_default.local_hostname]] *irc.server_default.local_hostname*
** Beschreibung: `benutzerdefinierter lokaler Hostname bzw. IP-Adresse für den entsprechenden Server (optional). Falls kein Eintrag vorhanden sein sollte wird der lokale Hostname verwendet`

View File

@ -391,7 +391,8 @@ Liste der Konstanten in Skript API:
WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND, WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED,
WEECHAT_HOOK_CONNECT_PROXY_ERROR, WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR,
WEECHAT_HOOK_CONNECT_GNUTLS_INIT_ERROR, WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR,
WEECHAT_HOOK_CONNECT_MEMORY_ERROR, WEECHAT_HOOK_CONNECT_TIMEOUT
WEECHAT_HOOK_CONNECT_MEMORY_ERROR, WEECHAT_HOOK_CONNECT_TIMEOUT,
WEECHAT_HOOK_CONNECT_SOCKET_ERROR
| hook Signal |
WEECHAT_HOOK_SIGNAL_STRING, WEECHAT_HOOK_SIGNAL_INT, WEECHAT_HOOK_SIGNAL_POINTER
|========================================

View File

@ -2322,7 +2322,7 @@ Patches::
Dmitry Kobylin, Rudolf Polzer, Jim Ramsay, Pistos, Gwenn, Dominik Honnef,
JD Horelick, Stefano Pigozzi, Gu1ll4um3r0m41n, Kyle Fuller,
Quentin Glidic (SardemFF7), Simon Kuhnle, Mateusz Poszwa, Peter Boström,
Arvydas Sidorenko
Arvydas Sidorenko, Simon Arlott
[[support]]

View File

@ -139,10 +139,12 @@
'addresses_count' (integer) +
'addresses_array' (string, array_size: "addresses_count") +
'ports_array' (integer, array_size: "addresses_count") +
'retry_array' (integer, array_size: "addresses_count") +
'index_current_address' (integer) +
'current_address' (string) +
'current_ip' (string) +
'current_port' (integer) +
'current_retry' (integer) +
'sock' (integer) +
'hook_connect' (pointer, hdata: "hook") +
'hook_fd' (pointer, hdata: "hook") +

View File

@ -459,9 +459,9 @@
** values: any string (default value: `"WeeChat %v"`)
* [[option_irc.server_default.ipv6]] *irc.server_default.ipv6*
** description: `use IPv6 protocol for server communication`
** description: `use IPv6 protocol for server communication (try IPv6 then fallback to IPv4); if disabled, only IPv4 is used`
** type: boolean
** values: on, off (default value: `off`)
** values: on, off (default value: `on`)
* [[option_irc.server_default.local_hostname]] *irc.server_default.local_hostname*
** description: `custom local hostname/IP for server (optional, if empty local hostname is used)`

View File

@ -7120,8 +7120,8 @@ Prototype:
struct t_hook *weechat_hook_connect (const char *proxy,
const char *address,
int port,
int sock,
int ipv6,
int retry,
void *gnutls_sess,
void *gnutls_cb,
int gnutls_dhkey_size,
@ -7130,6 +7130,7 @@ struct t_hook *weechat_hook_connect (const char *proxy,
int (*callback)(void *data,
int status,
int gnutls_rc,
int sock,
const char *error,
const char *ip_address),
void *callback_data);
@ -7141,8 +7142,9 @@ Arguments:
without proxy)
* 'address': name or IP address to connect to
* 'port': port number
* 'sock': socket used to connect
* 'ipv6': 1 to use IPv6, 0 to use IPv4
* 'ipv6': 1 to use IPv6 (with fallback to IPv4), 0 to use only IPv4
* 'retry': retry count, used to fallback to IPv4 hosts if IPv6 hosts connect
but then fail to accept the client
* 'gnutls_sess': GnuTLS session (optional)
* 'gnutls_cb': GnuTLS callback (optional)
* 'gnutls_dhkey_size': size of the key used during the Diffie-Hellman Key
@ -7170,7 +7172,9 @@ Arguments:
*** 'WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR': GnuTLS handshake error
*** 'WEECHAT_HOOK_CONNECT_MEMORY_ERROR': insufficient memory
*** 'WEECHAT_HOOK_CONNECT_TIMEOUT': timeout
*** 'WEECHAT_HOOK_CONNECT_SOCKET_ERROR': unable to create socket
** 'gnutls_rc': result value of 'gnutls_handshake()'
** 'sock': socket used to connect
** 'const char *error': result value of 'gnutls_strerror(gnutls_rc)'
** 'const char *ip_address': IP address found
** return value:
@ -7222,6 +7226,9 @@ my_connect_cb (void *data, int status, int gnutls_rc, const char *error,
case WEECHAT_HOOK_CONNECT_TIMEOUT:
/* ... */
break;
case WEECHAT_HOOK_CONNECT_SOCKET_ERROR:
/* ... */
break;
}
return WEECHAT_RC_OK;
}
@ -7264,6 +7271,8 @@ def my_connect_cb(data, status, gnutls_rc, error, ip_address):
# ...
elif status == WEECHAT_HOOK_CONNECT_TIMEOUT:
# ...
elif status == WEECHAT_HOOK_CONNECT_SOCKET_ERROR:
# ...
return weechat.WEECHAT_RC_OK
hook = weechat.hook_connect("", "my.server.org", 1234, sock, 0, "",

View File

@ -385,7 +385,8 @@ List of constants in script API:
WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND, WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED,
WEECHAT_HOOK_CONNECT_PROXY_ERROR, WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR,
WEECHAT_HOOK_CONNECT_GNUTLS_INIT_ERROR, WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR,
WEECHAT_HOOK_CONNECT_MEMORY_ERROR, WEECHAT_HOOK_CONNECT_TIMEOUT
WEECHAT_HOOK_CONNECT_MEMORY_ERROR, WEECHAT_HOOK_CONNECT_TIMEOUT,
WEECHAT_HOOK_CONNECT_SOCKET_ERROR
| hook signal |
WEECHAT_HOOK_SIGNAL_STRING, WEECHAT_HOOK_SIGNAL_INT, WEECHAT_HOOK_SIGNAL_POINTER
|========================================

View File

@ -2274,7 +2274,7 @@ Patches::
Dmitry Kobylin, Rudolf Polzer, Jim Ramsay, Pistos, Gwenn, Dominik Honnef,
JD Horelick, Stefano Pigozzi, Gu1ll4um3r0m41n, Kyle Fuller,
Quentin Glidic (SardemFF7), Simon Kuhnle, Mateusz Poszwa, Peter Boström,
Arvydas Sidorenko
Arvydas Sidorenko, Simon Arlott
[[support]]

View File

@ -139,10 +139,12 @@
'addresses_count' (integer) +
'addresses_array' (string, array_size: "addresses_count") +
'ports_array' (integer, array_size: "addresses_count") +
'retry_array' (integer, array_size: "addresses_count") +
'index_current_address' (integer) +
'current_address' (string) +
'current_ip' (string) +
'current_port' (integer) +
'current_retry' (integer) +
'sock' (integer) +
'hook_connect' (pointer, hdata: "hook") +
'hook_fd' (pointer, hdata: "hook") +

View File

@ -459,9 +459,9 @@
** valeurs: toute chaîne (valeur par défaut: `"WeeChat %v"`)
* [[option_irc.server_default.ipv6]] *irc.server_default.ipv6*
** description: `utiliser le protocole IPv6 pour la communication avec le serveur`
** description: `utiliser le protocole IPv6 pour la communication avec le serveur (essayer IPv6 puis repli sur l'IPv4); si désactivé, seulemenent l'IPv4 est utilisé`
** type: booléen
** valeurs: on, off (valeur par défaut: `off`)
** valeurs: on, off (valeur par défaut: `on`)
* [[option_irc.server_default.local_hostname]] *irc.server_default.local_hostname*
** description: `nom local de machine/IP personnalisé pour le serveur (optionnel, si non renseigné, le nom de machine local est utilisé)`

View File

@ -7224,8 +7224,8 @@ Prototype :
struct t_hook *weechat_hook_connect (const char *proxy,
const char *address,
int port,
int sock,
int ipv6,
int retry,
void *gnutls_sess,
void *gnutls_cb,
int gnutls_dhkey_size,
@ -7234,6 +7234,7 @@ struct t_hook *weechat_hook_connect (const char *proxy,
int (*callback)(void *data,
int status,
int gnutls_rc,
int sock,
const char *error,
const char *ip_address),
void *callback_data);
@ -7245,8 +7246,10 @@ Paramètres :
une connexion sans proxy)
* 'address' : nom ou adresse IP de la machine à laquelle se connecter
* 'port' : numéro de port
* 'sock' : socket utilisée pour la connexion
* 'ipv6' : 1 pour utiliser IPv6, 0 pour utiliser IPv4
* 'ipv6' : 1 pour utiliser IPv6 (avec repli sur IPv4), 0 pour utiliser seulement
IPv4
* 'retry' : numéro de nouvelle tentative, utilisé pour se rabattre sur les
adresses IPv4 si la connexion IPv6 échoue
* 'gnutls_sess' : GnuTLS session (optionnel)
* 'gnutls_cb' : callback pour GnuTLS (optionnel)
* 'gnutls_dhkey_size' : taille de clé utilisée pour l'échange de clé
@ -7277,7 +7280,9 @@ Paramètres :
"poignée de main" GnuTLS
*** 'WEECHAT_HOOK_CONNECT_MEMORY_ERROR' : mémoire insuffisante
*** 'WEECHAT_HOOK_CONNECT_TIMEOUT' : temps maximum dépassé
*** 'WEECHAT_HOOK_CONNECT_SOCKET_ERROR' : erreur de création socket
** 'gnutls_rc' : valeur retour de 'gnutls_handshake()'
** 'sock' : socket utilisée pour la connexion
** 'const char *error' : valeur retour de 'gnutls_strerror(gnutls_rc)'
** 'const char *ip_address' : adresse IP trouvée
** valeur de retour :
@ -7330,6 +7335,9 @@ my_connect_cb (void *data, int status, int gnutls_rc, const char *error,
case WEECHAT_HOOK_CONNECT_TIMEOUT:
/* ... */
break;
case WEECHAT_HOOK_CONNECT_SOCKET_ERROR:
/* ... */
break;
}
return WEECHAT_RC_OK;
}
@ -7372,6 +7380,8 @@ def my_connect_cb(data, status, gnutls_rc, error, ip_address):
# ...
elif status == WEECHAT_HOOK_CONNECT_TIMEOUT:
# ...
elif status == WEECHAT_HOOK_CONNECT_SOCKET_ERROR:
# ...
return weechat.WEECHAT_RC_OK
hook = weechat.hook_connect("", "my.server.org", 1234, sock, 0, "",

View File

@ -394,7 +394,8 @@ Liste des constantes de l'API script :
WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND, WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED,
WEECHAT_HOOK_CONNECT_PROXY_ERROR, WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR,
WEECHAT_HOOK_CONNECT_GNUTLS_INIT_ERROR, WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR,
WEECHAT_HOOK_CONNECT_MEMORY_ERROR, WEECHAT_HOOK_CONNECT_TIMEOUT
WEECHAT_HOOK_CONNECT_MEMORY_ERROR, WEECHAT_HOOK_CONNECT_TIMEOUT,
WEECHAT_HOOK_CONNECT_SOCKET_ERROR
| hook signal |
WEECHAT_HOOK_SIGNAL_STRING, WEECHAT_HOOK_SIGNAL_INT, WEECHAT_HOOK_SIGNAL_POINTER
|========================================

View File

@ -2338,7 +2338,7 @@ Patchs::
Dmitry Kobylin, Rudolf Polzer, Jim Ramsay, Pistos, Gwenn, Dominik Honnef,
JD Horelick, Stefano Pigozzi, Gu1ll4um3r0m41n, Kyle Fuller,
Quentin Glidic (SardemFF7), Simon Kuhnle, Mateusz Poszwa, Peter Boström,
Arvydas Sidorenko
Arvydas Sidorenko, Simon Arlott
[[support]]

View File

@ -139,10 +139,12 @@
'addresses_count' (integer) +
'addresses_array' (string, array_size: "addresses_count") +
'ports_array' (integer, array_size: "addresses_count") +
'retry_array' (integer, array_size: "addresses_count") +
'index_current_address' (integer) +
'current_address' (string) +
'current_ip' (string) +
'current_port' (integer) +
'current_retry' (integer) +
'sock' (integer) +
'hook_connect' (pointer, hdata: "hook") +
'hook_fd' (pointer, hdata: "hook") +

View File

@ -459,9 +459,9 @@
** valori: qualsiasi stringa (valore predefinito: `"WeeChat %v"`)
* [[option_irc.server_default.ipv6]] *irc.server_default.ipv6*
** descrizione: `usa il protocollo IPv6 per le comunicazioni col server`
** descrizione: `use IPv6 protocol for server communication (try IPv6 then fallback to IPv4); if disabled, only IPv4 is used`
** tipo: bool
** valori: on, off (valore predefinito: `off`)
** valori: on, off (valore predefinito: `on`)
* [[option_irc.server_default.local_hostname]] *irc.server_default.local_hostname*
** descrizione: `nome host/IP locale definito per il server (opzionale, se vuoto viene usato il nome host locale)`

View File

@ -7152,8 +7152,8 @@ Prototipo:
struct t_hook *weechat_hook_connect (const char *proxy,
const char *address,
int port,
int sock,
int ipv6,
int retry,
void *gnutls_sess,
void *gnutls_cb,
int gnutls_dhkey_size,
@ -7162,6 +7162,7 @@ struct t_hook *weechat_hook_connect (const char *proxy,
int (*callback)(void *data,
int status,
int gnutls_rc,
int sock,
const char *error,
const char *ip_address),
void *callback_data);
@ -7173,8 +7174,11 @@ Argomenti:
NULL significa connessione senza proxy)
* 'address': nome o indirizzo IP al quale connettersi
* 'port': numero della porta
* 'sock': socket utilizzato per la connessione
* 'ipv6': 1 per usare IPv6, 0 per usare IPv4
// TRANSLATION MISSING
* 'ipv6': 1 to use IPv6 (with fallback to IPv4), 0 to use only IPv4
// TRANSLATION MISSING
* 'retry': retry count, used to fallback to IPv4 hosts if IPv6 hosts connect
but then fail to accept the client
* 'gnutls_sess': sessione GnuTLS (opzionale)
* 'gnutls_cb' callback GnuTLS (opzionale)
* 'gnutls_dhkey_size': dimensione della chiave utilizzata nello Scambio
@ -7204,7 +7208,9 @@ Argomenti:
*** 'WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR': errore di handshake GnuTLS
*** 'WEECHAT_HOOK_CONNECT_MEMORY_ERROR': memoria insufficiente
*** 'WEECHAT_HOOK_CONNECT_TIMEOUT': timeout
*** 'WEECHAT_HOOK_CONNECT_SOCKET_ERROR': errore nella creazione socket
** 'gnutls_rc': valore del risultato di 'gnutls_handshake()'
** 'sock': socket utilizzato per la connessione
** 'const char *error': valore del risultato di 'gnutls_strerror(gnutls_rc)'
** 'const char *ip_address': indirizzo IP trovato
** valore restituito:
@ -7256,6 +7262,9 @@ my_connect_cb (void *data, int status, int gnutls_rc, const char *error,
case WEECHAT_HOOK_CONNECT_TIMEOUT:
/* ... */
break;
case WEECHAT_HOOK_CONNECT_SOCKET_ERROR:
/* ... */
break;
}
return WEECHAT_RC_OK;
}
@ -7298,6 +7307,8 @@ def my_connect_cb(data, status, gnutls_rc, error, ip_address):
# ...
elif status == WEECHAT_HOOK_CONNECT_TIMEOUT:
# ...
elif status == WEECHAT_HOOK_CONNECT_SOCKET_ERROR:
# ...
return weechat.WEECHAT_RC_OK
hook = weechat.hook_connect("", "my.server.org", 1234, sock, 0, "",

View File

@ -393,7 +393,8 @@ Elenco di costanti nelle API per gli script:
WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND, WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED,
WEECHAT_HOOK_CONNECT_PROXY_ERROR, WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR,
WEECHAT_HOOK_CONNECT_GNUTLS_INIT_ERROR, WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR,
WEECHAT_HOOK_CONNECT_MEMORY_ERROR, WEECHAT_HOOK_CONNECT_TIMEOUT
WEECHAT_HOOK_CONNECT_MEMORY_ERROR, WEECHAT_HOOK_CONNECT_TIMEOUT,
WEECHAT_HOOK_CONNECT_SOCKET_ERROR
| hook su segnale |
WEECHAT_HOOK_SIGNAL_STRING, WEECHAT_HOOK_SIGNAL_INT, WEECHAT_HOOK_SIGNAL_POINTER
|========================================

View File

@ -2332,7 +2332,7 @@ Patch::
Dmitry Kobylin, Rudolf Polzer, Jim Ramsay, Pistos, Gwenn, Dominik Honnef,
JD Horelick, Stefano Pigozzi, Gu1ll4um3r0m41n, Kyle Fuller,
Quentin Glidic (SardemFF7), Simon Kuhnle, Mateusz Poszwa, Peter Boström,
Arvydas Sidorenko
Arvydas Sidorenko, Simon Arlott
[[support]]

View File

@ -139,10 +139,12 @@
'addresses_count' (integer) +
'addresses_array' (string, array_size: "addresses_count") +
'ports_array' (integer, array_size: "addresses_count") +
'retry_array' (integer, array_size: "addresses_count") +
'index_current_address' (integer) +
'current_address' (string) +
'current_ip' (string) +
'current_port' (integer) +
'current_retry' (integer) +
'sock' (integer) +
'hook_connect' (pointer, hdata: "hook") +
'hook_fd' (pointer, hdata: "hook") +

View File

@ -459,9 +459,9 @@
** 値: 未制約文字列 (デフォルト値: `"WeeChat %v"`)
* [[option_irc.server_default.ipv6]] *irc.server_default.ipv6*
** 説明: `サーバとの通信に IPv6 を利用`
** 説明: `use IPv6 protocol for server communication (try IPv6 then fallback to IPv4); if disabled, only IPv4 is used`
** タイプ: ブール
** 値: on, off (デフォルト値: `off`)
** 値: on, off (デフォルト値: `on`)
* [[option_irc.server_default.local_hostname]] *irc.server_default.local_hostname*
** 説明: `サーバで使用するカスタムホスト名/IP アドレス (任意、空の場合はローカルホスト名が使われる)`

View File

@ -367,7 +367,8 @@ API に含まれる関数の詳しい情報は
WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND, WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED,
WEECHAT_HOOK_CONNECT_PROXY_ERROR, WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR,
WEECHAT_HOOK_CONNECT_GNUTLS_INIT_ERROR, WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR,
WEECHAT_HOOK_CONNECT_MEMORY_ERROR, WEECHAT_HOOK_CONNECT_TIMEOUT
WEECHAT_HOOK_CONNECT_MEMORY_ERROR, WEECHAT_HOOK_CONNECT_TIMEOUT,
WEECHAT_HOOK_CONNECT_SOCKET_ERROR
| シグナルのフック |
WEECHAT_HOOK_SIGNAL_STRING, WEECHAT_HOOK_SIGNAL_INT, WEECHAT_HOOK_SIGNAL_POINTER
|========================================

View File

@ -2176,7 +2176,7 @@ include::autogen/user/xfer_commands.txt[]
Dmitry Kobylin、Rudolf Polzer、Jim Ramsay、Pistos、Gwenn、Dominik Honnef、
JD Horelick、Stefano Pigozzi、Gu1ll4um3r0m41n、Kyle Fuller、
Quentin Glidic (SardemFF7)、Simon Kuhnle、Mateusz Poszwa、Peter Boström、
Arvydas Sidorenko
Arvydas Sidorenko、Simon Arlott
[[support]]

View File

@ -384,7 +384,8 @@ Lista stałych w API skryptów:
WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND, WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED,
WEECHAT_HOOK_CONNECT_PROXY_ERROR, WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR,
WEECHAT_HOOK_CONNECT_GNUTLS_INIT_ERROR, WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR,
WEECHAT_HOOK_CONNECT_MEMORY_ERROR, WEECHAT_HOOK_CONNECT_TIMEOUT
WEECHAT_HOOK_CONNECT_MEMORY_ERROR, WEECHAT_HOOK_CONNECT_TIMEOUT,
WEECHAT_HOOK_CONNECT_SOCKET_ERROR
| hook signal |
WEECHAT_HOOK_SIGNAL_STRING, WEECHAT_HOOK_SIGNAL_INT, WEECHAT_HOOK_SIGNAL_POINTER
|========================================

View File

@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.4.0-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2012-10-09 21:22+0200\n"
"POT-Creation-Date: 2012-10-14 09:22+0200\n"
"PO-Revision-Date: 2012-09-29 11:42+0200\n"
"Last-Translator: Jiri Golembiovsky <golemj@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -5465,8 +5465,10 @@ msgstr ""
msgid "proxy used for this server (optional)"
msgstr "proxy použitá pro tento server (volitelné)"
msgid "use IPv6 protocol for server communication"
msgstr "použít protokol IPv6 pro komunikaci se serverem"
msgid ""
"use IPv6 protocol for server communication (try IPv6 then fallback to IPv4); "
"if disabled, only IPv4 is used"
msgstr ""
msgid "use SSL for server communication"
msgstr "použít SSL pro komunikaci se serverem"
@ -6792,6 +6794,10 @@ msgstr "%s%s: nedostatek paměti"
msgid "%s%s: timeout"
msgstr "%s%s: vypršel časový limit \"%s\" pro %s"
#, fuzzy, c-format
msgid "%s%s: unable to create socket"
msgstr "%s%s: nemohu vytvořit server"
#, fuzzy, c-format
msgid "%sgnutls: connected using %d-bit Diffie-Hellman shared secret exchange"
msgstr ""
@ -6881,29 +6887,17 @@ msgstr ""
"podporou GNUtls"
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
msgid "%s%s: connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "%s: připojuji se k serveru %s/%d%s%s přes %s proxy %s/%d%s..."
#, c-format
msgid "Connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
#, fuzzy, c-format
msgid "Connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "Připojuji se k serveru %s/%d%s%s přes %s proxy %s/%d%s..."
#, c-format
msgid "%s%s: connecting to server %s/%d%s%s..."
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s..."
msgstr "%s%s: připojuji se k serveru %s/%d%s%s..."
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s nemohu vytvořit soket"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s%s: nemohu nastavit nastavení sketu \"SO_REUSEADDR\""
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s%s: nemohu nastavit nastavení soketu \"SO_KEEPALIVE\""
#, fuzzy, c-format
msgid "%s%s: reconnecting to server..."
msgstr "%s: připojuji se znovu k serveru..."
@ -7764,6 +7758,18 @@ msgstr "%s%s: nemohu akceptovat klienta na portu %d (%s.%s)"
msgid "%s%s: IP address \"%s\" not allowed for relay"
msgstr "%s%s: adresa \"%s\" nenalezena"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s%s: nemohu nastavit nastavení sketu \"SO_REUSEADDR\""
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s nemohu vytvořit soket"
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s%s: nemohu nastavit nastavení soketu \"SO_KEEPALIVE\""
#, fuzzy, c-format
msgid "%s%s: error with \"bind\" on port %d (%s%s%s)"
msgstr "%s%s: chyba s \"bind\" na portu %d (%s.%s)"
@ -9074,6 +9080,9 @@ msgstr ""
msgid "Constants"
msgstr ""
#~ msgid "use IPv6 protocol for server communication"
#~ msgstr "použít protokol IPv6 pro komunikaci se serverem"
#~ msgid "global decoding charset"
#~ msgstr "globální znaková sada pro dekódování"

View File

@ -23,7 +23,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.4.0-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2012-10-09 21:22+0200\n"
"POT-Creation-Date: 2012-10-14 09:22+0200\n"
"PO-Revision-Date: 2012-09-29 11:42+0200\n"
"Last-Translator: Nils Görs <weechatter@arcor.de>\n"
"Language-Team: German <weechatter@arcor.de>\n"
@ -5895,8 +5895,10 @@ msgstr ""
msgid "proxy used for this server (optional)"
msgstr "Proxy, der für diesen Server verwendet wird (optional)"
msgid "use IPv6 protocol for server communication"
msgstr "Server über IPv6 ansprechen"
msgid ""
"use IPv6 protocol for server communication (try IPv6 then fallback to IPv4); "
"if disabled, only IPv4 is used"
msgstr ""
msgid "use SSL for server communication"
msgstr "Server über SSL ansprechen"
@ -7335,6 +7337,10 @@ msgstr "%s%s: nicht genügend Speicher"
msgid "%s%s: timeout"
msgstr "%s%s: Zeitüberschreitung"
#, fuzzy, c-format
msgid "%s%s: unable to create socket"
msgstr "%s%s: Server kann nicht anlegt werden"
#, c-format
msgid "%sgnutls: connected using %d-bit Diffie-Hellman shared secret exchange"
msgstr ""
@ -7430,30 +7436,18 @@ msgstr ""
"%s%s SSL-Verbindung nicht möglich da WeeChat nicht mit GNUtls-Support "
"kompiliert wurde"
#, c-format
msgid "%s%s: connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "%s%s: Verbinden zum Server %s/%d%s%s via %s Proxy %s/%d%s..."
#, c-format
msgid "Connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
#, fuzzy, c-format
msgid "Connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "Verbinden zum Server %s/%d%s%s via %s Proxy %s/%d%s..."
#, c-format
msgid "%s%s: connecting to server %s/%d%s%s..."
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s..."
msgstr "%s%s: Verbinden zum Server %s/%d%s%s..."
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s: Socket konnte nicht angelegt werden"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s%s Fehler beim Erstellen der Socket-Option \"SO_REUSEADDR\""
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s%s Fehler beim Erstellen der Socket-Option \"SO_KEEPALIVE\""
#, c-format
msgid "%s%s: reconnecting to server..."
msgstr "%s%s: Neuverbinden zum Server..."
@ -8335,6 +8329,18 @@ msgstr "%s%s: Der Client wird an dem Port %d (%s%s%s) nicht akzeptiert"
msgid "%s%s: IP address \"%s\" not allowed for relay"
msgstr "%s%s: IP Adresse \"%s\" für Relay nicht gültig"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s%s Fehler beim Erstellen der Socket-Option \"SO_REUSEADDR\""
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s: Socket konnte nicht angelegt werden"
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s%s Fehler beim Erstellen der Socket-Option \"SO_KEEPALIVE\""
#, c-format
msgid "%s%s: error with \"bind\" on port %d (%s%s%s)"
msgstr "%s%s: Fehler mit \"bind\" am Port %d (%s%s%s)"
@ -9769,6 +9775,9 @@ msgstr "Type"
msgid "Constants"
msgstr "Konstanten"
#~ msgid "use IPv6 protocol for server communication"
#~ msgstr "Server über IPv6 ansprechen"
#~ msgid "global decoding charset"
#~ msgstr "globaler Zeichensatz zum dekodieren"

View File

@ -22,7 +22,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.4.0-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2012-10-09 21:22+0200\n"
"POT-Creation-Date: 2012-10-14 09:22+0200\n"
"PO-Revision-Date: 2012-09-29 11:42+0200\n"
"Last-Translator: Elián Hanisch <lambdae2@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -5675,8 +5675,10 @@ msgstr "lista de dirección/puerto para el servidor (separados por comas)"
msgid "proxy used for this server (optional)"
msgstr "proxy usado por este servidor (opcional)"
msgid "use IPv6 protocol for server communication"
msgstr "usar el protocolo IPv6 para la comunicación con el servidor"
msgid ""
"use IPv6 protocol for server communication (try IPv6 then fallback to IPv4); "
"if disabled, only IPv4 is used"
msgstr ""
msgid "use SSL for server communication"
msgstr "usar SSL para la comunicación con el servidor"
@ -7042,6 +7044,10 @@ msgstr "%s%s: no hay suficiente memoria"
msgid "%s%s: timeout"
msgstr "%s%s: agotado tiempo de espera"
#, fuzzy, c-format
msgid "%s%s: unable to create socket"
msgstr "%s%s: no es posible crear el servidor"
#, c-format
msgid "%sgnutls: connected using %d-bit Diffie-Hellman shared secret exchange"
msgstr ""
@ -7137,33 +7143,19 @@ msgstr ""
# hard to guess what the %s are
# example: "connecting to server address/port(IPv6)(SSL) via http proxy address/port(IPv6)..."
#, c-format
msgid "%s%s: connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr ""
"%s%s: conectando al servidor %s/%d%s%s a través del proxy %s en %s/%d%s..."
#, c-format
msgid "Connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
#, fuzzy, c-format
msgid "Connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "Conectando al servidor %s/%d%s%s a través del proxy %s en %s/%d%s..."
#, c-format
msgid "%s%s: connecting to server %s/%d%s%s..."
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s..."
msgstr "%s%s: conectando al servidor %s/%d%s%s..."
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s: no ha sido posible crear el socket"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr ""
"%s%s: no ha sido posible configurar la opción del socket \"SO_REUSEADDR\""
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr ""
"%s%s: no ha sido posible configurar la opción del socket \"SO_KEEPALIVE\""
#, c-format
msgid "%s%s: reconnecting to server..."
msgstr "%s%s: reconectando al servidor..."
@ -8031,6 +8023,20 @@ msgstr "%s%s: no se puede aceptar el cliente en el puerto %d (%s%s%s)"
msgid "%s%s: IP address \"%s\" not allowed for relay"
msgstr "%s%s: dirección IP \"%s\" no permitida por el repetidor"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr ""
"%s%s: no ha sido posible configurar la opción del socket \"SO_REUSEADDR\""
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s: no ha sido posible crear el socket"
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr ""
"%s%s: no ha sido posible configurar la opción del socket \"SO_KEEPALIVE\""
#, c-format
msgid "%s%s: error with \"bind\" on port %d (%s%s%s)"
msgstr "%s%s: error con \"bind\" en el puerto %d (%s%s%s)"
@ -9350,6 +9356,9 @@ msgstr "Tipo"
msgid "Constants"
msgstr "Constantes"
#~ msgid "use IPv6 protocol for server communication"
#~ msgstr "usar el protocolo IPv6 para la comunicación con el servidor"
#~ msgid "display channel modes in \"buffer_name\" bar item"
#~ msgstr "mostrar los modos del canal en el elemento de barra \"buffer_name\""

View File

@ -21,8 +21,8 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.4.0-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2012-10-09 21:22+0200\n"
"PO-Revision-Date: 2012-10-09 21:22+0200\n"
"POT-Creation-Date: 2012-10-14 09:22+0200\n"
"PO-Revision-Date: 2012-10-13 12:59+0200\n"
"Last-Translator: Sebastien Helleu <flashcode@flashtux.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
"Language: French\n"
@ -5746,8 +5746,12 @@ msgstr ""
msgid "proxy used for this server (optional)"
msgstr "proxy utilisé pour ce serveur (optionnel)"
msgid "use IPv6 protocol for server communication"
msgstr "utiliser le protocole IPv6 pour la communication avec le serveur"
msgid ""
"use IPv6 protocol for server communication (try IPv6 then fallback to IPv4); "
"if disabled, only IPv4 is used"
msgstr ""
"utiliser le protocole IPv6 pour la communication avec le serveur (essayer "
"IPv6 puis repli sur l'IPv4); si désactivé, seulemenent l'IPv4 est utilisé"
msgid "use SSL for server communication"
msgstr "utiliser SSL pour la communication avec le serveur"
@ -7131,6 +7135,10 @@ msgstr "%s%s: pas assez de mémoire"
msgid "%s%s: timeout"
msgstr "%s%s: délai d'attente dépassé"
#, c-format
msgid "%s%s: unable to create socket"
msgstr "%s%s: impossible de créer la socket"
#, c-format
msgid "%sgnutls: connected using %d-bit Diffie-Hellman shared secret exchange"
msgstr ""
@ -7221,28 +7229,16 @@ msgstr ""
"avec le support GnuTLS"
#, c-format
msgid "%s%s: connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
msgstr "%s%s: connexion au serveur %s/%d%s%s via le proxy %s %s/%d%s..."
msgid "%s%s: connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "%s%s: connexion au serveur %s/%d%s via le proxy %s %s/%d%s..."
#, c-format
msgid "Connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
msgstr "Connexion au serveur %s/%d%s%s via le proxy %s %s/%d%s..."
msgid "Connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "Connexion au serveur %s/%d%s via le proxy %s %s/%d%s..."
#, c-format
msgid "%s%s: connecting to server %s/%d%s%s..."
msgstr "%s%s: connexion au serveur %s/%d%s%s..."
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s: impossible de créer la socket"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s%s: impossible d'activer l'option socket \"SO_REUSEADDR\""
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s%s: impossible d'activer l'option socket \"SO_KEEPALIVE\""
msgid "%s%s: connecting to server %s/%d%s..."
msgstr "%s%s: connexion au serveur %s/%d%s..."
#, c-format
msgid "%s%s: reconnecting to server..."
@ -8120,6 +8116,18 @@ msgstr "%s%s: impossible d'accepter le client sur le port %d (%s%s%s)"
msgid "%s%s: IP address \"%s\" not allowed for relay"
msgstr "%s%s: adresse IP \"%s\" non autorisée pour le relai"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s%s: impossible d'activer l'option socket \"SO_REUSEADDR\""
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s: impossible de créer la socket"
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s%s: impossible d'activer l'option socket \"SO_KEEPALIVE\""
#, c-format
msgid "%s%s: error with \"bind\" on port %d (%s%s%s)"
msgstr "%s%s: erreur avec le \"bind\" sur le port %d (%s%s%s)"
@ -9527,6 +9535,9 @@ msgstr "Type"
msgid "Constants"
msgstr "Constantes"
#~ msgid "use IPv6 protocol for server communication"
#~ msgstr "utiliser le protocole IPv6 pour la communication avec le serveur"
#~ msgid "global decoding charset"
#~ msgstr "charset de décodage global"

View File

@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.4.0-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2012-10-09 21:22+0200\n"
"POT-Creation-Date: 2012-10-14 09:22+0200\n"
"PO-Revision-Date: 2012-09-29 11:42+0200\n"
"Last-Translator: Andras Voroskoi <voroskoi@frugalware.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -5058,8 +5058,10 @@ msgstr "felhasználónév az IRC szerveren"
msgid "proxy used for this server (optional)"
msgstr ""
msgid "use IPv6 protocol for server communication"
msgstr "IPv6 protokoll használata a kapcsolathoz"
msgid ""
"use IPv6 protocol for server communication (try IPv6 then fallback to IPv4); "
"if disabled, only IPv4 is used"
msgstr ""
msgid "use SSL for server communication"
msgstr "SSL használata a a kapcsolathoz"
@ -6338,6 +6340,10 @@ msgstr "Nincs elég memória az új sorhoz\n"
msgid "%s%s: timeout"
msgstr "%s hiányzó argumentum a(z) \"%s\" opciónak\n"
#, fuzzy, c-format
msgid "%s%s: unable to create socket"
msgstr "%s nem sikerült a szervert létrehozni\n"
#, c-format
msgid "%sgnutls: connected using %d-bit Diffie-Hellman shared secret exchange"
msgstr ""
@ -6425,33 +6431,21 @@ msgstr ""
"támogatás nélkül lett fordítva\n"
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
msgid "%s%s: connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr ""
"%s: csatlakozás a(z) %s:%d%s%s szerverhez %s proxy kiszolgálón keresztül: %s:"
"%d%s...\n"
#, fuzzy, c-format
msgid "Connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
msgid "Connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr ""
"Csatlakozás a(z) %s:%d%s%s szerverhez %s proxy kiszolgálón keresztül: %s:%d"
"%s...\n"
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s%s..."
msgid "%s%s: connecting to server %s/%d%s..."
msgstr "%s: csatlakozás a(z) %s:%d%s%s szerverhez...\n"
#, fuzzy, c-format
msgid "%s%s: cannot create socket"
msgstr "%s nem sikerült a csatornát létrehozni\n"
#, fuzzy, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s nem sikerült a \"SO_REUSEADDR\" csatornaopciót beállítani\n"
#, fuzzy, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s nem sikerült a \"SO_KEEPALIVE\" csatornaopciót beállítani\n"
#, fuzzy, c-format
msgid "%s%s: reconnecting to server..."
msgstr "%s: Újracsatlakozás a szerverhez...\n"
@ -7263,6 +7257,18 @@ msgstr "%s nem sikerült a csatornát létrehozni\n"
msgid "%s%s: IP address \"%s\" not allowed for relay"
msgstr "%s cím \"%s\" nem található\n"
#, fuzzy, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s nem sikerült a \"SO_REUSEADDR\" csatornaopciót beállítani\n"
#, fuzzy, c-format
msgid "%s%s: cannot create socket"
msgstr "%s nem sikerült a csatornát létrehozni\n"
#, fuzzy, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s nem sikerült a \"SO_KEEPALIVE\" csatornaopciót beállítani\n"
#, fuzzy, c-format
msgid "%s%s: error with \"bind\" on port %d (%s%s%s)"
msgstr "%s nem sikerült a csatornát létrehozni\n"
@ -8568,6 +8574,9 @@ msgstr ""
msgid "Constants"
msgstr ""
#~ msgid "use IPv6 protocol for server communication"
#~ msgstr "IPv6 protokoll használata a kapcsolathoz"
#, fuzzy
#~ msgid "%s: connecting to server %s/%d%s%s..."
#~ msgstr "%s: csatlakozás a(z) %s:%d%s%s szerverhez...\n"

View File

@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.4.0-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2012-10-09 21:22+0200\n"
"POT-Creation-Date: 2012-10-14 09:22+0200\n"
"PO-Revision-Date: 2012-09-29 11:42+0200\n"
"Last-Translator: Marco Paolone <marcopaolone@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -5667,8 +5667,10 @@ msgstr "elenco di host/porte o IP/porte per il server (separati da virgole)"
msgid "proxy used for this server (optional)"
msgstr "proxy usato per il server (opzionale)"
msgid "use IPv6 protocol for server communication"
msgstr "usa il protocollo IPv6 per le comunicazioni col server"
msgid ""
"use IPv6 protocol for server communication (try IPv6 then fallback to IPv4); "
"if disabled, only IPv4 is used"
msgstr ""
msgid "use SSL for server communication"
msgstr "usa SSL per le comunicazioni col server"
@ -7043,6 +7045,10 @@ msgstr "%s%s: memoria non sufficiente"
msgid "%s%s: timeout"
msgstr "%s%s: timeout"
#, fuzzy, c-format
msgid "%s%s: unable to create socket"
msgstr "%s%s: impossibile creare il server"
#, fuzzy, c-format
msgid "%sgnutls: connected using %d-bit Diffie-Hellman shared secret exchange"
msgstr ""
@ -7133,29 +7139,17 @@ msgstr ""
"con il supporto a GnuTLS"
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
msgid "%s%s: connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "%s: connessione al server %s/%d%s%s tramite proxy %s %s/%d%s..."
#, c-format
msgid "Connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
#, fuzzy, c-format
msgid "Connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "Connessione al server %s/%d%s%s tramite %s proxy %s/%d%s..."
#, c-format
msgid "%s%s: connecting to server %s/%d%s%s..."
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s..."
msgstr "%s%s: connessione al server %s/%d%s%s..."
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s: impossibile creare il socket"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s%s: impossibile impostare l'opzione del socket \"SO_REUSEADDR\""
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s%s: impossibile impostare l'opzione del socket \"SO_KEEPALIVE\""
#, fuzzy, c-format
msgid "%s%s: reconnecting to server..."
msgstr "%s: riconnessione al server..."
@ -8021,6 +8015,18 @@ msgstr "%s%s: impossibile accettare il client sulla porta %d (%s%s%s)"
msgid "%s%s: IP address \"%s\" not allowed for relay"
msgstr "%s%s: indirizzo IP \"%s\" non consentito per il relay"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s%s: impossibile impostare l'opzione del socket \"SO_REUSEADDR\""
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s: impossibile creare il socket"
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s%s: impossibile impostare l'opzione del socket \"SO_KEEPALIVE\""
#, c-format
msgid "%s%s: error with \"bind\" on port %d (%s%s%s)"
msgstr "%s%s: errore con \"bind\" sulla porta %d (%s%s%s)"
@ -9337,6 +9343,9 @@ msgstr "Tipo"
msgid "Constants"
msgstr "Costanti"
#~ msgid "use IPv6 protocol for server communication"
#~ msgstr "usa il protocollo IPv6 per le comunicazioni col server"
#~ msgid "global decoding charset"
#~ msgstr "set di caratteri per la decodifica globale"

View File

@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.4.0-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2012-10-09 21:22+0200\n"
"POT-Creation-Date: 2012-10-14 09:22+0200\n"
"PO-Revision-Date: 2012-09-29 11:42+0200\n"
"Last-Translator: AYANOKOUZI, Ryuunosuke <i38w7i3@yahoo.co.jp>\n"
"Language-Team: Japanese <https://github.com/l/WeeChat>\n"
@ -5556,8 +5556,10 @@ msgstr ""
msgid "proxy used for this server (optional)"
msgstr "このサーバに使われるプロキシ (オプション)"
msgid "use IPv6 protocol for server communication"
msgstr "サーバとの通信に IPv6 を利用"
msgid ""
"use IPv6 protocol for server communication (try IPv6 then fallback to IPv4); "
"if disabled, only IPv4 is used"
msgstr ""
msgid "use SSL for server communication"
msgstr "サーバとの通信に SSL を利用"
@ -6888,6 +6890,10 @@ msgstr "%s%s: メモリが足りません"
msgid "%s%s: timeout"
msgstr "%s%s: タイムアウト"
#, fuzzy, c-format
msgid "%s%s: unable to create socket"
msgstr "%s%s: サーバの作成に失敗"
#, c-format
msgid "%sgnutls: connected using %d-bit Diffie-Hellman shared secret exchange"
msgstr "%sgnutls: %d-bit Diffie-Hellman 共有鍵交換を使って接続しました"
@ -6977,30 +6983,18 @@ msgstr ""
"%s%s: WeeChat は GnuTLS をサポートしてビルドされていないため、SSL で接続でき"
"ません"
#, c-format
msgid "%s%s: connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "%s%s: サーバ %s/%d%s%s に %s プロキシ %s/%d%s で接続中..."
#, c-format
msgid "Connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
#, fuzzy, c-format
msgid "Connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "サーバ %s/%d%s%s に %s プロキシ %s/%d%s で接続中..."
#, c-format
msgid "%s%s: connecting to server %s/%d%s%s..."
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s..."
msgstr "%s%s: サーバ %s/%d%s%s に接続中..."
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s: ソケットの作成に失敗"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s%s: ソケットオプション \"SO_REUSEADDR\" の設定に失敗"
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s%s: ソケットオプション \"SO_KEEPALIVE\" の設定に失敗"
#, c-format
msgid "%s%s: reconnecting to server..."
msgstr "%s%s: サーバに再接続中..."
@ -7838,6 +7832,18 @@ msgstr "%s%s: ポート %d (%s%s%s) ではクライアントを受け付けま
msgid "%s%s: IP address \"%s\" not allowed for relay"
msgstr "%s%s: IP アドレス \"%s\" はリレーの許可がありません"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s%s: ソケットオプション \"SO_REUSEADDR\" の設定に失敗"
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s: ソケットの作成に失敗"
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s%s: ソケットオプション \"SO_KEEPALIVE\" の設定に失敗"
#, c-format
msgid "%s%s: error with \"bind\" on port %d (%s%s%s)"
msgstr "%s%s: ポート %d (%s%s%s) での \"bind\" にエラー"
@ -9205,6 +9211,9 @@ msgstr "タイプ"
msgid "Constants"
msgstr "定数"
#~ msgid "use IPv6 protocol for server communication"
#~ msgstr "サーバとの通信に IPv6 を利用"
#~ msgid "global decoding charset"
#~ msgstr "グローバルデコード文字集合"

View File

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.4.0-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2012-10-09 21:22+0200\n"
"POT-Creation-Date: 2012-10-14 09:22+0200\n"
"PO-Revision-Date: 2012-09-29 11:42+0200\n"
"Last-Translator: Krzysztof Korościk <soltys@szluug.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -5646,8 +5646,10 @@ msgstr "lista host/port lub adres IP/port dla serwera (oddzielone przecinkiem)"
msgid "proxy used for this server (optional)"
msgstr "proxy użyte dla tego serwera (opcjonalne)"
msgid "use IPv6 protocol for server communication"
msgstr "użyj protokołu IPv6 do komunikacji z serwerem"
msgid ""
"use IPv6 protocol for server communication (try IPv6 then fallback to IPv4); "
"if disabled, only IPv4 is used"
msgstr ""
msgid "use SSL for server communication"
msgstr "użyj protokołu SSL do komunikacji z serwerem"
@ -7004,6 +7006,10 @@ msgstr "%s%s: za mało pamięci"
msgid "%s%s: timeout"
msgstr "%s%s: timeout"
#, fuzzy, c-format
msgid "%s%s: unable to create socket"
msgstr "%s%s: nie można utworzyć serwera"
#, fuzzy, c-format
msgid "%sgnutls: connected using %d-bit Diffie-Hellman shared secret exchange"
msgstr "gnutls: połączono używając %d-bitowego klucza Diffie-Hellmana"
@ -7093,29 +7099,17 @@ msgstr ""
"bez wsparcia dla GnuTLS"
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
msgid "%s%s: connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "%s: łączę się z serwerem %s/%d%s%s przez %s proxy %s/%d%s..."
#, c-format
msgid "Connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
#, fuzzy, c-format
msgid "Connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "Łączę z serwerem %s/%d%s%s przez %s proxy %s/%d%s..."
#, c-format
msgid "%s%s: connecting to server %s/%d%s%s..."
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s..."
msgstr "%s%s: łączę z serwerem %s/%d%s%s..."
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s: nie można utworzyć gniazda"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s%s: nie można ustawić opcji gniazda \"SO_REUSEADDR\""
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s%s: nie można ustawić opcji gniazda \"SO_KEEPALIVE\""
#, fuzzy, c-format
msgid "%s%s: reconnecting to server..."
msgstr "%s: ponownie łączę się z serwerem..."
@ -7960,6 +7954,18 @@ msgstr "%s%s: nie można zaakceptować klienta na porcie %d (%s%s%s)"
msgid "%s%s: IP address \"%s\" not allowed for relay"
msgstr "%s%s: adres IP \"%s\" nie posiada zezwolenia na połączenie"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s%s: nie można ustawić opcji gniazda \"SO_REUSEADDR\""
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s: nie można utworzyć gniazda"
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s%s: nie można ustawić opcji gniazda \"SO_KEEPALIVE\""
#, c-format
msgid "%s%s: error with \"bind\" on port %d (%s%s%s)"
msgstr "%s%s: błąd podczas \"bind\" na porcie %d (%s%s%s)"
@ -9269,6 +9275,9 @@ msgstr "Typ"
msgid "Constants"
msgstr "Stałe"
#~ msgid "use IPv6 protocol for server communication"
#~ msgstr "użyj protokołu IPv6 do komunikacji z serwerem"
#~ msgid "global decoding charset"
#~ msgstr "globalne dekodowane kodowanie"

View File

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.4.0-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2012-10-09 21:22+0200\n"
"POT-Creation-Date: 2012-10-14 09:22+0200\n"
"PO-Revision-Date: 2012-09-29 11:43+0200\n"
"Last-Translator: Sergio Durigan Junior <sergiosdj@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -5212,8 +5212,10 @@ msgstr ""
msgid "proxy used for this server (optional)"
msgstr "proxy utilizado para este servidor (opcional)"
msgid "use IPv6 protocol for server communication"
msgstr "usar protocolo IPv6 para comunicação com o servidor"
msgid ""
"use IPv6 protocol for server communication (try IPv6 then fallback to IPv4); "
"if disabled, only IPv4 is used"
msgstr ""
msgid "use SSL for server communication"
msgstr "usar encriptação SSL para comunicação com o servidor"
@ -6494,6 +6496,10 @@ msgstr "%s%s: memória insuficiente"
msgid "%s%s: timeout"
msgstr "%s%s: tempo esgotado para \"%s\" com %s"
#, fuzzy, c-format
msgid "%s%s: unable to create socket"
msgstr "%s%s: não foi possível criar pipe"
#, fuzzy, c-format
msgid "%sgnutls: connected using %d-bit Diffie-Hellman shared secret exchange"
msgstr ""
@ -6589,29 +6595,17 @@ msgstr ""
"com suporte a GnuTLS"
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
msgid "%s%s: connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "%s: conectando ao servidor %s/%d%s%s via %s proxy %s/%d%s..."
#, c-format
msgid "Connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
#, fuzzy, c-format
msgid "Connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "Conectando ao servidor %s/%d%s%s via %s proxy %s/%d%s..."
#, c-format
msgid "%s%s: connecting to server %s/%d%s%s..."
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s..."
msgstr "%s%s: conectando ao servidor %s/%d%s%s..."
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s: não foi possível criar socket"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s%s: não foi possível setar opção \"SO_REUSEADDR\" para o socket"
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s%s: não foi possível setar opção \"SO_KEEPALIVE\" para o socket"
#, fuzzy, c-format
msgid "%s%s: reconnecting to server..."
msgstr "%s: reconectando ao servidor..."
@ -7410,6 +7404,18 @@ msgstr "%s%s: não foi possível aceitar o cliente na porta %d (%s.%s)"
msgid "%s%s: IP address \"%s\" not allowed for relay"
msgstr "%s%s: endereço IP \"%s\" não permitido para relay"
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s%s: não foi possível setar opção \"SO_REUSEADDR\" para o socket"
#, c-format
msgid "%s%s: cannot create socket"
msgstr "%s%s: não foi possível criar socket"
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s%s: não foi possível setar opção \"SO_KEEPALIVE\" para o socket"
#, fuzzy, c-format
msgid "%s%s: error with \"bind\" on port %d (%s%s%s)"
msgstr "%s%s: erro ao associar (\"bind\") na porta %d (%s.%s)"
@ -8709,6 +8715,9 @@ msgstr ""
msgid "Constants"
msgstr ""
#~ msgid "use IPv6 protocol for server communication"
#~ msgstr "usar protocolo IPv6 para comunicação com o servidor"
#~ msgid "global decoding charset"
#~ msgstr "charset de decodificação global"

View File

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.4.0-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2012-10-09 21:22+0200\n"
"POT-Creation-Date: 2012-10-14 09:22+0200\n"
"PO-Revision-Date: 2012-09-29 11:43+0200\n"
"Last-Translator: Aleksey V Zapparov AKA ixti <ixti@member.fsf.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -5077,8 +5077,10 @@ msgstr "ник, используемый на IRC сервере"
msgid "proxy used for this server (optional)"
msgstr ""
msgid "use IPv6 protocol for server communication"
msgstr "использовать IPv6 при связи с сервером"
msgid ""
"use IPv6 protocol for server communication (try IPv6 then fallback to IPv4); "
"if disabled, only IPv4 is used"
msgstr ""
msgid "use SSL for server communication"
msgstr "использовать SSL при связи с сервером"
@ -6366,6 +6368,10 @@ msgstr "Недостаточно памяти для новой строчки\n
msgid "%s%s: timeout"
msgstr "%s нет аргумента для параметра \"%s\"\n"
#, fuzzy, c-format
msgid "%s%s: unable to create socket"
msgstr "%s не могу создать сервер\n"
#, c-format
msgid "%sgnutls: connected using %d-bit Diffie-Hellman shared secret exchange"
msgstr ""
@ -6454,29 +6460,17 @@ msgstr ""
"поддержки GNUtls\n"
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
msgid "%s%s: connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "%s: подключение к серверу %s:%d%s%s через %s proxy %s:%d%s...\n"
#, fuzzy, c-format
msgid "Connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
msgid "Connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr "Подключаюсь к серверу %s:%d%s%s через %s proxy %s:%d%s...\n"
#, fuzzy, c-format
msgid "%s%s: connecting to server %s/%d%s%s..."
msgid "%s%s: connecting to server %s/%d%s..."
msgstr "%s: поключаюсь к серверу %s:%d%s%s...\n"
#, fuzzy, c-format
msgid "%s%s: cannot create socket"
msgstr "%s невозможно создать сокет\n"
#, fuzzy, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s не могу установить настройку сокета \"SO_REUSEADDR\"\n"
#, fuzzy, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s не могу установить настройку сокета \"SO_KEEPALIVE\"\n"
#, fuzzy, c-format
msgid "%s%s: reconnecting to server..."
msgstr "%s: Повторное соединение...\n"
@ -7287,6 +7281,18 @@ msgstr "%s невозможно создать сокет\n"
msgid "%s%s: IP address \"%s\" not allowed for relay"
msgstr "%s адрес \"%s\" не найден\n"
#, fuzzy, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr "%s не могу установить настройку сокета \"SO_REUSEADDR\"\n"
#, fuzzy, c-format
msgid "%s%s: cannot create socket"
msgstr "%s невозможно создать сокет\n"
#, fuzzy, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr "%s не могу установить настройку сокета \"SO_KEEPALIVE\"\n"
#, fuzzy, c-format
msgid "%s%s: error with \"bind\" on port %d (%s%s%s)"
msgstr "%s невозможно создать сокет\n"
@ -8587,6 +8593,9 @@ msgstr ""
msgid "Constants"
msgstr ""
#~ msgid "use IPv6 protocol for server communication"
#~ msgstr "использовать IPv6 при связи с сервером"
#, fuzzy
#~ msgid "%s: connecting to server %s/%d%s%s..."
#~ msgstr "%s: поключаюсь к серверу %s:%d%s%s...\n"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2012-10-09 21:22+0200\n"
"POT-Creation-Date: 2012-10-14 09:22+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -4364,7 +4364,9 @@ msgstr ""
msgid "proxy used for this server (optional)"
msgstr ""
msgid "use IPv6 protocol for server communication"
msgid ""
"use IPv6 protocol for server communication (try IPv6 then fallback to IPv4); "
"if disabled, only IPv4 is used"
msgstr ""
msgid "use SSL for server communication"
@ -5543,6 +5545,10 @@ msgstr ""
msgid "%s%s: timeout"
msgstr ""
#, c-format
msgid "%s%s: unable to create socket"
msgstr ""
#, c-format
msgid "%sgnutls: connected using %d-bit Diffie-Hellman shared secret exchange"
msgstr ""
@ -5628,27 +5634,15 @@ msgid ""
msgstr ""
#, c-format
msgid "%s%s: connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
msgid "%s%s: connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr ""
#, c-format
msgid "Connecting to server %s/%d%s%s via %s proxy %s/%d%s..."
msgid "Connecting to server %s/%d%s via %s proxy %s/%d%s..."
msgstr ""
#, c-format
msgid "%s%s: connecting to server %s/%d%s%s..."
msgstr ""
#, c-format
msgid "%s%s: cannot create socket"
msgstr ""
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr ""
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgid "%s%s: connecting to server %s/%d%s..."
msgstr ""
#, c-format
@ -6378,6 +6372,18 @@ msgstr ""
msgid "%s%s: IP address \"%s\" not allowed for relay"
msgstr ""
#, c-format
msgid "%s%s: cannot set socket option \"SO_REUSEADDR\""
msgstr ""
#, c-format
msgid "%s%s: cannot create socket"
msgstr ""
#, c-format
msgid "%s%s: cannot set socket option \"SO_KEEPALIVE\""
msgstr ""
#, c-format
msgid "%s%s: error with \"bind\" on port %d (%s%s%s)"
msgstr ""

View File

@ -1,5 +1,6 @@
/*
* Copyright (C) 2003-2012 Sebastien Helleu <flashcode@flashtux.org>
* Copyright (C) 2012 Simon Arlott
*
* This file is part of WeeChat, the extensible chat client.
*
@ -1713,13 +1714,16 @@ hook_process_run (struct t_hook *hook_process)
struct t_hook *
hook_connect (struct t_weechat_plugin *plugin, const char *proxy,
const char *address, int port, int sock, int ipv6,
const char *address, int port, int ipv6, int retry,
void *gnutls_sess, void *gnutls_cb, int gnutls_dhkey_size,
const char *gnutls_priorities, const char *local_hostname,
t_hook_callback_connect *callback, void *callback_data)
{
struct t_hook *new_hook;
struct t_hook_connect *new_hook_connect;
#ifdef HOOK_CONNECT_MAX_SOCKETS
int i;
#endif
#ifndef HAVE_GNUTLS
/* make C compiler happy */
@ -1729,7 +1733,7 @@ hook_connect (struct t_weechat_plugin *plugin, const char *proxy,
(void) gnutls_priorities;
#endif
if ((sock < 0) || !address || (port <= 0) || !callback)
if (!address || (port <= 0) || !callback)
return NULL;
new_hook = malloc (sizeof (*new_hook));
@ -1750,8 +1754,9 @@ hook_connect (struct t_weechat_plugin *plugin, const char *proxy,
new_hook_connect->proxy = (proxy) ? strdup (proxy) : NULL;
new_hook_connect->address = strdup (address);
new_hook_connect->port = port;
new_hook_connect->sock = sock;
new_hook_connect->sock = -1;
new_hook_connect->ipv6 = ipv6;
new_hook_connect->retry = retry;
#ifdef HAVE_GNUTLS
new_hook_connect->gnutls_sess = gnutls_sess;
new_hook_connect->gnutls_cb = gnutls_cb;
@ -1763,6 +1768,8 @@ hook_connect (struct t_weechat_plugin *plugin, const char *proxy,
strdup (local_hostname) : NULL;
new_hook_connect->child_read = -1;
new_hook_connect->child_write = -1;
new_hook_connect->child_recv = -1;
new_hook_connect->child_send = -1;
new_hook_connect->child_pid = 0;
new_hook_connect->hook_child_timer = NULL;
new_hook_connect->hook_fd = NULL;
@ -1770,6 +1777,13 @@ hook_connect (struct t_weechat_plugin *plugin, const char *proxy,
new_hook_connect->handshake_hook_timer = NULL;
new_hook_connect->handshake_fd_flags = 0;
new_hook_connect->handshake_ip_address = NULL;
#ifdef HOOK_CONNECT_MAX_SOCKETS
for (i = 0; i < HOOK_CONNECT_MAX_SOCKETS; i++)
{
new_hook_connect->sock_v4[i] = -1;
new_hook_connect->sock_v6[i] = -1;
}
#endif
hook_add_to_list (new_hook);
@ -3166,6 +3180,19 @@ unhook (struct t_hook *hook)
close (HOOK_CONNECT(hook, child_read));
if (HOOK_CONNECT(hook, child_write) != -1)
close (HOOK_CONNECT(hook, child_write));
if (HOOK_CONNECT(hook, child_recv) != -1)
close (HOOK_CONNECT(hook, child_recv));
if (HOOK_CONNECT(hook, child_send) != -1)
close (HOOK_CONNECT(hook, child_send));
#ifdef HOOK_CONNECT_MAX_SOCKETS
for (i = 0; i < HOOK_CONNECT_MAX_SOCKETS; i++)
{
if (HOOK_CONNECT(hook, sock_v4[i]) != -1)
close (HOOK_CONNECT(hook, sock_v4[i]));
if (HOOK_CONNECT(hook, sock_v6[i]) != -1)
close (HOOK_CONNECT(hook, sock_v6[i]));
}
#endif
break;
case HOOK_TYPE_PRINT:
if (HOOK_PRINT(hook, message))
@ -3478,6 +3505,8 @@ hook_add_to_infolist_type (struct t_infolist *infolist, int type,
return 0;
if (!infolist_new_var_integer (ptr_item, "ipv6", HOOK_CONNECT(ptr_hook, ipv6)))
return 0;
if (!infolist_new_var_integer (ptr_item, "retry", HOOK_CONNECT(ptr_hook, retry)))
return 0;
#ifdef HAVE_GNUTLS
if (!infolist_new_var_pointer (ptr_item, "gnutls_sess", HOOK_CONNECT(ptr_hook, gnutls_sess)))
return 0;
@ -3492,6 +3521,10 @@ hook_add_to_infolist_type (struct t_infolist *infolist, int type,
return 0;
if (!infolist_new_var_integer (ptr_item, "child_write", HOOK_CONNECT(ptr_hook, child_write)))
return 0;
if (!infolist_new_var_integer (ptr_item, "child_recv", HOOK_CONNECT(ptr_hook, child_recv)))
return 0;
if (!infolist_new_var_integer (ptr_item, "child_send", HOOK_CONNECT(ptr_hook, child_send)))
return 0;
if (!infolist_new_var_integer (ptr_item, "child_pid", HOOK_CONNECT(ptr_hook, child_pid)))
return 0;
if (!infolist_new_var_pointer (ptr_item, "hook_child_timer", HOOK_CONNECT(ptr_hook, hook_child_timer)))
@ -3886,6 +3919,7 @@ hook_print_log ()
log_printf (" port. . . . . . . . . : %d", HOOK_CONNECT(ptr_hook, port));
log_printf (" sock. . . . . . . . . : %d", HOOK_CONNECT(ptr_hook, sock));
log_printf (" ipv6. . . . . . . . . : %d", HOOK_CONNECT(ptr_hook, ipv6));
log_printf (" retry . . . . . . . . : %d", HOOK_CONNECT(ptr_hook, retry));
#ifdef HAVE_GNUTLS
log_printf (" gnutls_sess . . . . . : 0x%lx", HOOK_CONNECT(ptr_hook, gnutls_sess));
log_printf (" gnutls_cb . . . . . . : 0x%lx", HOOK_CONNECT(ptr_hook, gnutls_cb));
@ -3895,6 +3929,8 @@ hook_print_log ()
log_printf (" local_hostname. . . . : '%s'", HOOK_CONNECT(ptr_hook, local_hostname));
log_printf (" child_read. . . . . . : %d", HOOK_CONNECT(ptr_hook, child_read));
log_printf (" child_write . . . . . : %d", HOOK_CONNECT(ptr_hook, child_write));
log_printf (" child_recv. . . . . . : %d", HOOK_CONNECT(ptr_hook, child_recv));
log_printf (" child_send. . . . . . : %d", HOOK_CONNECT(ptr_hook, child_send));
log_printf (" child_pid . . . . . . : %d", HOOK_CONNECT(ptr_hook, child_pid));
log_printf (" hook_child_timer. . . : 0x%lx", HOOK_CONNECT(ptr_hook, hook_child_timer));
log_printf (" hook_fd . . . . . . . : 0x%lx", HOOK_CONNECT(ptr_hook, hook_fd));
@ -3902,6 +3938,13 @@ hook_print_log ()
log_printf (" handshake_hook_timer. : 0x%lx", HOOK_CONNECT(ptr_hook, handshake_hook_timer));
log_printf (" handshake_fd_flags. . : %d", HOOK_CONNECT(ptr_hook, handshake_fd_flags));
log_printf (" handshake_ip_address. : '%s'", HOOK_CONNECT(ptr_hook, handshake_ip_address));
#ifdef HOOK_CONNECT_MAX_SOCKETS
for (i = 0; i < HOOK_CONNECT_MAX_SOCKETS; i++)
{
log_printf (" sock_v4[%d]. . . . . . : '%d'", HOOK_CONNECT(ptr_hook, sock_v4[i]));
log_printf (" sock_v6[%d]. . . . . . : '%d'", HOOK_CONNECT(ptr_hook, sock_v6[i]));
}
#endif
}
break;
case HOOK_TYPE_PRINT:

View File

@ -1,5 +1,6 @@
/*
* Copyright (C) 2003-2012 Sebastien Helleu <flashcode@flashtux.org>
* Copyright (C) 2012 Simon Arlott
*
* This file is part of WeeChat, the extensible chat client.
*
@ -26,6 +27,18 @@
#include <gnutls/gnutls.h>
#endif
#ifdef __CYGWIN__
/*
* For the connect hook, when this is defined an array of sockets will
* be passed from the parent process to the child process instead of using
* SCM_RIGHTS to pass a socket back from the child process to parent process.
*
* This allows connections to work on Windows but it limits the number of
* IPs that can be attempted each time.
*/
#define HOOK_CONNECT_MAX_SOCKETS 4
#endif
struct t_gui_bar;
struct t_gui_buffer;
struct t_gui_line;
@ -212,7 +225,7 @@ struct t_hook_process
/* hook connect */
typedef int (t_hook_callback_connect)(void *data, int status,
int gnutls_rc,
int gnutls_rc, int sock,
const char *error,
const char *ip_address);
@ -235,8 +248,9 @@ struct t_hook_connect
char *proxy; /* proxy (optional) */
char *address; /* peer address */
int port; /* peer port */
int sock; /* socket (created by caller) */
int ipv6; /* IPv6 connection ? */
int ipv6; /* use IPv6 */
int sock; /* socket (set when connected) */
int retry; /* retry count */
#ifdef HAVE_GNUTLS
gnutls_session_t *gnutls_sess; /* GnuTLS session (SSL connection) */
gnutls_callback_t *gnutls_cb; /* GnuTLS callback during handshake */
@ -246,6 +260,8 @@ struct t_hook_connect
char *local_hostname; /* force local hostname (optional) */
int child_read; /* to read data in pipe from child */
int child_write; /* to write data in pipe for child */
int child_recv; /* to read data from child socket */
int child_send; /* to write data to child socket */
pid_t child_pid; /* pid of child process (connecting) */
struct t_hook *hook_child_timer; /* timer for child process timeout */
struct t_hook *hook_fd; /* pointer to fd hook */
@ -253,6 +269,10 @@ struct t_hook_connect
struct t_hook *handshake_hook_timer; /* timer for handshake timeout */
int handshake_fd_flags; /* socket flags saved for handshake */
char *handshake_ip_address; /* ip address (used for handshake) */
#ifdef HOOK_CONNECT_MAX_SOCKETS
int sock_v4[HOOK_CONNECT_MAX_SOCKETS]; /* IPv4 sockets for connecting */
int sock_v6[HOOK_CONNECT_MAX_SOCKETS]; /* IPv6 sockets for connecting */
#endif
};
/* hook print */
@ -457,7 +477,7 @@ extern struct t_hook *hook_process_hashtable (struct t_weechat_plugin *plugin,
void *callback_data);
extern struct t_hook *hook_connect (struct t_weechat_plugin *plugin,
const char *proxy, const char *address,
int port, int sock, int ipv6,
int port, int ipv6, int retry,
void *gnutls_session, void *gnutls_cb,
int gnutls_dhkey_size,
const char *gnutls_priorities,

View File

@ -2,6 +2,7 @@
* Copyright (C) 2003-2012 Sebastien Helleu <flashcode@flashtux.org>
* Copyright (C) 2005-2010 Emmanuel Bouthenot <kolter@openics.org>
* Copyright (C) 2010 Gu1ll4um3r0m41n <aeroxteam@gmail.com>
* Copyright (C) 2012 Simon Arlott
*
* This file is part of WeeChat, the extensible chat client.
*
@ -38,6 +39,7 @@
#include <netdb.h>
#include <errno.h>
#include <gcrypt.h>
#include <sys/time.h>
#ifdef HAVE_GNUTLS
#include <gnutls/gnutls.h>
@ -645,20 +647,45 @@ void
network_connect_child (struct t_hook *hook_connect)
{
struct t_proxy *ptr_proxy;
struct addrinfo hints, *res, *res_local, *ptr_res;
struct addrinfo hints, *res_local, *res_remote, *ptr_res, *ptr_loc;
char port[NI_MAXSERV + 1];
char status_str[2], *ptr_address, *status_with_string;
char ipv4_address[INET_ADDRSTRLEN + 1], ipv6_address[INET6_ADDRSTRLEN + 1];
char remote_address[NI_MAXHOST + 1];
char status_without_string[1 + 5 + 1];
const char *error;
int rc, length, num_written;
int sock, set, flags;
#ifdef HOOK_CONNECT_MAX_SOCKETS
int j;
#else
struct msghdr msg;
struct cmsghdr *cmsg;
char msg_buf[CMSG_SPACE(sizeof (sock))];
#endif
/*
* indicates that something is wrong with whichever group of
* servers is being tried first after connecting, so start at
* a different offset to increase the chance of success
*/
int retry, rand_num, i;
int num_groups, tmp_num_groups, num_hosts, tmp_host;
struct addrinfo **res_reorder;
int last_af;
struct timeval tv_time;
res = NULL;
res_local = NULL;
res_remote = NULL;
res_reorder = NULL;
port[0] = '\0';
status_str[1] = '\0';
status_with_string = NULL;
ptr_address = NULL;
gettimeofday (&tv_time, NULL);
srand ((tv_time.tv_sec * tv_time.tv_usec) ^ getpid ());
ptr_proxy = NULL;
if (HOOK_CONNECT(hook_connect, proxy)
&& HOOK_CONNECT(hook_connect, proxy)[0])
@ -672,18 +699,86 @@ network_connect_child (struct t_hook *hook_connect)
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
(void) num_written;
return;
goto end;
}
}
/* get info about peer */
memset (&hints, 0, sizeof (hints));
hints.ai_socktype = SOCK_STREAM;
#ifdef AI_ADDRCONFIG
hints.ai_flags = AI_ADDRCONFIG;
#endif
if (ptr_proxy)
{
/* get info about peer */
memset (&hints, 0, sizeof (hints));
hints.ai_family = (CONFIG_BOOLEAN(ptr_proxy->options[PROXY_OPTION_IPV6])) ?
AF_INET6 : AF_INET;
AF_UNSPEC : AF_INET;
snprintf (port, sizeof (port), "%d", CONFIG_INTEGER(ptr_proxy->options[PROXY_OPTION_PORT]));
rc = getaddrinfo (CONFIG_STRING(ptr_proxy->options[PROXY_OPTION_ADDRESS]),
port, &hints, &res_remote);
}
else
{
hints.ai_family = HOOK_CONNECT(hook_connect, ipv6) ? AF_UNSPEC : AF_INET;
snprintf (port, sizeof (port), "%d", HOOK_CONNECT(hook_connect, port));
rc = getaddrinfo (HOOK_CONNECT(hook_connect, address), port, &hints, &res_remote);
}
if (rc != 0)
{
/* address not found */
status_with_string = NULL;
error = gai_strerror (rc);
if (error)
{
length = 1 + 5 + strlen (error) + 1;
status_with_string = malloc (length);
if (status_with_string)
{
snprintf (status_with_string, length, "%c%05d%s",
'0' + WEECHAT_HOOK_CONNECT_ADDRESS_NOT_FOUND,
(int)strlen (error), error);
}
}
if (status_with_string)
{
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_with_string, strlen (status_with_string));
}
else
{
snprintf (status_without_string, sizeof (status_without_string),
"%c00000", '0' + WEECHAT_HOOK_CONNECT_ADDRESS_NOT_FOUND);
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
}
(void) num_written;
goto end;
}
if (!res_remote)
{
/* address not found */
snprintf (status_without_string, sizeof (status_without_string),
"%c00000", '0' + WEECHAT_HOOK_CONNECT_ADDRESS_NOT_FOUND);
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
(void) num_written;
goto end;
}
/* set local hostname/IP if asked by user */
if (HOOK_CONNECT(hook_connect, local_hostname)
&& HOOK_CONNECT(hook_connect, local_hostname[0]))
{
memset (&hints, 0, sizeof (hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
rc = getaddrinfo (CONFIG_STRING(ptr_proxy->options[PROXY_OPTION_ADDRESS]), NULL, &hints, &res);
#ifdef AI_ADDRCONFIG
hints.ai_flags = AI_ADDRCONFIG;
#endif
rc = getaddrinfo (HOOK_CONNECT(hook_connect, local_hostname),
NULL, &hints, &res_local);
if (rc != 0)
{
/* address not found */
@ -696,7 +791,7 @@ network_connect_child (struct t_hook *hook_connect)
if (status_with_string)
{
snprintf (status_with_string, length, "%c%05d%s",
'0' + WEECHAT_HOOK_CONNECT_ADDRESS_NOT_FOUND,
'0' + WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR,
(int)strlen (error), error);
}
}
@ -708,254 +803,256 @@ network_connect_child (struct t_hook *hook_connect)
else
{
snprintf (status_without_string, sizeof (status_without_string),
"%c00000", '0' + WEECHAT_HOOK_CONNECT_ADDRESS_NOT_FOUND);
"%c00000", '0' + WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR);
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
}
if (status_with_string)
free (status_with_string);
(void) num_written;
return;
}
if (!res)
{
/* adddress not found */
snprintf (status_without_string, sizeof (status_without_string),
"%c00000", '0' + WEECHAT_HOOK_CONNECT_ADDRESS_NOT_FOUND);
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
(void) num_written;
return;
}
if ((CONFIG_BOOLEAN(ptr_proxy->options[PROXY_OPTION_IPV6]) && (res->ai_family != AF_INET6))
|| ((!CONFIG_BOOLEAN(ptr_proxy->options[PROXY_OPTION_IPV6]) && (res->ai_family != AF_INET))))
{
/* IP address not found */
snprintf (status_without_string, sizeof (status_without_string),
"%c00000", '0' + WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND);
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
(void) num_written;
freeaddrinfo (res);
return;
goto end;
}
if (CONFIG_BOOLEAN(ptr_proxy->options[PROXY_OPTION_IPV6]))
((struct sockaddr_in6 *)(res->ai_addr))->sin6_port = htons (CONFIG_INTEGER(ptr_proxy->options[PROXY_OPTION_PORT]));
else
((struct sockaddr_in *)(res->ai_addr))->sin_port = htons (CONFIG_INTEGER(ptr_proxy->options[PROXY_OPTION_PORT]));
if (!res_local)
{
/* address not found */
snprintf (status_without_string, sizeof (status_without_string),
"%c00000", '0' + WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR);
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
(void) num_written;
goto end;
}
}
/* res_local != NULL now indicates that bind() is required */
/*
* count all the groups of hosts by tracking family, e.g.
* 0 = [2001:db8::1, 2001:db8::2,
* 1 = 192.0.2.1, 192.0.2.2,
* 2 = 2002:c000:201::1, 2002:c000:201::2]
*/
last_af = AF_UNSPEC;
num_groups = 0;
num_hosts = 0;
for (ptr_res = res_remote; ptr_res; ptr_res = ptr_res->ai_next)
{
if (ptr_res->ai_family != last_af)
if (last_af != AF_UNSPEC)
num_groups++;
num_hosts++;
last_af = ptr_res->ai_family;
}
if (last_af != AF_UNSPEC)
num_groups++;
res_reorder = malloc (sizeof (*res_reorder) * num_hosts);
if (!res_reorder)
{
snprintf (status_without_string, sizeof (status_without_string),
"%c00000", '0' + WEECHAT_HOOK_CONNECT_MEMORY_ERROR);
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
(void) num_written;
goto end;
}
/* reorder groups */
retry = HOOK_CONNECT(hook_connect, retry);
if (num_groups > 0)
{
retry %= num_groups;
i = 0;
last_af = AF_UNSPEC;
tmp_num_groups = 0;
tmp_host = i; /* start of current group */
/* top of list */
for (ptr_res = res_remote; ptr_res; ptr_res = ptr_res->ai_next)
{
if (ptr_res->ai_family != last_af)
{
if (last_af != AF_UNSPEC)
tmp_num_groups++;
tmp_host = i;
}
if (tmp_num_groups >= retry)
{
/* shuffle while adding */
rand_num = tmp_host + (rand() % ((i + 1) - tmp_host));
if (rand_num == i)
res_reorder[i++] = ptr_res;
else
{
res_reorder[i++] = res_reorder[rand_num];
res_reorder[rand_num] = ptr_res;
}
}
last_af = ptr_res->ai_family;
}
last_af = AF_UNSPEC;
tmp_num_groups = 0;
tmp_host = i; /* start of current group */
/* remainder of list */
for (ptr_res = res_remote; ptr_res; ptr_res = ptr_res->ai_next)
{
if (ptr_res->ai_family != last_af)
{
if (last_af != AF_UNSPEC)
tmp_num_groups++;
tmp_host = i;
}
if (tmp_num_groups < retry)
{
/* shuffle while adding */
rand_num = tmp_host + (rand() % ((i + 1) - tmp_host));
if (rand_num == i)
res_reorder[i++] = ptr_res;
else
{
res_reorder[i++] = res_reorder[rand_num];
res_reorder[rand_num] = ptr_res;
}
}
else
break;
last_af = ptr_res->ai_family;
}
}
else
{
/* no IP addresses found (all AF_UNSPEC) */
snprintf (status_without_string, sizeof (status_without_string),
"%c00000", '0' + WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND);
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
(void) num_written;
goto end;
}
status_str[0] = '0' + WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND;
/* try all IP addresses found, stop when connection is ok */
sock = -1;
for (i = 0; i < num_hosts; i++)
{
ptr_res = res_reorder[i];
#ifdef HOOK_CONNECT_MAX_SOCKETS
/* use pre-created socket pool */
sock = -1;
for (j = 0; j < HOOK_CONNECT_MAX_SOCKETS; j++)
{
if (ptr_res->ai_family == AF_INET)
{
sock = HOOK_CONNECT(hook_connect, sock_v4[j]);
if (sock != -1)
{
HOOK_CONNECT(hook_connect, sock_v4[j]) = -1;
break;
}
}
else if (ptr_res->ai_family == AF_INET6)
{
sock = HOOK_CONNECT(hook_connect, sock_v6[j]);
if (sock != -1)
{
HOOK_CONNECT(hook_connect, sock_v6[j]) = -1;
break;
}
}
}
if (sock < 0)
continue;
#else
/* create a socket */
sock = socket (ptr_res->ai_family,
ptr_res->ai_socktype,
ptr_res->ai_protocol);
#endif
if (sock < 0)
{
status_str[0] = '0' + WEECHAT_HOOK_CONNECT_SOCKET_ERROR;
continue;
}
/* set SO_REUSEADDR option for socket */
set = 1;
setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, (void *) &set, sizeof (set));
/* set SO_KEEPALIVE option for socket */
set = 1;
setsockopt (sock, SOL_SOCKET, SO_KEEPALIVE, (void *) &set, sizeof (set));
/* set flag O_NONBLOCK on socket */
flags = fcntl (sock, F_GETFL);
if (flags == -1)
flags = 0;
fcntl (sock, F_SETFL, flags | O_NONBLOCK);
if (res_local)
{
rc = -1;
/* bind local hostname/IP if asked by user */
for (ptr_loc = res_local; ptr_loc; ptr_loc = ptr_loc->ai_next)
{
if (ptr_loc->ai_family != ptr_res->ai_family)
continue;
rc = bind (sock, ptr_loc->ai_addr, ptr_loc->ai_addrlen);
if (rc < 0)
continue;
}
if (rc < 0)
{
status_str[0] = '0' + WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR;
close (sock);
sock = -1;
continue;
}
}
/* connect to peer */
if (!network_connect (HOOK_CONNECT(hook_connect, sock),
res->ai_addr, res->ai_addrlen))
if (network_connect (sock, ptr_res->ai_addr, ptr_res->ai_addrlen))
{
/* connection refused */
snprintf (status_without_string, sizeof (status_without_string),
"%c00000", '0' + WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED);
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
(void) num_written;
freeaddrinfo (res);
return;
status_str[0] = '0' + WEECHAT_HOOK_CONNECT_OK;
rc = getnameinfo (ptr_res->ai_addr, ptr_res->ai_addrlen,
remote_address, sizeof (remote_address),
NULL, 0, NI_NUMERICHOST);
if (rc == 0)
ptr_address = remote_address;
break;
}
else
{
status_str[0] = '0' + WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED;
close (sock);
sock = -1;
}
}
HOOK_CONNECT(hook_connect, sock) = sock;
if (ptr_proxy && status_str[0] == '0' + WEECHAT_HOOK_CONNECT_OK)
{
if (!network_pass_proxy (HOOK_CONNECT(hook_connect, proxy),
HOOK_CONNECT(hook_connect, sock),
HOOK_CONNECT(hook_connect, address),
HOOK_CONNECT(hook_connect, port)))
{
/* proxy fails to connect to peer */
snprintf (status_without_string, sizeof (status_without_string),
"%c00000", '0' + WEECHAT_HOOK_CONNECT_PROXY_ERROR);
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
(void) num_written;
freeaddrinfo (res);
return;
}
status_str[0] = '0' + WEECHAT_HOOK_CONNECT_OK;
}
else
{
/* set local hostname/IP if asked by user */
if (HOOK_CONNECT(hook_connect, local_hostname)
&& HOOK_CONNECT(hook_connect, local_hostname[0]))
{
memset (&hints, 0, sizeof(hints));
hints.ai_family = (HOOK_CONNECT(hook_connect, ipv6)) ? AF_INET6 : AF_INET;
hints.ai_socktype = SOCK_STREAM;
rc = getaddrinfo (HOOK_CONNECT(hook_connect, local_hostname),
NULL, &hints, &res_local);
if (rc != 0)
{
/* fails to set local hostname/IP */
status_with_string = NULL;
error = gai_strerror (rc);
if (error)
{
length = 1 + 5 + strlen (error) + 1;
status_with_string = malloc (length);
if (status_with_string)
{
snprintf (status_with_string, length, "%c%05d%s",
'0' + WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR,
(int)strlen (error), error);
}
}
if (status_with_string)
{
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_with_string, strlen (status_with_string));
}
else
{
snprintf (status_without_string, sizeof (status_without_string),
"%c00000", '0' + WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR);
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
}
if (status_with_string)
free (status_with_string);
(void) num_written;
if (res_local)
freeaddrinfo (res_local);
return;
}
else if (!res_local
|| (HOOK_CONNECT(hook_connect, ipv6)
&& (res_local->ai_family != AF_INET6))
|| ((!HOOK_CONNECT(hook_connect, ipv6)
&& (res_local->ai_family != AF_INET))))
{
/* fails to set local hostname/IP */
snprintf (status_without_string, sizeof (status_without_string),
"%c00000", '0' + WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR);
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
(void) num_written;
if (res_local)
freeaddrinfo (res_local);
return;
}
if (bind (HOOK_CONNECT(hook_connect, sock),
res_local->ai_addr, res_local->ai_addrlen) < 0)
{
/* fails to set local hostname/IP */
snprintf (status_without_string, sizeof (status_without_string),
"%c00000", '0' + WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR);
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
(void) num_written;
if (res_local)
freeaddrinfo (res_local);
return;
}
}
/* get info about peer */
memset (&hints, 0, sizeof(hints));
hints.ai_family = (HOOK_CONNECT(hook_connect, ipv6)) ? AF_INET6 : AF_INET;
hints.ai_socktype = SOCK_STREAM;
rc = getaddrinfo (HOOK_CONNECT(hook_connect, address),
NULL, &hints, &res);
if (rc != 0)
{
status_with_string = NULL;
error = gai_strerror (rc);
if (error)
{
length = 1 + 5 + strlen (error) + 1;
status_with_string = malloc (length);
if (status_with_string)
{
snprintf (status_with_string, length, "%c%05d%s",
'0' + WEECHAT_HOOK_CONNECT_ADDRESS_NOT_FOUND,
(int)strlen (error), error);
}
}
if (status_with_string)
{
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_with_string, strlen (status_with_string));
}
else
{
snprintf (status_without_string, sizeof (status_without_string),
"%c00000", '0' + WEECHAT_HOOK_CONNECT_ADDRESS_NOT_FOUND);
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
}
if (status_with_string)
free (status_with_string);
(void) num_written;
if (res)
freeaddrinfo (res);
if (res_local)
freeaddrinfo (res_local);
return;
}
else if (!res)
{
/* address not found */
snprintf (status_without_string, sizeof (status_without_string),
"%c00000", '0' + WEECHAT_HOOK_CONNECT_ADDRESS_NOT_FOUND);
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_without_string, strlen (status_without_string));
(void) num_written;
if (res)
freeaddrinfo (res);
if (res_local)
freeaddrinfo (res_local);
return;
}
status_str[0] = '0' + WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND;
/* try all IP addresses found, stop when connection is ok */
for (ptr_res = res; ptr_res; ptr_res = ptr_res->ai_next)
{
/* skip IP address if it's not good family */
if ((HOOK_CONNECT(hook_connect, ipv6) && (ptr_res->ai_family != AF_INET6))
|| ((!HOOK_CONNECT(hook_connect, ipv6) && (ptr_res->ai_family != AF_INET))))
continue;
/* connect to peer */
if (HOOK_CONNECT(hook_connect, ipv6))
((struct sockaddr_in6 *)(ptr_res->ai_addr))->sin6_port =
htons (HOOK_CONNECT(hook_connect, port));
else
((struct sockaddr_in *)(ptr_res->ai_addr))->sin_port =
htons (HOOK_CONNECT(hook_connect, port));
if (network_connect (HOOK_CONNECT(hook_connect, sock),
ptr_res->ai_addr, ptr_res->ai_addrlen))
{
status_str[0] = '0' + WEECHAT_HOOK_CONNECT_OK;
if (HOOK_CONNECT(hook_connect, ipv6))
{
if (inet_ntop (AF_INET6,
&((struct sockaddr_in6 *)(ptr_res->ai_addr))->sin6_addr,
ipv6_address,
INET6_ADDRSTRLEN))
{
ptr_address = ipv6_address;
}
}
else
{
if (inet_ntop (AF_INET,
&((struct sockaddr_in *)(ptr_res->ai_addr))->sin_addr,
ipv4_address,
INET_ADDRSTRLEN))
{
ptr_address = ipv4_address;
}
}
break;
}
else
status_str[0] = '0' + WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED;
status_str[0] = '0' + WEECHAT_HOOK_CONNECT_PROXY_ERROR;
}
}
@ -978,7 +1075,6 @@ network_connect_child (struct t_hook *hook_connect)
num_written = write (HOOK_CONNECT(hook_connect, child_write),
status_with_string, strlen (status_with_string));
(void) num_written;
free (status_with_string);
}
else
{
@ -988,6 +1084,24 @@ network_connect_child (struct t_hook *hook_connect)
status_without_string, strlen (status_without_string));
(void) num_written;
}
/* send the socket to the parent process */
#ifndef HOOK_CONNECT_MAX_SOCKETS
memset (&msg, 0, sizeof (msg));
msg.msg_control = msg_buf;
msg.msg_controllen = sizeof (msg_buf);
cmsg = CMSG_FIRSTHDR(&msg);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
cmsg->cmsg_len = CMSG_LEN(sizeof (sock));
memcpy(CMSG_DATA(cmsg), &sock, sizeof (sock));
msg.msg_controllen = cmsg->cmsg_len;
num_written = sendmsg (HOOK_CONNECT(hook_connect, child_send), &msg, 0);
(void) num_written;
#else
num_written = write (HOOK_CONNECT(hook_connect, child_write), &sock, sizeof (sock));
(void) num_written;
#endif
}
else
{
@ -998,10 +1112,15 @@ network_connect_child (struct t_hook *hook_connect)
(void) num_written;
}
if (res)
freeaddrinfo (res);
end:
if (status_with_string)
free (status_with_string);
if (res_reorder)
free (res_reorder);
if (res_local)
freeaddrinfo (res_local);
if (res_remote)
freeaddrinfo (res_remote);
}
/*
@ -1023,7 +1142,7 @@ network_connect_child_timer_cb (void *arg_hook_connect, int remaining_calls)
(void) (HOOK_CONNECT(hook_connect, callback))
(hook_connect->callback_data,
WEECHAT_HOOK_CONNECT_TIMEOUT,
0, NULL, NULL);
0, -1, NULL, NULL);
unhook (hook_connect);
return WEECHAT_RC_OK;
@ -1066,8 +1185,8 @@ network_connect_gnutls_handshake_fd_cb (void *arg_hook_connect, int fd)
{
(void) (HOOK_CONNECT(hook_connect, callback))
(hook_connect->callback_data,
WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR,
rc,
WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR, rc,
HOOK_CONNECT(hook_connect, sock),
gnutls_strerror (rc),
HOOK_CONNECT(hook_connect, handshake_ip_address));
unhook (hook_connect);
@ -1086,8 +1205,8 @@ network_connect_gnutls_handshake_fd_cb (void *arg_hook_connect, int fd)
{
(void) (HOOK_CONNECT(hook_connect, callback))
(hook_connect->callback_data,
WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR,
rc,
WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR, rc,
HOOK_CONNECT(hook_connect, sock),
"Error in the certificate.",
HOOK_CONNECT(hook_connect, handshake_ip_address));
unhook (hook_connect);
@ -1096,8 +1215,10 @@ network_connect_gnutls_handshake_fd_cb (void *arg_hook_connect, int fd)
#endif
unhook (HOOK_CONNECT(hook_connect, handshake_hook_fd));
(void) (HOOK_CONNECT(hook_connect, callback))
(hook_connect->callback_data, WEECHAT_HOOK_CONNECT_OK, 0, NULL,
HOOK_CONNECT(hook_connect, handshake_ip_address));
(hook_connect->callback_data,
WEECHAT_HOOK_CONNECT_OK, 0,
HOOK_CONNECT(hook_connect, sock),
NULL, HOOK_CONNECT(hook_connect, handshake_ip_address));
unhook (hook_connect);
}
@ -1127,6 +1248,7 @@ network_connect_gnutls_handshake_timer_cb (void *arg_hook_connect,
(hook_connect->callback_data,
WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR,
GNUTLS_E_EXPIRED,
HOOK_CONNECT(hook_connect, sock),
gnutls_strerror (GNUTLS_E_EXPIRED),
HOOK_CONNECT(hook_connect, handshake_ip_address));
unhook (hook_connect);
@ -1149,6 +1271,14 @@ network_connect_child_read_cb (void *arg_hook_connect, int fd)
#ifdef HAVE_GNUTLS
int rc, direction;
#endif
int sock;
#ifdef HOOK_CONNECT_MAX_SOCKETS
int i;
#else
struct msghdr msg;
struct cmsghdr *cmsg;
char msg_buf[CMSG_SPACE(sizeof (sock))];
#endif
/* make C compiler happy */
(void) fd;
@ -1157,10 +1287,11 @@ network_connect_child_read_cb (void *arg_hook_connect, int fd)
cb_error = NULL;
cb_ip_address = NULL;
sock = -1;
num_read = read (HOOK_CONNECT(hook_connect, child_read),
buffer, sizeof (buffer));
if (num_read > 0)
if (num_read == sizeof (buffer))
{
if (buffer[0] - '0' == WEECHAT_HOOK_CONNECT_OK)
{
@ -1189,6 +1320,41 @@ network_connect_child_read_cb (void *arg_hook_connect, int fd)
}
}
}
#ifndef HOOK_CONNECT_MAX_SOCKETS
/* receive the socket from the child process */
memset (&msg, 0, sizeof (msg));
msg.msg_control = msg_buf;
msg.msg_controllen = sizeof (msg_buf);
if (recvmsg (HOOK_CONNECT(hook_connect, child_recv), &msg, 0) >= 0)
{
cmsg = CMSG_FIRSTHDR(&msg);
if (cmsg != NULL
&& cmsg->cmsg_level == SOL_SOCKET
&& cmsg->cmsg_type == SCM_RIGHTS
&& cmsg->cmsg_len >= sizeof (sock))
{
memcpy(&sock, CMSG_DATA(cmsg), sizeof (sock));
}
}
#else
num_read = read (HOOK_CONNECT(hook_connect, child_read), &sock, sizeof (sock));
(void) num_read;
/* prevent unhook process from closing the socket */
for (i = 0; i < HOOK_CONNECT_MAX_SOCKETS; i++)
{
if (HOOK_CONNECT(hook_connect, sock_v4[i]) == sock)
HOOK_CONNECT(hook_connect, sock_v4[i]) = -1;
if (HOOK_CONNECT(hook_connect, sock_v6[i]) == sock)
HOOK_CONNECT(hook_connect, sock_v6[i]) = -1;
}
#endif
HOOK_CONNECT(hook_connect, sock) = sock;
#ifdef HAVE_GNUTLS
if (HOOK_CONNECT(hook_connect, gnutls_sess))
{
@ -1240,7 +1406,7 @@ network_connect_child_read_cb (void *arg_hook_connect, int fd)
(void) (HOOK_CONNECT(hook_connect, callback))
(hook_connect->callback_data,
WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR,
rc,
rc, sock,
gnutls_strerror (rc),
cb_ip_address);
unhook (hook_connect);
@ -1261,7 +1427,7 @@ network_connect_child_read_cb (void *arg_hook_connect, int fd)
(void) (HOOK_CONNECT(hook_connect, callback))
(hook_connect->callback_data,
WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR,
rc,
rc, sock,
"Error in the certificate.",
cb_ip_address);
unhook (hook_connect);
@ -1303,7 +1469,14 @@ network_connect_child_read_cb (void *arg_hook_connect, int fd)
}
(void) (HOOK_CONNECT(hook_connect, callback))
(hook_connect->callback_data, buffer[0] - '0', 0,
cb_error, cb_ip_address);
sock, cb_error, cb_ip_address);
unhook (hook_connect);
}
else
{
(void) (HOOK_CONNECT(hook_connect, callback))
(hook_connect->callback_data, WEECHAT_HOOK_CONNECT_MEMORY_ERROR,
0, sock, cb_error, cb_ip_address);
unhook (hook_connect);
}
@ -1323,6 +1496,11 @@ void
network_connect_with_fork (struct t_hook *hook_connect)
{
int child_pipe[2];
#ifdef HOOK_CONNECT_MAX_SOCKETS
int i;
#else
int child_socket[2];
#endif
#ifdef HAVE_GNUTLS
int rc;
const char *pos_error;
@ -1338,7 +1516,7 @@ network_connect_with_fork (struct t_hook *hook_connect)
(void) (HOOK_CONNECT(hook_connect, callback))
(hook_connect->callback_data,
WEECHAT_HOOK_CONNECT_GNUTLS_INIT_ERROR,
0, NULL, NULL);
0, -1, NULL, NULL);
unhook (hook_connect);
return;
}
@ -1350,7 +1528,7 @@ network_connect_with_fork (struct t_hook *hook_connect)
(void) (HOOK_CONNECT(hook_connect, callback))
(hook_connect->callback_data,
WEECHAT_HOOK_CONNECT_GNUTLS_INIT_ERROR,
0, _("invalid priorities"), NULL);
0, -1, _("invalid priorities"), NULL);
unhook (hook_connect);
return;
}
@ -1368,13 +1546,34 @@ network_connect_with_fork (struct t_hook *hook_connect)
(void) (HOOK_CONNECT(hook_connect, callback))
(hook_connect->callback_data,
WEECHAT_HOOK_CONNECT_MEMORY_ERROR,
0, NULL, NULL);
0, -1, NULL, NULL);
unhook (hook_connect);
return;
}
HOOK_CONNECT(hook_connect, child_read) = child_pipe[0];
HOOK_CONNECT(hook_connect, child_write) = child_pipe[1];
#ifndef HOOK_CONNECT_MAX_SOCKETS
/* create socket for child process */
if (socketpair (AF_LOCAL, SOCK_DGRAM, 0, child_socket) < 0)
{
(void) (HOOK_CONNECT(hook_connect, callback))
(hook_connect->callback_data,
WEECHAT_HOOK_CONNECT_MEMORY_ERROR,
0, -1, NULL, NULL);
unhook (hook_connect);
return;
}
HOOK_CONNECT(hook_connect, child_recv) = child_socket[0];
HOOK_CONNECT(hook_connect, child_send) = child_socket[1];
#else
for (i = 0; i < HOOK_CONNECT_MAX_SOCKETS; i++)
{
HOOK_CONNECT(hook_connect, sock_v4[i]) = socket (AF_INET, SOCK_STREAM, 0);
HOOK_CONNECT(hook_connect, sock_v6[i]) = socket (AF_INET6, SOCK_STREAM, 0);
}
#endif
switch (pid = fork ())
{
/* fork failed */
@ -1382,13 +1581,16 @@ network_connect_with_fork (struct t_hook *hook_connect)
(void) (HOOK_CONNECT(hook_connect, callback))
(hook_connect->callback_data,
WEECHAT_HOOK_CONNECT_MEMORY_ERROR,
0, NULL, NULL);
0, -1, NULL, NULL);
unhook (hook_connect);
return;
/* child process */
case 0:
setuid (getuid ());
close (HOOK_CONNECT(hook_connect, child_read));
#ifndef HOOK_CONNECT_MAX_SOCKETS
close (HOOK_CONNECT(hook_connect, child_recv));
#endif
network_connect_child (hook_connect);
_exit (EXIT_SUCCESS);
}
@ -1396,6 +1598,10 @@ network_connect_with_fork (struct t_hook *hook_connect)
HOOK_CONNECT(hook_connect, child_pid) = pid;
close (HOOK_CONNECT(hook_connect, child_write));
HOOK_CONNECT(hook_connect, child_write) = -1;
#ifndef HOOK_CONNECT_MAX_SOCKETS
close (HOOK_CONNECT(hook_connect, child_send));
HOOK_CONNECT(hook_connect, child_send) = -1;
#endif
HOOK_CONNECT(hook_connect, hook_child_timer) = hook_timer (hook_connect->plugin,
CONFIG_INTEGER(config_network_connection_timeout) * 1000,
0, 1,

View File

@ -1,5 +1,6 @@
/*
* Copyright (C) 2011-2012 Sebastien Helleu <flashcode@flashtux.org>
* Copyright (C) 2012 Simon Arlott
*
* This file is part of WeeChat, the extensible chat client.
*
@ -2476,11 +2477,12 @@ weechat_guile_api_hook_process_hashtable (SCM command, SCM options, SCM timeout,
int
weechat_guile_api_hook_connect_cb (void *data, int status, int gnutls_rc,
const char *error, const char *ip_address)
int sock, const char *error,
const char *ip_address)
{
struct t_plugin_script_cb *script_callback;
void *func_argv[5];
char str_status[32], str_gnutls_rc[32];
void *func_argv[6];
char str_status[32], str_gnutls_rc[32], str_sock[32];
char empty_arg[1] = { '\0' };
int *rc, ret;
@ -2490,17 +2492,19 @@ weechat_guile_api_hook_connect_cb (void *data, int status, int gnutls_rc,
{
snprintf (str_status, sizeof (str_status), "%d", status);
snprintf (str_gnutls_rc, sizeof (str_gnutls_rc), "%d", gnutls_rc);
snprintf (str_sock, sizeof (str_sock), "%d", sock);
func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg;
func_argv[1] = str_status;
func_argv[2] = str_gnutls_rc;
func_argv[3] = (ip_address) ? (char *)ip_address : empty_arg;
func_argv[4] = (error) ? (char *)error : empty_arg;
func_argv[3] = str_sock;
func_argv[4] = (ip_address) ? (char *)ip_address : empty_arg;
func_argv[5] = (error) ? (char *)error : empty_arg;
rc = (int *) weechat_guile_exec (script_callback->script,
WEECHAT_SCRIPT_EXEC_INT,
script_callback->function,
"sssss", func_argv);
"ssssss", func_argv);
if (!rc)
ret = WEECHAT_RC_ERROR;
@ -2521,8 +2525,8 @@ weechat_guile_api_hook_connect_cb (void *data, int status, int gnutls_rc,
*/
SCM
weechat_guile_api_hook_connect (SCM proxy, SCM address, SCM port, SCM sock,
SCM ipv6, SCM local_hostname, SCM function,
weechat_guile_api_hook_connect (SCM proxy, SCM address, SCM port, SCM ipv6,
SCM retry, SCM local_hostname, SCM function,
SCM data)
{
char *result;
@ -2530,8 +2534,8 @@ weechat_guile_api_hook_connect (SCM proxy, SCM address, SCM port, SCM sock,
API_FUNC(1, "hook_connect", API_RETURN_EMPTY);
if (!scm_is_string (proxy) || !scm_is_string (address)
|| !scm_is_integer (port) || !scm_is_integer (sock)
|| !scm_is_integer (ipv6) || !scm_is_string (local_hostname)
|| !scm_is_integer (port) || !scm_is_integer (ipv6)
|| !scm_is_integer (retry) || !scm_is_string (local_hostname)
|| !scm_is_string (function) || !scm_is_string (data))
API_WRONG_ARGS(API_RETURN_EMPTY);
@ -2540,8 +2544,8 @@ weechat_guile_api_hook_connect (SCM proxy, SCM address, SCM port, SCM sock,
scm_i_string_chars (proxy),
scm_i_string_chars (address),
scm_to_int (port),
scm_to_int (sock),
scm_to_int (ipv6),
scm_to_int (retry),
NULL, /* gnutls session */
NULL, /* gnutls callback */
0, /* gnutls DH key size */
@ -5567,6 +5571,7 @@ weechat_guile_api_module_init (void *data)
scm_c_define ("weechat:WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR", scm_from_int (WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR));
scm_c_define ("weechat:WEECHAT_HOOK_CONNECT_MEMORY_ERROR", scm_from_int (WEECHAT_HOOK_CONNECT_MEMORY_ERROR));
scm_c_define ("weechat:WEECHAT_HOOK_CONNECT_TIMEOUT", scm_from_int (WEECHAT_HOOK_CONNECT_TIMEOUT));
scm_c_define ("weechat:WEECHAT_HOOK_CONNECT_SOCKET_ERROR", scm_from_int (WEECHAT_HOOK_CONNECT_SOCKET_ERROR));
scm_c_define ("weechat:WEECHAT_HOOK_SIGNAL_STRING", scm_from_locale_string (WEECHAT_HOOK_SIGNAL_STRING));
scm_c_define ("weechat:WEECHAT_HOOK_SIGNAL_INT", scm_from_locale_string (WEECHAT_HOOK_SIGNAL_INT));
@ -5608,6 +5613,7 @@ weechat_guile_api_module_init (void *data)
"weechat:WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR",
"weechat:WEECHAT_HOOK_CONNECT_MEMORY_ERROR",
"weechat:WEECHAT_HOOK_CONNECT_TIMEOUT",
"weechat:WEECHAT_HOOK_CONNECT_SOCKET_ERROR",
"weechat:WEECHAT_HOOK_SIGNAL_STRING",
"weechat:WEECHAT_HOOK_SIGNAL_INT",
"weechat:WEECHAT_HOOK_SIGNAL_POINTER",

View File

@ -1347,7 +1347,8 @@ irc_config_server_new_option (struct t_config_file *config_file,
new_option = weechat_config_new_option (
config_file, section,
option_name, "boolean",
N_("use IPv6 protocol for server communication"),
N_("use IPv6 protocol for server communication (try IPv6 then "
"fallback to IPv4); if disabled, only IPv4 is used"),
NULL, 0, 0,
default_value, value,
null_value_allowed,

View File

@ -1,6 +1,7 @@
/*
* Copyright (C) 2003-2012 Sebastien Helleu <flashcode@flashtux.org>
* Copyright (C) 2005-2010 Emmanuel Bouthenot <kolter@openics.org>
* Copyright (C) 2012 Simon Arlott
*
* This file is part of WeeChat, the extensible chat client.
*
@ -82,7 +83,7 @@ char *irc_server_option_string[IRC_SERVER_NUM_OPTIONS] =
};
char *irc_server_option_default[IRC_SERVER_NUM_OPTIONS] =
{ "", "", "off",
{ "", "", "on",
"off", "", "NORMAL", "2048", "on",
"", "",
"plain", "", "", "15",
@ -362,6 +363,11 @@ irc_server_set_addresses (struct t_irc_server *server, const char *addresses)
free (server->ports_array);
server->ports_array = NULL;
}
if (server->retry_array)
{
free (server->retry_array);
server->retry_array = NULL;
}
/* set new addresses/ports */
if (addresses && addresses[0])
@ -370,6 +376,7 @@ irc_server_set_addresses (struct t_irc_server *server, const char *addresses)
",", 0, 0,
&server->addresses_count);
server->ports_array = malloc (server->addresses_count * sizeof (server->ports_array[0]));
server->retry_array = malloc (server->addresses_count * sizeof (server->retry_array[0]));
for (i = 0; i < server->addresses_count; i++)
{
pos = strchr (server->addresses_array[i], '/');
@ -386,6 +393,7 @@ irc_server_set_addresses (struct t_irc_server *server, const char *addresses)
{
server->ports_array[i] = IRC_SERVER_DEFAULT_PORT;
}
server->retry_array[i] = 0;
}
}
}
@ -401,8 +409,13 @@ irc_server_set_index_current_address (struct t_irc_server *server, int index)
{
free (server->current_address);
server->current_address = NULL;
/* copy current retry value before loading next server */
if (server->index_current_address < server->addresses_count)
server->retry_array[server->index_current_address] = server->current_retry;
}
server->current_port = 0;
server->current_retry = 0;
if (server->addresses_count > 0)
{
@ -410,6 +423,7 @@ irc_server_set_index_current_address (struct t_irc_server *server, int index)
server->index_current_address = index;
server->current_address = strdup (server->addresses_array[index]);
server->current_port = server->ports_array[index];
server->current_retry = server->retry_array[index];
}
}
@ -860,10 +874,12 @@ irc_server_alloc (const char *name)
new_server->addresses_count = 0;
new_server->addresses_array = NULL;
new_server->ports_array = NULL;
new_server->retry_array = NULL;
new_server->index_current_address = 0;
new_server->current_address = NULL;
new_server->current_ip = NULL;
new_server->current_port = 0;
new_server->current_retry = 0;
new_server->sock = -1;
new_server->hook_connect = NULL;
new_server->hook_fd = NULL;
@ -1331,6 +1347,8 @@ irc_server_free_data (struct t_irc_server *server)
weechat_string_free_split (server->addresses_array);
if (server->ports_array)
free (server->ports_array);
if (server->retry_array)
free (server->retry_array);
if (server->current_address)
free (server->current_address);
if (server->current_ip)
@ -3022,7 +3040,7 @@ irc_server_switch_address (struct t_irc_server *server, int connection)
*/
int
irc_server_connect_cb (void *data, int status, int gnutls_rc,
irc_server_connect_cb (void *data, int status, int gnutls_rc, int sock,
const char *error, const char *ip_address)
{
struct t_irc_server *server;
@ -3037,7 +3055,8 @@ irc_server_connect_cb (void *data, int status, int gnutls_rc,
switch (status)
{
case WEECHAT_HOOK_CONNECT_OK:
/* login to server */
/* set socket and IP */
server->sock = sock;
if (server->current_ip)
free (server->current_ip);
server->current_ip = (ip_address) ? strdup (ip_address) : NULL;
@ -3052,6 +3071,7 @@ irc_server_connect_cb (void *data, int status, int gnutls_rc,
1, 0, 0,
&irc_server_recv_cb,
server);
/* login to server */
irc_server_login (server);
break;
case WEECHAT_HOOK_CONNECT_ADDRESS_NOT_FOUND:
@ -3101,6 +3121,7 @@ irc_server_connect_cb (void *data, int status, int gnutls_rc,
error);
}
irc_server_close_connection (server);
server->current_retry++;
irc_server_switch_address (server, 1);
break;
case WEECHAT_HOOK_CONNECT_PROXY_ERROR:
@ -3147,6 +3168,7 @@ irc_server_connect_cb (void *data, int status, int gnutls_rc,
error);
}
irc_server_close_connection (server);
server->current_retry++;
irc_server_reconnect_schedule (server);
break;
case WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR:
@ -3176,6 +3198,7 @@ irc_server_connect_cb (void *data, int status, int gnutls_rc,
(void) gnutls_rc;
#endif
irc_server_close_connection (server);
server->current_retry++;
irc_server_switch_address (server, 1);
break;
case WEECHAT_HOOK_CONNECT_MEMORY_ERROR:
@ -3204,8 +3227,24 @@ irc_server_connect_cb (void *data, int status, int gnutls_rc,
error);
}
irc_server_close_connection (server);
server->current_retry++;
irc_server_switch_address (server, 1);
break;
case WEECHAT_HOOK_CONNECT_SOCKET_ERROR:
weechat_printf (server->buffer,
_("%s%s: unable to create socket"),
weechat_prefix ("error"), IRC_PLUGIN_NAME);
if (error && error[0])
{
weechat_printf (server->buffer,
_("%s%s: error: %s"),
weechat_prefix ("error"), IRC_PLUGIN_NAME,
error);
}
irc_server_close_connection (server);
server->current_retry++;
irc_server_reconnect_schedule (server);
break;
}
return WEECHAT_RC_OK;
@ -3618,7 +3657,7 @@ irc_server_gnutls_callback (void *data, gnutls_session_t tls_session,
int
irc_server_connect (struct t_irc_server *server)
{
int set, length, flags;
int length;
char *option_name;
struct t_config_option *proxy_type, *proxy_ipv6, *proxy_address, *proxy_port;
const char *proxy, *str_proxy_type, *str_proxy_address;
@ -3737,26 +3776,22 @@ irc_server_connect (struct t_irc_server *server)
if (proxy_type)
{
weechat_printf (server->buffer,
_("%s%s: connecting to server %s/%d%s%s via %s "
_("%s%s: connecting to server %s/%d%s via %s "
"proxy %s/%d%s..."),
weechat_prefix ("network"),
IRC_PLUGIN_NAME,
server->current_address,
server->current_port,
(IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_IPV6)) ?
" (IPv6)" : "",
(IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_SSL)) ?
" (SSL)" : "",
str_proxy_type,
str_proxy_address,
weechat_config_integer (proxy_port),
(weechat_config_boolean (proxy_ipv6)) ? " (IPv6)" : "");
weechat_log_printf (_("Connecting to server %s/%d%s%s via %s proxy "
weechat_log_printf (_("Connecting to server %s/%d%s via %s proxy "
"%s/%d%s..."),
server->current_address,
server->current_port,
(IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_IPV6)) ?
" (IPv6)" : "",
(IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_SSL)) ?
" (SSL)" : "",
str_proxy_type,
@ -3767,22 +3802,18 @@ irc_server_connect (struct t_irc_server *server)
else
{
weechat_printf (server->buffer,
_("%s%s: connecting to server %s/%d%s%s..."),
_("%s%s: connecting to server %s/%d%s..."),
weechat_prefix ("network"),
IRC_PLUGIN_NAME,
server->current_address,
server->current_port,
(IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_IPV6)) ?
" (IPv6)" : "",
(IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_SSL)) ?
" (SSL)" : "");
weechat_log_printf (_("%s%s: connecting to server %s/%d%s%s..."),
weechat_log_printf (_("%s%s: connecting to server %s/%d%s..."),
"",
IRC_PLUGIN_NAME,
server->current_address,
server->current_port,
(IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_IPV6)) ?
" (IPv6)" : "",
(IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_SSL)) ?
" (SSL)" : "");
}
@ -3790,55 +3821,6 @@ irc_server_connect (struct t_irc_server *server)
/* close connection if opened */
irc_server_close_connection (server);
/* create socket and set options */
if (proxy_type)
{
server->sock = socket ((weechat_config_integer (proxy_ipv6)) ?
AF_INET6 : AF_INET,
SOCK_STREAM, 0);
}
else
{
server->sock = socket ((IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_IPV6)) ?
AF_INET6 : AF_INET,
SOCK_STREAM, 0);
}
if (server->sock == -1)
{
weechat_printf (server->buffer,
_("%s%s: cannot create socket"),
weechat_prefix ("error"), IRC_PLUGIN_NAME);
return 0;
}
/* set SO_REUSEADDR option for socket */
set = 1;
if (setsockopt (server->sock, SOL_SOCKET, SO_REUSEADDR,
(void *) &set, sizeof (set)) == -1)
{
weechat_printf (server->buffer,
_("%s%s: cannot set socket option "
"\"SO_REUSEADDR\""),
weechat_prefix ("error"), IRC_PLUGIN_NAME);
}
/* set SO_KEEPALIVE option for socket */
set = 1;
if (setsockopt (server->sock, SOL_SOCKET, SO_KEEPALIVE,
(void *) &set, sizeof (set)) == -1)
{
weechat_printf (server->buffer,
_("%s%s: cannot set socket option "
"\"SO_KEEPALIVE\""),
weechat_prefix ("error"), IRC_PLUGIN_NAME);
}
/* set flag O_NONBLOCK on socket */
flags = fcntl (server->sock, F_GETFL);
if (flags == -1)
flags = 0;
fcntl (server->sock, F_SETFL, flags | O_NONBLOCK);
/* init SSL if asked and connect */
server->ssl_connected = 0;
#ifdef HAVE_GNUTLS
@ -3847,8 +3829,9 @@ irc_server_connect (struct t_irc_server *server)
server->hook_connect = weechat_hook_connect (proxy,
server->current_address,
server->current_port,
server->sock,
IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_IPV6),
proxy_type ? weechat_config_integer (proxy_ipv6)
: IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_IPV6),
server->current_retry,
(server->ssl_connected) ? &server->gnutls_sess : NULL,
(server->ssl_connected) ? irc_server_gnutls_callback : NULL,
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_SSL_DHKEY_SIZE),
@ -3860,7 +3843,9 @@ irc_server_connect (struct t_irc_server *server)
server->hook_connect = weechat_hook_connect (proxy,
server->current_address,
server->current_port,
server->sock,
proxy_type ? weechat_config_integer (proxy_ipv6)
: IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_IPV6),
server->current_retry,
IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_IPV6),
NULL, NULL, 0, NULL,
IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_LOCAL_HOSTNAME),
@ -3966,6 +3951,9 @@ irc_server_disconnect (struct t_irc_server *server, int switch_address,
IRC_PLUGIN_NAME);
}
if (reconnect)
server->current_retry++;
if (switch_address)
irc_server_switch_address (server, 0);
else
@ -4444,10 +4432,12 @@ irc_server_hdata_server_cb (void *data, const char *hdata_name)
WEECHAT_HDATA_VAR(struct t_irc_server, addresses_count, INTEGER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, addresses_array, STRING, 0, "addresses_count", NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, ports_array, INTEGER, 0, "addresses_count", NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, retry_array, INTEGER, 0, "addresses_count", NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, index_current_address, INTEGER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, current_address, STRING, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, current_ip, STRING, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, current_port, INTEGER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, current_retry, INTEGER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, sock, INTEGER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, hook_connect, POINTER, 0, NULL, "hook");
WEECHAT_HDATA_VAR(struct t_irc_server, hook_fd, POINTER, 0, NULL, "hook");
@ -4647,6 +4637,8 @@ irc_server_add_to_infolist (struct t_infolist *infolist,
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "current_port", server->current_port))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "current_retry", server->current_retry))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "sock", server->sock))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "is_connected", server->is_connected))
@ -4962,10 +4954,12 @@ irc_server_print_log ()
weechat_log_printf (" addresses_count. . . : %d", ptr_server->addresses_count);
weechat_log_printf (" addresses_array. . . : 0x%lx", ptr_server->addresses_array);
weechat_log_printf (" ports_array. . . . . : 0x%lx", ptr_server->ports_array);
weechat_log_printf (" retry_array. . . . . : 0x%lx", ptr_server->retry_array);
weechat_log_printf (" index_current_address: %d", ptr_server->index_current_address);
weechat_log_printf (" current_address. . . : '%s'", ptr_server->current_address);
weechat_log_printf (" current_ip . . . . . : '%s'", ptr_server->current_ip);
weechat_log_printf (" current_port . . . . : %d", ptr_server->current_port);
weechat_log_printf (" current_retry. . . . : %d", ptr_server->current_retry);
weechat_log_printf (" sock . . . . . . . . : %d", ptr_server->sock);
weechat_log_printf (" hook_connect . . . . : 0x%lx", ptr_server->hook_connect);
weechat_log_printf (" hook_fd. . . . . . . : 0x%lx", ptr_server->hook_fd);

View File

@ -1,5 +1,6 @@
/*
* Copyright (C) 2003-2012 Sebastien Helleu <flashcode@flashtux.org>
* Copyright (C) 2012 Simon Arlott
*
* This file is part of WeeChat, the extensible chat client.
*
@ -140,11 +141,14 @@ struct t_irc_server
int addresses_count; /* number of addresses */
char **addresses_array; /* addresses (after split) */
int *ports_array; /* ports for addresses */
int *retry_array; /* retry count per address */
int index_current_address; /* current address index in array */
char *current_address; /* current address */
char *current_ip; /* current IP address */
int current_port; /* current port */
int sock; /* socket for server (IPv4 or IPv6) */
int current_retry; /* current retry count (increment if a */
/* connected server fails in any way) */
int sock; /* socket for server */
struct t_hook *hook_connect; /* connection hook */
struct t_hook *hook_fd; /* hook for server socket */
struct t_hook *hook_timer_connection; /* timer for connection */

View File

@ -1,6 +1,7 @@
/*
* Copyright (C) 2006-2007 Emmanuel Bouthenot <kolter@openics.org>
* Copyright (C) 2006-2012 Sebastien Helleu <flashcode@flashtux.org>
* Copyright (C) 2012 Simon Arlott
*
* This file is part of WeeChat, the extensible chat client.
*
@ -2727,11 +2728,12 @@ weechat_lua_api_hook_process_hashtable (lua_State *L)
int
weechat_lua_api_hook_connect_cb (void *data, int status, int gnutls_rc,
const char *error, const char *ip_address)
int sock, const char *error,
const char *ip_address)
{
struct t_plugin_script_cb *script_callback;
void *func_argv[5];
char str_status[32], str_gnutls_rc[32];
void *func_argv[6];
char str_status[32], str_gnutls_rc[32], str_sock[32];
char empty_arg[1] = { '\0' };
int *rc, ret;
@ -2741,17 +2743,19 @@ weechat_lua_api_hook_connect_cb (void *data, int status, int gnutls_rc,
{
snprintf (str_status, sizeof (str_status), "%d", status);
snprintf (str_gnutls_rc, sizeof (str_gnutls_rc), "%d", gnutls_rc);
snprintf (str_sock, sizeof (str_sock), "%d", sock);
func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg;
func_argv[1] = str_status;
func_argv[2] = str_gnutls_rc;
func_argv[3] = (ip_address) ? (char *)ip_address : empty_arg;
func_argv[4] = (error) ? (char *)error : empty_arg;
func_argv[3] = str_sock;
func_argv[4] = (ip_address) ? (char *)ip_address : empty_arg;
func_argv[5] = (error) ? (char *)error : empty_arg;
rc = (int *) weechat_lua_exec (script_callback->script,
WEECHAT_SCRIPT_EXEC_INT,
script_callback->function,
"sssss", func_argv);
"ssssss", func_argv);
if (!rc)
ret = WEECHAT_RC_ERROR;
@ -2775,7 +2779,7 @@ static int
weechat_lua_api_hook_connect (lua_State *L)
{
const char *proxy, *address, *local_hostname, *function, *data;
int port, sock, ipv6;
int port, ipv6, retry;
char *result;
API_FUNC(1, "hook_connect", API_RETURN_EMPTY);
@ -2785,8 +2789,8 @@ weechat_lua_api_hook_connect (lua_State *L)
proxy = lua_tostring (lua_current_interpreter, -8);
address = lua_tostring (lua_current_interpreter, -7);
port = lua_tonumber (lua_current_interpreter, -6);
sock = lua_tonumber (lua_current_interpreter, -5);
ipv6 = lua_tonumber (lua_current_interpreter, -4);
ipv6 = lua_tonumber (lua_current_interpreter, -5);
retry = lua_tonumber (lua_current_interpreter, -4);
local_hostname = lua_tostring (lua_current_interpreter, -3);
function = lua_tostring (lua_current_interpreter, -2);
data = lua_tostring (lua_current_interpreter, -1);
@ -2796,8 +2800,8 @@ weechat_lua_api_hook_connect (lua_State *L)
proxy,
address,
port,
sock,
ipv6,
retry,
NULL, /* gnutls session */
NULL, /* gnutls callback */
0, /* gnutls DH key size */
@ -6233,6 +6237,16 @@ weechat_lua_api_constant_weechat_hook_connect_timeout (lua_State *L)
return 1;
}
static int
weechat_lua_api_constant_weechat_hook_connect_socket_error (lua_State *L)
{
/* make C compiler happy */
(void) L;
lua_pushnumber (lua_current_interpreter, WEECHAT_HOOK_CONNECT_SOCKET_ERROR);
return 1;
}
static int
weechat_lua_api_constant_weechat_hook_signal_string (lua_State *L)
{
@ -6496,6 +6510,7 @@ const struct luaL_Reg weechat_lua_api_funcs[] = {
{ "WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR", &weechat_lua_api_constant_weechat_hook_connect_gnutls_handshake_error },
{ "WEECHAT_HOOK_CONNECT_MEMORY_ERROR", &weechat_lua_api_constant_weechat_hook_connect_memory_error },
{ "WEECHAT_HOOK_CONNECT_TIMEOUT", &weechat_lua_api_constant_weechat_hook_connect_timeout },
{ "WEECHAT_HOOK_CONNECT_SOCKET_ERROR", &weechat_lua_api_constant_weechat_hook_connect_socket_error },
{ "WEECHAT_HOOK_SIGNAL_STRING", &weechat_lua_api_constant_weechat_hook_signal_string },
{ "WEECHAT_HOOK_SIGNAL_INT", &weechat_lua_api_constant_weechat_hook_signal_int },

View File

@ -1,6 +1,7 @@
/*
* Copyright (C) 2003-2012 Sebastien Helleu <flashcode@flashtux.org>
* Copyright (C) 2005-2008 Emmanuel Bouthenot <kolter@openics.org>
* Copyright (C) 2012 Simon Arlott
*
* This file is part of WeeChat, the extensible chat client.
*
@ -2561,11 +2562,12 @@ XS (XS_weechat_api_hook_process_hashtable)
int
weechat_perl_api_hook_connect_cb (void *data, int status, int gnutls_rc,
const char *error, const char *ip_address)
int sock, const char *error,
const char *ip_address)
{
struct t_plugin_script_cb *script_callback;
void *func_argv[5];
char str_status[32], str_gnutls_rc[32];
void *func_argv[6];
char str_status[32], str_gnutls_rc[32], str_sock[32];
char empty_arg[1] = { '\0' };
int *rc, ret;
@ -2575,17 +2577,19 @@ weechat_perl_api_hook_connect_cb (void *data, int status, int gnutls_rc,
{
snprintf (str_status, sizeof (str_status), "%d", status);
snprintf (str_gnutls_rc, sizeof (str_gnutls_rc), "%d", gnutls_rc);
snprintf (str_sock, sizeof (str_sock), "%d", sock);
func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg;
func_argv[1] = str_status;
func_argv[2] = str_gnutls_rc;
func_argv[3] = (ip_address) ? (char *)ip_address : empty_arg;
func_argv[4] = (error) ? (char *)error : empty_arg;
func_argv[3] = str_sock;
func_argv[4] = (ip_address) ? (char *)ip_address : empty_arg;
func_argv[5] = (error) ? (char *)error : empty_arg;
rc = (int *) weechat_perl_exec (script_callback->script,
WEECHAT_SCRIPT_EXEC_INT,
script_callback->function,
"sssss", func_argv);
"ssssss", func_argv);
if (!rc)
ret = WEECHAT_RC_ERROR;
@ -2625,8 +2629,8 @@ XS (XS_weechat_api_hook_connect)
proxy,
address,
SvIV (ST (2)), /* port */
SvIV (ST (3)), /* sock */
SvIV (ST (4)), /* ipv6 */
SvIV (ST (3)), /* ipv6 */
SvIV (ST (4)), /* retry */
NULL, /* gnutls session */
NULL, /* gnutls callback */
0, /* gnutls DH key size */
@ -5840,6 +5844,7 @@ weechat_perl_api_init (pTHX)
newCONSTSUB (stash, "weechat::WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR", newSViv (WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR));
newCONSTSUB (stash, "weechat::WEECHAT_HOOK_CONNECT_MEMORY_ERROR", newSViv (WEECHAT_HOOK_CONNECT_MEMORY_ERROR));
newCONSTSUB (stash, "weechat::WEECHAT_HOOK_CONNECT_TIMEOUT", newSViv (WEECHAT_HOOK_CONNECT_TIMEOUT));
newCONSTSUB (stash, "weechat::WEECHAT_HOOK_CONNECT_SOCKET_ERROR", newSViv (WEECHAT_HOOK_CONNECT_SOCKET_ERROR));
newCONSTSUB (stash, "weechat::WEECHAT_HOOK_SIGNAL_STRING", newSVpv (WEECHAT_HOOK_SIGNAL_STRING, PL_na));
newCONSTSUB (stash, "weechat::WEECHAT_HOOK_SIGNAL_INT", newSVpv (WEECHAT_HOOK_SIGNAL_INT, PL_na));

View File

@ -1,5 +1,6 @@
/*
* Copyright (C) 2003-2012 Sebastien Helleu <flashcode@flashtux.org>
* Copyright (C) 2012 Simon Arlott
*
* This file is part of WeeChat, the extensible chat client.
*
@ -694,12 +695,13 @@ struct t_hook *
plugin_script_api_hook_connect (struct t_weechat_plugin *weechat_plugin,
struct t_plugin_script *script,
const char *proxy, const char *address, int port,
int sock, int ipv6, void *gnutls_sess,
void *gnutls_cb, int gnutls_dhkey_size,
int ipv6, int retry,
void *gnutls_sess, void *gnutls_cb,
int gnutls_dhkey_size,
const char *gnutls_priorities,
const char *local_hostname,
int (*callback)(void *data, int status,
int gnutls_rc,
int gnutls_rc, int sock,
const char *error,
const char *ip_address),
const char *function,
@ -712,7 +714,7 @@ plugin_script_api_hook_connect (struct t_weechat_plugin *weechat_plugin,
if (!script_cb)
return NULL;
new_hook = weechat_hook_connect (proxy, address, port, sock, ipv6,
new_hook = weechat_hook_connect (proxy, address, port, ipv6, retry,
gnutls_sess, gnutls_cb, gnutls_dhkey_size,
gnutls_priorities, local_hostname,
callback, script_cb);

View File

@ -1,5 +1,6 @@
/*
* Copyright (C) 2003-2012 Sebastien Helleu <flashcode@flashtux.org>
* Copyright (C) 2012 Simon Arlott
*
* This file is part of WeeChat, the extensible chat client.
*
@ -180,8 +181,8 @@ extern struct t_hook *plugin_script_api_hook_connect (struct t_weechat_plugin *w
const char *proxy,
const char *address,
int port,
int sock,
int ipv6,
int retry,
void *gnutls_sess,
void *gnutls_cb,
int gnutls_dhkey_size,
@ -190,6 +191,7 @@ extern struct t_hook *plugin_script_api_hook_connect (struct t_weechat_plugin *w
int (*callback)(void *data,
int status,
int gnutls_rc,
int sock,
const char *error,
const char *ip_address),
const char *function,

View File

@ -1,6 +1,7 @@
/*
* Copyright (C) 2003-2012 Sebastien Helleu <flashcode@flashtux.org>
* Copyright (C) 2005-2007 Emmanuel Bouthenot <kolter@openics.org>
* Copyright (C) 2012 Simon Arlott
*
* This file is part of WeeChat, the extensible chat client.
*
@ -2674,11 +2675,12 @@ weechat_python_api_hook_process_hashtable (PyObject *self, PyObject *args)
int
weechat_python_api_hook_connect_cb (void *data, int status, int gnutls_rc,
const char *error, const char *ip_address)
int sock, const char *error,
const char *ip_address)
{
struct t_plugin_script_cb *script_callback;
void *func_argv[5];
char str_status[32], str_gnutls_rc[32], empty_arg[1] = { '\0' };
void *func_argv[6];
char str_status[32], str_gnutls_rc[32], str_sock[32], empty_arg[1] = { '\0' };
int *rc, ret;
script_callback = (struct t_plugin_script_cb *)data;
@ -2687,17 +2689,19 @@ weechat_python_api_hook_connect_cb (void *data, int status, int gnutls_rc,
{
snprintf (str_status, sizeof (str_status), "%d", status);
snprintf (str_gnutls_rc, sizeof (str_gnutls_rc), "%d", gnutls_rc);
snprintf (str_sock, sizeof (str_sock), "%d", sock);
func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg;
func_argv[1] = str_status;
func_argv[2] = str_gnutls_rc;
func_argv[3] = (ip_address) ? (char *)ip_address : empty_arg;
func_argv[4] = (error) ? (char *)error : empty_arg;
func_argv[3] = str_sock;
func_argv[4] = (ip_address) ? (char *)ip_address : empty_arg;
func_argv[5] = (error) ? (char *)error : empty_arg;
rc = (int *) weechat_python_exec (script_callback->script,
WEECHAT_SCRIPT_EXEC_INT,
script_callback->function,
"sssss", func_argv);
"ssssss", func_argv);
if (!rc)
ret = WEECHAT_RC_ERROR;
@ -2721,20 +2725,20 @@ static PyObject *
weechat_python_api_hook_connect (PyObject *self, PyObject *args)
{
char *proxy, *address, *local_hostname, *function, *data, *result;
int port, sock, ipv6;
int port, ipv6, retry;
PyObject *return_value;
API_FUNC(1, "hook_connect", API_RETURN_EMPTY);
proxy = NULL;
address = NULL;
port = 0;
sock = 0;
ipv6 = 0;
retry = 0;
local_hostname = NULL;
function = NULL;
data = NULL;
if (!PyArg_ParseTuple (args, "ssiiisss", &proxy, &address, &port, &sock,
&ipv6, &local_hostname, &function, &data))
if (!PyArg_ParseTuple (args, "ssiiisss", &proxy, &address, &port, &ipv6,
&retry, &local_hostname, &function, &data))
API_WRONG_ARGS(API_RETURN_EMPTY);
result = API_PTR2STR(plugin_script_api_hook_connect (weechat_python_plugin,
@ -2742,8 +2746,8 @@ weechat_python_api_hook_connect (PyObject *self, PyObject *args)
proxy,
address,
port,
sock,
ipv6,
retry,
NULL, /* gnutls session */
NULL, /* gnutls callback */
0, /* gnutls DH key size */

View File

@ -1,6 +1,7 @@
/*
* Copyright (C) 2003-2012 Sebastien Helleu <flashcode@flashtux.org>
* Copyright (C) 2005-2007 Emmanuel Bouthenot <kolter@openics.org>
* Copyright (C) 2012 Simon Arlott
*
* This file is part of WeeChat, the extensible chat client.
*
@ -547,6 +548,7 @@ void weechat_python_init_module_weechat ()
PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR", PyLong_FromLong((long) WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR));
PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_MEMORY_ERROR", PyLong_FromLong((long) WEECHAT_HOOK_CONNECT_MEMORY_ERROR));
PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_TIMEOUT", PyLong_FromLong((long) WEECHAT_HOOK_CONNECT_TIMEOUT));
PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_SOCKET_ERROR", PyLong_FromLong((long) WEECHAT_HOOK_CONNECT_SOCKET_ERROR));
PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_SIGNAL_STRING", PyUnicode_FromString(WEECHAT_HOOK_SIGNAL_STRING));
PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_SIGNAL_INT", PyUnicode_FromString(WEECHAT_HOOK_SIGNAL_INT));

View File

@ -1,6 +1,7 @@
/*
* Copyright (C) 2003-2012 Sebastien Helleu <flashcode@flashtux.org>
* Copyright (C) 2005-2007 Emmanuel Bouthenot <kolter@openics.org>
* Copyright (C) 2012 Simon Arlott
*
* This file is part of WeeChat, the extensible chat client.
*
@ -3056,11 +3057,12 @@ weechat_ruby_api_hook_process_hashtable (VALUE class, VALUE command,
int
weechat_ruby_api_hook_connect_cb (void *data, int status, int gnutls_rc,
const char *error, const char *ip_address)
int sock, const char *error,
const char *ip_address)
{
struct t_plugin_script_cb *script_callback;
void *func_argv[5];
char str_status[32], str_gnutls_rc[32];
void *func_argv[6];
char str_status[32], str_gnutls_rc[32], str_sock[32];
char empty_arg[1] = { '\0' };
int *rc, ret;
@ -3070,17 +3072,19 @@ weechat_ruby_api_hook_connect_cb (void *data, int status, int gnutls_rc,
{
snprintf (str_status, sizeof (str_status), "%d", status);
snprintf (str_gnutls_rc, sizeof (str_gnutls_rc), "%d", gnutls_rc);
snprintf (str_sock, sizeof (str_sock), "%d", sock);
func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg;
func_argv[1] = str_status;
func_argv[2] = str_gnutls_rc;
func_argv[3] = (ip_address) ? (char *)ip_address : empty_arg;
func_argv[4] = (error) ? (char *)error : empty_arg;
func_argv[3] = str_sock;
func_argv[4] = (ip_address) ? (char *)ip_address : empty_arg;
func_argv[5] = (error) ? (char *)error : empty_arg;
rc = (int *) weechat_ruby_exec (script_callback->script,
WEECHAT_SCRIPT_EXEC_INT,
script_callback->function,
"sssss", func_argv);
"ssssss", func_argv);
if (!rc)
ret = WEECHAT_RC_ERROR;
@ -3102,25 +3106,25 @@ weechat_ruby_api_hook_connect_cb (void *data, int status, int gnutls_rc,
static VALUE
weechat_ruby_api_hook_connect (VALUE class, VALUE proxy, VALUE address,
VALUE port, VALUE sock, VALUE ipv6,
VALUE port, VALUE ipv6, VALUE retry,
VALUE local_hostname, VALUE function,
VALUE data)
{
char *c_proxy, *c_address, *c_local_hostname, *c_function, *c_data, *result;
int c_port, c_sock, c_ipv6;
int c_port, c_ipv6, c_retry;
VALUE return_value;
API_FUNC(1, "hook_connect", API_RETURN_EMPTY);
if (NIL_P (proxy) || NIL_P (address) || NIL_P (port) || NIL_P (sock)
|| NIL_P (ipv6) || NIL_P (local_hostname) || NIL_P (function)
if (NIL_P (proxy) || NIL_P (address) || NIL_P (port) || NIL_P (ipv6)
|| NIL_P (retry) || NIL_P (local_hostname) || NIL_P (function)
|| NIL_P (data))
API_WRONG_ARGS(API_RETURN_EMPTY);
Check_Type (proxy, T_STRING);
Check_Type (address, T_STRING);
Check_Type (port, T_FIXNUM);
Check_Type (sock, T_FIXNUM);
Check_Type (ipv6, T_FIXNUM);
Check_Type (retry, T_FIXNUM);
Check_Type (local_hostname, T_STRING);
Check_Type (function, T_STRING);
Check_Type (data, T_STRING);
@ -3128,8 +3132,8 @@ weechat_ruby_api_hook_connect (VALUE class, VALUE proxy, VALUE address,
c_proxy = StringValuePtr (proxy);
c_address = StringValuePtr (address);
c_port = FIX2INT (port);
c_sock = FIX2INT (sock);
c_ipv6 = FIX2INT (ipv6);
c_retry = FIX2INT (retry);
c_local_hostname = StringValuePtr (local_hostname);
c_function = StringValuePtr (function);
c_data = StringValuePtr (data);
@ -3139,8 +3143,8 @@ weechat_ruby_api_hook_connect (VALUE class, VALUE proxy, VALUE address,
c_proxy,
c_address,
c_port,
c_sock,
c_ipv6,
c_retry,
NULL, /* gnutls session */
NULL, /* gnutls callback */
0, /* gnutls DH key size */
@ -6708,6 +6712,7 @@ weechat_ruby_api_init (VALUE ruby_mWeechat)
rb_define_const(ruby_mWeechat, "WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR", INT2NUM(WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR));
rb_define_const(ruby_mWeechat, "WEECHAT_HOOK_CONNECT_MEMORY_ERROR", INT2NUM(WEECHAT_HOOK_CONNECT_MEMORY_ERROR));
rb_define_const(ruby_mWeechat, "WEECHAT_HOOK_CONNECT_TIMEOUT", INT2NUM(WEECHAT_HOOK_CONNECT_TIMEOUT));
rb_define_const(ruby_mWeechat, "WEECHAT_HOOK_CONNECT_SOCKET_ERROR", INT2NUM(WEECHAT_HOOK_CONNECT_SOCKET_ERROR));
rb_define_const(ruby_mWeechat, "WEECHAT_HOOK_SIGNAL_STRING", rb_str_new2(WEECHAT_HOOK_SIGNAL_STRING));
rb_define_const(ruby_mWeechat, "WEECHAT_HOOK_SIGNAL_INT", rb_str_new2(WEECHAT_HOOK_SIGNAL_INT));

View File

@ -2,6 +2,7 @@
* Copyright (C) 2008-2010 Dmitry Kobylin <fnfal@academ.tsc.ru>
* Copyright (C) 2008 Julien Louis <ptitlouis@sysif.net>
* Copyright (C) 2008-2012 Sebastien Helleu <flashcode@flashtux.org>
* Copyright (C) 2012 Simon Arlott
*
* This file is part of WeeChat, the extensible chat client.
*
@ -2997,11 +2998,12 @@ weechat_tcl_api_hook_process_hashtable (ClientData clientData,
int
weechat_tcl_api_hook_connect_cb (void *data, int status, int gnutls_rc,
const char *error, const char *ip_address)
int sock, const char *error,
const char *ip_address)
{
struct t_plugin_script_cb *script_callback;
void *func_argv[5];
char str_status[32], str_gnutls_rc[32];
void *func_argv[6];
char str_status[32], str_gnutls_rc[32], str_sock[32];
char empty_arg[1] = { '\0' };
int *rc, ret;
@ -3011,17 +3013,19 @@ weechat_tcl_api_hook_connect_cb (void *data, int status, int gnutls_rc,
{
snprintf (str_status, sizeof (str_status), "%d", status);
snprintf (str_gnutls_rc, sizeof (str_gnutls_rc), "%d", gnutls_rc);
snprintf (str_sock, sizeof (str_sock), "%d", sock);
func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg;
func_argv[1] = str_status;
func_argv[2] = str_gnutls_rc;
func_argv[3] = (ip_address) ? (char *)ip_address : empty_arg;
func_argv[4] = (error) ? (char *)error : empty_arg;
func_argv[3] = str_sock;
func_argv[4] = (ip_address) ? (char *)ip_address : empty_arg;
func_argv[5] = (error) ? (char *)error : empty_arg;
rc = (int *) weechat_tcl_exec (script_callback->script,
WEECHAT_SCRIPT_EXEC_INT,
script_callback->function,
"sssss", func_argv);
"ssssss", func_argv);
if (!rc)
ret = WEECHAT_RC_ERROR;
@ -3047,15 +3051,15 @@ weechat_tcl_api_hook_connect (ClientData clientData, Tcl_Interp *interp,
{
Tcl_Obj *objp;
char *proxy, *address, *local_hostname, *function, *data, *result;
int i, port, sock, ipv6;
int i, port, ipv6, retry;
API_FUNC(1, "hook_connect", API_RETURN_EMPTY);
if (objc < 9)
API_WRONG_ARGS(API_RETURN_EMPTY);
if ((Tcl_GetIntFromObj (interp, objv[3], &port) != TCL_OK)
|| (Tcl_GetIntFromObj (interp, objv[4], &sock) != TCL_OK)
|| (Tcl_GetIntFromObj (interp, objv[5], &ipv6) != TCL_OK))
|| (Tcl_GetIntFromObj (interp, objv[4], &ipv6) != TCL_OK)
|| (Tcl_GetIntFromObj (interp, objv[5], &retry) != TCL_OK))
API_WRONG_ARGS(API_RETURN_EMPTY);
proxy = Tcl_GetStringFromObj (objv[1], &i);
@ -3069,8 +3073,8 @@ weechat_tcl_api_hook_connect (ClientData clientData, Tcl_Interp *interp,
proxy,
address,
port,
sock,
ipv6,
retry,
NULL, /* gnutls session */
NULL, /* gnutls callback */
0, /* gnutls DH key size */
@ -6464,6 +6468,8 @@ void weechat_tcl_api_init (Tcl_Interp *interp)
Tcl_SetVar (interp, "weechat::WEECHAT_HOOK_CONNECT_MEMORY_ERROR", Tcl_GetStringFromObj (objp, &i), 0);
Tcl_SetIntObj (objp, WEECHAT_HOOK_CONNECT_TIMEOUT);
Tcl_SetVar (interp, "weechat::WEECHAT_HOOK_CONNECT_TIMEOUT", Tcl_GetStringFromObj (objp, &i), 0);
Tcl_SetIntObj (objp, WEECHAT_HOOK_CONNECT_SOCKET_ERROR);
Tcl_SetVar (interp, "weechat::WEECHAT_HOOK_CONNECT_SOCKET_ERROR", Tcl_GetStringFromObj (objp, &i), 0);
Tcl_SetStringObj (objp, WEECHAT_HOOK_SIGNAL_STRING, -1);
Tcl_SetVar (interp, "weechat::WEECHAT_HOOK_SIGNAL_STRING", Tcl_GetStringFromObj (objp, &i), 0);

View File

@ -45,8 +45,12 @@ struct timeval;
* some functions in this file, then please update API version below.
*/
/* API version (used to check that plugin has same API and can be loaded) */
#define WEECHAT_PLUGIN_API_VERSION "20120827-01"
/*
* API version (used to check that plugin has same API and can be loaded):
* please change the date with current one; for a second change at same
* date, increment the 01, otherwise please keep 01.
*/
#define WEECHAT_PLUGIN_API_VERSION "20121014-01"
/* macros for defining plugin infos */
#define WEECHAT_PLUGIN_NAME(__name) \
@ -138,6 +142,7 @@ struct timeval;
#define WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR 7
#define WEECHAT_HOOK_CONNECT_MEMORY_ERROR 8
#define WEECHAT_HOOK_CONNECT_TIMEOUT 9
#define WEECHAT_HOOK_CONNECT_SOCKET_ERROR 10
/* action for gnutls callback: verify or set certificate */
#define WEECHAT_HOOK_CONNECT_GNUTLS_CB_VERIFY_CERT 0
@ -535,8 +540,8 @@ struct t_weechat_plugin
const char *proxy,
const char *address,
int port,
int sock,
int ipv6,
int retry,
void *gnutls_sess, void *gnutls_cb,
int gnutls_dhkey_size,
const char *gnutls_priorities,
@ -544,6 +549,7 @@ struct t_weechat_plugin
int (*callback)(void *data,
int status,
int gnutls_rc,
int sock,
const char *error,
const char *ip_address),
void *callback_data);
@ -1330,13 +1336,14 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin);
weechat_plugin->hook_process_hashtable(weechat_plugin, __command, \
__options, __timeout, \
__callback, __callback_data)
#define weechat_hook_connect(__proxy, __address, __port, __sock, \
__ipv6, __gnutls_sess, __gnutls_cb, \
#define weechat_hook_connect(__proxy, __address, __port, __ipv6, \
__retry, __gnutls_sess, __gnutls_cb, \
__gnutls_dhkey_size, __gnutls_priorities, \
__local_hostname, __callback, __data) \
__local_hostname, __callback, __data) \
weechat_plugin->hook_connect(weechat_plugin, __proxy, __address, \
__port, __sock, __ipv6, __gnutls_sess, \
__gnutls_cb, __gnutls_dhkey_size, \
__port, __ipv6, __retry, \
__gnutls_sess, __gnutls_cb, \
__gnutls_dhkey_size, \
__gnutls_priorities, __local_hostname, \
__callback, __data)
#define weechat_hook_print(__buffer, __tags, __msg, __strip__colors, \