- Update to 1.3.2

- Add include patch (permit including other files in config)
- Define LICENSE

PR:		ports/159331
Submitted by:	Alexander V. Chernikov <melifaro@ipfw.ru> (maintainer)
This commit is contained in:
Pav Lucistnik 2011-08-08 12:48:16 +00:00
parent f7798e7b27
commit a2bd73d474
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=279212
3 changed files with 331 additions and 3 deletions

View file

@ -6,7 +6,7 @@
#
PORTNAME= bird6
PORTVERSION= 1.3.1
PORTVERSION= 1.3.2
CATEGORIES= net
MASTER_SITES= ftp://bird.network.cz/pub/bird/
DISTNAME= bird-${PORTVERSION}
@ -14,15 +14,23 @@ DISTNAME= bird-${PORTVERSION}
MAINTAINER= melifaro@ipfw.ru
COMMENT= Dynamic IP routing daemon (IPv6 version)
LICENSE= GPLv2
USE_BISON= build
USE_GMAKE= yes
GNU_CONFIGURE= yes
CONFIGURE_ARGS= --enable-ipv6
OPTIONS= CONFIG_INCLUDES "Permit config 'include' keyword" Off
MAKE_JOBS_UNSAFE= yes
USE_RC_SUBR= bird6
.if defined(WITH_CONFIG_INCLUDES)
EXTRA_PATCHES+= ${FILESDIR}/extra-config_includes.diff
.endif
post-install:
@if [ ! -f ${PREFIX}/etc/bird6.conf ]; then \
${CP} -p ${PREFIX}/etc/bird6.conf.example ${PREFIX}/etc/bird6.conf ; \

View file

@ -1,2 +1,2 @@
SHA256 (bird-1.3.1.tar.gz) = 848be209aba6a1a85ae0ed6192710f8bcc2f1257068191fe2959398cdec01afb
SIZE (bird-1.3.1.tar.gz) = 826422
SHA256 (bird-1.3.2.tar.gz) = dbf8794ef3560382f10b8926e2d158da9d34670703090bfe378c08892743f54b
SIZE (bird-1.3.2.tar.gz) = 744121

View file

