Convert listeners to use a flagset in preparation for IPv4/IPv6 selection.
[ircu2.10.12-pk.git] / ircd / s_bsd.c
index 2a57382856f66d4030e6eedfc7fe67c96906602c..71706e518536ee58478860c4cac23cf851cffd57 100644 (file)
 #include <sys/utsname.h>
 #include <unistd.h>
 
-#ifdef USE_POLL
-#include <sys/poll.h>
-#endif /* USE_POLL */
-
 /** Array of my own clients, indexed by file descriptor. */
 struct Client*            LocalClientArray[MAXCONNECTIONS];
 /** Maximum file descriptor in current use. */
@@ -108,24 +104,6 @@ const char* const TOS_ERROR_MSG          = "error setting TOS for %s: %s";
 static void client_sock_callback(struct Event* ev);
 static void client_timer_callback(struct Event* ev);
 
-#if !defined(USE_POLL)
-#if FD_SETSIZE < (MAXCONNECTIONS + 4)
-/*
- * Sanity check
- *
- * All operating systems work when MAXCONNECTIONS <= 252.
- * Most operating systems work when MAXCONNECTIONS <= 1020 and FD_SETSIZE is
- *   updated correctly in the system headers (on BSD systems our sys.h has
- *   defined FD_SETSIZE to MAXCONNECTIONS+4 before including the system's headers 
- *   but sys/types.h might have abruptly redefined it so the check is still 
- *   done), you might already need to recompile your kernel.
- * For larger FD_SETSIZE your mileage may vary (kernel patches may be needed).
- * The check is _NOT_ done if we will not use FD_SETS at all (USE_POLL)
- */
-#error "FD_SETSIZE is too small or MAXCONNECTIONS too large."
-#endif
-#endif
-
 
 /*
  * Cannot use perror() within daemon. stderr is closed in
@@ -154,13 +132,7 @@ void report_error(const char* text, const char* who, int err)
   if (EmptyString(who))
     who = "unknown";
 
-  if (last_notice + 20 < CurrentTime) {
-    /*
-     * pace error messages so opers don't get flooded by transients
-     */
-    sendto_opmask_butone(0, SNO_OLDSNO, text, who, errmsg);
-    last_notice = CurrentTime;
-  }
+  sendto_opmask_butone_ratelimited(0, SNO_OLDSNO, &last_notice, text, who, errmsg);
   log_write(LS_SOCKET, L_ERROR, 0, text, who, errmsg);
   errno = errtmp;
 }
@@ -229,6 +201,8 @@ static int connect_inet(struct ConfItem* aconf, struct Client* cptr)
 {
   const struct irc_sockaddr *local;
   IOResult result;
+  int family = 0;
+
   assert(0 != aconf);
   assert(0 != cptr);
   /*
@@ -237,11 +211,12 @@ static int connect_inet(struct ConfItem* aconf, struct Client* cptr)
    */
   if (irc_in_addr_valid(&aconf->origin.addr))
     local = &aconf->origin;
-  else if (irc_in_addr_is_ipv4(&aconf->address.addr))
+  else if (irc_in_addr_is_ipv4(&aconf->address.addr)) {
     local = &VirtualHost_v4;
-  else
+    family = AF_INET;
+  } else
     local = &VirtualHost_v6;
-  cli_fd(cptr) = os_socket(local, SOCK_STREAM, cli_name(cptr));
+  cli_fd(cptr) = os_socket(local, SOCK_STREAM, cli_name(cptr), family);
   if (cli_fd(cptr) < 0)
     return 0;
 
@@ -518,7 +493,7 @@ void add_connection(struct Listener* listener, int fd) {
    */
   os_disable_options(fd);
 
-  if (listener->server)
+  if (listener_server(listener))
   {
     new_client = make_client(0, STAT_UNKNOWN_SERVER);
   }