Committer  : entrope
CVSROOT    : /cvsroot/undernet-ircu
Module     : ircu2.10
Commit time: 2004-11-10 03:47:46 UTC

Modified files:
     ChangeLog include/res.h ircd/ircd.c ircd/ircd_res.c
     ircd/os_generic.c

Log message:

Fix resolver code when IPv6 is enabled (or at least make it capable of working).

---------------------- diff included ----------------------
Index: ircu2.10/ChangeLog
diff -u ircu2.10/ChangeLog:1.508 ircu2.10/ChangeLog:1.509
--- ircu2.10/ChangeLog:1.508    Tue Nov  9 19:37:36 2004
+++ ircu2.10/ChangeLog  Tue Nov  9 19:47:34 2004
@@ -1,5 +1,21 @@
 2004-11-09  Michael Poole <[EMAIL PROTECTED]>
 
+       * include/res.h (init_resolver): Delete, and initialize lazily.
+
+       * ircd/ircd.c (main): Do not call init_resolver().
+
+       * ircd/ircd_res.c (restart_resolver): Use default VirtualHost for
+       local resolver socket address.
+       (init_resolver): Delete.
+       (make_request): Call restart_resolver() if necessary.
+       (query_name): Use ircrandom() instead of rand().
+
+       * ircd/os_generic.c (sockaddr_from_irc): Convert last argument to
+       a file descriptor that indicates the socket family to use.
+       (os_sendto_nonb,os_socket,os_connect_nonb): Update to match.
+
+2004-11-09  Michael Poole <[EMAIL PROTECTED]>
+
        * ircd/engine_epoll.c (engine_delete): Do not attempt to remove a
        socket from epoll on delete, since the kernel does that for us.
 
Index: ircu2.10/include/res.h
diff -u ircu2.10/include/res.h:1.14 ircu2.10/include/res.h:1.15
--- ircu2.10/include/res.h:1.14 Mon Sep 27 21:05:22 2004
+++ ircu2.10/include/res.h      Tue Nov  9 19:47:34 2004
@@ -1,6 +1,6 @@
 /** @file
  * @brief IRC resolver API.
- * @version $Id: res.h,v 1.14 2004/09/28 04:05:22 entrope Exp $
+ * @version $Id: res.h,v 1.15 2004/11/10 03:47:34 entrope Exp $
  */
 
 #ifndef INCLUDED_res_h
@@ -118,7 +118,6 @@
        unsigned        arcount :16;    /**< number of resource entries */
 } HEADER;
 
-extern int init_resolver(void);
 extern void restart_resolver(void);
 extern void add_local_domain(char *hname, size_t size);
 extern size_t cres_mem(struct Client* cptr);
Index: ircu2.10/ircd/ircd.c
diff -u ircu2.10/ircd/ircd.c:1.74 ircu2.10/ircd/ircd.c:1.75
--- ircu2.10/ircd/ircd.c:1.74   Mon Oct  4 21:14:43 2004
+++ ircu2.10/ircd/ircd.c        Tue Nov  9 19:47:34 2004
@@ -19,7 +19,7 @@
  */
 /** @file
  * @brief Entry point and other initialization functions for the daemon.
- * @version $Id: ircd.c,v 1.74 2004/10/05 04:14:43 entrope Exp $
+ * @version $Id: ircd.c,v 1.75 2004/11/10 03:47:34 entrope Exp $
  */
 #include "config.h"
 
@@ -674,8 +674,6 @@
   initmsgtree();
   initstats();
 
-  init_resolver();
-
   /* we need this for now, when we're modular this 
      should be removed -- hikari */
   ircd_crypt_init();
Index: ircu2.10/ircd/ircd_res.c
diff -u ircu2.10/ircd/ircd_res.c:1.7 ircu2.10/ircd/ircd_res.c:1.8
--- ircu2.10/ircd/ircd_res.c:1.7        Mon Sep 27 21:05:22 2004
+++ ircu2.10/ircd/ircd_res.c    Tue Nov  9 19:47:36 2004
@@ -18,7 +18,7 @@
  */
 /** @file
  * @brief IRC resolver functions.
- * @version $Id: ircd_res.c,v 1.7 2004/09/28 04:05:22 entrope Exp $
+ * @version $Id: ircd_res.c,v 1.8 2004/11/10 03:47:36 entrope Exp $
  */
 
 #include "client.h"
@@ -31,6 +31,7 @@
 #include "ircd.h"
 #include "numeric.h"
 #include "fileio.h" /* for fbopen / fbclose / fbputs */
+#include "random.h"
 #include "s_bsd.h"
 #include "s_debug.h"
 #include "s_stats.h"
@@ -53,6 +54,8 @@
 static struct Socket res_socket;
 /** Next DNS lookup timeout. */
 static struct Timer res_timeout;
