Author: Isomer <isomer@coders.net>
[ircu2.10.12-pk.git] / ircd / listener.c
index b4962656d3882e1e043b6560a2285e52ed93f391..fab23846c82ec68d7143fbfe812ac9329b54247e 100644 (file)
@@ -23,6 +23,7 @@
 #include "ircd.h"
 #include "ircd_alloc.h"
 #include "ircd_osdep.h"
+#include "ircd_reply.h"
 #include "ircd_string.h"
 #include "numeric.h"
 #include "s_bsd.h"
@@ -46,6 +47,9 @@
 #define INADDR_NONE ((unsigned int) 0xffffffff)
 #endif
 
+int tos_server = 0x08; // Low delay
+int tos_client = 0x08; // Low delay
+
 struct Listener* ListenerPollList = 0;
 
 static struct Listener* make_listener(int port, struct in_addr addr)
@@ -83,7 +87,7 @@ const char* get_listener_name(const struct Listener* listener)
 {
   static char buf[HOSTLEN + PORTNAMELEN + 4];
   assert(0 != listener);
-  sprintf_irc(buf, "%s:%u", me.name, listener->port);
+  sprintf_irc(buf, "%s:%u", cli_name(&me), listener->port);
   return buf;
 }
 
@@ -127,11 +131,9 @@ void show_ports(struct Client* sptr, int show_hidden, int port, int count)
     }
     else
       flags[1] = '\0';
-        
-    sendto_one(sptr, rpl_str(RPL_STATSPLINE),
-               me.name, sptr->name, listener->port,
-               listener->ref_count, flags, 
-               (listener->active) ? "active" : "disabled");
+
+    send_reply(sptr, RPL_STATSPLINE, listener->port, listener->ref_count,
+              flags, (listener->active) ? "active" : "disabled");
     if (--count == 0)
       break;
   }
@@ -214,6 +216,12 @@ static int inetport(struct Listener* listener)
     close(fd);
     return 0;
   }
+  /*
+   * Set the TOS bits - this is nonfatal if it doesn't stick.
+   */
+  if (!os_set_tos(fd,(listener->server) ? tos_server : tos_client)) {
+    report_error(TOS_ERROR_MSG, get_listener_name(listener), errno);
+  }
   listener->fd = fd;
 
   return 1;
@@ -245,7 +253,7 @@ static void set_listener_mask(struct Listener* listener, const char* mask)
 
   assert(0 != listener);
 
-  if (EmptyString(mask) && strcmp(mask,"*")!=0) {
+  if (EmptyString(mask) || 0 == strcmp(mask, "*")) {
     listener->mask.s_addr = 0;
     return;
   }
@@ -395,8 +403,8 @@ void release_listener(struct Listener* listener)
  */
 void accept_connection(struct Listener* listener)
 {
-  struct sockaddr_in addr;
-  size_t             addrlen = sizeof(struct sockaddr_in);
+  struct sockaddr_in addr = { 0 };
+  unsigned int       addrlen = sizeof(struct sockaddr_in);
   int                fd;
 
   assert(0 != listener);
@@ -413,8 +421,15 @@ void accept_connection(struct Listener* listener)
    * point, just assume that connections cannot
    * be accepted until some old is closed first.
    */
-  if (-1 == (fd = accept(listener->fd, (struct sockaddr*) &addr, &addrlen)))
+  if (-1 == (fd = accept(listener->fd, (struct sockaddr*) &addr, &addrlen))) {
+    /* Lotsa admins seem to have problems with not giving enough file descriptors
+     * to their server so we'll add a generic warning mechanism here.  If it
+     * turns out too many messages are generated for meaningless reasons we
+     * can filter them back.
+     */
+    sendto_opmask_butone(0, SNO_TCPCOMMON, "Unable to accept connection: %m");
     return;
+  }
   /*
    * check for connection limit
    */