@ -0,0 +1,320 @@
Index: conf/conf.c
===================================================================
--- conf/conf.c (revision 4962)
+++ conf/conf.c (working copy)
@@ -108,7 +108,7 @@ config_parse(struct config *c)
cfg_mem = c->mem;
if (setjmp(conf_jmpbuf))
return 0;
- cf_lex_init(0);
+ cf_lex_init(c, 0);
sysdep_preconfig(c);
protos_preconfig(c);
rt_preconfig(c);
@@ -138,7 +138,7 @@ cli_parse(struct config *c)
cfg_mem = c->mem;
if (setjmp(conf_jmpbuf))
return 0;
- cf_lex_init(1);
+ cf_lex_init(c, 1);
cf_parse();
return 1;
}
@@ -356,6 +356,7 @@ cf_error(char *msg, ...)
strcpy(buf, "<bug: error message too long>");
new_config->err_msg = cfg_strdup(buf);
new_config->err_lino = conf_lino;
+ new_config->err_fname = conf_fname;
longjmp(conf_jmpbuf, 1);
}
Index: conf/cf-lex.l
===================================================================
--- conf/cf-lex.l (revision 4962)
+++ conf/cf-lex.l (working copy)
@@ -30,6 +30,9 @@
#include <errno.h>
#include <stdlib.h>
#include <stdarg.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <libgen.h>
#define PARSER 1
@@ -64,18 +67,36 @@ struct sym_scope {
static struct sym_scope *conf_this_scope;
int conf_lino;
+char conf_fname[255];
+int conf_fd;
+char conf_base[255];
+
static int cf_hash(byte *c);
static struct symbol *cf_find_sym(byte *c, unsigned int h0);
linpool *cfg_mem;
-int (*cf_read_hook)(byte *buf, unsigned int max);
+int (*cf_read_hook)(byte *buf, unsigned int max, int fd);
-#define YY_INPUT(buf,result,max) result = cf_read_hook(buf, max);
-#define YY_NO_UNPUT
+#define YY_INPUT(buf,result,max) result = cf_read_hook(buf, max, STACK(conf_fd));
#define YY_FATAL_ERROR(msg) cf_error(msg)
+#define MAX_INCLUDE_DEPTH 42
+struct include_file_stack {
+ YY_BUFFER_STATE stack; /* Internal lexer state */
+ unsigned int conf_lino; /* Current file lineno (at include) */
+ char conf_fname[255]; /* Current file name */
+ int conf_fd; /* Current file descriptor */
+};
+
+static struct include_file_stack ifs[MAX_INCLUDE_DEPTH];
+static int ifs_ind; /* Current stack depth */
+#define STACK(x) ifs[ifs_ind].x
+
+static void dispatch_include(void);
+static int check_eof(void);
+
%}
%option noyywrap
@@ -90,9 +111,12 @@ DIGIT [0-9]
XIGIT [0-9a-fA-F]
ALNUM [a-zA-Z_0-9]
WHITE [ \t]
+include ^{WHITE}*include{WHITE}*\".*\"{WHITE}*;
%%
+{include} { dispatch_include(); }
+
{DIGIT}+\.{DIGIT}+\.{DIGIT}+\.{DIGIT}+ {
#ifdef IPV6
if (ipv4_pton_u32(yytext, &cf_lval.i32))
@@ -188,7 +212,7 @@ else: {
["][^"\n]*\n cf_error("Unterminated string");
-<INITIAL,COMMENT><<EOF>> return END;
+<INITIAL,COMMENT><<EOF>> { if (check_eof()) return END; }
{WHITE}+
@@ -224,7 +248,67 @@ else: {
%%
+/* Open included file with properly swapped buffers */
+static void
+dispatch_include(void)
+{
+ char *fname, *p = NULL, full_name[255];
+ int fd;
+
+ if ((fname = strchr(yytext, '"')) != NULL) {
+ if ((p = strchr(++fname, '"')) != NULL)
+ *p = '\0';
+
+ if (*fname == '/')
+ snprintf(full_name, sizeof(full_name), "%s", fname);
+ else
+ snprintf(full_name, sizeof(full_name), "%s/%s", conf_base, fname);
+
+ if (ifs_ind >= MAX_INCLUDE_DEPTH)
+ cf_error("Max include depth (%d) reached on file %s", MAX_INCLUDE_DEPTH, fname);
+
+ if ((fd = open(full_name, O_RDONLY)) == -1)
+ cf_error("Error opening included file %s", full_name);
+
+ /* Save current stack */
+ STACK(conf_lino) = conf_lino;
+ STACK(stack) = YY_CURRENT_BUFFER;
+ /* Prepare new stack */
+ ifs_ind++;
+ STACK(conf_lino) = 1;
+ strcpy(STACK(conf_fname), fname); /* XXX: strlcpy should be here */
+ STACK(conf_fd) = fd;
+ /* Export to global variables */
+ conf_lino = STACK(conf_lino);
+ conf_fd = STACK(conf_fd);
+ strcpy(conf_fname, STACK(conf_fname));
+
+ yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
+ }
+}
+
static int
+check_eof(void)
+{
+ if (ifs_ind > 0)
+ close(STACK(conf_fd));
+ if (--ifs_ind < 0) {
+ /* EOF in main config file */
+ ifs_ind = 0;
+ conf_lino = 1;
+ return 1;
+ }
+
+ /* switch buffer */
+ conf_lino = STACK(conf_lino);
+ conf_fd = STACK(conf_fd);
+ strcpy(conf_fname, STACK(conf_fname));
+ yy_delete_buffer(YY_CURRENT_BUFFER);
+ yy_switch_to_buffer(STACK(stack));
+ return 0;
+}
+
+static int
cf_hash(byte *c)
{
unsigned int h = 13;
@@ -367,11 +451,28 @@ cf_lex_init_kh(void)
* parsing of a new input.
*/
void
-cf_lex_init(int is_cli)
+cf_lex_init(struct config *c, int is_cli)
{
if (!kw_hash_inited)
cf_lex_init_kh();
conf_lino = 1;
+ /* Zero stack */
+ memset(ifs, 0, sizeof(ifs));
+ memset(conf_base, 0, sizeof(conf_base));
+ ifs_ind = 0;
+ if (!is_cli) {
+ /* Fill in level 0 */
+ STACK(conf_lino) = 1;
+ STACK(conf_fd) = c->file_fd;
+ strcpy(STACK(conf_fname), c->file_name);
+ /* Save config directory path */
+ strcpy(conf_base, dirname(STACK(conf_fname)));
+ }
+ /* Export to global variables */
+ conf_lino = STACK(conf_lino);
+ conf_fd = STACK(conf_fd);
+ strcpy(conf_fname, STACK(conf_fname));
+
yyrestart(NULL);
if (is_cli)
BEGIN(CLI);
Index: conf/conf.h
===================================================================
--- conf/conf.h (revision 4962)
+++ conf/conf.h (working copy)
@@ -38,7 +38,9 @@ struct config {
int cli_debug; /* Tracing of CLI connections and commands */
char *err_msg; /* Parser error message */
int err_lino; /* Line containing error */
+ char *err_fname; /* File name containing error */
char *file_name; /* Name of configuration file */
+ int file_fd; /* Config file descriptor */
struct symbol **sym_hash; /* Lexer: symbol hash table */
struct symbol **sym_fallback; /* Lexer: fallback symbol hash table */
int obstacle_count; /* Number of items blocking freeing of this config */
@@ -83,7 +85,7 @@ char *cfg_strdup(char *c);
/* Lexer */
-extern int (*cf_read_hook)(byte *buf, unsigned int max);
+extern int (*cf_read_hook)(byte *buf, unsigned int max, int fd);
struct symbol {
struct symbol *next;
@@ -107,9 +109,10 @@ struct symbol {
#define SYM_VARIABLE 0x100 /* 0x100-0x1ff are variable types */
extern int conf_lino;
+extern char conf_fname[255];
int cf_lex(void);
-void cf_lex_init(int is_cli);
+void cf_lex_init(struct config *c, int is_cli);
struct symbol *cf_find_symbol(byte *c);
struct symbol *cf_default_name(char *template, int *counter);
struct symbol *cf_define_symbol(struct symbol *symbol, int type, void *def);
Index: doc/bird.conf.example
===================================================================
--- doc/bird.conf.example (revision 4962)
+++ doc/bird.conf.example (working copy)
@@ -22,6 +22,9 @@
# else reject;
#}
+# Write more filters in included config file(s):
+#include "filters.conf";
+
#filter sink { reject; }
#filter okay { accept; }
Index: sysdep/unix/main.c
===================================================================
--- sysdep/unix/main.c (revision 4962)
+++ sysdep/unix/main.c (working copy)
@@ -149,13 +149,12 @@ read_iproute_table(char *file, char *prefix, int m
#endif // PATH_IPROUTE_DIR
-static int conf_fd;
static char *config_name = PATH_CONFIG;
static int
-cf_read(byte *dest, unsigned int len)
+cf_read(byte *dest, unsigned int len, int fd)
{
- int l = read(conf_fd, dest, len);
+ int l = read(fd, dest, len);
if (l < 0)
cf_error("Read error");
return l;
@@ -185,15 +184,15 @@ static int
unix_read_config(struct config **cp, char *name)
{
struct config *conf = config_alloc(name);
- int ret;
+ int ret, fd;
*cp = conf;
- conf_fd = open(name, O_RDONLY);
- if (conf_fd < 0)
+ if ((fd = open(name, O_RDONLY)) == -1)
return 0;
+ conf->file_fd = fd;
cf_read_hook = cf_read;
ret = config_parse(conf);
- close(conf_fd);
+ close(fd);
return ret;
}
@@ -205,7 +204,7 @@ read_config(void)
if (!unix_read_config(&conf, config_name))
{
if (conf->err_msg)
- die("%s, line %d: %s", config_name, conf->err_lino, conf->err_msg);
+ die("%s, line %d: %s", conf->err_fname, conf->err_lino, conf->err_msg);
else
die("Unable to open configuration file %s: %m", config_name);
}
@@ -221,7 +220,7 @@ async_config(void)
if (!unix_read_config(&conf, config_name))
{
if (conf->err_msg)
- log(L_ERR "%s, line %d: %s", config_name, conf->err_lino, conf->err_msg);
+ log(L_ERR "%s, line %d: %s", conf->err_fname, conf->err_lino, conf->err_msg);
else
log(L_ERR "Unable to open configuration file %s: %m", config_name);
config_free(conf);
@@ -244,7 +243,7 @@ cmd_reconfig(char *name, int type)
if (!unix_read_config(&conf, name))
{
if (conf->err_msg)
- cli_msg(8002, "%s, line %d: %s", name, conf->err_lino, conf->err_msg);
+ cli_msg(8002, "%s, line %d: %s", conf->err_fname, conf->err_lino, conf->err_msg);
else
cli_msg(8002, "%s: %m", name);
config_free(conf);