Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
BitchX
GitHub Repository: BitchX/BitchX1.3
Path: blob/master/contrib/BitchX-1.0c14-IPv6-2.patch
1069 views
1
diff -uNr BitchX.orig/source/banlist.c BitchX/source/banlist.c
2
--- BitchX.orig/source/banlist.c Wed Nov 17 09:03:44 1999
3
+++ BitchX/source/banlist.c Mon Dec 27 18:28:50 1999
4
@@ -237,6 +237,7 @@
5
switch(*p)
6
{
7
case '.':
8
+ case ':':
9
case '*':
10
case '@':
11
case '!':
12
diff -uNr BitchX.orig/source/commands.c BitchX/source/commands.c
13
--- BitchX.orig/source/commands.c Fri Dec 17 11:30:38 1999
14
+++ BitchX/source/commands.c Mon Dec 27 18:28:50 1999
15
@@ -2529,16 +2529,25 @@
16
BUILT_IN_COMMAND(e_hostname)
17
{
18
struct hostent *hp;
19
+ int norev = 0;
20
+
21
+ if (args && !strcasecmp(args, "-norev"))
22
+ {
23
+ norev = 1;
24
+ next_arg(args, &args);
25
+ }
26
27
if (args && *args && *args != '#')
28
{
29
int reconn = 0;
30
+
31
if (LocalHostName && strcmp(LocalHostName, args))
32
reconn = 1;
33
malloc_strcpy(&LocalHostName, args);
34
+#ifndef IPV6
35
if ((hp = gethostbyname(LocalHostName)))
36
- memcpy((void *)&LocalHostAddr, hp->h_addr, sizeof(LocalHostAddr));
37
-
38
+ memcpy((void *)&LocalHostAddr.sf_addr, hp->h_addr, sizeof(struct in_addr));
39
+#endif
40
bitchsay("Local host name is now %s", LocalHostName);
41
if (reconn)
42
reconnect_cmd(NULL, NULL, NULL, NULL);
43
@@ -2597,12 +2606,35 @@
44
while((fgets(comm, 200, fptr)))
45
{
46
#if defined(__linux__)
47
+
48
+#ifdef IPV6
49
+ if (strstr(comm, "inet6 addr") || strstr(comm, "inet addr"))
50
+ {
51
+ /* inet addr:127.0.0.1 Mask:... */
52
+ /* inet6 addr: ::1/128 Scope:... */
53
+
54
+ if ((p = strstr(comm, "inet6 addr")))
55
+ {
56
+ p += 12;
57
+ q = strchr(p, '/');
58
+ }
59
+ else
60
+ {
61
+ p = strstr(comm, "inet addr") + 10;
62
+ q = strchr(p, ' ');
63
+ }
64
+ *q = 0;
65
+
66
+ if (p && (!*p || !strcmp(p, "127.0.0.1") || !strcmp(p, "::1") || !strncmp(p, "fe80:", 5) || !strncmp(p, "ff80:", 5))) continue;
67
+#else
68
if ((p = strstr(comm, "inet addr")))
69
{
70
p += 10;
71
q = strchr(p, ' ');
72
*q = 0;
73
if ((p && !*p) || (p && !strcmp(p, "127.0.0.1"))) continue;
74
+#endif
75
+
76
#elif _BSDI_VERSION < 199701
77
if (!strncmp(comm, device, strlen(device)))
78
{
79
@@ -2620,13 +2652,37 @@
80
*q = 0;
81
if ((p && !*p) || (p && !strcmp(p, "127.0.0.1"))) continue;
82
#endif
83
- ip = inet_addr(p);
84
- if ((host = gethostbyaddr((char *)&ip, sizeof(ip), AF_INET)))
85
+
86
+#ifdef IPV6
87
{
88
+ char vhost[128], vip[128];
89
+ struct sockaddr_foobar sf;
90
+
91
+ if (inet_pton(AF_INET6, p, &sf.sf_addr6))
92
+ sf.sf_family = AF_INET6;
93
+ else
94
+ {
95
+ inet_pton(AF_INET, p, &sf.sf_addr);
96
+ sf.sf_family = AF_INET;
97
+ }
98
+
99
new = (Virtuals *) new_malloc(sizeof(Virtuals));
100
- new->hostname = m_strdup(host->h_name);
101
+ if (!norev && !getnameinfo((struct sockaddr*) &sf, sizeof(sf), vhost, 128, NULL, 0, 0))
102
+ new->hostname = m_strdup(vhost);
103
+ else
104
+ new->hostname = m_strdup(inet_ntop(sf.sf_family, (sf.sf_family == AF_INET) ? (void*)&sf.sf_addr : (void*)&sf.sf_addr6, vhost, 128));
105
add_to_list((List **)&virtuals, (List *)new);
106
+
107
}
108
+#else
109
+ new = (Virtuals *) new_malloc(sizeof(Virtuals));
110
+ ip = inet_addr(p);
111
+ if (!norev && (host = gethostbyaddr((char *)&ip, sizeof(ip), AF_INET)))
112
+ new->hostname = m_strdup(host->h_name);
113
+ else
114
+ new->hostname = m_strdup(p);
115
+ add_to_list((List **)&virtuals, (List *)new);
116
+#endif
117
118
}
119
}
120
@@ -2652,9 +2708,10 @@
121
if (newhost)
122
{
123
malloc_strcpy(&LocalHostName, newhost);
124
+#ifndef IPV6
125
if ((hp = gethostbyname(LocalHostName)))
126
- memcpy((void *)&LocalHostAddr, hp->h_addr, sizeof(LocalHostAddr));
127
-
128
+ memcpy((void *)&LocalHostAddr.sf_addr, hp->h_addr, sizeof(struct in_addr));
129
+#endif
130
bitchsay("Local host name is now [%s]", LocalHostName);
131
new_free(&newhost);
132
reconnect_cmd(NULL, NULL, NULL, NULL);
133
@@ -2671,8 +2728,7 @@
134
selectflag = -1;
135
int oldbufsize,
136
bufsize = sizeof(struct ifreq);
137
-
138
-
139
+
140
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
141
{
142
error("ifconfig: socket %s", strerror(errno));
143
diff -uNr BitchX.orig/source/dcc.c BitchX/source/dcc.c
144
--- BitchX.orig/source/dcc.c Wed Dec 8 06:55:53 1999
145
+++ BitchX/source/dcc.c Mon Dec 27 18:28:50 1999
146
@@ -160,13 +160,13 @@
147
148
#if 0
149
/* sock num, type, address, port */
150
-int (*dcc_open_func) (int, int, unsigned long, int) = NULL;
151
+int (*dcc_open_func) (int, int, struct sockaddr_foobar, int) = NULL;
152
/* type, sock num, buffer, buff_len */
153
int (*dcc_output_func) (int, int, char *, int) = NULL;
154
/* sock num, type, buffer, new line, len buffer */
155
int (*dcc_input_func) (int, int, char *, int, int) = NULL;
156
/* socket num, address, port */
157
-int (*dcc_close_func) (int, unsigned long, int) = NULL;
158
+int (*dcc_close_func) (int, sockaddr_foobar, int) = NULL;
159
#endif
160
161
162
@@ -485,7 +485,7 @@
163
DCC_int *dcc_create(char *nick, char *filename, char *passwd, unsigned long filesize, int port, int type, unsigned long flags, void (*func)(int))
164
{
165
166
-struct in_addr myip;
167
+struct sockaddr_foobar myip, blah;
168
int ofs = from_server;
169
int s;
170
DCC_int *new = NULL;
171
@@ -497,11 +497,16 @@
172
if (from_server == -1)
173
return NULL;
174
if (get_int_var(DCC_USE_GATEWAY_ADDR_VAR))
175
- myip.s_addr = get_server_uh_addr(from_server).s_addr;
176
+ blah = get_server_uh_addr(from_server);
177
else
178
- myip.s_addr = get_server_local_addr(from_server).s_addr;
179
+ blah = get_server_local_addr(from_server);
180
+ memcpy(&myip, &blah, sizeof(struct sockaddr_foobar));
181
+
182
if (use_nat_address)
183
- myip.s_addr = nat_address.s_addr;
184
+ {
185
+ myip.sf_family = AF_INET;
186
+ myip.sf_addr.s_addr = nat_address.s_addr;
187
+ }
188
189
set_display_target(NULL, LOG_DCC);
190
if ( ((new_i = find_dcc_pending(nick, filename, NULL, type, 1, -1)) && new_i->sock.flags & DCC_OFFER) || (flags & DCC_OFFER))
191
@@ -654,7 +659,7 @@
192
}
193
else
194
#endif
195
- send_ctcp_booster(nick, Type, file, ntohl(myip.s_addr), portnum, filesize);
196
+ send_ctcp_booster(nick, Type, file, ntohl(myip.sf_addr.s_addr), portnum, filesize);
197
if (!doing_multi && !dcc_quiet)
198
{
199
if (filesize)
200
@@ -1458,7 +1463,7 @@
201
{
202
send_ctcp_booster(nick,
203
dcc_types[DCC_CHAT]->name, "chat",
204
- htonl(get_int_var(DCC_USE_GATEWAY_ADDR_VAR) ? get_server_uh_addr(from_server).s_addr : get_server_local_addr(from_server).s_addr),
205
+ htonl(get_int_var(DCC_USE_GATEWAY_ADDR_VAR) ? get_server_uh_addr(from_server).sf_addr.s_addr : get_server_local_addr(from_server).sf_addr.s_addr),
206
htons(s->port), new->filesize);
207
add_sockettimeout(s->is_read, 120, NULL);
208
}
209
@@ -1836,7 +1841,7 @@
210
new = (DCC_int *)s->info;
211
if (s->flags & DCC_WAIT)
212
{
213
- send_ctcp_booster(nick, dcc_types[type]->name, filebuf, htonl(get_server_local_addr(from_server).s_addr), htons(s->port), new->filesize);
214
+ send_ctcp_booster(nick, dcc_types[type]->name, filebuf, htonl(get_server_local_addr(from_server).sf_addr.s_addr), htons(s->port), new->filesize);
215
add_sockettimeout(s->is_read, 120, NULL);
216
}
217
continue;
218
@@ -1879,7 +1884,7 @@
219
new = (DCC_int *)s->info;
220
if (s->flags & DCC_WAIT)
221
{
222
- send_ctcp_booster(nick, dcc_types[type]->name, FileBuf, htonl(get_server_local_addr(from_server).s_addr), htons(s->port), new->filesize);
223
+ send_ctcp_booster(nick, dcc_types[type]->name, FileBuf, htonl(get_server_local_addr(from_server).sf_addr.s_addr), htons(s->port), new->filesize);
224
add_sockettimeout(s->is_read, 120, NULL);
225
}
226
return;
227
diff -uNr BitchX.orig/source/functions.c BitchX/source/functions.c
228
--- BitchX.orig/source/functions.c Sun Dec 19 12:36:49 1999
229
+++ BitchX/source/functions.c Mon Dec 27 18:44:52 1999
230
@@ -428,6 +428,10 @@
231
static char * function_menucontrol (char *, char *);
232
#endif
233
234
+#ifdef IPV6
235
+static char * function_ipv6 (char *, char *);
236
+#endif
237
+
238
#undef BUILT_IN_FUNCTION
239
#define BUILT_IN_FUNCTION(x, y) static char * x (char *fn, char * y)
240
241
@@ -549,6 +553,9 @@
242
{ "INSERTW", function_insertw },
243
{ "IPLONG", function_iplong },
244
{ "IPTONAME", function_iptoname },
245
+#ifdef IPV6
246
+ { "IPV6", function_ipv6 },
247
+#endif
248
{ "IRCLIB", function_irclib },
249
{ "ISALNUM", function_isalnum },
250
{ "ISALPHA", function_isalpha },
251
@@ -7326,3 +7333,9 @@
252
RETURN_EMPTY;
253
}
254
255
+#ifdef IPV6
256
+BUILT_IN_FUNCTION(function_ipv6, input)
257
+{
258
+ RETURN_INT(1);
259
+}
260
+#endif
261
\ No newline at end of file
262
diff -uNr BitchX.orig/source/irc.c BitchX/source/irc.c
263
--- BitchX.orig/source/irc.c Thu Dec 16 12:05:39 1999
264
+++ BitchX/source/irc.c Mon Dec 27 18:28:50 1999
265
@@ -127,8 +127,8 @@
266
* between an incorrect password generated by
267
* an oper() command and one generated when
268
* connecting to a new server */
269
- struct in_addr MyHostAddr; /* The local machine address */
270
- struct in_addr LocalHostAddr;
271
+ struct sockaddr_foobar MyHostAddr; /* The local machine address */
272
+ struct sockaddr_foobar LocalHostAddr;
273
char *LocalHostName = NULL;
274
275
276
@@ -939,7 +939,7 @@
277
}
278
else
279
{
280
- if (!strchr(argv[ac], '.'))
281
+ if (!strchr(argv[ac], '.') && !strchr(argv[ac], ','))
282
strmcpy(nickname, argv[ac], NICKNAME_LEN);
283
else
284
build_server_list(argv[ac]);
285
@@ -1081,14 +1081,16 @@
286
if (LocalHostName)
287
{
288
printf("Your hostname appears to be [%s]\n", LocalHostName);
289
+#ifndef IPV6
290
memset((void *)&LocalHostAddr, 0, sizeof(LocalHostAddr));
291
if ((hp = gethostbyname(LocalHostName)))
292
- memcpy((void *)&LocalHostAddr, hp->h_addr, sizeof(LocalHostAddr));
293
+ memcpy((void *)&LocalHostAddr.sf_addr, hp->h_addr, sizeof(struct in_addr));
294
}
295
else
296
{
297
if ((hp = gethostbyname(hostname)))
298
- memcpy((char *) &MyHostAddr, hp->h_addr, sizeof(MyHostAddr));
299
+ memcpy((char *) &MyHostAddr.sf_addr, hp->h_addr, sizeof(struct in_addr));
300
+#endif
301
}
302
303
if (!nickname || !*nickname)
304
diff -uNr BitchX.orig/source/ircaux.c BitchX/source/ircaux.c
305
--- BitchX.orig/source/ircaux.c Sat Dec 4 01:52:17 1999
306
+++ BitchX/source/ircaux.c Mon Dec 27 18:28:50 1999
307
@@ -2400,7 +2400,7 @@
308
309
if (!bang && !at)
310
{
311
- if (strchr(mystuff, '.'))
312
+ if (strchr(mystuff, '.') || strchr(mystuff, ':'))
313
myhost = mystuff;
314
else
315
{
316
diff -uNr BitchX.orig/source/misc.c BitchX/source/misc.c
317
--- BitchX.orig/source/misc.c Mon Dec 13 00:43:27 1999
318
+++ BitchX/source/misc.c Mon Dec 27 18:28:50 1999
319
@@ -3566,22 +3566,37 @@
320
static void handle_socket_connect(int rc)
321
{
322
struct servent *serv;
323
-struct sockaddr_in addr;
324
+struct sockaddr_foobar addr;
325
struct hostent *host;
326
+char buf[128], *hostname = buf;
327
int address_len;
328
329
- address_len = sizeof(struct sockaddr_in);
330
+ address_len = sizeof(struct sockaddr_foobar);
331
if ((getpeername(rc, (struct sockaddr *) &addr, &address_len)) != -1)
332
{
333
- serv = getservbyport(addr.sin_port,"tcp");
334
- address_len = sizeof(addr.sin_addr);
335
- host = gethostbyaddr((char *)&addr.sin_addr, address_len, AF_INET);
336
- put_it("Hostname %s:%s port %d is running (%s)", host->h_name, inet_ntoa(addr.sin_addr), htons(addr.sin_port), serv == NULL? "UNKNOWN":serv->s_name);
337
+ serv = getservbyport(addr.sf_port,"tcp");
338
+ strcpy(hostname, "unknown");
339
+ if (addr.sf_family == AF_INET)
340
+ {
341
+ address_len = sizeof(struct in_addr);
342
+ if ((host = gethostbyaddr((char *)&addr.sf_addr, address_len, AF_INET)))
343
+ hostname = host->h_name;
344
+ else
345
+ hostname = inet_ntoa(addr.sf_addr);
346
+ }
347
+#ifdef IPV6
348
+ else
349
+ {
350
+ if (getnameinfo((struct sockaddr*) &addr, sizeof(struct sockaddr_foobar), hostname, 128, NULL, 0, 0))
351
+ hostname = inet_ntop(AF_INET6, (void*) &(addr.sf_addr6), buf, 128);
352
+ }
353
+#endif
354
+ put_it("Hostname %s port %d is running (%s)", hostname, htons(addr.sf_port), serv == NULL? "UNKNOWN":serv->s_name);
355
}
356
close_socketread(rc);
357
}
358
359
-static int scan(char *remote_host, int low_port, int high_port, struct hostent *host)
360
+static int scan(char *remote_host, int low_port, int high_port, struct sockaddr_foobar *host)
361
{
362
unsigned short int port;
363
int rc;
364
@@ -3604,7 +3619,7 @@
365
char *t;
366
int low_port = 0,
367
high_port = 0;
368
-struct hostent *host;
369
+struct sockaddr_foobar *host; /* gee, and what's this one for? */
370
371
if (!stuff || !stuff->nick || !nick || !strcmp(stuff->user, "<UNKNOWN>") || my_stricmp(stuff->nick, nick))
372
{
373
@@ -3630,7 +3645,7 @@
374
char *remote_host;
375
int low_port = 6660;
376
int high_port = 7000;
377
-struct hostent *host;
378
+struct sockaddr_foobar *host;
379
380
381
if (args && *args)
382
@@ -3649,7 +3664,7 @@
383
else
384
high_port = low_port;
385
}
386
- if (strchr(remote_host, '.'))
387
+ if (strchr(remote_host, '.') || strchr(remote_host, ':'))
388
{
389
if ((host = resolv(remote_host)))
390
{
391
diff -uNr BitchX.orig/source/network.c BitchX/source/network.c
392
--- BitchX.orig/source/network.c Wed Dec 8 19:56:03 1999
393
+++ BitchX/source/network.c Mon Dec 27 18:28:50 1999
394
@@ -14,6 +14,8 @@
395
#include "output.h"
396
#include "vars.h"
397
398
+#include "struct.h"
399
+
400
#ifdef HAVE_SYS_UN_H
401
#include <sys/un.h>
402
#endif
403
@@ -391,6 +393,7 @@
404
#else
405
sock_type = AF_INET;
406
#endif
407
+
408
proto_type = (protocol == PROTOCOL_TCP) ? SOCK_STREAM : SOCK_DGRAM;
409
410
if ((fd = socket(sock_type, proto_type, 0)) < 0)
411
@@ -446,14 +449,22 @@
412
#ifdef IP_PORTRANGE
413
int ports;
414
#endif
415
- struct sockaddr_in name;
416
+ struct sockaddr_foobar name;
417
+#ifdef IPV6
418
+ struct in6_addr any = { IN6ADDR_ANY_INIT };
419
+
420
+ memset(&name, 0, sizeof(struct sockaddr_foobar));
421
+ name.sf_family = AF_INET6;
422
+ memcpy(&name.sf_addr6, &any, sizeof(struct in6_addr));
423
+#else
424
+ memset(&name, 0, sizeof(struct sockaddr_foobar));
425
+ name.sf_family = AF_INET;
426
+ name.sf_addr.s_addr = htonl(INADDR_ANY);
427
+#endif
428
429
- memset(&name, 0, sizeof(struct sockaddr_in));
430
- name.sin_family = AF_INET;
431
- name.sin_addr.s_addr = htonl(INADDR_ANY);
432
- name.sin_port = htons(*portnum);
433
+ name.sf_port = htons(*portnum);
434
#ifdef PARANOID
435
- name.sin_port += (unsigned short)(rand() & 255);
436
+ name.sf_port += (unsigned short)(rand() & 255);
437
#endif
438
439
#ifdef IP_PORTRANGE
440
@@ -472,7 +483,7 @@
441
if (getsockname(fd, (struct sockaddr *)&name, &length))
442
return close(fd), -5;
443
444
- *portnum = ntohs(name.sin_port);
445
+ *portnum = ntohs(name.sf_port);
446
447
if (protocol == PROTOCOL_TCP)
448
if (listen(fd, 4) < 0)
449
@@ -486,39 +497,74 @@
450
/* Inet domain client */
451
else if (!is_unix && (service == SERVICE_CLIENT))
452
{
453
- struct sockaddr_in server;
454
+ struct sockaddr_foobar server;
455
struct hostent *hp;
456
- struct sockaddr_in localaddr;
457
+ struct sockaddr_foobar localaddr;
458
#ifdef WINNT
459
char buf[BIG_BUFFER_SIZE+1];
460
#endif
461
- /*
462
- * Doing this bind is bad news unless you are sure that
463
- * the hostname is valid. This is not true for me at home,
464
- * since i dynamic-ip it.
465
- */
466
+#ifdef IPV6
467
+ struct addrinfo hints, *res;
468
+ struct sockaddr_foobar *sf = NULL;
469
+#endif
470
+
471
+#ifndef IPV6
472
if (LocalHostName)
473
{
474
- memset(&localaddr, 0, sizeof(struct sockaddr_in));
475
- localaddr.sin_family = AF_INET;
476
- localaddr.sin_addr = LocalHostAddr;
477
- localaddr.sin_port = 0;
478
- if (bind(fd, (struct sockaddr *)&localaddr, sizeof(localaddr)))
479
+ if (bind(fd, (struct sockaddr *)&LocalHostAddr, sizeof(LocalHostAddr)))
480
return close(fd), -2;
481
}
482
+#endif
483
484
memset(&server, 0, sizeof(struct sockaddr_in));
485
#ifndef WINNT
486
+
487
+#ifdef IPV6
488
+ memset(&hints, 0, sizeof(hints));
489
+ if (!getaddrinfo(hostn, NULL, &hints, &res) && res)
490
+ {
491
+ sf = (struct sockaddr_foobar*) res->ai_addr;
492
+
493
+ close(fd);
494
+
495
+ proto_type = (protocol == PROTOCOL_TCP) ? SOCK_STREAM : SOCK_DGRAM;
496
+ if ((fd = socket(sf->sf_family, proto_type, 0)) < 0)
497
+ return -1;
498
+ set_socket_options (fd);
499
+
500
+ if ((server.sf_family = sf->sf_family) == AF_INET)
501
+ memcpy(&server.sf_addr, &sf->sf_addr, sizeof(struct in_addr));
502
+ else
503
+ memcpy(&server.sf_addr6, &sf->sf_addr6, sizeof(struct in6_addr));
504
+ server.sf_port = htons(*portnum);
505
+
506
+ memset(&hints, 0, sizeof(struct addrinfo));
507
+ hints.ai_family = res->ai_family;
508
+ freeaddrinfo(res);
509
+
510
+ if (LocalHostName && !getaddrinfo(LocalHostName, NULL, &hints, &res) && res)
511
+ {
512
+ if (bind(fd, (struct sockaddr *) res->ai_addr, sizeof(struct sockaddr_foobar)))
513
+ return close(fd), -2;
514
+ freeaddrinfo(res);
515
+ }
516
+ }
517
+ else
518
+ return close(fd), -6;
519
+
520
+#else
521
if (isdigit(hostn[strlen(hostn)-1]))
522
- inet_aton(hostn, (struct in_addr *)&server.sin_addr);
523
+ inet_aton(hostn, (struct in_addr *)&server.sf_addr);
524
else
525
{
526
- if (!(hp = resolv(hostn)))
527
+ if (!(hp = gethostbyname(hostn)))
528
return close(fd), -6;
529
- memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
530
+ memcpy(&server.sf_addr, hp->h_addr, hp->h_length);
531
}
532
- server.sin_family = AF_INET;
533
- server.sin_port = htons(*portnum);
534
+ server.sf_family = AF_INET;
535
+ server.sf_port = htons(*portnum);
536
+#endif /* IPV6 */
537
+
538
#else
539
/* for some odd reason resolv() fails on NT... */
540
server = (*(struct sockaddr_in *) hostn);
541
@@ -527,21 +573,21 @@
542
gethostname(buf, sizeof(buf));
543
hostn = buf;
544
}
545
- if ((server.sin_addr.s_addr = inet_addr(hostn)) == -1)
546
+ if ((server.sf_addr.s_addr = inet_addr(hostn)) == -1)
547
{
548
if ((hp = gethostbyname(hostn)) != NULL)
549
{
550
memset(&server, 0, sizeof(server));
551
- bcopy(hp->h_addr, (char *) &server.sin_addr,
552
+ bcopy(hp->h_addr, (char *) &server.sf_addr,
553
hp->h_length);
554
- server.sin_family = hp->h_addrtype;
555
+ server.sf_family = hp->h_addrtype;
556
}
557
else
558
return (-2);
559
}
560
else
561
- server.sin_family = AF_INET;
562
- server.sin_port = (unsigned short) htons(*portnum);
563
+ server.sf_family = AF_INET;
564
+ server.sf_port = (unsigned short) htons(*portnum);
565
#endif
566
567
#ifdef NON_BLOCKING_CONNECTS
568
@@ -549,11 +595,12 @@
569
return close(fd), -4;
570
#endif
571
572
-#if !defined(WTERM_C) && !defined(STERM_C)
573
+#if !defined(WTERM_C) && !defined(STERM_C) && !IPV6
574
575
if (use_socks && get_string_var(SOCKS_HOST_VAR))
576
{
577
- fd = handle_socks(fd, server, get_string_var(SOCKS_HOST_VAR), get_int_var(SOCKS_PORT_VAR));
578
+
579
+ fd = handle_socks(fd, *((struct sockaddr_in*) &server), get_string_var(SOCKS_HOST_VAR), get_int_var(SOCKS_PORT_VAR));
580
if (fd == -1)
581
return -4;
582
else
583
@@ -579,41 +626,114 @@
584
return fd;
585
}
586
587
-int lame_resolv (const char *hostname, struct in_addr *buffer)
588
+int lame_resolv (const char *hostname, struct sockaddr_foobar *buffer)
589
{
590
+#ifdef IPV6
591
+ struct addrinfo *res;
592
+ if (getaddrinfo(hostname, NULL, NULL, &res) && res)
593
+ return -1;
594
+
595
+ memmove(buffer, res->ai_addr, res->ai_addrlen);
596
+ return 0;
597
+#else
598
struct hostent *hp;
599
600
- if (!(hp = resolv(hostname)))
601
+ if (!(hp = gethostbyname(hostname)))
602
return -1;
603
604
- memmove(buffer, hp->h_addr, hp->h_length);
605
+ buffer->sf_family = AF_INET;
606
+ memmove(&buffer->sf_addr, hp->h_addr, hp->h_length);
607
return 0;
608
+#endif
609
}
610
611
+#ifdef IPV6
612
613
-extern struct hostent *resolv (const char *stuff)
614
+extern struct sockaddr_foobar *lookup_host (const char *host)
615
{
616
- struct hostent *hep;
617
+ static struct sockaddr_foobar sf;
618
+ struct addrinfo *res;
619
+
620
+ if (!getaddrinfo(host, NULL, NULL, &res) && res)
621
+ {
622
+ memcpy(&sf, res->ai_addr, sizeof(struct sockaddr_foobar));
623
+ freeaddrinfo(res);
624
625
- if ((hep = lookup_host(stuff)) == NULL)
626
- hep = lookup_ip(stuff);
627
+ return &sf;
628
+ }
629
630
- return hep;
631
+ return NULL;
632
}
633
634
-extern struct hostent *lookup_host (const char *host)
635
+extern char *host_to_ip (const char *host)
636
{
637
- struct hostent *hep;
638
+ struct addrinfo *res;
639
+ struct sockaddr_foobar *sf;
640
+ static char ip[128];
641
+
642
+ if (!getaddrinfo(host, NULL, NULL, &res) && res)
643
+ {
644
+ sf = (struct sockaddr_foobar*) res->ai_addr;
645
+ inet_ntop(sf->sf_family, (sf->sf_family == AF_INET) ?
646
+ (void*) &sf->sf_addr : (void*) &sf->sf_addr6, ip, 128);
647
+ freeaddrinfo(res);
648
+
649
+ return ip;
650
+ }
651
+ else
652
+ return empty_string;
653
+}
654
+
655
+extern char *ip_to_host (const char *ip)
656
+{
657
+ static char host[128];
658
+ struct sockaddr_foobar sf;
659
+
660
+ if (inet_pton(AF_INET6, ip, &sf.sf_addr6))
661
+ sf.sf_family = AF_INET6;
662
+ else
663
+ {
664
+ inet_pton(AF_INET, ip, &sf.sf_addr);
665
+ sf.sf_family = AF_INET;
666
+ }
667
+
668
+ if (getnameinfo((struct sockaddr*)&sf, sizeof(struct sockaddr_foobar), host, 128, NULL, 0, 0))
669
+ strncpy(host, ip, 128);
670
+
671
+ return host;
672
+}
673
+
674
+extern char *one_to_another (const char *what)
675
+{
676
+ if (isdigit(what[strlen(what)-1]) || strchr(what, ':'))
677
+ return ip_to_host (what);
678
+ else
679
+ return host_to_ip (what);
680
+}
681
+
682
+#else
683
+
684
+extern struct sockaddr_foobar *lookup_host (const char *host)
685
+{
686
+ struct hostent *he;
687
+ static struct sockaddr_foobar sf;
688
689
alarm(1);
690
- hep = gethostbyname(host);
691
+ he = gethostbyname(host);
692
alarm(0);
693
- return hep;
694
+ if (he)
695
+ {
696
+ sf.sf_family = AF_INET;
697
+ memcpy(&sf.sf_addr, he->h_addr, sizeof(struct in_addr));
698
+ return &sf;
699
+ }
700
+ else
701
+ return NULL;
702
}
703
704
extern char *host_to_ip (const char *host)
705
{
706
- struct hostent *hep = lookup_host(host);
707
+ struct hostent *hep = gethostbyname(host);
708
static char ip[30];
709
710
return (hep ? sprintf(ip,"%u.%u.%u.%u", hep->h_addr[0] & 0xff,
711
@@ -623,31 +743,16 @@
712
ip : empty_string);
713
}
714
715
-extern struct hostent *lookup_ip (const char *ip)
716
-{
717
- int b1 = 0, b2 = 0, b3 = 0, b4 = 0;
718
- char foo[4];
719
- struct hostent *hep;
720
-
721
- sscanf(ip,"%d.%d.%d.%d", &b1, &b2, &b3, &b4);
722
- foo[0] = b1;
723
- foo[1] = b2;
724
- foo[2] = b3;
725
- foo[3] = b4;
726
-
727
- alarm(1);
728
- hep = gethostbyaddr(foo, 4, AF_INET);
729
- alarm(0);
730
-
731
- return hep;
732
-}
733
-
734
extern char *ip_to_host (const char *ip)
735
{
736
- struct hostent *hep = lookup_ip(ip);
737
+ struct in_addr ia;
738
+ struct hostent *he;
739
static char host[101];
740
+
741
+ ia.s_addr = inet_addr(ip);
742
+ he = gethostbyaddr((char*) &ia, sizeof(struct in_addr), AF_INET);
743
744
- return (hep ? strncpy(host, hep->h_name, 100): empty_string);
745
+ return (he ? strncpy(host, he->h_name, 100): empty_string);
746
}
747
748
extern char *one_to_another (const char *what)
749
@@ -659,7 +764,7 @@
750
return ip_to_host (what);
751
}
752
753
-
754
+#endif
755
756
/*
757
* It is possible for a race condition to exist; such that select()
758
diff -uNr BitchX.orig/source/server.c BitchX/source/server.c
759
--- BitchX.orig/source/server.c Fri Dec 17 11:36:21 1999
760
+++ BitchX/source/server.c Mon Dec 27 18:28:50 1999
761
@@ -81,10 +81,10 @@
762
irc_server *map = NULL;
763
static int first_time = 0;
764
765
-int (*serv_open_func) (int, unsigned long, int) = NULL;
766
+int (*serv_open_func) (int, struct sockaddr_foobar, int) = NULL;
767
int (*serv_output_func) (int, int, char *, int) = NULL;
768
int (*serv_input_func) (int, char *, int, int, int) = NULL;
769
-int (*serv_close_func) (int, long, int) = NULL;
770
+int (*serv_close_func) (int, struct sockaddr_foobar, int) = NULL;
771
772
static QueueSend *serverqueue = NULL;
773
774
@@ -104,7 +104,7 @@
775
return;
776
777
if (serv_close_func)
778
- (*serv_close_func)(cs_index, server_list[cs_index].local_addr.s_addr, server_list[cs_index].port);
779
+ (*serv_close_func)(cs_index, server_list[cs_index].local_addr, server_list[cs_index].port);
780
clean_server_queues(from_server);
781
782
if (waiting_out > waiting_in)
783
@@ -388,7 +388,7 @@
784
/*
785
* Next check to see if its a "server:port:password:nick:network"
786
*/
787
- else if (index(server, ':'))
788
+ else if (index(server, ':') || index(server, ','))
789
parse_server_info(server, &cport, &password, &nick, &snetwork);
790
791
else if (index(server, '['))
792
@@ -548,13 +548,17 @@
793
* string, so * upon return, name will only point the the name. If portnum
794
* or password are missing or empty, their respective returned value will
795
* point to null.
796
+ *
797
+ * With IPv6 patch it also supports comma as a delimiter.
798
*/
799
void parse_server_info (char *name, char **port, char **password, char **nick, char **snetwork)
800
{
801
- char *ptr;
802
+ char *ptr, delim;
803
+
804
+ delim = (index(name, ',')) ? ',' : ':';
805
806
*port = *password = *nick = NULL;
807
- if ((ptr = (char *) strchr(name, ':')) != NULL)
808
+ if ((ptr = (char *) strchr(name, delim)) != NULL)
809
{
810
*(ptr++) = (char) 0;
811
if (strlen(ptr) == 0)
812
@@ -562,7 +566,7 @@
813
else
814
{
815
*port = ptr;
816
- if ((ptr = (char *) strchr(ptr, ':')) != NULL)
817
+ if ((ptr = (char *) strchr(ptr, delim)) != NULL)
818
{
819
*(ptr++) = (char) 0;
820
if (strlen(ptr) == 0)
821
@@ -570,7 +574,7 @@
822
else
823
{
824
*password = ptr;
825
- if ((ptr = (char *) strchr(ptr, ':'))
826
+ if ((ptr = (char *) strchr(ptr, delim))
827
!= NULL)
828
{
829
*(ptr++) = 0;
830
@@ -579,7 +583,7 @@
831
else
832
{
833
*nick = ptr;
834
- if ((ptr = strchr(ptr, ':')) !=NULL)
835
+ if ((ptr = strchr(ptr, delim)) !=NULL)
836
{
837
*(ptr++) = 0;
838
if (!strlen(ptr))
839
@@ -746,7 +750,7 @@
840
static int connect_to_server_direct (char *server_name, int port)
841
{
842
int new_des;
843
-struct sockaddr_in *localaddr;
844
+ struct sockaddr_foobar *localaddr;
845
int address_len;
846
unsigned short this_sucks;
847
848
@@ -821,9 +825,14 @@
849
850
if (*server_name != '/')
851
{
852
- address_len = sizeof(struct sockaddr_in);
853
- getsockname(new_des, (struct sockaddr *) localaddr, &address_len);
854
- server_list[from_server].local_addr.s_addr = localaddr->sin_addr.s_addr;
855
+ address_len = sizeof(struct sockaddr_foobar);
856
+ getsockname(new_des, (struct sockaddr *) localaddr, &address_len);
857
+ if ((server_list[from_server].local_addr.sf_family = localaddr->sf_family) == AF_INET)
858
+ memcpy(&server_list[from_server].local_addr.sf_addr, &localaddr->sf_addr, sizeof(struct in_addr));
859
+#ifdef IPV6
860
+ else
861
+ memcpy(&server_list[from_server].local_addr.sf_addr6, &localaddr->sf_addr6, sizeof(struct in6_addr));
862
+#endif
863
}
864
#ifdef WDIDENT
865
if(candofilestuff && (fp = fopen(lockfile, "w")) )
866
@@ -881,7 +890,7 @@
867
return -1;
868
869
if (serv_open_func)
870
- (*serv_open_func)(from_server, server_list[from_server].local_addr.s_addr, server_list[from_server].port);
871
+ (*serv_open_func)(from_server, server_list[from_server].local_addr, server_list[from_server].port);
872
if ((c_server != -1) && (c_server != from_server))
873
{
874
server_list[c_server].reconnecting =1;
875
@@ -2892,15 +2901,15 @@
876
else if (gsp_index >= number_of_servers)
877
return 0;
878
879
- return ntohs(server_list[gsp_index].local_sockname.sin_port);
880
+ return ntohs(server_list[gsp_index].local_sockname.sf_port);
881
}
882
883
-struct in_addr get_server_local_addr (int servnum)
884
+struct sockaddr_foobar get_server_local_addr (int servnum)
885
{
886
return server_list[servnum].local_addr;
887
}
888
889
-struct in_addr get_server_uh_addr (int servnum)
890
+struct sockaddr_foobar get_server_uh_addr (int servnum)
891
{
892
return server_list[servnum].uh_addr;
893
}
894
Binary files BitchX.orig/source/tcl.o and BitchX/source/tcl.o differ
895
diff -uNr BitchX.orig/source/wserv.c BitchX/source/wserv.c
896
--- BitchX.orig/source/wserv.c Wed Nov 3 15:36:57 1999
897
+++ BitchX/source/wserv.c Mon Dec 27 18:28:50 1999
898
@@ -124,7 +124,7 @@
899
900
/* These are here so we can link with network.o */
901
char *LocalHostName = NULL;
902
-struct in_addr LocalHostAddr;
903
+struct sockaddr_foobar LocalHostAddr;
904
char empty_string[] = "";
905
enum VAR_TYPES { unused };
906
int get_int_var (enum VAR_TYPES unused) { return 5; }
907
diff -uNr BitchX.orig/include/config.h BitchX/include/config.h
908
--- BitchX.orig/include/config.h Mon Dec 20 20:43:25 1999
909
+++ BitchX/include/config.h Mon Dec 27 19:16:27 1999
910
@@ -349,6 +349,13 @@
911
*/
912
#define TRANSLATE
913
914
+/*
915
+ * IPv6 support by [email protected] (thanks to Cron and thorgi)
916
+ * If you have a Linux box with glibc-2.x change the following line to
917
+ * `#define IPV6 1'. For older libc and libinet6 run configure script
918
+ * with `--enable-ipv6' parameter.
919
+ */
920
+#undef IPV6
921
922
#define DEFAULT_PING_TYPE 1
923
924
diff -uNr BitchX.orig/include/defs.h.in BitchX/include/defs.h.in
925
--- BitchX.orig/include/defs.h.in Fri Dec 17 00:26:59 1999
926
+++ BitchX/include/defs.h.in Mon Dec 27 19:05:30 1999
927
@@ -328,6 +328,9 @@
928
/* Define this is you want sound support */
929
#undef SOUND
930
931
+/* Define this if you want IPv6 support */
932
+#undef IPV6
933
+
934
/* Define this if you have dlfcn.h */
935
#undef HAVE_DLFCN_H
936
937
diff -uNr BitchX.orig/include/irc.h BitchX/include/irc.h
938
--- BitchX.orig/include/irc.h Sun Nov 21 22:41:14 1999
939
+++ BitchX/include/irc.h Mon Dec 27 18:28:50 1999
940
@@ -228,10 +228,10 @@
941
extern int inhibit_logging;
942
943
extern char MyHostName[];
944
-extern struct in_addr MyHostAddr;
945
-extern struct in_addr LocalHostAddr;
946
+extern struct sockaddr_foobar MyHostAddr;
947
+extern struct sockaddr_foobar LocalHostAddr;
948
extern int cpu_saver;
949
-extern struct in_addr local_ip_address;
950
+extern struct sockaddr_foobar local_ip_address;
951
952
953
int is_channel (char *);
954
diff -uNr BitchX.orig/include/ircaux.h BitchX/include/ircaux.h
955
--- BitchX.orig/include/ircaux.h Mon Nov 15 17:39:32 1999
956
+++ BitchX/include/ircaux.h Mon Dec 27 18:28:50 1999
957
@@ -151,16 +151,16 @@
958
959
/* Used from network.c */
960
int connect_by_number (char *, unsigned short *, int, int, int);
961
-struct hostent * resolv (const char *);
962
-struct hostent * lookup_host (const char *);
963
-struct hostent * lookup_ip (const char *);
964
+#define resolv lookup_host
965
+struct sockaddr_foobar * lookup_host(const char *);
966
+#define lookup_ip host_to_ip
967
char * host_to_ip (const char *);
968
char * ip_to_host (const char *);
969
char * one_to_another (const char *);
970
int set_blocking (int);
971
int set_non_blocking (int);
972
int my_accept (int, struct sockaddr *, int *);
973
-int lame_resolv (const char *, struct in_addr *);
974
+int lame_resolv (const char *, struct sockaddr_foobar *);
975
976
#define my_isspace(x) \
977
((x) == 9 || (x) == 10 || (x) == 11 || (x) == 12 || (x) == 13 || (x) == 32)
978
diff -uNr BitchX.orig/include/server.h BitchX/include/server.h
979
--- BitchX.orig/include/server.h Sun Nov 21 22:09:37 1999
980
+++ BitchX/include/server.h Mon Dec 27 18:28:50 1999
981
@@ -117,9 +117,9 @@
982
int ctcp_not_warned; /* */
983
time_t ctcp_last_reply_time; /* used to limit flooding */
984
985
- struct in_addr local_addr; /* ip address of this connection */
986
- struct in_addr uh_addr; /* ip address of this connection */
987
- struct sockaddr_in local_sockname; /* sockname of this connection */
988
+ struct sockaddr_foobar local_addr; /* ip address of this connection */
989
+ struct sockaddr_foobar uh_addr; /* ip address of this connection */
990
+ struct sockaddr_foobar local_sockname; /* sockname of this connection */
991
992
ChannelList *chan_list; /* list of channels for this server */
993
int in_delay_notify;
994
@@ -324,8 +324,8 @@
995
Server *get_server_list (void);
996
997
int get_server_local_port (int);
998
-struct in_addr get_server_local_addr (int);
999
-struct in_addr get_server_uh_addr (int);
1000
+struct sockaddr_foobar get_server_local_addr (int);
1001
+struct sockaddr_foobar get_server_uh_addr (int);
1002
NotifyItem *get_server_notify_list (int);
1003
void send_msg_to_nicks (ChannelList *, int, char *);
1004
void send_msg_to_channels (ChannelList *, int, char *);
1005
diff -uNr BitchX.orig/include/struct.h BitchX/include/struct.h
1006
--- BitchX.orig/include/struct.h Wed Dec 8 23:03:12 1999
1007
+++ BitchX/include/struct.h Mon Dec 27 18:28:50 1999
1008
@@ -17,6 +17,30 @@
1009
1010
#include "alist.h"
1011
#include "hash.h"
1012
+#include "config.h"
1013
+#include <netinet/in.h>
1014
+
1015
+/*
1016
+ * struct sockaddr_storage isn't avaiable on all ipv6-ready-systems, bleh ;(
1017
+ * and i'm too lazy to #ifdef every sockaddr declaration. --wojtekka
1018
+ */
1019
+
1020
+struct sockaddr_foobar
1021
+{
1022
+ union {
1023
+ struct sockaddr_in sin;
1024
+#ifdef IPV6
1025
+ struct sockaddr_in6 sin6;
1026
+#endif
1027
+ } sins;
1028
+};
1029
+
1030
+#define sf_family sins.sin.sin_family
1031
+#define sf_port sins.sin.sin_port
1032
+#define sf_addr sins.sin.sin_addr
1033
+#ifdef IPV6
1034
+# define sf_addr6 sins.sin6.sin6_addr
1035
+#endif
1036
1037
1038
#ifdef GUI
1039
--- BitchX.orig/configure.in Fri Dec 17 00:23:23 1999
1040
+++ BitchX/configure.in Mon Dec 27 19:02:33 1999
1041
@@ -1452,6 +1452,24 @@
1042
AC_MSG_RESULT(none)
1043
)
1044
1045
+AC_MSG_CHECKING(whether to enable IPv6 support)
1046
+AC_ARG_ENABLE(ipv6,
1047
+[ --enable-ipv6 Enable IPv6 support (Linux only).],
1048
+[ if test x"$enableval" = x"yes"; then
1049
+ if test -d /usr/inet6/include; then
1050
+ CFLAGS="$CFLAGS -I/usr/inet6/include"
1051
+ LIBS="$LIBS -L/usr/inet6/lib -linet6"
1052
+ AC_MSG_RESULT(yes (libinet6))
1053
+ else
1054
+ AC_MSG_RESULT(yes (libc))
1055
+ fi
1056
+ AC_DEFINE(IPV6)
1057
+ else
1058
+ AC_MSG_RESULT(no)
1059
+ fi ],
1060
+AC_MSG_RESULT(no)
1061
+)
1062
+
1063
dnl ----------------------------------------------------------
1064
dnl
1065
dnl Socks4 or Socks5 or neither?
1066
1067