]> git.pld-linux.org Git - packages/eggdrop.git/blame - eggdrop-ipv6-ssl.patch
- release 5
[packages/eggdrop.git] / eggdrop-ipv6-ssl.patch
CommitLineData
1d12ab62 1diff -urN eggdrop1.6.19/config.h.in eggdrop1.6.19-ipv6/config.h.in
2--- config.h.in 2006-11-20 12:38:25.000000000 +0100
3+++ config.h.in 2008-07-27 22:13:41.000000000 +0200
4@@ -372,6 +372,9 @@
5 /* Define to `unsigned' if <sys/types.h> does not define. */
6 #undef size_t
7
8+/* Define if there is IPV6 */
9+#define IPV6
10+
11 /* Define to empty if the keyword `volatile' does not work. Warning: valid
12 code using `volatile' can become incorrect without. Disable with care. */
13 #undef volatile
14diff -urN eggdrop1.6.19/eggdrop.conf eggdrop1.6.19-ipv6/eggdrop.conf
15--- eggdrop.conf 2008-02-16 21:15:30.000000000 +0100
16+++ eggdrop.conf 2008-07-27 22:13:43.000000000 +0200
17@@ -56,7 +56,9 @@
18 # by hostname or by IP. You may also want to set the hostname here if
19 # Eggdrop has trouble detecting it when it starts up.
20 #set my-hostname "virtual.host.com"
21-#set my-ip "99.99.0.0"
22+#set my-ip "98.76.54.32"
23+#set my-hostname6 "virtual.host6.com"
24+#set my-ip6 "2002:624c:3620::1"
25
26 # If you want to have your Eggdrop messages displayed in a language other
27 # than English, change this setting to match your preference. An alternative
28diff -urN eggdrop1.6.19/src/botnet.c eggdrop1.6.19-ipv6/src/botnet.c
29--- src/botnet.c 2008-02-16 22:41:03.000000000 +0100
30+++ src/botnet.c 2008-07-27 22:13:40.000000000 +0200
31@@ -1063,7 +1063,7 @@
32 strcpy(dcc[i].u.bot->version, "(primitive bot)");
33 dcc[i].u.bot->numver = idx;
34 dcc[i].u.bot->port = dcc[i].port; /* Remember where i started */
35- dcc[i].sock = getsock(SOCK_STRONGCONN);
36+ dcc[i].sock = getsock(SOCK_STRONGCONN,getprotocol(dcc[i].host));
37 nfree(linker);
38 if (dcc[i].sock < 0 ||
39 open_telnet_raw(dcc[i].sock, iptostr(htonl(dcc[i].addr)),
40@@ -1099,7 +1099,7 @@
41 return;
42 }
43 killsock(dcc[idx].sock);
44- dcc[idx].sock = getsock(SOCK_STRONGCONN);
45+ dcc[idx].sock = getsock(SOCK_STRONGCONN,getprotocol(dcc[idx].host));
46 dcc[uidx].u.relay->sock = dcc[idx].sock;
47 dcc[idx].port++;
48 dcc[idx].timeval = now;
49@@ -1145,7 +1145,7 @@
50 return;
51 }
52
53- dcc[i].sock = getsock(SOCK_STRONGCONN | SOCK_VIRTUAL);
54+ dcc[i].sock = getsock(SOCK_STRONGCONN | SOCK_VIRTUAL,getprotocol(bi->address));
55 if (dcc[i].sock < 0) {
56 lostdcc(i);
57 dprintf(idx, "%s\n", MISC_NOFREESOCK);
58diff -urN eggdrop1.6.19/src/chanprog.c eggdrop1.6.19-ipv6/src/chanprog.c
59--- src/chanprog.c 2008-02-16 22:41:03.000000000 +0100
60+++ src/chanprog.c 2008-07-27 22:13:41.000000000 +0200
61@@ -294,6 +294,8 @@
62 botnetnick, ver, i, i == 1 ? "" : "s",
63 (int) (expected_memory() / 1024));
64
65+ dprintf(idx, "Unofficial IPv6 patch for v1.6.19 based on the v1.6.18 IPv6 patch \n");
66+
67 s[0] = 0;
68 if (now2 > 86400) {
69 /* days */
70diff -urN eggdrop1.6.19/src/dcc.c eggdrop1.6.19-ipv6/src/dcc.c
71--- src/dcc.c 2008-02-16 22:41:03.000000000 +0100
72+++ src/dcc.c 2008-07-27 22:13:42.000000000 +0200
73@@ -234,7 +234,7 @@
74
75 /* Try next port */
76 killsock(dcc[idx].sock);
77- dcc[idx].sock = getsock(SOCK_STRONGCONN);
78+ dcc[idx].sock = getsock(SOCK_STRONGCONN,getprotocol(dcc[idx].host));
79 dcc[idx].port++;
80 dcc[idx].timeval = now;
81 if (dcc[idx].sock < 0 ||
82@@ -1174,7 +1174,8 @@
83 changeover_dcc(i, &DCC_IDENTWAIT, 0);
84 dcc[i].timeval = now;
85 dcc[i].u.ident_sock = dcc[idx].sock;
86- sock = open_telnet(iptostr(htonl(dcc[i].addr)), 113);
87+ // sock = open_telnet(iptostr(htonl(dcc[i].addr)), 113);
88+ sock = open_telnet(dcc[i].host, 113);
89 putlog(LOG_MISC, "*", DCC_TELCONN, dcc[i].host, dcc[i].port);
90 s[0] = 0;
91 if (sock < 0) {
92diff -urN eggdrop1.6.19/src/main.c eggdrop1.6.19-ipv6/src/main.c
93--- src/main.c 2008-02-16 22:41:03.000000000 +0100
94+++ src/main.c 2008-07-28 18:35:52.000000000 +0200
95@@ -90,8 +90,8 @@
96 * modified versions of this bot.
97 */
98
99-char egg_version[1024] = "1.6.19";
100-int egg_numver = 1061800;
101+char egg_version[1024] = "1.6.19";
102+int egg_numver = 1061900;
103
104 char notify_new[121] = ""; /* Person to send a note to for new users */
105 int default_flags = 0; /* Default user flags */
106@@ -239,7 +239,7 @@
107 * _not_ safe <cybah>
108 */
109 x = creat("DEBUG.DEBUG", 0644);
110- setsock(x, SOCK_NONSOCK);
111+ setsock(x, SOCK_NONSOCK,AF_INET);
112 if (x >= 0) {
113 strncpyz(s, ctime(&now), sizeof s);
114 dprintf(-x, "Debug (%s) written %s\n", ver, s);
115@@ -264,7 +264,7 @@
116 putlog(LOG_MISC, "*", "* Please REPORT this BUG!");
117 putlog(LOG_MISC, "*", "* Check doc/BUG-REPORT on how to do so.");
118 x = creat("DEBUG", 0644);
119- setsock(x, SOCK_NONSOCK);
120+ setsock(x, SOCK_NONSOCK,AF_INET);
121 if (x < 0) {
122 putlog(LOG_MISC, "*", "* Failed to write DEBUG");
123 } else {
124@@ -906,7 +906,7 @@
125 userlist = adduser(userlist, dcc[n].nick, "none", "-", USER_PARTY);
126 dcc[n].user = get_user_by_handle(userlist, dcc[n].nick);
127 }
128- setsock(STDOUT, 0); /* Entry in net table */
129+ setsock(STDOUT, 0,AF_INET); /* Entry in net table */
130 dprintf(n, "\n### ENTERING DCC CHAT SIMULATION ###\n\n");
131 dcc_chatter(n);
132 }
133diff -urN eggdrop1.6.19/src/mod/filesys.mod/filesys.c eggdrop1.6.19-ipv6/src/mod/filesys.mod/filesys.c
134--- src/mod/filesys.mod/filesys.c 2008-02-16 22:41:09.000000000 +0100
135+++ src/mod/filesys.mod/filesys.c 2008-07-27 22:13:44.000000000 +0200
136@@ -820,7 +820,7 @@
137 lostdcc(i);
138 } else {
139 dcc[i].timeval = now;
140- dcc[i].sock = getsock(SOCK_BINARY);
141+ dcc[i].sock = getsock(SOCK_BINARY,getprotocol(ip));
142 if (dcc[i].sock < 0 || open_telnet_dcc(dcc[i].sock, ip, prt) < 0)
143 dcc[i].type->eof(i);
144 }
145@@ -865,7 +865,7 @@
146 } else {
147 ip = newsplit(&msg);
148 prt = newsplit(&msg);
149- sock = getsock(0);
150+ sock = getsock(0,getprotocol(ip));
151 if (sock < 0 || open_telnet_dcc(sock, ip, prt) < 0) {
152 neterror(buf);
153 if (!quiet_reject)
154diff -urN eggdrop1.6.19/src/mod/module.h eggdrop1.6.19-ipv6/src/mod/module.h
155--- src/mod/module.h 2008-02-16 22:41:06.000000000 +0100
156+++ src/mod/module.h 2008-07-27 22:13:45.000000000 +0200
157@@ -198,7 +198,8 @@
158 /* 80 - 83 */
159 #define new_dcc ((int (*) (struct dcc_table *, int))global[80])
160 #define lostdcc ((void (*) (int))global[81])
161-#define getsock ((int (*) (int))global[82])
162+/* #define getsock ((int (*) (int))global[82]) */
163+#define getsock ((int (*) (int,int))global[82])
164 #define killsock ((void (*) (int))global[83])
165 /* 84 - 87 */
166 #define open_listen ((int (*) (int *))global[84])
167@@ -469,6 +470,7 @@
168 #define quiet_reject (*(int *)(global[284]))
169 #define file_readable ((int (*) (char *))global[285])
170 /* IPv6 leftovers: 286 */
171+#define getprotocol ((int (*)(char *))global[286]) /* get protocol */
172 /* IPv6 leftovers: 287 */
173 /* 288 - 291 */
174 /* IPv6 leftovers: 288 */
175diff -urN eggdrop1.6.19/src/mod/server.mod/server.c eggdrop1.6.19-ipv6/src/mod/server.mod/server.c
176--- src/mod/server.mod/server.c 2008-02-16 22:41:10.000000000 +0100
177+++ src/mod/server.mod/server.c 2008-07-27 22:13:47.000000000 +0200
178@@ -1517,7 +1517,7 @@
179 return;
180 }
181 egg_snprintf(ip, sizeof ip, "%lu", iptolong(htonl(dcc[i].addr)));
182- dcc[i].sock = getsock(0);
183+ dcc[i].sock = getsock(0,getprotocol(ip));
184 if (dcc[i].sock < 0 || open_telnet_dcc(dcc[i].sock, ip, buf) < 0) {
185 neterror(buf);
186 if (!quiet_reject)
187diff -urN eggdrop1.6.19/src/mod/server.mod/servmsg.c eggdrop1.6.19-ipv6/src/mod/server.mod/servmsg.c
188--- src/mod/server.mod/servmsg.c 2008-02-16 22:41:10.000000000 +0100
189+++ src/mod/server.mod/servmsg.c 2008-07-27 22:13:47.000000000 +0200
190@@ -1261,7 +1261,9 @@
191 /* I'm resolving... don't start another server connect request */
192 resolvserv = 1;
193 /* Resolve the hostname. */
194- dcc_dnsipbyhost(dcc[servidx].host);
195+ // dcc_dnsipbyhost(dcc[servidx].host);
196+ server_resolve_success(servidx);
197+
198 }
199 }
200
201@@ -1283,7 +1285,9 @@
202 dcc[servidx].addr = dcc[servidx].u.dns->ip;
203 strcpy(pass, dcc[servidx].u.dns->cbuf);
204 changeover_dcc(servidx, &SERVER_SOCKET, 0);
205- serv = open_telnet(iptostr(htonl(dcc[servidx].addr)), dcc[servidx].port);
206+ //serv = open_telnet(iptostr(htonl(dcc[servidx].addr)), dcc[servidx].port);
207+ serv = open_telnet(dcc[servidx].host, dcc[servidx].port);
208+
209 if (serv < 0) {
210 neterror(s);
211 putlog(LOG_SERV, "*", "%s %s (%s)", IRC_FAILEDCONNECT, dcc[servidx].host,
212diff -urN eggdrop1.6.19/src/mod/share.mod/share.c eggdrop1.6.19-ipv6/src/mod/share.mod/share.c
213--- src/mod/share.mod/share.c 2008-02-16 22:41:11.000000000 +0100
214+++ src/mod/share.mod/share.c 2008-07-27 22:13:48.000000000 +0200
215@@ -1137,7 +1137,7 @@
216 } else {
217 ip = newsplit(&par);
218 port = newsplit(&par);
219- sock = getsock(SOCK_BINARY); /* Don't buffer this -> mark binary. */
220+ sock = getsock(SOCK_BINARY,getprotocol(ip)); /* Don't buffer this -> mark binary. */
221 if (sock < 0 || open_telnet_dcc(sock, ip, port) < 0) {
222 killsock(sock);
223 putlog(LOG_BOTS, "*", "Asynchronous connection failed!");
224diff -urN eggdrop1.6.19/src/modules.c eggdrop1.6.19-ipv6/src/modules.c
225--- src/modules.c 2008-02-16 22:41:04.000000000 +0100
226+++ src/modules.c 2008-07-27 22:13:45.000000000 +0200
227@@ -99,6 +99,7 @@
228 extern tand_t *tandbot;
229 extern Tcl_Interp *interp;
230 extern sock_list *socklist;
231+extern int getprotocol(char *);
232
233 int cmd_die();
234 int xtra_kill();
235@@ -561,7 +562,7 @@
236 /* 284 - 287 */
237 (Function) & quiet_reject, /* int */
238 (Function) file_readable,
239- (Function) 0, /* IPv6 leftovers: 286 */
240+ (Function) getprotocol, /* IPv6 leftovers: 286 */
241 (Function) 0, /* IPv6 leftovers: 287 */
242 /* 288 - 291 */
243 (Function) 0, /* IPv6 leftovers: 288 */
244diff -urN eggdrop1.6.19/src/net.c eggdrop1.6.19-ipv6/src/net.c
245--- src/net.c 2008-02-16 22:41:04.000000000 +0100
246+++ src/net.c 2008-07-27 22:13:46.000000000 +0200
247@@ -60,6 +60,9 @@
248
249 char hostname[121] = ""; /* Hostname can be specified in the config file.*/
250 char myip[121] = ""; /* IP can be specified in the config file. */
251+char myip6[121] = ""; /* IPV6 can be specified in the config file. */
252+char hostname6[121] = ""; /* Hostname6 can be specified in the config file*/
253+
254 char firewall[121] = ""; /* Socks server for firewall. */
255 int firewallport = 1080; /* Default port of socks 4/5 firewalls. */
256 char botuser[21] = "eggdrop"; /* Username of the user running the bot. */
257@@ -88,6 +91,28 @@
258 return ret;
259 }
260
261+/* define the protocol based on a given host */
262+int getprotocol(char *host)
263+{
264+#ifndef IPV6
265+ return AF_INET;
266+#else
267+ struct hostent *he;
268+ if (!setjmp(alarmret)) {
269+ alarm(resolve_timeout);
270+ he = gethostbyname2(host,AF_INET6);
271+ alarm(0);
272+ } else
273+ he = NULL;
274+
275+ if(!he)
276+ {
277+ return AF_INET; // we check no resolve on IPv4 and assume it, if IPv6 does not works
278+ }
279+ return AF_INET6;
280+#endif
281+}
282+
283 /* Initialize the socklist
284 */
285 void init_net()
286@@ -114,6 +139,9 @@
287 return tot;
288 }
289
290+struct hostent *myipv6he;
291+char myipv6host[120];
292+
293 /* Get my ip number
294 */
295 IP getmyip()
296@@ -122,6 +150,25 @@
297 char s[121];
298 IP ip;
299 struct in_addr *in;
300+
301+ myipv6he = NULL;
302+
303+ #ifdef IPV6
304+ if (myip[0]) {
305+ myipv6he = gethostbyname2(myip6,AF_INET6);
306+ if (myipv6he==NULL)
307+ fatal("Hostname IPV6 self-lookup failed.",0);
308+ }
309+ if (hostname6[0]) {
310+ myipv6he = gethostbyname2(hostname6,AF_INET6);
311+ if (myipv6he==NULL)
312+ fatal("Hostname IPV6 self-lookup failed.",0);
313+ }
314+ if(myipv6he!=NULL)
315+ {
316+ inet_ntop(AF_INET6,&myipv6he,myipv6host,119);
317+ }
318+ #endif
319 if (myip[0]) {
320 if ((myip[strlen(myip) - 1] >= '0') && (myip[strlen(myip) - 1] <= '9'))
321 return (IP) inet_addr(myip);
322@@ -133,9 +180,10 @@
323 gethostname(s, 120);
324 hp = gethostbyname(s);
325 }
326- if (hp == NULL)
327+ if (hp == NULL && myipv6he==NULL)
328 fatal("Hostname self-lookup failed. Please set 'my-ip' in the config "
329 "file.", 0);
330+ if (hp == NULL) return 0;
331 in = (struct in_addr *) (hp->h_addr_list[0]);
332 ip = (IP) (in->s_addr);
333 return ip;
334@@ -244,7 +292,7 @@
335
336 /* Return a free entry in the socket entry
337 */
338-int allocsock(int sock, int options)
339+int allocsock(int sock, int options, int af_ty)
340 {
341 int i;
342
343@@ -255,6 +303,7 @@
344 socklist[i].inbuflen = socklist[i].outbuflen = 0;
345 socklist[i].flags = options;
346 socklist[i].sock = sock;
347+ socklist[i].af = af_ty;
348 return i;
349 }
350 }
351@@ -264,9 +313,9 @@
352
353 /* Request a normal socket for i/o
354 */
355-void setsock(int sock, int options)
356+void setsock(int sock, int options, int af_ty)
357 {
358- int i = allocsock(sock, options), parm;
359+ int i = allocsock(sock, options, af_ty), parm;
360
361 if (((sock != STDOUT) || backgrd) && !(socklist[i].flags & SOCK_NONSOCK)) {
362 parm = 1;
363@@ -284,12 +333,12 @@
364 fcntl(sock, F_SETFL, O_NONBLOCK);
365 }
366
367-int getsock(int options)
368+int getsock(int options, int AF_DEF)
369 {
370- int sock = socket(AF_INET, SOCK_STREAM, 0);
371+ int sock = socket(AF_DEF, SOCK_STREAM, 0);
372
373 if (sock >= 0)
374- setsock(sock, options);
375+ setsock(sock, options, AF_DEF);
376 else
377 putlog(LOG_MISC, "*", "Warning: Can't create new socket!");
378 return sock;
379@@ -328,23 +377,39 @@
380 */
381 static int proxy_connect(int sock, char *host, int port, int proxy)
382 {
383+ #ifdef IPV6
384+ unsigned char x[32];
385+#else
386 unsigned char x[10];
387+#endif
388+
389 struct hostent *hp;
390 char s[256];
391+ int af_ty;
392 int i;
393+ af_ty=getprotocol(host);
394
395 /* socks proxy */
396 if (proxy == PROXY_SOCKS) {
397 /* numeric IP? */
398- if (host[strlen(host) - 1] >= '0' && host[strlen(host) - 1] <= '9') {
399+ if ((host[strlen(host) - 1] >= '0' && host[strlen(host) - 1] <= '9') && af_ty!=AF_INET6) {
400 IP ip = ((IP) inet_addr(host));
401 egg_memcpy(x, &ip, 4);
402 } else {
403 /* no, must be host.domain */
404 if (!sigsetjmp(alarmret, 1)) {
405+ #ifdef IPV6
406 alarm(resolve_timeout);
407+ if (af_ty==AF_INET6)
408+ {
409+ hp = gethostbyname(host);
410+ } else {
411+ #endif
412 hp = gethostbyname(host);
413+ #ifdef IPV6
414+ }
415 alarm(0);
416+ #endif
417 } else
418 hp = NULL;
419 if (hp == NULL) {
420@@ -356,6 +421,17 @@
421 for (i = 0; i < MAXSOCKS; i++)
422 if (!(socklist[i].flags & SOCK_UNUSED) && socklist[i].sock == sock)
423 socklist[i].flags |= SOCK_PROXYWAIT; /* drummer */
424+
425+ #ifdef IPV6
426+ if (af_ty==AF_INET6)
427+ egg_snprintf(s, sizeof s,"\004\001%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%s", (port >> 8) % 256, (port % 256),
428+ x[0], x[1], x[2], x[3],
429+ x[4], x[5], x[6], x[7],
430+ x[8], x[9], x[10], x[11],
431+ x[12], x[13], x[14], x[15],
432+ botuser);
433+ else
434+ #endif
435 egg_snprintf(s, sizeof s, "\004\001%c%c%c%c%c%c%s", (port >> 8) % 256,
436 (port % 256), x[0], x[1], x[2], x[3], botuser);
437 tputs(sock, s, strlen(botuser) + 9); /* drummer */
438@@ -366,6 +442,19 @@
439 return sock;
440 }
441
442+/*
443+ * Return protocol of socket
444+ */
445+int getsockproto(int sock)
446+{
447+ int i;
448+ for (i = 0 ; i < MAXSOCKS ; i++) {
449+ if (socklist[i].sock == sock)
450+ return socklist[i].af;
451+ }
452+ return AF_INET; // default
453+}
454+
455 /* Starts a connection attempt to a socket
456 *
457 * If given a normal hostname, this will be resolved to the corresponding
458@@ -379,9 +468,15 @@
459 int open_telnet_raw(int sock, char *server, int sport)
460 {
461 struct sockaddr_in name;
462+#ifdef IPV6
463+ struct sockaddr_in6 name6;
464+ unsigned long succ;
465+#endif
466+ int rc;
467 struct hostent *hp;
468 char host[121];
469- int i, port, rc;
470+ int i, port;
471+ int af_ty;
472 volatile int proxy;
473
474 /* firewall? use socks */
475@@ -399,6 +494,43 @@
476 strcpy(host, server);
477 port = sport;
478 }
479+#ifdef IPV6
480+ af_ty = getprotocol(host);
481+ if(af_ty==AF_INET6)
482+ {
483+ succ=getmyip();
484+ bzero((char *) &name6, sizeof(struct sockaddr_in6));
485+
486+ name6.sin6_family = AF_INET6;
487+ if (myip[0])
488+ {
489+ if (myipv6he==NULL)
490+ {
491+ memcpy(&name6.sin6_addr,&in6addr_any,16);
492+ } else {
493+ memcpy(&name6.sin6_addr,myipv6he->h_addr,myipv6he->h_length);
494+ }
495+ } else {
496+
497+ }
498+ if (bind(sock, (struct sockaddr *) &name6, sizeof(name6)) < 0) {
499+ killsock(sock);
500+ return -1;
501+ }
502+ bzero((char *) &name6, sizeof(struct sockaddr_in6));
503+ name6.sin6_family = AF_INET6;
504+ name6.sin6_port = htons(port);
505+ if (!setjmp(alarmret)) {
506+ alarm(resolve_timeout);
507+ hp = gethostbyname2(host,AF_INET6);
508+ alarm(0) ;
509+ } else {
510+ hp = NULL ;
511+ }
512+ egg_memcpy((char *) &name6.sin6_addr, hp->h_addr, hp->h_length);
513+ name6.sin6_family = hp->h_addrtype;
514+ } else {
515+#endif
516 egg_bzero((char *) &name, sizeof(struct sockaddr_in));
517
518 name.sin_family = AF_INET;
519@@ -428,11 +560,20 @@
520 egg_memcpy(&name.sin_addr, hp->h_addr, hp->h_length);
521 name.sin_family = hp->h_addrtype;
522 }
523+#ifdef IPV6
524+ }
525+#endif
526 for (i = 0; i < MAXSOCKS; i++) {
527 if (!(socklist[i].flags & SOCK_UNUSED) && (socklist[i].sock == sock))
528 socklist[i].flags = (socklist[i].flags & ~SOCK_VIRTUAL) | SOCK_CONNECT;
529 }
530- rc = connect(sock, (struct sockaddr *) &name, sizeof(struct sockaddr_in));
531+ //rc = connect(sock, (struct sockaddr *) &name, sizeof(struct sockaddr_in));
532+#ifdef IPV6
533+ if (af_ty == AF_INET6)
534+ rc = connect(sock, (struct sockaddr *) &name6, sizeof(struct sockaddr_in6));
535+ else
536+#endif
537+ rc = connect(sock, (struct sockaddr *) &name, sizeof(struct sockaddr_in)) ;
538 if (rc < 0) {
539 if (errno == EINPROGRESS) {
540 /* Firewall? announce connect attempt to proxy */
541@@ -451,8 +592,12 @@
542 /* Ordinary non-binary connection attempt */
543 int open_telnet(char *server, int port)
544 {
545- int sock = getsock(0), ret = open_telnet_raw(sock, server, port);
546+ int sock = getsock(0,getprotocol(server)), ret = open_telnet_raw(sock, server, port);
547+
548+ putlog(LOG_DEBUG, "*", "net.c / open_telnet");
549
550+ if (ret < 0)
551+ killsock(sock);
552 return ret;
553 }
554
555@@ -462,7 +607,12 @@
556 int open_address_listen(IP addr, int *port)
557 {
558 int sock = 0;
559+ int af_def;
560+ unsigned long ipp;
561 socklen_t addrlen;
562+#ifdef IPV6
563+ struct sockaddr_in6 name6;
564+#endif
565 struct sockaddr_in name;
566
567 if (firewall[0]) {
568@@ -473,7 +623,8 @@
569 }
570
571 if (getmyip() > 0) {
572- sock = getsock(SOCK_LISTEN);
573+ af_def=AF_INET;
574+ sock = getsock(SOCK_LISTEN,af_def);
575 if (sock < 1)
576 return -1;
577
578@@ -483,7 +634,7 @@
579 name.sin_addr.s_addr = addr;
580 if (bind(sock, (struct sockaddr *) &name, sizeof(name)) < 0) {
581 killsock(sock);
582- return -1;
583+ goto tryv6;
584 }
585 /* what port are we on? */
586 addrlen = sizeof(name);
587@@ -494,9 +645,37 @@
588 *port = ntohs(name.sin_port);
589 if (listen(sock, 1) < 0) {
590 killsock(sock);
591+ goto tryv6;
592+ }
593+ return sock;
594+ }
595+ tryv6:
596+#ifdef IPV6
597+ ipp=getmyip();
598+ af_def=AF_INET6;
599+ if(af_def==AF_INET6 && myipv6he!=NULL)
600+ {
601+ sock = getsock(SOCK_LISTEN,af_def);
602+ bzero((char *) &name6,sizeof(name6));
603+ name6.sin6_family=af_def;
604+ name6.sin6_port=htons(*port);
605+ memcpy(&name6.sin6_addr,myipv6he->h_addr,myipv6he->h_length);
606+ if (bind(sock, (struct sockaddr *) &name6, sizeof(name6)) < 0) {
607+ killsock(sock);
608+ return -1;
609+ }
610+ addrlen = sizeof(name6);
611+ if (getsockname(sock, (struct sockaddr *) &name6, &addrlen) < 0) {
612+ killsock(sock);
613+ return -1;
614+ }
615+ *port = ntohs(name6.sin6_port);
616+ if (listen(sock, 1) < 0) {
617+ killsock(sock);
618 return -1;
619 }
620 }
621+#endif
622
623 return sock;
624 }
625@@ -520,6 +699,9 @@
626 return inet_ntoa(a);
627 }
628
629+unsigned long notalloc=0;
630+
631+
632 /* Short routine to answer a connect received on a socket made previously
633 * by open_listen ... returns hostname of the caller & the new socket
634 * does NOT dispose of old "public" socket!
635@@ -529,23 +711,57 @@
636 {
637 int new_sock;
638 socklen_t addrlen;
639+ int af_ty;
640+#ifdef IPV6
641+ struct sockaddr_in6 from6;
642+#endif
643 struct sockaddr_in from;
644+ af_ty=getsockproto(sock);
645
646 addrlen = sizeof(struct sockaddr);
647+#ifdef IPV6
648+ if (af_ty==AF_INET6)
649+ {
650+ addrlen = sizeof(from6);
651+ new_sock = accept(sock, (struct sockaddr *) &from6, &addrlen);
652+ } else {
653+#endif
654+ addrlen = sizeof(struct sockaddr);
655 new_sock = accept(sock, (struct sockaddr *) &from, &addrlen);
656+#ifdef IPV6
657+ }
658+#endif
659
660 if (new_sock < 0)
661 return -1;
662 if (ip != NULL) {
663+#ifdef IPV6
664+ if (af_ty==AF_INET6)
665+ {
666+ *ip=notalloc;
667+ inet_ntop(AF_INET6,&from6,caller,119);
668+ caller[120]=0;
669+ } else {
670+#endif
671 *ip = from.sin_addr.s_addr;
672 /* DNS is now done asynchronously. We now only provide the IP address. */
673 strncpyz(caller, iptostr(*ip), 121);
674 *ip = ntohl(*ip);
675+#ifdef IPV6
676+ }
677+#endif
678 }
679 if (port != NULL)
680+ {
681+#ifdef IPV6
682+ if (af_ty==AF_INET6)
683+ *port = ntohs(from6.sin6_port);
684+ else
685+#endif
686 *port = ntohs(from.sin_port);
687+ }
688 /* Set up all the normal socket crap */
689- setsock(new_sock, (binary ? SOCK_BINARY : 0));
690+ setsock(new_sock, (binary ? SOCK_BINARY : 0),af_ty);
691 return new_sock;
692 }
693
694@@ -562,6 +778,14 @@
695 p = atoi(port);
696 else
697 p = 2000;
698+#ifdef IPV6
699+ if(getprotocol(server)==AF_INET6)
700+ {
701+ server[0]=0;
702+ if(strlen(server)<500)
703+ strcpy(sv,server);
704+ } else {
705+#endif
706 if (server != NULL)
707 addr = my_atoul(server);
708 else
709@@ -573,6 +797,9 @@
710 c[2] = (addr >> 8) & 0xff;
711 c[3] = addr & 0xff;
712 sprintf(sv, "%u.%u.%u.%u", c[0], c[1], c[2], c[3]);
713+#ifdef IPV6
714+ }
715+#endif
716 p = open_telnet_raw(sock, sv, p);
717 return p;
718 }
719@@ -1112,6 +1339,14 @@
720 if (!dcc_sanitycheck)
721 return 1;
722
723+#ifdef IPV6
724+ if(getprotocol(ipaddy)==AF_INET6)
725+ {
726+ return 1;
727+ }
728+#endif
729+
730+
731 if (prt < 1) {
732 putlog(LOG_MISC, "*", "ALERT: (%s!%s) specified an impossible port of %u!",
733 nick, from, prt);
734diff -urN eggdrop1.6.19/src/proto.h eggdrop1.6.19-ipv6/src/proto.h
735--- src/proto.h 2008-02-16 22:41:04.000000000 +0100
736+++ src/proto.h 2008-07-27 22:13:46.000000000 +0200
737@@ -245,9 +245,11 @@
738 unsigned long iptolong(IP);
739 IP getmyip();
740 void neterror(char *);
741-void setsock(int, int);
742-int allocsock(int, int);
743-int getsock(int);
744+void setsock(int, int, int);
745+int allocsock(int, int, int);
746+int getsock(int, int);
747+int getprotocol(char *);
748+char *hostnamefromip(unsigned long);
749 void killsock(int);
750 int answer(int, char *, unsigned long *, unsigned short *, int);
751 inline int open_listen(int *);
752diff -urN eggdrop1.6.19/src/tcl.c eggdrop1.6.19-ipv6/src/tcl.c
753--- src/tcl.c 2008-02-16 22:41:04.000000000 +0100
754+++ src/tcl.c 2008-07-27 22:13:49.000000000 +0200
755@@ -46,7 +46,7 @@
756 extern time_t online_since;
757
758 extern char origbotname[], botuser[], motdfile[], admin[], userfile[],
759- firewall[], helpdir[], notify_new[], hostname[], myip[], moddir[],
760+ firewall[], helpdir[], notify_new[], hostname[], hostname6[], myip[], myip6[], moddir[],
761 tempdir[], owner[], network[], botnetnick[], bannerfile[],
762 egg_version[], natip[], configfile[], logfile_suffix[], textdir[],
763 pid_file[];
764@@ -461,6 +461,8 @@
765 {"owner", owner, 120, STR_PROTECT},
766 {"my-ip", myip, 120, 0},
767 {"my-hostname", hostname, 120, 0},
768+ {"my-ip6", myip6, 120, 0},
769+ {"my-hostname6", hostname6, 120, 0},
770 {"network", network, 40, 0},
771 {"whois-fields", whois_fields, 1024, 0},
772 {"nat-ip", natip, 120, 0},
773diff -urN eggdrop1.6.19/src/tcldcc.c eggdrop1.6.19-ipv6/src/tcldcc.c
774--- src/tcldcc.c 2008-02-16 22:41:04.000000000 +0100
775+++ src/tcldcc.c 2008-07-27 22:13:50.000000000 +0200
776@@ -850,7 +850,7 @@
777 Tcl_AppendResult(irp, "out of dcc table space", NULL);
778 return TCL_ERROR;
779 }
780- sock = getsock(0);
781+ sock = getsock(0,getprotocol(argv[1]));
782
783 if (sock < 0) {
784 Tcl_AppendResult(irp, MISC_NOFREESOCK, NULL);
785diff -urN eggdrop1.6.19/src/tclmisc.c eggdrop1.6.19-ipv6/src/tclmisc.c
786--- src/tclmisc.c 2008-02-16 22:41:04.000000000 +0100
787+++ src/tclmisc.c 2008-07-27 22:13:50.000000000 +0200
788@@ -428,6 +428,21 @@
789 return TCL_OK;
790 }
791
792+extern char myipv6host[120];
793+
794+static int tcl_myip6 STDVAR
795+{
796+ char s[120];
797+ getmyip();
798+
799+ BADARGS(1, 1, "");
800+ s[0]=0;
801+ if (strlen(myipv6host)<120)
802+ strcpy(s,myipv6host);
803+ Tcl_AppendResult(irp, s, NULL);
804+ return TCL_OK;
805+}
806+
807 static int tcl_rand STDVAR
808 {
809 unsigned long x;*** eggdrop1.6.19/src/net.h.org Thu Feb 5 23:55:45 2009
810--- src/net.h.org 2009-02-05 23:59:43.000000000 +0100
811+++ src/net.h 2009-02-05 23:59:52.000000000 +0100
812@@ -22,9 +22,7 @@
813 char *outbuf;
814 unsigned long outbuflen; /* Outbuf could be binary data */
815 unsigned long inbuflen; /* Inbuf could be binary data */
816-#ifdef USE_IPV6
817 unsigned int af;
818-#endif /* USE_IPV6 */
819 } sock_list;
820
821 #endif /* _EGG_NET_H */
This page took 0.17391 seconds and 4 git commands to generate.