+/** Check for whether the resolver has been initialized yet. */
+#define resolver_started() (request_list.next != NULL)
 
 /** Maximum DNS packet length.
  * RFC says 512, but we add extra for expanded names.
@@ -169,7 +172,7 @@
   if (!s_active(&res_socket))
   {
     int fd;
-    fd = os_socket(NULL, SOCK_DGRAM, "Resolver UDP socket");
+    fd = os_socket(&VirtualHost, SOCK_DGRAM, "Resolver UDP socket");
     if (fd < 0) return;
     if (!socket_add(&res_socket, res_readreply, NULL, SS_DATAGRAM,
                     SOCK_EVENT_READABLE, fd)) return;
@@ -177,19 +180,6 @@
   }
 }
 
-/** Initialize resolver.
- * This seends the pseudo-random number generator and calls
- * restart_resolver().
- * @return Resolver socket file descriptor.
- */
-int
-init_resolver(void)
-{
-  srand(CurrentTime);
-  restart_resolver();
-  return(s_fd(&res_socket));
-}
-
 /** Append local domain to hostname if needed.
  * If \a hname does not contain any '.'s, append #irc_domain to it.
  * @param[in,out] hname Hostname to check.
@@ -251,6 +241,9 @@
 {
   struct reslist *request;
 
+  if (!resolver_started())
+    restart_resolver();
+
   request = (struct reslist *)MyMalloc(sizeof(struct reslist));
   memset(request, 0, sizeof(struct reslist));
 
@@ -537,7 +530,7 @@
      */
     do
     {
-      header->id = (header->id + rand()) & 0xffff;
+      header->id = (header->id + ircrandom()) & 0xffff;
     } while (find_id(header->id));
     request->id = header->id;
     ++request->sends;
Index: ircu2.10/ircd/os_generic.c
diff -u ircu2.10/ircd/os_generic.c:1.16 ircu2.10/ircd/os_generic.c:1.17
--- ircu2.10/ircd/os_generic.c:1.16     Mon Oct  4 21:14:43 2004
+++ ircu2.10/ircd/os_generic.c  Tue Nov  9 19:47:36 2004
@@ -18,7 +18,7 @@
  */
 /** @file
  * @brief Implementation of OS-dependent operations.
- * @version $Id: os_generic.c,v 1.16 2004/10/05 04:14:43 entrope Exp $
+ * @version $Id: os_generic.c,v 1.17 2004/11/10 03:47:36 entrope Exp $
  */
 #include "config.h"
 
@@ -97,19 +97,30 @@
 /** Convert IRC socket address to native format.
  * @param[out] v6 Native socket address.
  * @param[in] irc IRC socket address.
- * @param[in] persist If non-zero, and \a irc is an IPv4 address,
- * create an AF_INET size address.
+ * @param[in] compat_fd If non-negative, an FD specifying address family.
  * @return Length of address written to \a v6.
  */
-int sockaddr_from_irc(struct sockaddr_in6 *v6, const struct irc_sockaddr *irc, 
int persist)
+int sockaddr_from_irc(struct sockaddr_in6 *v6, const struct irc_sockaddr *irc, 
int compat_fd)
 {
+    struct sockaddr_in6 sin6;
+    socklen_t slen;
+    int family;
+
+    slen = sizeof(sin6);
+    if ((0 <= compat_fd) && (0 == getsockname(compat_fd, (struct 
sockaddr*)&sin6, &slen)))
+        family = sin6.sin6_family;
+    else if (irc_in_addr_is_ipv4(&VirtualHost.addr))
+        family = AF_INET;
+    else
+        family = AF_INET6;
+
     memset(v6, 0, sizeof(*v6));
     if (!irc) {
         memset(v6, 0, sizeof(v6));
         v6->sin6_family = AF_INET6;
         return sizeof(*v6);
     }
-    else if (persist && irc_in_addr_is_ipv4(&irc->addr)) {
+    else if ((family == AF_INET) && irc_in_addr_is_ipv4(&irc->addr)) {
         struct sockaddr_in *v4 = (struct sockaddr_in*)v6;
         v4->sin_family = AF_INET;
         memcpy(&v4->sin_addr, &irc->addr.in6_16[6], sizeof(v4->sin_addr));
@@ -136,7 +147,7 @@
     irc->port = ntohs(v4->sin_port);
 }
 
-int sockaddr_from_irc(struct sockaddr_in *v4, const struct irc_sockaddr *irc, 
int persist)
+int sockaddr_from_irc(struct sockaddr_in *v4, const struct irc_sockaddr *irc, 
int compat_fd)
 {
     v4->sin_family = AF_INET;
     if (irc) {
@@ -146,7 +157,7 @@
     } else{
         memset(&v4, 0, sizeof(v4));
     }
-    (void)persist;
+    (void)compat_fd;
     return sizeof(*v4);
 }
 
@@ -497,7 +508,7 @@
     *count_out = 0;
   errno = 0;
 
-  size = sockaddr_from_irc(&addr, peer, 1);
+  size = sockaddr_from_irc(&addr, peer, fd);
   if (-1 < (res = sendto(fd, buf, length, flags, (struct sockaddr*)&addr, 
size))) {
     if (count_out)
       *count_out = (unsigned) res;
@@ -599,7 +610,7 @@
   struct sockaddr_native addr;
   int size, fd;
 
-  size = sockaddr_from_irc(&addr, local, 1);
+  size = sockaddr_from_irc(&addr, local, -1);
   fd = socket(addr.sn_family, type, 0);
   if (fd < 0) {
     report_error(SOCKET_ERROR_MSG, port_name, errno);
@@ -660,7 +671,7 @@
   struct sockaddr_native addr;
   int size;
 
-  size = sockaddr_from_irc(&addr, sin, 1);
+  size = sockaddr_from_irc(&addr, sin, fd);
   if (connect(fd, (struct sockaddr*) &addr, size))
     return (errno == EINPROGRESS) ? IO_BLOCKED : IO_FAILURE;
   return IO_SUCCESS;
----------------------- End of diff -----------------------

Reply via email to