X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/ed28210c45304471bededbcf07644046fc1119d6..cb097b8840594b6a77aab21d0b4c20f036a7d012:/src/s_auth.c diff --git a/src/s_auth.c b/src/s_auth.c index 9ae504c..a6143bb 100644 --- a/src/s_auth.c +++ b/src/s_auth.c @@ -58,6 +58,8 @@ struct AuthRequest unsigned int flags; /* current state of request */ rb_fde_t *F; /* file descriptor for auth queries */ time_t timeout; /* time when query expires */ + uint16_t lport; + uint16_t rport; }; /* @@ -295,7 +297,6 @@ static int start_auth_query(struct AuthRequest *auth) { struct rb_sockaddr_storage localaddr, destaddr; - socklen_t locallen = sizeof(struct rb_sockaddr_storage); rb_fde_t *F; int family; @@ -331,27 +332,35 @@ start_auth_query(struct AuthRequest *auth) * since the ident request must originate from that same address-- * and machines with multiple IP addresses are common now */ - memset(&localaddr, 0, locallen); - getsockname(rb_get_fd(auth->client->localClient->F), - (struct sockaddr *) &localaddr, &locallen); + localaddr = auth->client->preClient->lip; /* XXX mangle_mapped_sockaddr((struct sockaddr *)&localaddr); */ #ifdef RB_IPV6 if(localaddr.ss_family == AF_INET6) { + auth->lport = ntohs(((struct sockaddr_in6 *)&localaddr)->sin6_port); ((struct sockaddr_in6 *)&localaddr)->sin6_port = 0; - } else + } + else #endif - ((struct sockaddr_in *)&localaddr)->sin_port = 0; + { + auth->lport = ntohs(((struct sockaddr_in *)&localaddr)->sin_port); + ((struct sockaddr_in *)&localaddr)->sin_port = 0; + } destaddr = auth->client->localClient->ip; #ifdef RB_IPV6 if(localaddr.ss_family == AF_INET6) { + auth->rport = ntohs(((struct sockaddr_in6 *)&destaddr)->sin6_port); ((struct sockaddr_in6 *)&destaddr)->sin6_port = htons(113); - } else + } + else #endif - ((struct sockaddr_in *)&destaddr)->sin_port = htons(113); + { + auth->rport = ntohs(((struct sockaddr_in *)&destaddr)->sin_port); + ((struct sockaddr_in *)&destaddr)->sin_port = htons(113); + } auth->F = F; SetAuthConnect(auth); @@ -509,11 +518,7 @@ static void auth_connect_callback(rb_fde_t *F, int error, void *data) { struct AuthRequest *auth = data; - struct sockaddr_in us; - struct sockaddr_in them; char authbuf[32]; - socklen_t ulen = sizeof(struct sockaddr_in); - socklen_t tlen = sizeof(struct sockaddr_in); /* Check the error */ if(error != RB_OK) @@ -523,21 +528,10 @@ auth_connect_callback(rb_fde_t *F, int error, void *data) return; } - if(getsockname - (rb_get_fd(auth->client->localClient->F), (struct sockaddr *) &us, - (socklen_t *) & ulen) - || getpeername(rb_get_fd(auth->client->localClient->F), - (struct sockaddr *) &them, (socklen_t *) & tlen)) - { - ilog(L_IOERROR, "auth get{sock,peer}name error for %s:%m", - log_client_name(auth->client, SHOW_IP)); - auth_error(auth); - return; - } rb_snprintf(authbuf, sizeof(authbuf), "%u , %u\r\n", - (unsigned int) ntohs(them.sin_port), (unsigned int) ntohs(us.sin_port)); + auth->rport, auth->lport); - if(write(rb_get_fd(auth->F), authbuf, strlen(authbuf)) == -1) + if(rb_write(auth->F, authbuf, strlen(authbuf)) != strlen(authbuf)) { auth_error(auth); return; @@ -566,7 +560,7 @@ read_auth_reply(rb_fde_t *F, void *data) int count; char buf[AUTH_BUFSIZ + 1]; /* buffer to read auth reply into */ - len = read(rb_get_fd(F), buf, AUTH_BUFSIZ); + len = rb_read(F, buf, AUTH_BUFSIZ); if(len < 0 && rb_ignore_errno(errno)) {