+ FlagClr(&privs, $1);
+ invert = 0;
+};
+
+privtype: TPRIV_CHAN_LIMIT { $$ = PRIV_CHAN_LIMIT; } |
+ TPRIV_MODE_LCHAN { $$ = PRIV_MODE_LCHAN; } |
+ TPRIV_DEOP_LCHAN { $$ = PRIV_DEOP_LCHAN; } |
+ TPRIV_WALK_LCHAN { $$ = PRIV_WALK_LCHAN; } |
+ KILL { $$ = PRIV_KILL; } |
+ TPRIV_LOCAL_KILL { $$ = PRIV_LOCAL_KILL; } |
+ TPRIV_REHASH { $$ = PRIV_REHASH; } |
+ TPRIV_RESTART { $$ = PRIV_RESTART; } |
+ TPRIV_DIE { $$ = PRIV_DIE; } |
+ TPRIV_GLINE { $$ = PRIV_GLINE; } |
+ TPRIV_LOCAL_GLINE { $$ = PRIV_LOCAL_GLINE; } |
+ JUPE { $$ = PRIV_JUPE; } |
+ TPRIV_LOCAL_JUPE { $$ = PRIV_LOCAL_JUPE; } |
+ TPRIV_LOCAL_OPMODE { $$ = PRIV_LOCAL_OPMODE; } |
+ TPRIV_OPMODE { $$ = PRIV_OPMODE; }|
+ TPRIV_SET { $$ = PRIV_SET; } |
+ TPRIV_WHOX { $$ = PRIV_WHOX; } |
+ TPRIV_BADCHAN { $$ = PRIV_BADCHAN; } |
+ TPRIV_LOCAL_BADCHAN { $$ = PRIV_LOCAL_BADCHAN; } |
+ TPRIV_SEE_CHAN { $$ = PRIV_SEE_CHAN; } |
+ TPRIV_SHOW_INVIS { $$ = PRIV_SHOW_INVIS; } |
+ TPRIV_SHOW_ALL_INVIS { $$ = PRIV_SHOW_ALL_INVIS; } |
+ TPRIV_PROPAGATE { $$ = PRIV_PROPAGATE; } |
+ TPRIV_UNLIMIT_QUERY { $$ = PRIV_UNLIMIT_QUERY; } |
+ TPRIV_DISPLAY { $$ = PRIV_DISPLAY; } |
+ TPRIV_SEE_OPERS { $$ = PRIV_SEE_OPERS; } |
+ TPRIV_WIDE_GLINE { $$ = PRIV_WIDE_GLINE; } |
+ TPRIV_LIST_CHAN { $$ = PRIV_LIST_CHAN; } |
+ LOCAL { $$ = PRIV_PROPAGATE; invert = 1; } |
+ TPRIV_FORCE_OPMODE { $$ = PRIV_FORCE_OPMODE; } |
+ TPRIV_FORCE_LOCAL_OPMODE { $$ = PRIV_FORCE_LOCAL_OPMODE; } |
+ TPRIV_APASS_OPMODE { $$ = PRIV_APASS_OPMODE; } ;
+
+yesorno: YES { $$ = 1; } | NO { $$ = 0; };
+
+/* not a recursive definition because some pedant will just come along
+ * and whine that the parser accepts "ipv4 ipv4 ipv4 ipv4"
+ */
+address_family:
+ { $$ = 0; }
+ | TOK_IPV4 { $$ = USE_IPV4; }
+ | TOK_IPV6 { $$ = USE_IPV6; }
+ | TOK_IPV4 TOK_IPV6 { $$ = USE_IPV4 | USE_IPV6; }
+ | TOK_IPV6 TOK_IPV4 { $$ = USE_IPV6 | USE_IPV4; }
+ ;
+
+/* The port block... */
+portblock: PORT '{' portitems '}' ';' {
+ struct ListenerFlags flags_here;
+ struct SLink *link;
+ if (hosts == NULL) {
+ struct SLink *link;
+ link = make_link();
+ DupString(link->value.cp, "*");
+ link->flags = 0;
+ link->next = hosts;
+ hosts = 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);