diff options
| author | erdgeist <> | 2003-12-13 11:44:33 +0000 |
|---|---|---|
| committer | erdgeist <> | 2003-12-13 11:44:33 +0000 |
| commit | dc6e7bc1160c777a0464de1985501a4e4a046b1e (patch) | |
| tree | 349a3997e80b163cbb41dbc70ceddc3e6b845b79 /vchat-protocol.c | |
| parent | 56453afa766ac8bf74e04d630d06ca2119e7b538 (diff) | |
Experimental V6 support
Diffstat (limited to 'vchat-protocol.c')
| -rwxr-xr-x | vchat-protocol.c | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/vchat-protocol.c b/vchat-protocol.c index f1e8b5c..03161e0 100755 --- a/vchat-protocol.c +++ b/vchat-protocol.c | |||
| @@ -83,7 +83,7 @@ unsigned char *encoding; | |||
| 83 | 83 | ||
| 84 | /* connects to server */ | 84 | /* connects to server */ |
| 85 | int | 85 | int |
| 86 | vcconnect (unsigned char *server, unsigned int port) | 86 | vcconnect (unsigned char *server, unsigned char *port) |
| 87 | { | 87 | { |
| 88 | /* used for tilde expansion of cert & key filenames */ | 88 | /* used for tilde expansion of cert & key filenames */ |
| 89 | unsigned char *tildex = NULL; | 89 | unsigned char *tildex = NULL; |
| @@ -98,10 +98,16 @@ vcconnect (unsigned char *server, unsigned int port) | |||
| 98 | EVP_PKEY *certpubkey = NULL; | 98 | EVP_PKEY *certpubkey = NULL; |
| 99 | /* temporary result */ | 99 | /* temporary result */ |
| 100 | int result; | 100 | int result; |
| 101 | #ifndef EXPERIMENTAL_IPV6 | ||
| 101 | /* servers hostentry */ | 102 | /* servers hostentry */ |
| 102 | struct hostent *serverhe; | 103 | struct hostent *serverhe; |
| 103 | /* servers sockaddr */ | 104 | /* servers sockaddr */ |
| 104 | struct sockaddr_in serversi; | 105 | struct sockaddr_in serversi; |
| 106 | int portnr = strtoul(port,NULL,10); | ||
| 107 | #else | ||
| 108 | /* protocol independent server addresses */ | ||
| 109 | struct addrinfo hints, *addr, *tmpaddr; | ||
| 110 | #endif | ||
| 105 | /* SSL-context */ | 111 | /* SSL-context */ |
| 106 | SSL_CTX *sslctx = NULL; | 112 | SSL_CTX *sslctx = NULL; |
| 107 | /* SSL server certificate */ | 113 | /* SSL server certificate */ |
| @@ -115,6 +121,7 @@ vcconnect (unsigned char *server, unsigned int port) | |||
| 115 | /* variable for verify return */ | 121 | /* variable for verify return */ |
| 116 | long verify; | 122 | long verify; |
| 117 | 123 | ||
| 124 | #ifndef EXPERIMENTAL_IPV6 | ||
| 118 | /* get host-entry for server */ | 125 | /* get host-entry for server */ |
| 119 | if ((serverhe = gethostbyname (server)) == NULL) | 126 | if ((serverhe = gethostbyname (server)) == NULL) |
| 120 | return 0; | 127 | return 0; |
| @@ -125,13 +132,35 @@ vcconnect (unsigned char *server, unsigned int port) | |||
| 125 | 132 | ||
| 126 | /* initialize datastructure for connect */ | 133 | /* initialize datastructure for connect */ |
| 127 | serversi.sin_family = AF_INET; | 134 | serversi.sin_family = AF_INET; |
| 128 | serversi.sin_port = htons (port); | 135 | serversi.sin_port = htons(portnr); |
| 129 | serversi.sin_addr = *((struct in_addr *) serverhe->h_addr); | 136 | serversi.sin_addr = *((struct in_addr *) serverhe->h_addr); |
| 130 | memset (&(serversi.sin_zero), 0, 8); | 137 | memset (&(serversi.sin_zero), 0, 8); |
| 131 | 138 | ||
| 132 | /* attempt connect */ | 139 | /* attempt connect */ |
| 133 | if (connect (serverfd, (struct sockaddr *) &serversi, sizeof (struct sockaddr)) == -1) | 140 | if (connect (serverfd, (struct sockaddr *) &serversi, sizeof (struct sockaddr)) == -1) |
| 134 | return 0; | 141 | return 0; |
| 142 | #else | ||
| 143 | memset( &hints, 0, sizeof(hints)); | ||
| 144 | /* Expect v4 and v6 */ | ||
| 145 | hints.ai_family = PF_UNSPEC; | ||
| 146 | hints.ai_socktype = SOCK_STREAM; | ||
| 147 | if( getaddrinfo( server, port, &hints, &addr )) | ||
| 148 | return 0; | ||
| 149 | for( tmpaddr = addr; addr; addr = addr->ai_next ) | ||
| 150 | { | ||
| 151 | if( (serverfd = socket( addr->ai_family, addr->ai_socktype, addr->ai_protocol)) < 0) | ||
| 152 | continue; | ||
| 153 | if( connect( serverfd, addr->ai_addr, addr->ai_addrlen ) < 0) | ||
| 154 | { | ||
| 155 | close( serverfd ); | ||
| 156 | continue; | ||
| 157 | } | ||
| 158 | break; | ||
| 159 | } | ||
| 160 | if( serverfd < 0 ) | ||
| 161 | return 0; | ||
| 162 | freeaddrinfo( tmpaddr ); | ||
| 163 | #endif | ||
| 135 | 164 | ||
| 136 | /* inform user */ | 165 | /* inform user */ |
| 137 | snprintf (tmpstr, TMPSTRSIZE, getformatstr(FS_CONNECTED), server, port); | 166 | snprintf (tmpstr, TMPSTRSIZE, getformatstr(FS_CONNECTED), server, port); |
| @@ -537,7 +566,7 @@ justloggedin (unsigned char *message) | |||
| 537 | setstroption(CF_NICK,str1); | 566 | setstroption(CF_NICK,str1); |
| 538 | 567 | ||
| 539 | /* show change in console window */ | 568 | /* show change in console window */ |
| 540 | snprintf (consolestr, CONSOLESTRSIZE, getformatstr(FS_CONSOLE), nick, getstroption (CF_SERVERHOST), getintoption (CF_SERVERPORT)); | 569 | snprintf (consolestr, CONSOLESTRSIZE, getformatstr(FS_CONSOLE), nick, getstroption (CF_SERVERHOST), getstroption (CF_SERVERPORT)); |
| 541 | consoleline (NULL); | 570 | consoleline (NULL); |
| 542 | 571 | ||
| 543 | /* announce login as servermessage */ | 572 | /* announce login as servermessage */ |
