added basic ssl support to ircu
[ircu2.10.12-pk.git] / ircd / ircd_lexer.l
index c8943b4e81255df00ee4160d645a8d16407ae052..8e6b55ff4c3658f564b92226b298ab8b534d6f2a 100644 (file)
 %{
 #include <unistd.h>
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include "config.h"
+#include "fileio.h"
 #include "ircd.h"
+#include "ircd_alloc.h"
 #include "ircd_string.h"
 #include "s_debug.h"
 #include "y.tab.h"
@@ -42,11 +46,15 @@ static struct lexer_token {
   TOKEN(CONTACT),
   TOKEN(CLASS),
   TOKEN(PINGFREQ),
+  TOKEN(CONNECT),
   TOKEN(CONNECTFREQ),
   TOKEN(MAXLINKS),
+  TOKEN(MAXHOPS),
   TOKEN(SENDQ),
   TOKEN(NAME),
   TOKEN(HOST),
+  TOKEN(IP),
+  TOKEN(USERNAME),
   TOKEN(PASS),
   TOKEN(SECONDS),
   TOKEN(MINUTES),
@@ -83,7 +91,6 @@ static struct lexer_token {
   TOKEN(REASON),
   TOKEN(RULE),
   TOKEN(ALL),
-  TOKEN(IP),
   TOKEN(CRULE),
   TOKEN(KILL),
   TOKEN(QUARANTINE),
@@ -94,8 +101,18 @@ static struct lexer_token {
   TOKEN(PSEUDO),
   TOKEN(PREPEND),
   TOKEN(USERMODE),
+  TOKEN(FAST),
+  TOKEN(AUTOCONNECT),
+  TOKEN(PROGRAM),
+  TOKEN(DNS),
+  TOKEN(SSL),
+  TOKEN(CERTFILE),
+  TOKEN(KEYFILE),
+  TOKEN(CAFILE),
 #undef TOKEN
   { "administrator", ADMIN },
+  { "apass_opmode", TPRIV_APASS_OPMODE },
+  { "auto", AUTOCONNECT },
   { "b", BYTES },
   { "badchan", TPRIV_BADCHAN },
   { "chan_limit", TPRIV_CHAN_LIMIT },
@@ -105,18 +122,22 @@ static struct lexer_token {
   { "file", TFILE },
   { "force_local_opmode", TPRIV_FORCE_LOCAL_OPMODE },
   { "force_opmode", TPRIV_FORCE_OPMODE },
+  { "gb", GBYTES },
+  { "gigabytes", GBYTES },
   { "gline", TPRIV_GLINE },
+  { "ipv4", TOK_IPV4 },
+  { "ipv6", TOK_IPV6 },
   { "kb", KBYTES },
   { "kilobytes", KBYTES },
+  { "list_chan", TPRIV_LIST_CHAN },
   { "local_badchan", TPRIV_LOCAL_BADCHAN },
   { "local_gline", TPRIV_LOCAL_GLINE },
   { "local_jupe", TPRIV_LOCAL_JUPE },
   { "local_kill", TPRIV_LOCAL_KILL },
+  { "local_opmode", TPRIV_LOCAL_OPMODE },
   { "mb", MBYTES },
   { "megabytes", MBYTES },
   { "mode_lchan", TPRIV_MODE_LCHAN },
-  { "gb", GBYTES },
-  { "gigabytes", GBYTES },
   { "operator", OPER },
   { "opmode", TPRIV_OPMODE },
   { "password", PASS },
@@ -132,6 +153,7 @@ static struct lexer_token {
   { "tb", TBYTES },
   { "terabytes", TBYTES },
   { "unlimit_query", TPRIV_UNLIMIT_QUERY },
+  { "unlimit_flood", TPRIV_UNLIMIT_FLOOD },
   { "walk_lchan", TPRIV_WALK_LCHAN },
   { "wide_gline", TPRIV_WIDE_GLINE },
   { "whox", TPRIV_WHOX },
@@ -169,22 +191,44 @@ find_token(char *token)
   return tok ? tok->value : 0;
 }
 
-void
+static FBFILE *lexer_input;
+
+#undef YY_INPUT
+#define YY_INPUT(buf, res, size) res = (fbgets(buf, size, lexer_input) ? strlen(buf) : 0)
+
+int
 init_lexer(void)
 {
-  yyin = fopen(configfile, "r");
-  if (yyin == NULL)
+  lexer_input = fbopen(configfile, "r");
+  if (lexer_input == NULL)
   {
 #ifdef YY_FATAL_ERROR
     YY_FATAL_ERROR("Could not open the configuration file.");
 #else
     fprintf(stderr, "Could not open the configuration file.");
 #endif
+    return 0;
   }
 #ifdef YY_NEW_FILE
   YY_NEW_FILE;
 #endif
   lineno = 1;
+  return 1;
+}
+
+void deinit_lexer(void)
+{
+  if (lexer_input != NULL)
+  {
+    fbclose(lexer_input);
+    lexer_input = NULL;
+  }
+}
+
+int
+yywrap(void)
+{
+  return 1;
 }
 
 %}
@@ -195,11 +239,11 @@ NUMBER [0-9]+
 QSTRING \"[^"\n]+[\"\n]
 %%
 
-{QSTRING} {yytext[yyleng-1] = 0; yylval.text = yytext+1; return QSTRING;}
+{QSTRING} {yytext[yyleng-1] = 0; DupString(yylval.text, yytext+1); return QSTRING;}
 {NUMBER} {yylval.num = strtoul(yytext, NULL, 10); return NUMBER;}
 {WHITE} ;
 {SHCOMMENT} ;
 
-[a-zA-Z_]+ { int res = find_token(yytext); if (res) return res; else REJECT; }
+[a-zA-Z_][a-zA-Z_0-9]* { int res = find_token(yytext); if (res) return res; else REJECT; }
 \n lineno++;
 . return yytext[0];