Committer  : entrope
CVSROOT    : /cvsroot/undernet-ircu
Module     : ircu2.10
Branch tags: u2_10_12_branch
Commit time: 2007-03-18 02:47:06 UTC

Modified files:
  Tag: u2_10_12_branch
     ChangeLog doc/example.conf ircd/ircd_parser.y

Log message:

Allow multiple server entries in a CRule and multiple vhosts in a Port.

---------------------- diff included ----------------------
Index: ircu2.10/ChangeLog
diff -u ircu2.10/ChangeLog:1.710.2.163 ircu2.10/ChangeLog:1.710.2.164
--- ircu2.10/ChangeLog:1.710.2.163      Sat Mar 17 19:33:02 2007
+++ ircu2.10/ChangeLog  Sat Mar 17 19:46:56 2007
@@ -1,5 +1,26 @@
 2007-03-17  Michael Poole <[EMAIL PROTECTED]>
 
+       * doc/example.conf (CRule): Document the support for multiple
+       server masks in a single CRule block.
+       (Port): Document the optional additional field for vhost entries.
+       Document the support for multiple vhost entries in a single Port
+       block.
+
+       * ircd/ircd_parser.y (USE_IPV4): Shift up by 16 bytes.
+       (USE_IPV6): Likewise.
+       (portblock): Iterate over hosts rather than using the single host.
+       (portitem): Add portvhostnumber alternative production.
+       (portnumber): Check port number here.  If valid, combine address
+       family and port number in "port" variable.  If a port-less item
+       exists in "hosts", set its port number.
+       (portvhost): Prepend mask to "hosts" list.
+       (portvhostnumber): New production.
+       (cruleblock): Iterate over hosts rather than using the single
+       host.
+       (cruleserver): Prepend server mask to "hosts" list.
+
+2007-03-17  Michael Poole <[EMAIL PROTECTED]>
+
        * ircd/listener.c (add_listener): Only try to create IPv6 sockets
        for IPv6-compatible addresses; likewise for IPv4.
 
Index: ircu2.10/doc/example.conf
diff -u ircu2.10/doc/example.conf:1.61.2.16 ircu2.10/doc/example.conf:1.61.2.17
--- ircu2.10/doc/example.conf:1.61.2.16 Sat Mar 17 18:46:58 2007
+++ ircu2.10/doc/example.conf   Sat Mar 17 19:46:56 2007
@@ -570,6 +570,8 @@
 #
 # For an advanced, real-time rule-based routing decision making system
 # you can use crule blocks. For more information, see doc/readme.crules.
+# If more than one server mask is present in a single crule, the rule
+# applies to all servers.
 # CRULE
 # {
 #  server = "servermask";
@@ -673,11 +675,14 @@
 # IANA says we should use port 194, but that requires us to run as root,
 # so we don't do that.
 #
+#
 # Port {
 #  port = [ipv4] [ipv6] number;
 #  mask = "ipmask";
 #  # Use this to control the interface you bind to.
 #  vhost = [ipv4] [ipv6] "virtualhostip";
+#  # You can specify both virtual host and port number in one entry.
+#  vhost = [ipv4] [ipv6] "virtualhostip" number;
 #  # Setting to yes makes this server only.
 #  server = yes;
 #  # Setting to yes makes the port "hidden" from stats.
@@ -730,6 +735,14 @@
  port = 7000;
 };
 
+# More than one vhost may be present in a single Port block; in this case,
+# we recommend listing the port number on the vhost line for clarity.
+Port {
+ vhost = "172.16.0.1" 6667;
+ vhost = "172.16.3.1" 6668;
+ hidden = no;
+};
+
 # Quarantine blocks disallow operators from using OPMODE and CLEARMODE
 # on certain channels.  Opers with the force_opmode (for local
 # channels, force_local_opmode) privilege may override the quarantine
