]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/s_auth.c
Don't allow +Z to be set by default_umodes
[irc/rqf/shadowircd.git] / src / s_auth.c
index 672cb6dacfc48c8c8392e197b8a855edb11cac6e..2644ff14aa2ac3265f5bc2d03acb085e831ca91d 100644 (file)
@@ -20,8 +20,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
  *  USA
- *
- *  $Id: s_auth.c 3354 2007-04-03 09:21:31Z nenolod $ */
+ */
 
 /*
  * Changes:
@@ -58,6 +57,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 +296,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,32 +331,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);
-       if(getsockname(rb_get_fd(auth->client->localClient->F),
-                   (struct sockaddr *) &localaddr, &locallen) == -1)
-       {
-               /* can happen if connection was just closed */
-               rb_close(F);
-               return 0;
-       }
+       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);
@@ -514,11 +517,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)
@@ -528,21 +527,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;
@@ -571,7 +559,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))
        {