Committer : entrope
CVSROOT : /cvsroot/undernet-ircu
Module : ircu2.10
Commit time: 2006-06-27 11:29:17 UTC
Modified files:
ircd/s_conf.c ircd/ircd_parser.y ircd/ircd_lexer.l
doc/example.conf ChangeLog
Log message:
Implement limited configuration file inclusion.
---------------------- diff included ----------------------
Index: ircu2.10/ChangeLog
diff -u ircu2.10/ChangeLog:1.780 ircu2.10/ChangeLog:1.781
--- ircu2.10/ChangeLog:1.780 Mon Jun 26 21:46:10 2006
+++ ircu2.10/ChangeLog Tue Jun 27 04:29:06 2006
@@ -1,5 +1,27 @@
2006-06-27 Michael Poole <[EMAIL PROTECTED]>
+ * doc/example.conf: Demonstrate the new inclusion syntax.
+
+ * ircd/ircd_lexer.l (init_lexer): Return a success indicator.
+ (lexer_include): New function.
+ (<<EOF>>): New handler.
+ (CHANNEL): Remove unused terminal symbol.
+ (TIMEOUT): Likewise.
+ (FROM): Recognize new terminal symbol.
+ (INCLUDE): Likewise.
+ (LINESYNC): Likewise.
+
+ * ircd/ircd_parser.y (%token): Remove CHANNEL, TIMEOUT; add
+ INCLUDE, LINESYNC, FROM, TEOF.
+ (block): Add includeblock production.
+ (includeblock): New production with several child productions.
+
+ * ircd/s_conf.c (lineno): Use external yylineno instead.
+ (read_configuration_file): Check init_lexer() return value.
+ (yyerror): Use yylineno instead.
+
+2006-06-27 Michael Poole <[EMAIL PROTECTED]>
+
* configure.ac: Make sure that $LEX is flex-compatible.
* test.l: Helper file for this test.
Index: ircu2.10/doc/example.conf
diff -u ircu2.10/doc/example.conf:1.70 ircu2.10/doc/example.conf:1.71
--- ircu2.10/doc/example.conf:1.70 Mon Jun 26 17:11:17 2006
+++ ircu2.10/doc/example.conf Tue Jun 27 04:29:06 2006
@@ -734,6 +734,33 @@
# program = "../path/to/iauth" "-n" "options go here";
# };
+# [Include]
+# You can include certain kinds of configuration snippets from other
+# files. The basic directive, which allows any kind of block or
+# recursive include, is:
+#
+# Include "filename";
+#
+# You can limit the file to certain types of configuration blocks by
+# using the block name. The following options, and ONLY the following
+# options, are supported:
+#
+# Include class from "filename";
+# Include client from "filename";
+# Include jupe from "filename";
+# Include kill from "filename";
+# Include linesync from "filename";
+# Include operator from "filename";
+# Include quarantine from "filename";
+# Include uworld from "filename";
+#
+# The linesync option allows UWorld, Jupe, Quarantine, and Kill blocks.
+# If the file includes other blocks, it causes a config syntax error at
+# the Include line.
+#
+# Include client from "clients.conf";
+# Include operator from "opers.conf";
+
# [features]
# IRC servers have a large number of options and features. Most of these
# are set at compile time through the use of #define's--see "make config"
Index: ircu2.10/ircd/ircd_lexer.l
diff -u ircu2.10/ircd/ircd_lexer.l:1.25 ircu2.10/ircd/ircd_lexer.l:1.26
--- ircu2.10/ircd/ircd_lexer.l:1.25 Mon Jun 26 21:46:10 2006
+++ ircu2.10/ircd/ircd_lexer.l Tue Jun 27 04:29:06 2006
@@ -17,45 +17,53 @@
* 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_lexer.l,v 1.25 2006/06/27 04:46:10 entrope Exp $
+ * $Id: ircd_lexer.l,v 1.26 2006/06/27 11:29:06 entrope Exp $
*/
%option never-interactive case-insensitive warn nodefault nounput yylineno
%{
-#ifndef YY_FATAL_ERROR
-# define YY_FATAL_ERROR(MSG) fprintf(stderr, MSG)
-#endif
-
-#ifndef YY_NEW_FILE
-# define YY_NEW_FILE
-#endif
-
#include "config.h"
#include "ircd_alloc.h"
#include "ircd_string.h"
#include "ircd_parser.h"
-void
+extern void yyerror(const char *pattern);
+
+int
init_lexer(const char *configfile)
{
yyin = fopen(configfile, "r");
if (yyin == NULL)
{
- YY_FATAL_ERROR("Could not open the configuration file.");
+ fprintf(stderr, "Could not open the configuration file.");
+ return 0;
+ }
+ return 1;
+}
+
+void
+lexer_include(const char *filename)
+{
+ yyin = fopen(filename, "r");
+ if (yyin == NULL)
+ {
+ yyerror("Unable to open included configuration file.");
+ return TEOF;
}
- YY_NEW_FILE;
+ yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE));
}
%}
%%
-\"[^"\n]+[\"\n] {yytext[yyleng-1] = 0; DupString(yylval.text, yytext+1);
return QSTRING;}
+\"[^"\n]+[\"\n] {yytext[yyleng-1] = 0; DupString(yylval.text,
yytext+1); return QSTRING;}
[0-9]+ {yylval.num = strtoul(yytext, NULL, 10); return NUMBER;}
[ \t\r\n]+ ;
#.* ;
+<<EOF>> { yypop_buffer_state(); if (YY_CURRENT_BUFFER) return
TEOF; else yyterminate(); }
ADMIN return ADMIN;
ADMINISTRATOR return ADMIN;
@@ -66,7 +74,6 @@
B return BYTES;
BADCHAN return TPRIV_BADCHAN;
BYTES return BYTES;
-CHANNEL return CHANNEL;
CHAN_LIMIT return TPRIV_CHAN_LIMIT;
CLASS return CLASS;
CLIENT return CLIENT;
@@ -85,6 +92,7 @@
FILE return TFILE;
FORCE_LOCAL_OPMODE return TPRIV_FORCE_LOCAL_OPMODE;
FORCE_OPMODE return TPRIV_FORCE_OPMODE;
+FROM return FROM;
GB return GBYTES;
GBYTES return GBYTES;
GENERAL return GENERAL;
@@ -95,6 +103,7 @@
HOURS return HOURS;
HUB return HUB;
IAUTH return IAUTH;
+INCLUDE return INCLUDE;
IP return IP;
JUPE return JUPE;
KB return KBYTES;
@@ -102,6 +111,7 @@
KILOBYTES return KBYTES;
KILL return KILL;
LEAF return LEAF;
+LINESYNC return LINESYNC;
LIST_CHAN return TPRIV_LIST_CHAN;
LOCAL return LOCAL;
LOCAL_BADCHAN return TPRIV_LOCAL_BADCHAN;
@@ -149,7 +159,6 @@
SET return TPRIV_SET;
SHOW_ALL_INVIS return TPRIV_SHOW_ALL_INVIS;
SHOW_INVIS return TPRIV_SHOW_INVIS;
-TIMEOUT return TIMEOUT;
TB return TBYTES;
TBYTES return TBYTES;
TERABYTES return TBYTES;
Index: ircu2.10/ircd/ircd_parser.y
diff -u ircu2.10/ircd/ircd_parser.y:1.63 ircu2.10/ircd/ircd_parser.y:1.64
--- ircu2.10/ircd/ircd_parser.y:1.63 Mon Jun 26 17:11:17 2006
+++ ircu2.10/ircd/ircd_parser.y Tue Jun 27 04:29:06 2006
@@ -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.63 2006/06/27 00:11:17 entrope Exp $
+ * $Id: ircd_parser.y,v 1.64 2006/06/27 11:29:06 entrope Exp $
*/
%{
@@ -97,7 +97,6 @@
%token CONTACT
%token CONNECT
%token CLASS
-%token CHANNEL
%token PINGFREQ
%token CONNECTFREQ
%token MAXLINKS
@@ -152,10 +151,13 @@
%token PREPEND
%token USERMODE
%token IAUTH
-%token TIMEOUT
%token FAST
%token AUTOCONNECT
%token PROGRAM
+%token INCLUDE
+%token LINESYNC
+%token FROM
+%token TEOF
/* 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
@@ -183,7 +185,7 @@
block: adminblock | generalblock | classblock | connectblock |
uworldblock | operblock | portblock | jupeblock | clientblock |
killblock | cruleblock | motdblock | featuresblock | quarantineblock |
- pseudoblock | iauthblock | error ';';
+ pseudoblock | iauthblock | includeblock | error ';';
/* The timespec, sizespec and expr was ripped straight from
* ircd-hybrid-7. */
@@ -1018,3 +1020,46 @@
while (stringno > 0)
MyFree(stringlist[stringno--]);
} stringlist ';';
+
+includeblock: INCLUDE QSTRING ';' { lexer_include($2); } blocks TEOF;
+
+/* These limitations are truly a pain, but making the allowed blocks a
+ * function of a list after the INCLUDE means context dependency and
+ * making a build-time list of combinations, each one either a token
+ * emitted by the lexer (2**N token types, one state each) or a list
+ * of token permutations (O(N!) states) -- neither of which is a happy
+ * place for the generated parser.
+ */
+
+includeblock: INCLUDE LINESYNC FROM QSTRING ';' { lexer_include($4); }
linesyncblocks2 TEOF;
+linesyncblocks2: linesyncblocks | error;
+linesyncblocks: linesyncblocks linesyncblock | ;
+linesyncblock: uworldblock | jupeblock | quarantineblock | killblock;
+
+includeblock: INCLUDE CLASS FROM QSTRING ';' { lexer_include($4); }
classblocks2 TEOF;
+classblocks2: classblocks | error;
+classblocks: classblocks classblock | ;
+
+includeblock: INCLUDE UWORLD FROM QSTRING ';' { lexer_include($4); }
uworldblocks2 TEOF;
+uworldblocks2: uworldblocks | error;
+uworldblocks: uworldblocks uworldblock | ;
+
+includeblock: INCLUDE OPER FROM QSTRING ';' { lexer_include($4); } operblocks2
TEOF;
+operblocks2: operblocks | error;
+operblocks: operblocks operblock | ;
+
+includeblock: INCLUDE JUPE FROM QSTRING ';' { lexer_include($4); } jupeblocks2
TEOF;
+jupeblocks2: jupeblocks | error;
+jupeblocks: jupeblocks jupeblock | ;
+
+includeblock: INCLUDE CLIENT FROM QSTRING ';' { lexer_include($4); }
clientblocks2 TEOF;
+clientblocks2: clientblocks | error;
+clientblocks: clientblocks clientblock | ;
+
+includeblock: INCLUDE KILL FROM QSTRING ';' { lexer_include($4); } killblocks2
TEOF;
+killblocks2: killblocks | error;
+killblocks: killblocks killblock | ;
+
+includeblock: INCLUDE QUARANTINE FROM QSTRING ';' { lexer_include($4); }
quarantineblocks2 TEOF;
+quarantineblocks2: quarantineblocks | error;
+quarantineblocks: quarantineblocks quarantineblock | ;
Index: ircu2.10/ircd/s_conf.c
diff -u ircu2.10/ircd/s_conf.c:1.88 ircu2.10/ircd/s_conf.c:1.89
--- ircu2.10/ircd/s_conf.c:1.88 Mon Jun 26 21:46:10 2006
+++ ircu2.10/ircd/s_conf.c Tue Jun 27 04:29:05 2006
@@ -19,7 +19,7 @@
*/
/** @file
* @brief ircd configuration file driver
- * @version $Id: s_conf.c,v 1.88 2006/06/27 04:46:10 entrope Exp $
+ * @version $Id: s_conf.c,v 1.89 2006/06/27 11:29:05 entrope Exp $
*/
#include "config.h"
@@ -75,7 +75,7 @@
struct qline *GlobalQuarantineList;
/** Current line number in scanner input. */
-int lineno;
+extern int yylineno;
/** Configuration information for #me. */
struct LocalConf localConf;
@@ -825,7 +825,7 @@
static int conf_already_read;
extern FILE *yyin;
extern void yyparse(void);
-extern void init_lexer(const char *configfile);
+extern int init_lexer(const char *configfile);
/** Read configuration file.
* @return Zero on failure, non-zero on success. */
@@ -833,7 +833,8 @@
{
conf_error = 0;
feature_unmark(); /* unmark all features for resetting later */
- init_lexer(configfile);
+ if (!init_lexer(configfile))
+ return 0;
yyparse();
fclose(yyin);
yyin = NULL;
@@ -849,11 +850,11 @@
yyerror(const char *msg)
{
sendto_opmask_butone(0, SNO_ALL, "Config file parse error line %d: %s",
- lineno, msg);
+ yylineno, msg);
log_write(LS_CONFIG, L_ERROR, 0, "Config file parse error line %d: %s",
- lineno, msg);
+ yylineno, msg);
if (!conf_already_read)
- fprintf(stderr, "Config file parse error line %d: %s\n", lineno, msg);
+ fprintf(stderr, "Config file parse error line %d: %s\n", yylineno, msg);
conf_error = 1;
}
----------------------- End of diff -----------------------
_______________________________________________
Patches mailing list
[email protected]
http://undernet.sbg.org/mailman/listinfo/patches