Allow specification of DNS vhost and server in ircd.conf.
[ircu2.10.12-pk.git] / ircd / ircd_parser.y
index 2c0dddcabe0d7c26b298a899c4ffdcb10a2fbd22..29b14ef6fef7a441088cf140aaf2868bcba2871c 100644 (file)
@@ -163,6 +163,7 @@ static void parse_error(char *pattern,...) {
 %token AUTOCONNECT
 %token PROGRAM
 %token TOK_IPV4 TOK_IPV6
+%token DNS
 /* and now a lot of privileges... */
 %token TPRIV_CHAN_LIMIT TPRIV_MODE_LCHAN TPRIV_DEOP_LCHAN TPRIV_WALK_LCHAN
 %token TPRIV_LOCAL_KILL TPRIV_REHASH TPRIV_RESTART TPRIV_DIE
@@ -283,7 +284,9 @@ generalblock: GENERAL
     parse_error("Your General block must contain a numeric (between 1 and 4095).");
 };
 generalitems: generalitem generalitems | generalitem;
-generalitem: generalnumeric | generalname | generalvhost | generaldesc;
+generalitem: generalnumeric | generalname | generalvhost | generaldesc
+  | generaldnsvhost | generaldnsserver;
+
 generalnumeric: NUMERIC '=' NUMBER ';'
 {
   if (localConf.numeric == 0)
@@ -329,6 +332,36 @@ generalvhost: VHOST '=' QSTRING ';'
   MyFree(vhost);
 };
 
+generaldnsvhost: DNS VHOST '=' address_family QSTRING ';'
+{
+  struct irc_in_addr addr;
+  int families = $4;
+  char *vhost = $5;
+
+  if (!strcmp(vhost, "*")) {
+    /* Let the operating system assign the default. */
+  } else if (!ircd_aton(&addr, vhost))
+    parse_error("Invalid DNS virtual host '%s'.", vhost);
+  else
+  {
+    if ((families & USE_IPV4)
+        || (!families && irc_in_addr_is_ipv4(&addr)))
+      memcpy(&VirtualHost_dns_v4.addr, &addr, sizeof(addr));
+    if ((families & USE_IPV6)
+        || (!families && !irc_in_addr_is_ipv4(&addr)))
+      memcpy(&VirtualHost_dns_v6.addr, &addr, sizeof(addr));
+  }
+  MyFree(vhost);
+};
+
+generaldnsserver: DNS SERVER '=' QSTRING ';'
+{
+  char *server = $4;
+
+  add_nameserver(server);
+  MyFree(server);
+};
+
 adminblock: ADMIN
 {
   MyFree(localConf.location1);