38 |
#include <netinet/in.h> |
#include <netinet/in.h> |
39 |
#include <arpa/inet.h> |
#include <arpa/inet.h> |
40 |
#include <netdb.h> |
#include <netdb.h> |
41 |
|
|
42 |
|
#ifdef HAVE_GNUTLS |
43 |
#include <gnutls/gnutls.h> |
#include <gnutls/gnutls.h> |
44 |
|
#endif |
45 |
|
|
46 |
#include "../common/weechat.h" |
#include "../common/weechat.h" |
47 |
#include "irc.h" |
#include "irc.h" |
90 |
server->child_write = -1; |
server->child_write = -1; |
91 |
server->sock = -1; |
server->sock = -1; |
92 |
server->is_connected = 0; |
server->is_connected = 0; |
93 |
|
#ifdef HAVE_GNUTLS |
94 |
|
server->ssl_connected = 0; |
95 |
|
#endif |
96 |
server->unterminated_message = NULL; |
server->unterminated_message = NULL; |
97 |
server->nick = NULL; |
server->nick = NULL; |
98 |
server->reconnect_start = 0; |
server->reconnect_start = 0; |
389 |
if (!server) |
if (!server) |
390 |
return -1; |
return -1; |
391 |
|
|
392 |
if (server->ssl) |
#ifdef HAVE_GNUTLS |
393 |
|
if (server->ssl_connected) |
394 |
return gnutls_record_send (server->gnutls_sess, buffer, size_buf); |
return gnutls_record_send (server->gnutls_sess, buffer, size_buf); |
395 |
else |
else |
396 |
|
#endif |
397 |
return send (server->sock, buffer, size_buf, 0); |
return send (server->sock, buffer, size_buf, 0); |
398 |
} |
} |
399 |
|
|
668 |
if (!server) |
if (!server) |
669 |
return; |
return; |
670 |
|
|
671 |
if (server->ssl) |
#ifdef HAVE_GNUTLS |
672 |
|
if (server->ssl_connected) |
673 |
num_read = gnutls_record_recv (server->gnutls_sess, buffer, sizeof (buffer) - 2); |
num_read = gnutls_record_recv (server->gnutls_sess, buffer, sizeof (buffer) - 2); |
674 |
else |
else |
675 |
|
#endif |
676 |
num_read = recv (server->sock, buffer, sizeof (buffer) - 2, 0); |
num_read = recv (server->sock, buffer, sizeof (buffer) - 2, 0); |
677 |
|
|
678 |
if (num_read > 0) |
if (num_read > 0) |
731 |
/* close network socket */ |
/* close network socket */ |
732 |
if (server->sock != -1) |
if (server->sock != -1) |
733 |
{ |
{ |
734 |
if (server->ssl) |
#ifdef HAVE_GNUTLS |
735 |
|
if (server->ssl_connected) |
736 |
gnutls_bye (server->gnutls_sess, GNUTLS_SHUT_RDWR); |
gnutls_bye (server->gnutls_sess, GNUTLS_SHUT_RDWR); |
737 |
|
#endif |
738 |
close (server->sock); |
close (server->sock); |
739 |
server->sock = -1; |
server->sock = -1; |
740 |
if (server->ssl) |
#ifdef HAVE_GNUTLS |
741 |
|
if (server->ssl_connected) |
742 |
gnutls_deinit (server->gnutls_sess); |
gnutls_deinit (server->gnutls_sess); |
743 |
|
#endif |
744 |
} |
} |
745 |
|
|
746 |
/* free any pending message */ |
/* free any pending message */ |
752 |
|
|
753 |
/* server is now disconnected */ |
/* server is now disconnected */ |
754 |
server->is_connected = 0; |
server->is_connected = 0; |
755 |
|
#ifdef HAVE_GNUTLS |
756 |
|
server->ssl_connected = 0; |
757 |
|
#endif |
758 |
} |
} |
759 |
|
|
760 |
/* |
/* |
793 |
/* connection OK */ |
/* connection OK */ |
794 |
case '0': |
case '0': |
795 |
/* enable SSL if asked */ |
/* enable SSL if asked */ |
796 |
if (server->ssl) |
#ifdef HAVE_GNUTLS |
797 |
|
if (server->ssl_connected) |
798 |
{ |
{ |
799 |
gnutls_transport_set_ptr (server->gnutls_sess, (gnutls_transport_ptr) server->sock); |
gnutls_transport_set_ptr (server->gnutls_sess, (gnutls_transport_ptr) server->sock); |
800 |
if (gnutls_handshake (server->gnutls_sess) < 0) |
if (gnutls_handshake (server->gnutls_sess) < 0) |
808 |
return; |
return; |
809 |
} |
} |
810 |
} |
} |
811 |
|
#endif |
812 |
/* kill child and login to server */ |
/* kill child and login to server */ |
813 |
server_kill_child (server); |
server_kill_child (server); |
814 |
irc_login (server); |
irc_login (server); |
897 |
{ |
{ |
898 |
int child_pipe[2], set; |
int child_pipe[2], set; |
899 |
pid_t pid; |
pid_t pid; |
900 |
|
#ifdef HAVE_GNUTLS |
901 |
const int cert_type_prio[] = { GNUTLS_CRT_X509, GNUTLS_CRT_OPENPGP, 0 }; |
const int cert_type_prio[] = { GNUTLS_CRT_X509, GNUTLS_CRT_OPENPGP, 0 }; |
902 |
|
#endif |
903 |
|
|
904 |
|
#ifndef HAVE_GNUTLS |
905 |
|
if (server->ssl) |
906 |
|
{ |
907 |
|
irc_display_prefix (server->buffer, PREFIX_ERROR); |
908 |
|
gui_printf (server->buffer, |
909 |
|
_("%s cannot connect with SSL since WeeChat was not built " |
910 |
|
"with GNUtls support\n"), WEECHAT_ERROR); |
911 |
|
return 0; |
912 |
|
} |
913 |
|
#endif |
914 |
irc_display_prefix (server->buffer, PREFIX_INFO); |
irc_display_prefix (server->buffer, PREFIX_INFO); |
915 |
gui_printf (server->buffer, |
gui_printf (server->buffer, |
916 |
_("%s: connecting to %s:%d%s...\n"), |
_("%s: connecting to %s:%d%s...\n"), |
924 |
server_close_connection (server); |
server_close_connection (server); |
925 |
|
|
926 |
/* init SSL if asked */ |
/* init SSL if asked */ |
927 |
|
#ifdef HAVE_GNUTLS |
928 |
|
server->ssl_connected = 0; |
929 |
if (server->ssl) |
if (server->ssl) |
930 |
{ |
{ |
931 |
if (gnutls_init (&server->gnutls_sess, GNUTLS_CLIENT) != 0) |
if (gnutls_init (&server->gnutls_sess, GNUTLS_CLIENT) != 0) |
938 |
gnutls_set_default_priority (server->gnutls_sess); |
gnutls_set_default_priority (server->gnutls_sess); |
939 |
gnutls_certificate_type_set_priority (server->gnutls_sess, cert_type_prio); |
gnutls_certificate_type_set_priority (server->gnutls_sess, cert_type_prio); |
940 |
gnutls_credentials_set (server->gnutls_sess, GNUTLS_CRD_CERTIFICATE, gnutls_xcred); |
gnutls_credentials_set (server->gnutls_sess, GNUTLS_CRD_CERTIFICATE, gnutls_xcred); |
941 |
|
server->ssl_connected = 1; |
942 |
} |
} |
943 |
|
#endif |
944 |
|
|
945 |
/* create pipe for child process */ |
/* create pipe for child process */ |
946 |
if (pipe (child_pipe) < 0) |
if (pipe (child_pipe) < 0) |