From 1e438f3560e8dd6a83fe7bfca12e88bcc2685944 Mon Sep 17 00:00:00 2001 From: stskeeps Date: Sun, 9 Sep 2001 20:09:59 +0000 Subject: [PATCH] + fixing a IPv6 bug +- Made Inet_si2p (sin to presensation), fixing the "*", bug, some debugging + fixes, fixed a lot of IPv6 bugs, hopefully - thanks to JK for borrowing + his box --- Changes | 5 ++++- include/h.h | 7 +++++++ src/res.c | 27 ++++----------------------- src/s_bsd.c | 43 +++++++------------------------------------ src/send.c | 17 ++++++++++------- src/socket.c | 30 ++++++++++++++++++++++++++++++ 6 files changed, 62 insertions(+), 67 deletions(-) diff --git a/Changes b/Changes index c00e9dacc..b7a1081da 100644 --- a/Changes +++ b/Changes @@ -842,4 +842,7 @@ seen. gmtime warning still there - Some more VFS/PHTML fixes, it actually works now, thanks to butter - Fixed a IPv6 bindip problem - Removed bsd.c and made socket.c, moving signal stuff to ircd.c, possible - fixing a IPv6 bug \ No newline at end of file + fixing a IPv6 bug +- Made Inet_si2p (sin to presensation), fixing the "*", bug, some debugging + fixes, fixed a lot of IPv6 bugs, hopefully - thanks to JK for borrowing + his box diff --git a/include/h.h b/include/h.h index e8f399d58..65157b3eb 100644 --- a/include/h.h +++ b/include/h.h @@ -346,6 +346,13 @@ extern char *inetntop(int af, const void *in, char *local_dummy, size_t the_size); #endif +/* + * socket.c +*/ + +char *Inet_si2p(struct SOCKADDR_IN *sin); +char *Inet_si2pB(struct SOCKADDR_IN *sin, char *buf); + /* * CommandHash -Stskeeps */ diff --git a/src/res.c b/src/res.c index b246449a8..52cea9721 100644 --- a/src/res.c +++ b/src/res.c @@ -507,8 +507,8 @@ static int do_query_number(lp, numb, rptr) cp = (u_char *)numb->s6_addr; if (cp[0] == 0 && cp[1] == 0 && cp[2] == 0 && cp[3] == 0 && cp[4] == 0 && cp[5] == 0 && cp[6] == 0 && cp[7] == 0 && cp[8] == 0 - && cp[9] == 0 && ((cp[10] == 0 && cp[11] == 0) || (cp[10] == 0xff - && cp[11] == 0xff))) + && cp[9] == 0 && cp[10] == 0xff + && cp[11] == 0xff) { (void)ircsprintf(ipbuf, "%u.%u.%u.%u.in-addr.arpa.", (u_int)(cp[15]), (u_int)(cp[14]), @@ -546,30 +546,11 @@ static int do_query_number(lp, numb, rptr) { rptr = make_request(lp); rptr->type = T_PTR; -#ifndef _WIN32 -#ifdef INET6 - bcopy(numb->s6_addr, rptr->addr.s6_addr, IN6ADDRSZ); - bcopy((char *)numb->s6_addr, - (char *)&rptr->he.h_addr, sizeof(struct in6_addr)); -#else - rptr->addr.s_addr = numb->s_addr; - bcopy((char *)&numb->s_addr, - (char *)&rptr->he.h_addr, sizeof(struct in_addr)); -#endif + bcopy(numb->S_ADDR, rptr->addr.S_ADDR, sizeof(rptr->addr.S_ADDR)); rptr->he.h_length = sizeof(struct IN_ADDR); -#else - rptr->addr.S_ADDR = numb->S_ADDR; - rptr->he->h_length = sizeof(struct IN_ADDR); - -/* rptr->addr.s_addr = numb->s_addr; - bcopy((char *)&numb->s_addr, - (char *)&rptr->he->h_addr, sizeof(struct in_addr)); - rptr->he->h_length = sizeof(struct IN_ADDR);*/ - -#endif } #ifndef _WIN32 - return (query_name(ipbuf, C_IN, T_PTR, rptr)); + return (query_name(ipbuf, C_IN, T_PTR, rptr)); #else rptr->id = _beginthread(async_dns, 0, (void *)rptr); rptr->sends++; diff --git a/src/s_bsd.c b/src/s_bsd.c index 27b360ae7..9348cb2f9 100644 --- a/src/s_bsd.c +++ b/src/s_bsd.c @@ -657,24 +657,6 @@ void write_pidfile() #endif } -#ifdef INET6 -#undef IN6_IS_ADDR_LOOPBACK - -int IN6_IS_ADDR_LOOPBACK(u_int32_t * f) -{ - if ((*f == 0) && (*(f + 1) == 0) - && (*(f + 2) == 0) && (*(f + 3) == htonl(1))) - return 1; - - return 0; -} - -#define IN6_IS_ADDR_LOOPBACK(a) \ - ((u_int32_t) (a)[0] == 0) && \ - ((u_int32_t) (a)[1] == 0) && \ - ((u_int32_t) (a)[2] == 0) && \ - ((u_int32_t) (a)[3] == htonl(1)) -#endif /* * Initialize the various name strings used to store hostnames. This is set * from either the server's sockhost (if client fd is a tty or localhost) @@ -703,21 +685,16 @@ static int check_init(cptr, sockn) report_error("connect failure: %s %s", cptr); return -1; } -#ifdef INET6 - inetntop(AF_INET6, (char *)&sk.sin6_addr, sockn, MYDUMMY_SIZE); -#else - (void)strcpy(sockn, (char *)inetntoa((char *)&sk.SIN_ADDR)); -#endif + (void)strcpy(sockn, (char *)Inet_si2p(&sk)); #ifdef INET6 -#undef IN6_IS_ADDR_LOOPBACK if (IN6_IS_ADDR_LOOPBACK(&sk.SIN_ADDR)) #else if (inet_netof(sk.SIN_ADDR) == IN_LOOPBACKNET) #endif { cptr->hostp = NULL; - strncpyzt(sockn, me.sockhost, HOSTLEN); + strncpyzt(sockn, "localhost", HOSTLEN); } bcopy((char *)&sk.SIN_ADDR, (char *)&cptr->ip, sizeof(struct IN_ADDR)); @@ -1231,13 +1208,7 @@ add_con_refuse: /* Copy ascii address to 'sockhost' just in case. Then we * have something valid to put into error messages... */ -#ifdef INET6 - inetntop(AF_INET6, (char *)&addr.sin6_addr, mydummy, - MYDUMMY_SIZE); - get_sockhost(acptr, (char *)mydummy); -#else - get_sockhost(acptr, (char *)inetntoa((char *)&addr.SIN_ADDR)); -#endif + get_sockhost(acptr, Inet_si2p(&addr)); bcopy((char *)&addr.SIN_ADDR, (char *)&acptr->ip, sizeof(struct IN_ADDR)); j = 1; for (i = LastSlot; i >= 0; i--) @@ -1260,7 +1231,7 @@ add_con_refuse: } } - if ((bconf = Find_ban(inetntoa((char *)&acptr->ip), CONF_BAN_IP))) + if ((bconf = Find_ban(acptr->sockhost, CONF_BAN_IP))) { ircsprintf(zlinebuf, "ERROR :Closing Link: [%s] (You are not welcome on " @@ -1288,8 +1259,7 @@ add_con_refuse: } lin.flags = ASYNC_CLIENT; lin.value.cptr = acptr; - Debug((DEBUG_DNS, "lookup %s", inetntoa((char *)&addr.SIN_ADDR))); - + Debug((DEBUG_DNS, "lookup %s", acptr->sockhost)); acptr->hostp = gethost_byaddr((char *)&acptr->ip, &lin); if (!acptr->hostp) @@ -2524,8 +2494,9 @@ void do_dns_async(id) del_queries((char *)cptr); ClearDNS(cptr); cptr->hostp = hp; + if (SHOWCONNECTINFO) - sendto_one(cptr, REPORT_FIN_DNS); + sendto_one(cptr, cptr->hostp ? REPORT_FIN_DNS : REPORT_FAIL_DNS); if (!DoingAuth(cptr)) SetAccess(cptr); } diff --git a/src/send.c b/src/send.c index 8c1f7fb5a..6dac20018 100644 --- a/src/send.c +++ b/src/send.c @@ -81,6 +81,8 @@ static int dead_link(to, notice) aClient *to; char *notice; { + char *error = NULL; + to->flags |= FLAGS_DEADSOCKET; /* * If because of BUFFERPOOL problem then clean dbuf's now so that @@ -88,15 +90,16 @@ static int dead_link(to, notice) */ DBufClear(&to->recvQ); DBufClear(&to->sendQ); + +#ifndef _WIN32 + error = strerror(errno); +#else + error = strerror(WSAGetLastError()); +#endif if (!IsPerson(to) && !IsUnknown(to) && !(to->flags & FLAGS_CLOSING)) (void)sendto_failops_whoare_opers(notice, get_client_name(to, FALSE), -#ifndef _WIN32 - strerror(errno)); -#else - strerror(WSAGetLastError())); -#endif - - Debug((DEBUG_ERROR, notice, get_client_name(to, FALSE))); + error); + Debug((DEBUG_ERROR, notice, get_client_name(to, FALSE), error)); return -1; } diff --git a/src/socket.c b/src/socket.c index 69727eb1f..40a74fa4d 100644 --- a/src/socket.c +++ b/src/socket.c @@ -172,3 +172,33 @@ int deliver_it(aClient *cptr, char *str, int len) return (retval); } +char *Inet_si2pB(struct SOCKADDR_IN *sin, char *buf) +{ +#ifdef INET6 + u_char *cp; + + cp = (u_char *)sin->SIN_ADDR.s6_addr; + if (cp[0] == 0 && cp[1] == 0 && cp[2] == 0 && cp[3] == 0 && cp[4] == 0 + && cp[5] == 0 && cp[6] == 0 && cp[7] == 0 && cp[8] == 0 + && cp[9] == 0 && cp[10] == 0xff + && cp[11] == 0xff) + { + (void)ircsprintf(buf, "%u.%u.%u.%u", + (u_int)(cp[12]), (u_int)(cp[13]), + (u_int)(cp[14]), (u_int)(cp[15])); + + return (buf); + } +#endif + return ((char *)inetntop(sin->SIN_FAMILY, (void *)&sin->SIN_ADDR, buf, sizeof(buf))); + +} + +char *Inet_si2p(struct SOCKADDR_IN *sin) +{ + static char buf[256]; + + return (Inet_si2pB(sin, buf)); +} + +