Index: ircu2.10/ircd/ircd_parser.y
diff -u ircu2.10/ircd/ircd_parser.y:1.56.2.11 
ircu2.10/ircd/ircd_parser.y:1.56.2.12
--- ircu2.10/ircd/ircd_parser.y:1.56.2.11       Sat Mar 17 18:46:58 2007
+++ ircu2.10/ircd/ircd_parser.y Sat Mar 17 19:46:56 2007
@@ -17,7 +17,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: ircd_parser.y,v 1.56.2.11 2007/03/18 01:46:58 entrope Exp $
+ * $Id: ircd_parser.y,v 1.56.2.12 2007/03/18 02:46:56 entrope Exp $
  */
 %{
 
@@ -60,8 +60,8 @@
 #include <arpa/inet.h>
 
 #define MAX_STRINGS 80 /* Maximum number of feature params. */
-#define USE_IPV4 (1 << 0)
-#define USE_IPV6 (1 << 1)
+#define USE_IPV4 (1 << 16)
+#define USE_IPV6 (1 << 17)
 
   extern struct LocalConf   localConf;
   extern struct DenyConf*   denyConfList;
@@ -695,45 +695,68 @@
     ;
 
 /* The port block... */
-portblock: PORT '{' portitems '}' ';'
-{
-  if (!FlagHas(&listen_flags, LISTEN_IPV4)
-      && !FlagHas(&listen_flags, LISTEN_IPV6))
-  {
-    FlagSet(&listen_flags, LISTEN_IPV4);
-    FlagSet(&listen_flags, LISTEN_IPV6);
+portblock: PORT '{' portitems '}' ';' {
+  struct ListenerFlags flags_here;
+  struct SLink *link;
+  for (link = hosts; link != NULL; link = link->next) {
+    memcpy(&flags_here, &listen_flags, sizeof(&flags_here));
+    switch (link->flags & (USE_IPV4 | USE_IPV6)) {
+    case USE_IPV4:
+      FlagSet(&flags_here, LISTEN_IPV4);
+      break;
+    case USE_IPV6:
+      FlagSet(&flags_here, LISTEN_IPV6);
+      break;
+    default: /* 0 or USE_IPV4|USE_IPV6 */
+      FlagSet(&flags_here, LISTEN_IPV4);
+      FlagSet(&flags_here, LISTEN_IPV6);
+      break;
+    }
+    if (link->flags & 65535)
+      port = link->flags & 65535;
+    add_listener(port, link->value.cp, pass, &flags_here);
   }
-  if (port > 0 && port <= 0xFFFF)
-    add_listener(port, host, pass, &listen_flags);
-  else
-    parse_error("Port %d is out of range", port);
-  MyFree(host);
+  free_slist(&hosts);
   MyFree(pass);
   memset(&listen_flags, 0, sizeof(listen_flags));
-  host = pass = NULL;
+  pass = NULL;
   port = 0;
 };
 portitems: portitem portitems | portitem;
-portitem: portnumber | portvhost | portmask | portserver | porthidden;
+portitem: portnumber | portvhost | portvhostnumber | portmask | portserver | 
porthidden;
 portnumber: PORT '=' address_family NUMBER ';'
 {
-  int families = $3;
-  if (families & USE_IPV4)
-    FlagSet(&listen_flags, LISTEN_IPV4);
-  else if (families & USE_IPV6)
-    FlagSet(&listen_flags, LISTEN_IPV6);
-  port = $4;
+  if ($4 < 1 || $4 > 65535) {
+    parse_error("Port %d is out of range", port);
+  } else {
+    port = $3 | $4;
+    if (hosts && (0 == (hosts->flags & 65535)))
+      hosts->flags = (hosts->flags & ~65535) | port;
+  }
 };
 
 portvhost: VHOST '=' address_family QSTRING ';'
 {
-  int families = $3;
-  if (families & USE_IPV4)
-    FlagSet(&listen_flags, LISTEN_IPV4);
-  else if (families & USE_IPV6)
-    FlagSet(&listen_flags, LISTEN_IPV6);
-  MyFree(host);
-  host = $4;
+  struct SLink *link;
+  link = make_link();
+  link->value.cp = $4;
+  link->flags = $3 | port;
+  link->next = hosts;
+  hosts = link;
+};
+
+portvhostnumber: VHOST '=' address_family QSTRING NUMBER ';'
+{
+  if ($5 < 1 || $5 > 65535) {
+    parse_error("Port %d is out of range", port);
+  } else {
+    struct SLink *link;
+    link = make_link();
+    link->value.cp = $4;
+    link->flags = $3 | $5;
+    link->next = hosts;
+    hosts = link;
+  }
 };
 
 portmask: MASK '=' QSTRING ';'
@@ -931,28 +954,30 @@
 } '{' cruleitems '}' ';'
 {
   struct CRuleNode *node = NULL;
-  if (host == NULL)
-    parse_error("Missing host in crule block");
+  struct SLink *link;
+
+  if (hosts == NULL)
+    parse_error("Missing server(s) in crule block");
   else if (pass == NULL)
     parse_error("Missing rule in crule block");
   else if ((node = crule_parse(pass)) == NULL)
     parse_error("Invalid rule '%s' in crule block", pass);
-  else
+  else for (link = hosts; link != NULL; link = link->next)
   {
     struct CRuleConf *p = (struct CRuleConf*) MyMalloc(sizeof(*p));
-    p->hostmask = host;
-    p->rule = pass;
+    if (node == NULL)
+      node = crule_parse(pass);
+    DupString(p->hostmask, link->value.cp);
+    DupString(p->rule, pass);
     p->type = tconn;
     p->node = node;
+    node = NULL;
     p->next = cruleConfList;
     cruleConfList = p;
   }
-  if (!node)
-  {
-    MyFree(host);
-    MyFree(pass);
-  }
-  host = pass = NULL;
+  free_slist(&hosts);
+  MyFree(pass);
+  pass = NULL;
   tconn = 0;
 };
 
@@ -961,9 +986,11 @@
 
 cruleserver: SERVER '=' QSTRING ';'
 {
-  MyFree(host);
-  collapse($3);
-  host = $3;
+  struct SLink *link;
+  link = make_link();
+  link->value.cp = $3;
+  link->next = hosts;
+  hosts = link;
 };
 
 crulerule: RULE '=' QSTRING ';'
----------------------- End of diff -----------------------
_______________________________________________
Patches mailing list
[email protected]
http://undernet.sbg.org/mailman/listinfo/patches

Reply via email to