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 -----------------------