From cd74def9c61b7786c78727f265e7f26850a07744 Mon Sep 17 00:00:00 2001 From: Sergey Dorofeev Date: Tue, 4 Jun 2013 20:31:26 +0400 Subject: [PATCH] flush --- source/Makefile | 202 ++++++++ source/bforce/expression.c | 976 +++++++++++++++++++++++++++++++++++++ source/include/config.h | 154 ++++++ 3 files changed, 1332 insertions(+) create mode 100644 source/Makefile create mode 100644 source/bforce/expression.c create mode 100644 source/include/config.h diff --git a/source/Makefile b/source/Makefile new file mode 100644 index 0000000..c804bb5 --- /dev/null +++ b/source/Makefile @@ -0,0 +1,202 @@ +# +# Copyright (c) 1999-2000, Alexander Belkin +# +# Copyright (c) 2004, Evgeniy Kozhuhovskiy +# +# $Id$ +# + +prefix=/home/sergey/bforce +exec_prefix=${prefix} + +CC = gcc +INCLUDES = -I./include +CFLAGS = -g -O2 -fno-builtin +LIBS = -lrt +YACC = byacc +INSTALL = /usr/bin/install -c +INSTALL_PROGRAM = ${INSTALL} +INSTALL_DATA = ${INSTALL} -m 644 +SRCDIR = . +SRCDIRCONF = $(SRCDIR)/../examples +CONTRIBDIR = $(SRCDIR)/../contrib + +OWNER = sergey +GROUP = sergey +CONFDIR = ${prefix}/etc +BINDIR = ${exec_prefix}/bin +LOGDIR = /var/log/bforce +SPOOLDIR = /var/spool/bforce + +DAEMON_LOGFILE = $(LOGDIR)/bf-daemon +BFORCE_LOGFILE = $(LOGDIR)/bf-log +BFORCE_DEBFILE = $(LOGDIR)/bf-debug +BFORCE_DEBLEVEL = 0L +BFORCE_CFGFILE = $(CONFDIR)/bforce.conf + +DEFINES = -DDAEMON_LOGFILE=\"$(DAEMON_LOGFILE)\" \ + -DBFORCE_LOGFILE=\"$(BFORCE_LOGFILE)\" \ + -DBFORCE_DEBFILE=\"$(BFORCE_DEBFILE)\" \ + -DBFORCE_DEBLEVEL=$(BFORCE_DEBLEVEL) \ + -DBFORCE_CFGFILE=\"$(BFORCE_CFGFILE)\" \ + -DBF_OS=\"linux-gnu\" -DHAVE_CONFIG_H + +SUBDIRS = bforce bfutil + +BFINDEX_OBJS = bfutil/bfindex.o \ + bforce/conf_deinit.o bforce/conf_proc.o \ + bforce/conf_read.o bforce/conf_get.o \ + bforce/logger.o bforce/nodelist.o \ + bforce/u_file.o bforce/u_ftn.o \ + bforce/u_misc.o bforce/u_string.o \ + bforce/u_time.o + +NLOOKUP_OBJS = bfutil/nlookup.o \ + bforce/conf_deinit.o bforce/conf_proc.o \ + bforce/conf_read.o bforce/conf_get.o \ + bforce/logger.o bforce/nodelist.o \ + bforce/u_file.o bforce/u_ftn.o \ + bforce/u_misc.o bforce/u_string.o \ + bforce/u_time.o + +BFSTAT_OBJS = bfutil/bfstat.o \ + bforce/conf_deinit.o bforce/conf_proc.o \ + bforce/conf_read.o bforce/conf_get.o \ + bforce/outb_flo.o bforce/outb_fsqueue.o \ + bforce/sess_stat.o \ + bforce/outb_getname.o bforce/outb_sysqueue.o \ + bforce/outb_scan.o bforce/logger.o \ + bforce/u_file.o \ + bforce/u_ftn.o bforce/u_misc.o \ + bforce/u_string.o bforce/u_time.o \ + bforce/u_plock.o + +BFORCE_OBJS = bforce/bforce.o \ + bforce/daemon.o bforce/daemon_branch.o \ + bforce/daemon_call.o bforce/daemon_lines.o \ + bforce/conf_deinit.o \ + bforce/conf_proc.o bforce/conf_read.o \ + bforce/conf_get.o bforce/expression.o \ + bforce/freq_bark.o bforce/freq_proc.o \ + bforce/freq_srif.o bforce/freq_wazoo.o \ + bforce/io_modem.o bforce/io_tcpip.o \ + bforce/io_unix_lock.o bforce/io_unix_modem.o \ + bforce/io_unix_tio.o bforce/io_unix_tty.o \ + bforce/logger.o bforce/nodelist.o \ + bforce/os_unix.o bforce/outb_bsy.o \ + bforce/outb_flo.o bforce/outb_fsqueue.o \ + bforce/outb_getname.o bforce/outb_sysqueue.o \ + bforce/outb_scan.o bforce/prot_common.o \ + bforce/prot_binkp.o bforce/prot_binkp_api.o \ + bforce/prot_binkp_misc.o bforce/prot_hydra.o \ + bforce/prot_xmrecv.o bforce/prot_xmsend.o \ + bforce/prot_zmmisc.o bforce/prot_zmrecv.o \ + bforce/prot_zmsend.o \ + bforce/prot_yoohoo.o bforce/prot_yoohoo_api.o \ + bforce/prot_emsi.o bforce/prot_emsi_misc.o \ + bforce/prot_emsi_api.o \ + bforce/sess_common.o bforce/sess_stat.o \ + bforce/sess_call.o bforce/sess_answ.o \ + bforce/sess_init.o bforce/sess_main.o \ + bforce/u_crc.o bforce/u_ftn.o \ + bforce/u_md5.o \ + bforce/u_misc.o bforce/u_string.o \ + bforce/u_time.o bforce/u_file.o \ + bforce/u_pkt.o bforce/u_recode.o \ + bforce/u_plock.o bforce/netspool.o + +.c.o: + @echo Compiling $*.c + @$(CC) $(CFLAGS) $(INCLUDES) $(DEFINES) -c $< -o $@ + +all: bin bin/bforce bin/bfindex bin/bfstat bin/nlookup + +bin: + test -d bin || mkdir bin + +bforce/expression.c: bforce/expression.y + $(YACC) bforce/expression.y + mv y.tab.c bforce/expression.c + +bin/bforce: $(BFLIB_OBJS) $(BFORCE_OBJS) + @echo "Linking $@" + @$(CC) $(BFLIB_OBJS) $(BFORCE_OBJS) $(LIBS) -o $@ + +bin/bfindex: $(BFLIB_OBJS) $(BFINDEX_OBJS) + @echo "Linking $@" + @$(CC) $(BFLIB_OBJS) $(BFINDEX_OBJS) $(LIBS) -o $@ + +bin/nlookup: $(BFLIB_OBJS) $(NLOOKUP_OBJS) + @echo "Linking $@" + @$(CC) $(BFLIB_OBJS) $(NLOOKUP_OBJS) $(LIBS) -o $@ + +bin/bfstat: $(BFLIB_OBJS) $(BFSTAT_OBJS) + @echo "Linking $@" + @$(CC) $(BFLIB_OBJS) $(BFSTAT_OBJS) $(LIBS) -o $@ + + +clean: + @for i in $(SUBDIRS); do (rm -f $$i/*.o || exit 1); done + rm -f ./bforce/expression.c + rm -f ./bin/bforce + rm -f ./bin/bfindex + rm -f ./bin/bfstat + rm -f ./bin/nlookup + rm -f ./bin/core +clean-am: + rm -f ./Makefile + rm -f ./include/config.h + rm -f ./config.log + rm -f ./config.status +clean-ac: + rm -f ./configure + +distclean: clean clean-am + +distclean-m: distclean clean-ac + + +ifnames: + @for i in $(SUBDIRS); do (ifnames $$i/*.c || exit 1); done + +bforce/expression.y.o: bforce/expression.y.c bforce/expression.l.c + +bforce/expression.l.o: bforce/expression.y.c bforce/expression.l.c + +installdirs: + if [ ! -d $(CONFDIR) ]; then mkdir -p $(CONFDIR); fi + if [ ! -d $(BINDIR) ]; then mkdir -p $(BINDIR); fi + if [ ! -d $(LOGDIR) ]; then mkdir -p $(LOGDIR); fi + if [ ! -d $(SPOOLDIR) ]; then mkdir -p $(SPOOLDIR); fi + if [ ! -d $(SPOOLDIR)/bt/in ]; then mkdir -p $(SPOOLDIR)/bt/in; fi + if [ ! -d $(SPOOLDIR)/bt/pin ]; then mkdir -p $(SPOOLDIR)/bt/pin; fi + if [ ! -d $(SPOOLDIR)/bt/out ]; then mkdir -p $(SPOOLDIR)/bt/out; fi + if [ ! -d $(SPOOLDIR)/ndl ]; then mkdir -p $(SPOOLDIR)/ndl; fi + if [ ! -d $(SPOOLDIR)/bforce ]; then mkdir -p $(SPOOLDIR); fi + chown $(OWNER):$(GROUP) $(CONFDIR) + chown $(OWNER):$(GROUP) $(LOGDIR) + chown $(OWNER):$(GROUP) $(SPOOLDIR)/bt/in + chown $(OWNER):$(GROUP) $(SPOOLDIR)/bt/pin + chown $(OWNER):$(GROUP) $(SPOOLDIR)/bt/out + chown $(OWNER):$(GROUP) $(SPOOLDIR)/ndl + chown $(OWNER):$(GROUP) $(SPOOLDIR) + +install-bin: + $(INSTALL_PROGRAM) -o $(OWNER) -g $(GROUP) $(SRCDIR)/bin/bforce $(BINDIR)/bforce + $(INSTALL_PROGRAM) -o $(OWNER) -g $(GROUP) $(SRCDIR)/bin/bfindex $(BINDIR)/bfindex + $(INSTALL_PROGRAM) -o $(OWNER) -g $(GROUP) $(SRCDIR)/bin/bfstat $(BINDIR)/bfstat + $(INSTALL_PROGRAM) -o $(OWNER) -g $(GROUP) $(SRCDIR)/bin/nlookup $(BINDIR)/nlookup + +install-config: + $(INSTALL_DATA) -o $(OWNER) -g $(GROUP) $(SRCDIRCONF)/bforce.conf $(CONFDIR)/bforce.conf.sample + $(INSTALL_DATA) -o $(OWNER) -g $(GROUP) $(SRCDIRCONF)/bforce.subst $(CONFDIR)/bforce.subst.sample + $(INSTALL_DATA) -o $(OWNER) -g $(GROUP) $(SRCDIRCONF)/bforce.passwd $(CONFDIR)/bforce.passwd.sample + $(INSTALL_DATA) -o $(OWNER) -g $(GROUP) $(SRCDIRCONF)/freq.aliases $(CONFDIR)/freq.aliases.sample + $(INSTALL_DATA) -o $(OWNER) -g $(GROUP) $(SRCDIRCONF)/freq.dirs $(CONFDIR)/freq.dirs.sample + +install-contrib: + $(INSTALL_PROGRAM) -o $(OWNER) -g $(GROUP) $(CONTRIBDIR)/outman $(BINDIR)/outman + @echo "Please, edit $(BINDIR)/outman" + +install: install-bin install-config + diff --git a/source/bforce/expression.c b/source/bforce/expression.c new file mode 100644 index 0000000..9bcc369 --- /dev/null +++ b/source/bforce/expression.c @@ -0,0 +1,976 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 +#define YYPATCH 20120115 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + +#define YYPREFIX "yy" + +#define YYPURE 0 + +#line 49 "bforce/expression.y" +#include "includes.h" +#include "confread.h" +#include "util.h" +#include "logger.h" +#include "session.h" +#include "nodelist.h" +#include "io.h" + +static struct tm *now = NULL; +static int expr_result = 0; +static char *expr_p_pos = NULL; +static char *expr_p_text = NULL; + +/* + * These are expression element checkers (not only) + * Return values: + * 0 - FALSE + * 1 - TRUE + * -1 - cannot check, because some data is not available yet + * -2 - invalid element (we should not check this expression more) + */ +static int expr_check_incoming(void); +static int expr_check_outgoing(void); +static int expr_check_protected(void); +static int expr_check_listed(void); +static int expr_check_logic(int e1, int op, int e2); +static int expr_check_phone(const char *phone); +static int expr_check_arop(int num1, int op, int num2); +static int expr_check_flag(const char *str); +static int expr_check_exec(const char *str); +static int expr_check_exist(const char *str); +static int expr_check_port(const char *str); +static int expr_check_mailer(const char *str); +static int expr_check_addr(const char *str); +static int expr_check_time(const char *str); + +static int yylex(void); +static int yyparse(void); +static int yyerror(const char *s); + +#line 60 "y.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define COMMA 257 +#define TEXT 258 +#define NUMBER 259 +#define INCOMING 260 +#define OUTGOING 261 +#define LISTED 262 +#define PROTECTED 263 +#define CONNSPEED 264 +#define EXEC 265 +#define EXIST 266 +#define PORT 267 +#define MAILER 268 +#define TZ 269 +#define FLAG 270 +#define SPEED 271 +#define PHONE 272 +#define TIME 273 +#define ADDRESS 274 +#define EQ 275 +#define NE 276 +#define GT 277 +#define GE 278 +#define LT 279 +#define LE 280 +#define AND 281 +#define OR 282 +#define NOT 283 +#define XOR 284 +#define OPENB 285 +#define CLOSEB 286 +#define AROP 287 +#define LOGOP 288 +#define YYERRCODE 256 +static const short yylhs[] = { -1, + 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 4, 4, +}; +static const short yylen[] = { 2, + 1, 1, 2, 3, 3, 1, 1, 1, 1, 2, + 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, + 1, 3, 1, 3, +}; +static const short yydefred[] = { 0, + 20, 6, 7, 8, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 16, 17, 18, 19, 0, 0, 10, 0, 14, + 0, 15, 0, 0, 0, 11, 13, 0, 12, 0, + 5, 0, 22, 24, +}; +static const short yydgoto[] = { 18, + 19, 20, 28, 32, +}; +static const short yysindex[] = { -251, + 0, 0, 0, 0, 0, -287, -255, -254, -250, -232, + -259, -229, -257, -227, -225, -251, -251, 0, -253, 0, + -223, 0, 0, 0, 0, -222, -219, 0, -220, 0, + -217, 0, -253, -261, -251, 0, 0, -229, 0, -225, + 0, -253, 0, 0, +}; +static const short yyrindex[] = { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 2, 0, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 0, +}; +static const short yygindex[] = { 0, + 7, 0, 8, 3, +}; +#define YYTABLESIZE 292 +static const short yytable[] = { 21, + 21, 23, 22, 23, 3, 4, 1, 24, 2, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 33, 34, 41, 25, 35, 26, 27, 29, + 30, 16, 31, 17, 35, 36, 37, 38, 39, 40, + 1, 42, 44, 0, 0, 43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 21, 23, 21, 23, + 3, 4, +}; +static const short yycheck[] = { 287, + 0, 0, 258, 258, 0, 0, 258, 258, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 16, 17, 286, 258, 288, 287, 258, 287, + 258, 283, 258, 285, 288, 259, 259, 257, 259, 257, + 0, 35, 40, -1, -1, 38, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 286, 286, 288, 288, + 286, 286, +}; +#define YYFINAL 18 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 288 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"COMMA","TEXT","NUMBER", +"INCOMING","OUTGOING","LISTED","PROTECTED","CONNSPEED","EXEC","EXIST","PORT", +"MAILER","TZ","FLAG","SPEED","PHONE","TIME","ADDRESS","EQ","NE","GT","GE","LT", +"LE","AND","OR","NOT","XOR","OPENB","CLOSEB","AROP","LOGOP", +}; +static const char *yyrule[] = { +"$accept : fullline", +"fullline : expression", +"expression : elemexp", +"expression : NOT expression", +"expression : expression LOGOP expression", +"expression : OPENB expression CLOSEB", +"elemexp : INCOMING", +"elemexp : OUTGOING", +"elemexp : LISTED", +"elemexp : PROTECTED", +"elemexp : FLAG flagstring", +"elemexp : CONNSPEED AROP NUMBER", +"elemexp : SPEED AROP NUMBER", +"elemexp : TZ AROP NUMBER", +"elemexp : PHONE TEXT", +"elemexp : TIME timestring", +"elemexp : EXEC TEXT", +"elemexp : EXIST TEXT", +"elemexp : PORT TEXT", +"elemexp : MAILER TEXT", +"elemexp : TEXT", +"flagstring : TEXT", +"flagstring : TEXT COMMA flagstring", +"timestring : TEXT", +"timestring : TEXT COMMA timestring", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 211 "bforce/expression.y" + +#include "expression_lex.c" + +static int expr_check_incoming(void) +{ + if( !state.valid ) + return -1; + + return state.caller ? 0 : 1; +} + +static int expr_check_outgoing(void) +{ + if( !state.valid ) + return -1; + + return state.caller ? 1 : 0; +} + +static int expr_check_protected(void) +{ + if( !state.valid || !state.node.addr.zone ) + return -1; + + return state.protected ? 1 : 0; +} + +static int expr_check_listed(void) +{ + if( !state.valid || !state.node.addr.zone ) + return -1; + + return state.node.listed ? 1 : 0; +} + +static int expr_check_logic(int e1, int op, int e2) +{ + DEB((D_EVENT, "[yacc] logic: %d %d %d", e1, op, e2)); + + if( e1 < 0 ) e1 = 0; + if( e2 < 0 ) e2 = 0; + + switch(op) { + case AND: + return (e1 && e2); + case OR: + return (e1 || e2); + case XOR: + return (e1 ^ e2); + } + + log("invalid logical operator in expression"); + + return 0; +} + +static int expr_check_phone(const char *phone) +{ + DEB((D_EVENT, "[yacc] phone: is %s in %s", + phone, state.node.phone)); + + if( !state.valid ) + return 0; + + return strstr(state.node.phone, phone) ? 1 : 0; +} + +static int expr_check_arop(int num1, int op, int num2) +{ + DEB((D_EVENT, "[yacc] arop: %d %d %d", num1, op, num2)); + + switch(op) { + case EQ: return (num1 == num2); + case NE: return (num1 != num2); + case GT: return (num1 > num2); + case GE: return (num1 >= num2); + case LT: return (num1 < num2); + case LE: return (num1 <= num2); + } + + log("invalid arithmetic operator in expression"); + + return 0; +} + +static int expr_check_flag(const char *str) +{ + DEB((D_EVENT, "[yacc] flag: \"%s\"", str)); + + if( !state.valid ) + return 0; + + return !nodelist_checkflag(state.node.flags, str); +} + +static int expr_check_exec(const char *str) +{ + DEB((D_EVENT, "[yacc] exec: \"%s\"", str)); + + return session_run_command(str) ? 0 : 1; +} + +static int expr_check_exist(const char *str) +{ + DEB((D_EVENT, "[yacc] exist: \"%s\"", str)); + + return access(str, F_OK) ? 1 : 0; +} + +static int expr_check_port(const char *str) +{ + DEB((D_EVENT, "[yacc] port: \"%s\"", str)); + + if( !state.valid ) + return -1; + + if( !strcasecmp(str, "tcpip") ) + { + return state.inet ? 1 : 0; + } + else if( state.modemport && state.modemport->name ) + { + return strstr(state.modemport->name, str) ? 1 : 0; + } + else if( isatty(0) ) + { + return strstr(ttyname(0), str) ? 1 : 0; + } + + return -1; +} + +static int expr_check_mailer(const char *str) +{ + char *p; + + DEB((D_EVENT, "[yacc] mailer: \"%s\"", str)); + + if( !state.valid ) + return -1; + + if( state.handshake && state.handshake->remote_mailer ) + p = state.handshake->remote_mailer(state.handshake); + else + return -1; + + return (p && string_casestr(p, str)) ? 1 : 0; +} + +static int expr_check_addr(const char *str) +{ + s_faddr addr; +#ifdef DEBUG + char abuf1[BF_MAXADDRSTR+1]; + char abuf2[BF_MAXADDRSTR+1]; + + DEB((D_EVENT, "[yacc] addr: \"%s\" (session with \"%s\")", + ftn_addrstr(abuf1, addr), + ftn_addrstr(abuf2, state.node.addr))); +#endif + + if( !state.valid ) + return -1; + + if( ftn_addrparse(&addr, str, TRUE) ) + { + log("invalid address \"%s\"", str); + return -2; + } + + return !ftn_addrcomp_mask(state.node.addr, addr); +} + +static int expr_check_time(const char *str) +{ + DEB((D_EVENT, "[yacc] time: \"%s\"", str)); + + switch( time_check(str, now) ) { + case -1: + log("invalid time string \"%s\"", str); + return -2; + case 0: + return 1; + } + + return 0; +} + +bool eventexpr(s_expr *expr) +{ + time_t tt; + char *tmp; + + if( !expr || !expr->expr ) + return 1; + + if( expr->error ) + return 0; + + DEB((D_EVENT, "eventexpr: [yacc] check expression \"%s\"", + expr->expr)); + + tt = time(NULL); + now = localtime(&tt); + tmp = (char*)xstrcpy(expr->expr); + + expr_p_pos = tmp; + expr_result = 0; + + if( yyparse() ) + { + expr->error = TRUE; + + log("cannot parse expression \"%s\"", expr->expr); + DEB((D_EVENT, "eventexpr: [yacc] $yyparse return error")); + + expr_result = 0; + } + + free(tmp); + + DEB((D_EVENT, "eventexpr: [yacc] checking result is \"%s\" (%d)", + (expr_result == 1) ? "TRUE" : "FALSE", expr_result)); + + return (expr_result == 1) ? TRUE : FALSE; +} + +static int yyerror(const char *str) +{ + log("expression check failure: %s", str); + + return 0; +} +#line 548 "y.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 1: +#line 93 "bforce/expression.y" + { + DEB((D_EVENT, "[yacc] expression return %d", yystack.l_mark[0])); + expr_result = yystack.l_mark[0]; + } +break; +case 2: +#line 99 "bforce/expression.y" + { + DEB((D_EVENT, "[yacc] elemexp return %d", yystack.l_mark[0])); + yyval = yystack.l_mark[0]; + } +break; +case 3: +#line 104 "bforce/expression.y" + { + DEB((D_EVENT, "[yacc] not exprression %d", yystack.l_mark[0])); + if( (yystack.l_mark[0]) < 0 ) + yyval = 0; + else + yyval = !(yystack.l_mark[0]); + } +break; +case 4: +#line 112 "bforce/expression.y" + { + yyval = expr_check_logic(yystack.l_mark[-2], yystack.l_mark[-1], yystack.l_mark[0]); + } +break; +case 5: +#line 116 "bforce/expression.y" + { + DEB((D_EVENT, "eventexp: [yacc] backeted.expr %d", yystack.l_mark[-1])); + yyval = yystack.l_mark[-1]; + } +break; +case 6: +#line 122 "bforce/expression.y" + { + yyval = expr_check_incoming(); + } +break; +case 7: +#line 126 "bforce/expression.y" + { + yyval = expr_check_outgoing(); + } +break; +case 8: +#line 130 "bforce/expression.y" + { + yyval = expr_check_listed(); + } +break; +case 9: +#line 134 "bforce/expression.y" + { + yyval = expr_check_protected(); + } +break; +case 10: +#line 138 "bforce/expression.y" + { + yyval = yystack.l_mark[0]; + } +break; +case 11: +#line 142 "bforce/expression.y" + { + if( state.valid && state.connspeed > 0 ) + yyval = expr_check_arop(state.connspeed, yystack.l_mark[-1], yystack.l_mark[0]); + else + yyval = -1; + } +break; +case 12: +#line 149 "bforce/expression.y" + { + if( state.valid && state.node.speed > 0 ) + yyval = expr_check_arop(state.node.speed, yystack.l_mark[-1], yystack.l_mark[0]); + else + yyval = -1; + } +break; +case 13: +#line 156 "bforce/expression.y" + { + yyval = expr_check_arop(time_gmtoffset(), yystack.l_mark[-1], yystack.l_mark[0]); + } +break; +case 14: +#line 160 "bforce/expression.y" + { + yyval = expr_check_phone(expr_p_text); + } +break; +case 15: +#line 164 "bforce/expression.y" + { + yyval = yystack.l_mark[0]; + } +break; +case 16: +#line 168 "bforce/expression.y" + { + yyval = expr_check_exec(expr_p_text); + } +break; +case 17: +#line 172 "bforce/expression.y" + { + yyval = expr_check_exist(expr_p_text); + } +break; +case 18: +#line 176 "bforce/expression.y" + { + yyval = expr_check_port(expr_p_text); + } +break; +case 19: +#line 180 "bforce/expression.y" + { + yyval = expr_check_mailer(expr_p_text); + } +break; +case 20: +#line 184 "bforce/expression.y" + { + yyval = expr_check_addr(expr_p_text); + if( yyval == -2 ) + YYABORT; + } +break; +case 21: +#line 191 "bforce/expression.y" + { + yyval = expr_check_flag(expr_p_text); + } +break; +case 22: +#line 195 "bforce/expression.y" + { + yyval = expr_check_logic(yystack.l_mark[-2], OR, yystack.l_mark[0]); + } +break; +case 23: +#line 200 "bforce/expression.y" + { + yyval = expr_check_time(expr_p_text); + if( yyval == -2 ) + YYABORT; + } +break; +case 24: +#line 206 "bforce/expression.y" + { + yyval = expr_check_logic(yystack.l_mark[-2], OR, yystack.l_mark[0]); + } +break; +#line 915 "y.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/source/include/config.h b/source/include/config.h new file mode 100644 index 0000000..bd0eafe --- /dev/null +++ b/source/include/config.h @@ -0,0 +1,154 @@ +/* include/config.h. Generated from config.h.in by configure. */ +/* include/config.h.in. Generated automatically from configure.in by autoheader. */ + +/* Define to empty if the keyword does not work. */ +/* #undef const */ + +/* Define if the `getpgrp' function takes no argument. */ +#define GETPGRP_VOID 1 + +/* Define if you don't have vprintf but do have _doprnt. */ +/* #undef HAVE_DOPRNT */ + +/* Define if you have that is POSIX.1 compatible. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define if you have the vprintf function. */ +#define HAVE_VPRINTF 1 + +/* Define to `int' if doesn't define. */ +/* #undef mode_t */ + +/* Define to `int' if doesn't define. */ +/* #undef pid_t */ + +/* Define as the return type of signal handlers (int or void). */ +#define RETSIGTYPE void + +/* Define if the setvbuf function takes the buffering type as its second + argument and the buffer pointer as the third, as on System V + before release 3. */ +/* #undef SETVBUF_REVERSED */ + +/* Define to `unsigned' if doesn't define. */ +/* #undef size_t */ + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Define if your declares struct tm. */ +/* #undef TM_IN_SYS_TIME */ + +/* Do you want debug code to be compiled? */ +#define DEBUG 1 + +/* Do you want use DCD line control? */ +#define MODEM_WATCH_CARRIER 1 + +/* Do you want hangup to watch for modem DCD line? */ +#define MODEM_HANGUP_WATCH_CARRIER 1 + +/* Version string */ +#define RELEASE_VERSION "0.23" + +/* Disable passwords logging? */ +#define BFORCE_LOG_PASSWD 1 + +/* Path to the UUCP lock files directory */ +#define BFORCE_LOCK_DIR "/var/lock/" + +/* Do you want to use syslog? */ +#define USE_SYSLOG 1 + +/* Netspool */ +#define NETSPOOL 1 + +/* Do you want use .csy locks? */ +#define BFORCE_USE_CSY 1 + +/* Define if you have the mkdir function. */ +#define HAVE_MKDIR 1 + +/* Define if you have the mktime function. */ +#define HAVE_MKTIME 1 + +/* Define if you have the rename function. */ +#define HAVE_RENAME 1 + +/* Define if you have the select function. */ +#define HAVE_SELECT 1 + +/* Define if you have the setproctitle function. */ +/* #undef HAVE_SETPROCTITLE */ + +/* Define if you have the socket function. */ +#define HAVE_SOCKET 1 + +/* Define if you have the statfs function. */ +#define HAVE_STATFS 1 + +/* Define if you have the statvfs function. */ +#define HAVE_STATVFS 1 + +/* Define if you have the strcasecmp function. */ +#define HAVE_STRCASECMP 1 + +/* Define if you have the strspn function. */ +#define HAVE_STRSPN 1 + +/* Define if you have the header file. */ +#define HAVE_DIRENT_H 1 + +/* Define if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_NDIR_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_FILE_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_IOCTL_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_MOUNT_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_SELECT_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_STATFS_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_STATVFS_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_TERMIOX_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_VFS_H 1 + +/* Define if you have the header file. */ +#define HAVE_TERMIOS_H 1 + +/* Define if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define if you want buggy emsi :) */ +#define BUGGY_EMSI 0