summaryrefslogtreecommitdiff
path: root/src/grammar.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/grammar.y')
-rw-r--r--src/grammar.y155
1 files changed, 155 insertions, 0 deletions
diff --git a/src/grammar.y b/src/grammar.y
new file mode 100644
index 0000000..4cc1261
--- /dev/null
+++ b/src/grammar.y
@@ -0,0 +1,155 @@
+/* $Id: grammar.y,v 1.1 2000-09-12 00:12:52 rjkaes Exp $
+ *
+ * This is the grammar for tinyproxy's configuration file. It needs to be
+ * in sync with scanner.l. If you know more about yacc and lex than I do
+ * please update these files.
+ *
+ * Copyright (C) 2000 Robert James Kaes (rjkaes@flarenet.com)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ */
+
+%{
+
+#include "tinyproxy.h"
+
+#include "acl.h"
+#include "anonymous.h"
+#include "log.h"
+#include "thread.h"
+
+void yyerror(char *s);
+int yylex(void);
+
+%}
+
+%union {
+ unsigned int num;
+ char *cptr;
+ void *ptr;
+}
+
+/* statements */
+%token KW_PORT KW_LISTEN
+%token KW_LOGFILE KW_PIDFILE KW_SYSLOG
+%token KW_MAXCLIENTS KW_MAXSPARESERVERS KW_MINSPARESERVERS KW_STARTSERVERS
+%token KW_MAXREQUESTSPERCHILD
+%token KW_TIMEOUT
+%token KW_USER KW_GROUP
+%token KW_ANONYMOUS KW_FILTER KW_XTINYPROXY KW_TUNNEL
+%token KW_ALLOW KW_DENY
+
+/* yes/no switches */
+%token KW_YES KW_NO
+
+%token <cptr> IDENTIFIER
+%token <num> NUMBER
+%token <cptr> STRING
+%token <cptr> NUMERIC_ADDRESS
+%token <cptr> STRING_ADDRESS
+%token <cptr> NETMASK_ADDRESS
+
+%type <num> yesno
+%type <cptr> string
+%type <cptr> network_address
+%type <cptr> unique_address
+
+%%
+
+start
+ : /* empty */
+ | start line
+ ;
+
+line
+ : '\n'
+ | statement '\n'
+ ;
+
+statement
+ : KW_PORT NUMBER { config.port = $2; }
+ | KW_TIMEOUT NUMBER { config.idletimeout = $2; }
+ | KW_SYSLOG yesno
+ {
+#ifdef HAVE_SYSLOG_H
+ config.syslog = $2;
+#else
+ log(LOG_WARNING, "Syslog support was not compiled in.");
+#endif
+ }
+ | KW_MAXCLIENTS NUMBER { thread_configure(THREAD_MAXCLIENTS, $2); }
+ | KW_MAXSPARESERVERS NUMBER { thread_configure(THREAD_MAXSPARESERVERS, $2); }
+ | KW_MINSPARESERVERS NUMBER { thread_configure(THREAD_MINSPARESERVERS, $2); }
+ | KW_STARTSERVERS NUMBER { thread_configure(THREAD_STARTSERVERS, $2); }
+ | KW_MAXREQUESTSPERCHILD NUMBER { thread_configure(THREAD_MAXREQUESTSPERCHILD, $2); }
+ | KW_LOGFILE string
+ {
+ config.logf_name = $2;
+ if (!config.logf_name) {
+ fprintf(stderr, "bad log file\n");
+ }
+ }
+ | KW_PIDFILE string { config.pidpath = $2; }
+ | KW_USER string { config.username = $2; }
+ | KW_GROUP string { config.group = $2; }
+ | KW_ANONYMOUS string { anon_insert($2); }
+ | KW_FILTER string
+ {
+#ifdef FILTER_ENABLE
+ config.filter = $2;
+#else
+ log(LOG_WARNING, "Filter support was not compiled in.");
+#endif
+ }
+ | KW_XTINYPROXY network_address { config.my_domain = $2; }
+ | KW_TUNNEL unique_address ':' NUMBER
+ {
+#ifdef TUNNEL_SUPPORT
+ config.tunnel_name = $2;
+ config.tunnel_port = $4;
+#else
+ log(LOG_WARNING, "Tunnel support was not compiled in.");
+#endif
+ }
+ | KW_LISTEN NUMERIC_ADDRESS { config.ipAddr = $2; }
+ | KW_ALLOW network_address { insert_acl($2, ACL_ALLOW); }
+ | KW_DENY network_address { insert_acl($2, ACL_DENY); }
+ ;
+
+network_address
+ : unique_address
+ | NETMASK_ADDRESS
+ ;
+
+unique_address
+ : STRING_ADDRESS
+ | NUMERIC_ADDRESS
+ ;
+
+yesno
+ : KW_YES { $$ = 1; }
+ | KW_NO { $$ = 0; }
+ | NUMBER { $$ = $1; }
+ ;
+
+string
+ : IDENTIFIER
+ | STRING
+ ;
+
+%%
+
+extern unsigned int yylineno;
+
+void yyerror(char *s)
+{
+ fprintf(stderr, "Line %d: %s\n", yylineno, s);
+}