2001-01-06 16:00:10 +03:00
/*
* Copyright ( c ) 1997 , 2000 Hellmuth Michaelis . All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ` ` AS IS ' ' AND
* ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED . IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
* DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION )
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT
* LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE .
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*
* i4b daemon - config file processing
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*
2002-04-17 19:26:13 +04:00
* $ Id : rc_config . c , v 1.14 2002 / 04 / 17 15 : 26 : 13 drochner Exp $
2001-01-06 16:00:10 +03:00
*
* $ FreeBSD $
*
* last edit - date : [ Sat Jan 6 12 : 57 : 36 2001 ]
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
# include <sys/types.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <arpa/inet.h>
# include <sys/callout.h>
# include <sys/ioctl.h>
2002-04-11 03:35:07 +04:00
# include <ifaddrs.h>
2001-01-06 16:00:10 +03:00
# include "isdnd.h"
2001-10-20 02:57:53 +04:00
# include "rc_parse.h"
2001-01-06 16:00:10 +03:00
# include "monitor.h"
extern int lineno ;
extern char * yytext ;
extern FILE * yyin ;
extern int yyparse ( void ) ;
static void set_config_defaults ( void ) ;
static void check_config ( void ) ;
static void print_config ( void ) ;
2002-03-27 16:46:34 +03:00
static void parse_valid ( char * dt ) ;
2002-03-17 23:57:24 +03:00
static int lookup_l4_driver ( const char * name ) ;
2002-03-27 16:46:34 +03:00
void init_currrent_cfg_state ( void ) ;
2002-04-11 03:35:07 +04:00
static void set_isppp_auth ( struct cfg_entry * ) ;
static void set_autoupdown ( struct cfg_entry * ) ;
2002-03-27 16:46:34 +03:00
void flush_config ( void ) ;
2001-01-06 16:00:10 +03:00
static int nregexpr = 0 ;
static int nregprog = 0 ;
2002-03-27 16:46:34 +03:00
static struct cfg_entry * current_cfe = NULL ;
struct isdn_ctrl_state * cur_ctrl = NULL ;
2001-01-06 16:00:10 +03:00
/*---------------------------------------------------------------------------*
* called from main to read and process config file
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
void
configure ( char * filename , int reread )
{
extern void reset_scanner ( FILE * inputfile ) ;
set_config_defaults ( ) ;
yyin = fopen ( filename , " r " ) ;
if ( reread )
{
reset_scanner ( yyin ) ;
2002-04-16 21:07:58 +04:00
current_cfe = NULL ;
2001-01-06 16:00:10 +03:00
}
2002-04-16 21:07:58 +04:00
2001-01-06 16:00:10 +03:00
if ( yyin = = NULL )
{
log ( LL_ERR , " cannot fopen file [%s] " , filename ) ;
exit ( 1 ) ;
}
yyparse ( ) ;
monitor_fixup_rights ( ) ;
check_config ( ) ; /* validation and consistency check */
fclose ( yyin ) ;
if ( do_print )
{
if ( config_error_flag )
{
log ( LL_ERR , " there were %d error(s) in the configuration file, terminating! " , config_error_flag ) ;
exit ( 1 ) ;
}
print_config ( ) ;
do_exit ( 0 ) ;
}
}
/*---------------------------------------------------------------------------*
* yacc error routine
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
void
yyerror ( const char * msg )
{
log ( LL_ERR , " configuration error: %s at line %d, token \" %s \" " , msg , lineno + 1 , yytext ) ;
config_error_flag + + ;
}
2002-03-27 16:46:34 +03:00
/*
* Prepare a new default entry
*/
void
init_currrent_cfg_state ( )
2002-01-04 15:24:33 +03:00
{
2002-03-27 16:46:34 +03:00
if ( current_cfe ! = NULL ) {
add_cfg_entry ( current_cfe ) ;
2002-01-04 15:24:33 +03:00
}
2002-03-27 16:46:34 +03:00
current_cfe = malloc ( sizeof ( struct cfg_entry ) ) ;
memset ( current_cfe , 0 , sizeof ( struct cfg_entry ) ) ;
current_cfe - > isdncontroller = INVALID ;
current_cfe - > isdnchannel = CHAN_ANY ;
current_cfe - > usrdevice = INVALID ;
current_cfe - > usrdeviceunit = INVALID ;
current_cfe - > remote_numbers_handling = RNH_LAST ;
current_cfe - > dialin_reaction = REACT_IGNORE ;
current_cfe - > b1protocol = BPROT_NONE ;
current_cfe - > unitlength = UNITLENGTH_DEFAULT ;
current_cfe - > earlyhangup = EARLYHANGUP_DEFAULT ;
current_cfe - > ratetype = INVALID_RATE ;
current_cfe - > unitlengthsrc = ULSRC_NONE ;
current_cfe - > answerprog = ANSWERPROG_DEF ;
current_cfe - > callbackwait = CALLBACKWAIT_MIN ;
current_cfe - > calledbackwait = CALLEDBACKWAIT_MIN ;
current_cfe - > dialretries = DIALRETRIES_DEF ;
current_cfe - > recoverytime = RECOVERYTIME_MIN ;
current_cfe - > dialouttype = DIALOUT_NORMAL ;
current_cfe - > inout = DIR_INOUT ;
current_cfe - > ppp_expect_auth = AUTH_UNDEF ;
current_cfe - > ppp_send_auth = AUTH_UNDEF ;
current_cfe - > ppp_auth_flags = AUTH_RECHALLENGE | AUTH_REQUIRED ;
current_cfe - > cdid = CDID_UNUSED ;
current_cfe - > state = ST_IDLE ;
current_cfe - > aoc_valid = AOC_INVALID ;
2002-04-11 03:35:07 +04:00
current_cfe - > autoupdown = AUTOUPDOWN_YES ;
2002-01-04 15:24:33 +03:00
}
2001-01-06 16:00:10 +03:00
/*---------------------------------------------------------------------------*
* fill all config entries with default values
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
static void
set_config_defaults ( void )
{
int i ;
/* system section cleanup */
2002-03-27 16:46:34 +03:00
2001-01-06 16:00:10 +03:00
nregprog = nregexpr = 0 ;
rt_prio = RTPRIO_NOTUSED ;
mailer [ 0 ] = ' \0 ' ;
2002-03-27 16:46:34 +03:00
mailto [ 0 ] = ' \0 ' ;
2001-01-06 16:00:10 +03:00
/* clean regular expression table */
2002-03-27 16:46:34 +03:00
2001-01-06 16:00:10 +03:00
for ( i = 0 ; i < MAX_RE ; i + + )
{
if ( rarr [ i ] . re_expr )
free ( rarr [ i ] . re_expr ) ;
rarr [ i ] . re_expr = NULL ;
2002-03-27 16:46:34 +03:00
2001-01-06 16:00:10 +03:00
if ( rarr [ i ] . re_prog )
free ( rarr [ i ] . re_prog ) ;
rarr [ i ] . re_prog = NULL ;
rarr [ i ] . re_flg = 0 ;
}
strcpy ( rotatesuffix , " " ) ;
}
static void
2002-04-11 03:35:07 +04:00
set_autoupdown ( struct cfg_entry * cep )
{
struct ifaddrs * res = NULL , * p ;
struct ifreq ifr ;
int r , s , cnt , in6 ;
s = socket ( AF_INET , SOCK_DGRAM , 0 ) ;
memset ( & ifr , 0 , sizeof ifr ) ;
snprintf ( ifr . ifr_name , sizeof ifr . ifr_name , " %s%d " , cep - > usrdevicename , cep - > usrdeviceunit ) ;
r = ioctl ( s , SIOCGIFFLAGS , & ifr ) ;
/*
* See if this interface has got any valid addresses - if not ,
* leave it alone .
*/
if ( r > = 0 & & ! ( ifr . ifr_flags & IFF_UP ) ) {
cnt = in6 = 0 ;
if ( getifaddrs ( & res ) = = 0 ) {
for ( p = res ; p ; p = p - > ifa_next ) {
if ( p - > ifa_addr = = NULL )
continue ;
if ( p - > ifa_addr - > sa_family = = AF_LINK )
continue ;
if ( strcmp ( p - > ifa_name , ifr . ifr_name ) ! = 0 )
continue ;
if ( p - > ifa_addr - > sa_family = = AF_INET6 )
in6 = 1 ;
cnt + + ;
}
freeifaddrs ( res ) ;
}
if ( in6 )
cnt - - ; /* XXX - heuristic to adjust for INET6 local scope */
/* Ok, we have some addres - so UP the interface */
if ( cnt > 0 ) {
ifr . ifr_flags | = IFF_UP ;
r = ioctl ( s , SIOCSIFFLAGS , & ifr ) ;
if ( r > = 0 )
cep - > autoupdown | = AUTOUPDOWN_DONE ;
}
}
close ( s ) ;
}
static void
set_isppp_auth ( struct cfg_entry * cep )
2001-01-06 16:00:10 +03:00
{
2002-01-04 15:24:33 +03:00
struct spppauthcfg spcfg ;
2001-01-06 16:00:10 +03:00
int s ;
int doioctl = 0 ;
2002-04-11 03:35:07 +04:00
if ( cep - > ppp_expect_auth = = AUTH_UNDEF
& & cep - > ppp_send_auth = = AUTH_UNDEF )
2001-01-06 16:00:10 +03:00
return ;
2002-04-11 03:35:07 +04:00
if ( cep - > ppp_expect_auth = = AUTH_NONE
| | cep - > ppp_send_auth = = AUTH_NONE )
2001-01-06 16:00:10 +03:00
doioctl = 1 ;
2002-04-11 03:35:07 +04:00
if ( ( cep - > ppp_expect_auth = = AUTH_CHAP
| | cep - > ppp_expect_auth = = AUTH_PAP )
& & cep - > ppp_expect_name ! = NULL
& & cep - > ppp_expect_password ! = NULL )
2001-01-06 16:00:10 +03:00
doioctl = 1 ;
2002-04-11 03:35:07 +04:00
if ( ( cep - > ppp_send_auth = = AUTH_CHAP | | cep - > ppp_send_auth = = AUTH_PAP )
& & cep - > ppp_send_name ! = NULL
& & cep - > ppp_send_password ! = NULL )
2001-01-06 16:00:10 +03:00
doioctl = 1 ;
if ( ! doioctl )
return ;
2002-01-04 15:24:33 +03:00
memset ( & spcfg , 0 , sizeof spcfg ) ;
2002-03-27 16:46:34 +03:00
snprintf ( spcfg . ifname , sizeof ( spcfg . ifname ) , " %s%d " ,
2002-04-11 03:35:07 +04:00
cep - > usrdevicename , cep - > usrdeviceunit ) ;
2001-01-06 16:00:10 +03:00
/* use a random AF to create the socket */
if ( ( s = socket ( AF_INET , SOCK_DGRAM , 0 ) ) < 0 ) {
log ( LL_ERR , " ERROR opening control socket at line %d! " , lineno ) ;
config_error_flag + + ;
return ;
}
2002-01-04 15:24:33 +03:00
if ( ioctl ( s , SPPPGETAUTHCFG , & spcfg ) = = - 1 ) {
log ( LL_ERR , " ERROR fetching active PPP authentication info for %s at line %d! " , spcfg . ifname , lineno ) ;
2001-01-06 16:00:10 +03:00
close ( s ) ;
config_error_flag + + ;
return ;
}
2002-04-11 03:35:07 +04:00
if ( cep - > ppp_expect_auth ! = AUTH_UNDEF )
2001-01-06 16:00:10 +03:00
{
2002-04-11 03:35:07 +04:00
if ( cep - > ppp_expect_auth = = AUTH_NONE )
2001-01-06 16:00:10 +03:00
{
2002-01-04 15:24:33 +03:00
spcfg . hisauth = SPPP_AUTHPROTO_NONE ;
2001-01-06 16:00:10 +03:00
}
2002-04-11 03:35:07 +04:00
else if ( ( cep - > ppp_expect_auth = = AUTH_CHAP
| | cep - > ppp_expect_auth = = AUTH_PAP )
& & cep - > ppp_expect_name ! = NULL
& & cep - > ppp_expect_password ! = NULL )
2001-01-06 16:00:10 +03:00
{
2002-04-11 03:35:07 +04:00
spcfg . hisauth = cep - > ppp_expect_auth = = AUTH_PAP ? SPPP_AUTHPROTO_PAP : SPPP_AUTHPROTO_CHAP ;
spcfg . hisname = cep - > ppp_expect_name ;
spcfg . hisname_length = strlen ( cep - > ppp_expect_name ) + 1 ;
spcfg . hissecret = cep - > ppp_expect_password ;
spcfg . hissecret_length = strlen ( cep - > ppp_expect_password ) + 1 ;
2001-01-06 16:00:10 +03:00
}
}
2002-04-11 03:35:07 +04:00
if ( cep - > ppp_send_auth ! = AUTH_UNDEF )
2001-01-06 16:00:10 +03:00
{
2002-04-11 03:35:07 +04:00
if ( cep - > ppp_send_auth = = AUTH_NONE )
2001-01-06 16:00:10 +03:00
{
2002-01-04 15:24:33 +03:00
spcfg . myauth = SPPP_AUTHPROTO_NONE ;
2001-01-06 16:00:10 +03:00
}
2002-04-11 03:35:07 +04:00
else if ( ( cep - > ppp_send_auth = = AUTH_CHAP
| | cep - > ppp_send_auth = = AUTH_PAP )
& & cep - > ppp_send_name ! = NULL
& & cep - > ppp_send_password ! = NULL )
2001-01-06 16:00:10 +03:00
{
2002-04-11 03:35:07 +04:00
spcfg . myauth = cep - > ppp_send_auth = = AUTH_PAP ? SPPP_AUTHPROTO_PAP : SPPP_AUTHPROTO_CHAP ;
spcfg . myname = cep - > ppp_send_name ;
spcfg . myname_length = strlen ( cep - > ppp_send_name ) + 1 ;
spcfg . mysecret = cep - > ppp_send_password ;
spcfg . mysecret_length = strlen ( cep - > ppp_send_password ) + 1 ;
2001-01-06 16:00:10 +03:00
2002-04-11 03:35:07 +04:00
if ( cep - > ppp_auth_flags & AUTH_REQUIRED )
2002-01-04 15:24:33 +03:00
spcfg . hisauthflags & = ~ SPPP_AUTHFLAG_NOCALLOUT ;
2001-01-06 16:00:10 +03:00
else
2002-01-04 15:24:33 +03:00
spcfg . hisauthflags | = SPPP_AUTHFLAG_NOCALLOUT ;
2001-01-06 16:00:10 +03:00
2002-04-11 03:35:07 +04:00
if ( cep - > ppp_auth_flags & AUTH_RECHALLENGE )
2002-01-04 15:24:33 +03:00
spcfg . hisauthflags & = ~ SPPP_AUTHFLAG_NORECHALLENGE ;
2001-01-06 16:00:10 +03:00
else
2002-01-04 15:24:33 +03:00
spcfg . hisauthflags | = SPPP_AUTHFLAG_NORECHALLENGE ;
2001-01-06 16:00:10 +03:00
}
}
2002-01-04 15:24:33 +03:00
if ( ioctl ( s , SPPPSETAUTHCFG , & spcfg ) = = - 1 ) {
log ( LL_ERR , " ERROR setting new PPP authentication parameters for %s at line %d! " , spcfg . ifname , lineno ) ;
2001-01-06 16:00:10 +03:00
config_error_flag + + ;
}
close ( s ) ;
}
/*---------------------------------------------------------------------------*
* extract values from config and fill table
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
void
cfg_setval ( int keyword )
{
int i ;
switch ( keyword )
{
case ACCTALL :
acct_all = yylval . booln ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: acctall = %d " , yylval . booln ) ) ) ;
break ;
case ACCTFILE :
strcpy ( acctfile , yylval . str ) ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: acctfile = %s " , yylval . str ) ) ) ;
break ;
case ALERT :
if ( yylval . num < MINALERT )
{
yylval . num = MINALERT ;
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: alert < %d, min = %d " , current_cfe - > name , MINALERT , yylval . num ) ) ) ;
2001-01-06 16:00:10 +03:00
}
else if ( yylval . num > MAXALERT )
{
yylval . num = MAXALERT ;
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: alert > %d, min = %d " , current_cfe - > name , MAXALERT , yylval . num ) ) ) ;
2001-01-06 16:00:10 +03:00
}
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: alert = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > alert = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case ALIASING :
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: aliasing = %d " , yylval . booln ) ) ) ;
aliasing = yylval . booln ;
break ;
case ALIASFNAME :
strcpy ( aliasfile , yylval . str ) ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: aliasfile = %s " , yylval . str ) ) ) ;
break ;
case ANSWERPROG :
2002-03-27 16:46:34 +03:00
if ( ( current_cfe - > answerprog = malloc ( strlen ( yylval . str ) + 1 ) ) = = NULL )
2001-01-06 16:00:10 +03:00
{
2002-03-27 16:46:34 +03:00
log ( LL_ERR , " entry %s: answerstring, malloc failed! " , current_cfe - > name ) ;
2001-01-06 16:00:10 +03:00
do_exit ( 1 ) ;
}
2002-03-27 16:46:34 +03:00
strcpy ( current_cfe - > answerprog , yylval . str ) ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: answerprog = %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
break ;
case B1PROTOCOL :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: b1protocol = %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
if ( ! ( strcmp ( yylval . str , " raw " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > b1protocol = BPROT_NONE ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " hdlc " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > b1protocol = BPROT_RHDLC ;
2001-01-06 16:00:10 +03:00
else
{
log ( LL_ERR , " ERROR parsing config file: unknown parameter for keyword \" b1protocol \" at line %d! " , lineno ) ;
config_error_flag + + ;
}
break ;
case BEEPCONNECT :
do_bell = yylval . booln ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: beepconnect = %d " , yylval . booln ) ) ) ;
break ;
case BUDGETCALLBACKPERIOD :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: budget-callbackperiod = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > budget_callbackperiod = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case BUDGETCALLBACKNCALLS :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: budget-callbackncalls = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > budget_callbackncalls = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case BUDGETCALLOUTPERIOD :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: budget-calloutperiod = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > budget_calloutperiod = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case BUDGETCALLOUTNCALLS :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: budget-calloutncalls = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > budget_calloutncalls = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
2002-04-11 03:35:07 +04:00
case AUTOUPDOWN :
current_cfe - > autoupdown = yylval . booln ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: autoupdown = %d " , current_cfe - > name , yylval . booln ) ) ) ;
break ;
2001-01-06 16:00:10 +03:00
case BUDGETCALLBACKSFILEROTATE :
2002-03-27 16:46:34 +03:00
current_cfe - > budget_callbacksfile_rotate = yylval . booln ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: budget-callbacksfile-rotate = %d " , current_cfe - > name , yylval . booln ) ) ) ;
2001-01-06 16:00:10 +03:00
break ;
case BUDGETCALLBACKSFILE :
{
FILE * fp ;
int s , l ;
int n ;
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: budget-callbacksfile = %s " , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
fp = fopen ( yylval . str , " r " ) ;
if ( fp ! = NULL )
{
if ( ( fscanf ( fp , " %d %d %d " , ( int * ) & s , ( int * ) & l , & n ) ) ! = 3 )
{
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %d: initializing budget-callbacksfile %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
fclose ( fp ) ;
fp = fopen ( yylval . str , " w " ) ;
if ( fp ! = NULL )
fprintf ( fp , " %d %d %d " , ( int ) time ( NULL ) , ( int ) time ( NULL ) , 0 ) ;
fclose ( fp ) ;
}
}
else
{
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: creating budget-callbacksfile %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
fp = fopen ( yylval . str , " w " ) ;
if ( fp ! = NULL )
fprintf ( fp , " %d %d %d " , ( int ) time ( NULL ) , ( int ) time ( NULL ) , 0 ) ;
fclose ( fp ) ;
}
fp = fopen ( yylval . str , " r " ) ;
if ( fp ! = NULL )
{
if ( ( fscanf ( fp , " %d %d %d " , ( int * ) & s , ( int * ) & l , & n ) ) = = 3 )
{
2002-03-27 16:46:34 +03:00
if ( ( current_cfe - > budget_callbacks_file = malloc ( strlen ( yylval . str ) + 1 ) ) = = NULL )
2001-01-06 16:00:10 +03:00
{
2002-03-27 16:46:34 +03:00
log ( LL_ERR , " entry %s: budget-callbacksfile, malloc failed! " , current_cfe - > name ) ;
2001-01-06 16:00:10 +03:00
do_exit ( 1 ) ;
}
2002-03-27 16:46:34 +03:00
strcpy ( current_cfe - > budget_callbacks_file , yylval . str ) ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: using callbacksfile %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
}
fclose ( fp ) ;
}
}
break ;
case BUDGETCALLOUTSFILEROTATE :
2002-03-27 16:46:34 +03:00
current_cfe - > budget_calloutsfile_rotate = yylval . booln ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: budget-calloutsfile-rotate = %d " , current_cfe - > name , yylval . booln ) ) ) ;
2001-01-06 16:00:10 +03:00
break ;
case BUDGETCALLOUTSFILE :
{
FILE * fp ;
int s , l ;
int n ;
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: budget-calloutsfile = %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
fp = fopen ( yylval . str , " r " ) ;
if ( fp ! = NULL )
{
if ( ( fscanf ( fp , " %d %d %d " , ( int * ) & s , ( int * ) & l , & n ) ) ! = 3 )
{
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: initializing budget-calloutsfile %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
fclose ( fp ) ;
fp = fopen ( yylval . str , " w " ) ;
if ( fp ! = NULL )
fprintf ( fp , " %d %d %d " , ( int ) time ( NULL ) , ( int ) time ( NULL ) , 0 ) ;
fclose ( fp ) ;
}
}
else
{
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: creating budget-calloutsfile %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
fp = fopen ( yylval . str , " w " ) ;
if ( fp ! = NULL )
fprintf ( fp , " %d %d %d " , ( int ) time ( NULL ) , ( int ) time ( NULL ) , 0 ) ;
fclose ( fp ) ;
}
fp = fopen ( yylval . str , " r " ) ;
if ( fp ! = NULL )
{
if ( ( fscanf ( fp , " %d %d %d " , ( int * ) & s , ( int * ) & l , & n ) ) = = 3 )
{
2002-03-27 16:46:34 +03:00
if ( ( current_cfe - > budget_callouts_file = malloc ( strlen ( yylval . str ) + 1 ) ) = = NULL )
2001-01-06 16:00:10 +03:00
{
2002-03-27 16:46:34 +03:00
log ( LL_ERR , " entry %s: budget-calloutsfile, malloc failed! " , current_cfe - > name ) ;
2001-01-06 16:00:10 +03:00
do_exit ( 1 ) ;
}
2002-03-27 16:46:34 +03:00
strcpy ( current_cfe - > budget_callouts_file , yylval . str ) ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: using calloutsfile %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
}
fclose ( fp ) ;
}
}
break ;
case CALLBACKWAIT :
if ( yylval . num < CALLBACKWAIT_MIN )
{
yylval . num = CALLBACKWAIT_MIN ;
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: callbackwait < %d, min = %d " , current_cfe - > name , CALLBACKWAIT_MIN , yylval . num ) ) ) ;
2001-01-06 16:00:10 +03:00
}
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: callbackwait = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > callbackwait = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case CALLEDBACKWAIT :
if ( yylval . num < CALLEDBACKWAIT_MIN )
{
yylval . num = CALLEDBACKWAIT_MIN ;
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: calledbackwait < %d, min = %d " , current_cfe - > name , CALLEDBACKWAIT_MIN , yylval . num ) ) ) ;
2001-01-06 16:00:10 +03:00
}
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: calledbackwait = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > calledbackwait = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case CONNECTPROG :
2002-03-27 16:46:34 +03:00
if ( ( current_cfe - > connectprog = malloc ( strlen ( yylval . str ) + 1 ) ) = = NULL )
2001-01-06 16:00:10 +03:00
{
2002-03-27 16:46:34 +03:00
log ( LL_ERR , " entry %s: connectprog, malloc failed! " , current_cfe - > name ) ;
2001-01-06 16:00:10 +03:00
do_exit ( 1 ) ;
}
2002-03-27 16:46:34 +03:00
strcpy ( current_cfe - > connectprog , yylval . str ) ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: connectprog = %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
break ;
case DIALOUTTYPE :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: dialouttype = %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
if ( ! ( strcmp ( yylval . str , " normal " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > dialouttype = DIALOUT_NORMAL ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " calledback " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > dialouttype = DIALOUT_CALLEDBACK ;
2001-01-06 16:00:10 +03:00
else
{
log ( LL_ERR , " ERROR parsing config file: unknown parameter for keyword \" dialout-type \" at line %d! " , lineno ) ;
config_error_flag + + ;
}
break ;
case DIALRETRIES :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: dialretries = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > dialretries = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case DIALRANDINCR :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: dialrandincr = %d " , current_cfe - > name , yylval . booln ) ) ) ;
current_cfe - > dialrandincr = yylval . booln ;
2001-01-06 16:00:10 +03:00
break ;
case DIRECTION :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: direction = %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
if ( ! ( strcmp ( yylval . str , " inout " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > inout = DIR_INOUT ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " in " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > inout = DIR_INONLY ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " out " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > inout = DIR_OUTONLY ;
2001-01-06 16:00:10 +03:00
else
{
log ( LL_ERR , " ERROR parsing config file: unknown parameter for keyword \" direction \" at line %d! " , lineno ) ;
config_error_flag + + ;
}
break ;
case DISCONNECTPROG :
2002-03-27 16:46:34 +03:00
if ( ( current_cfe - > disconnectprog = malloc ( strlen ( yylval . str ) + 1 ) ) = = NULL )
2001-01-06 16:00:10 +03:00
{
2002-03-27 16:46:34 +03:00
log ( LL_ERR , " entry %s: disconnectprog, malloc failed! " , current_cfe - > name ) ;
2001-01-06 16:00:10 +03:00
do_exit ( 1 ) ;
}
2002-03-27 16:46:34 +03:00
strcpy ( current_cfe - > disconnectprog , yylval . str ) ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: disconnectprog = %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
break ;
case DOWNTRIES :
if ( yylval . num > DOWN_TRIES_MAX )
yylval . num = DOWN_TRIES_MAX ;
else if ( yylval . num < DOWN_TRIES_MIN )
yylval . num = DOWN_TRIES_MIN ;
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: downtries = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > downtries = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case DOWNTIME :
if ( yylval . num > DOWN_TIME_MAX )
yylval . num = DOWN_TIME_MAX ;
else if ( yylval . num < DOWN_TIME_MIN )
yylval . num = DOWN_TIME_MIN ;
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: downtime = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > downtime = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case EARLYHANGUP :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: earlyhangup = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > earlyhangup = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case EXTCALLATTR :
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: extcallattr = %d " , yylval . booln ) ) ) ;
extcallattr = yylval . booln ;
break ;
case HOLIDAYFILE :
strcpy ( holidayfile , yylval . str ) ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: holidayfile = %s " , yylval . str ) ) ) ;
break ;
case IDLE_ALG_OUT :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: idle-algorithm-outgoing = %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
if ( ! ( strcmp ( yylval . str , " fix-unit-size " ) ) )
{
2002-03-27 16:46:34 +03:00
current_cfe - > shorthold_algorithm = SHA_FIXU ;
2001-01-06 16:00:10 +03:00
}
else if ( ! ( strcmp ( yylval . str , " var-unit-size " ) ) )
{
2002-03-27 16:46:34 +03:00
current_cfe - > shorthold_algorithm = SHA_VARU ;
2001-01-06 16:00:10 +03:00
}
else
{
log ( LL_ERR , " ERROR parsing config file: unknown parameter for keyword \" idle-algorithm-outgoing \" at line %d! " , lineno ) ;
config_error_flag + + ;
}
break ;
case IDLETIME_IN :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: idle_time_in = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > idle_time_in = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case IDLETIME_OUT :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: idle_time_out = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > idle_time_out = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case ISDNCONTROLLER :
2002-03-27 16:46:34 +03:00
current_cfe - > isdncontroller = yylval . num ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: isdncontroller = %d " , current_cfe - > name , yylval . num ) ) ) ;
2001-01-06 16:00:10 +03:00
break ;
case ISDNCHANNEL :
switch ( yylval . num )
{
case 0 :
case - 1 :
2002-03-27 16:46:34 +03:00
current_cfe - > isdnchannel = CHAN_ANY ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: isdnchannel = any " , current_cfe - > name ) ) ) ;
2001-01-06 16:00:10 +03:00
break ;
case 1 :
2002-03-27 16:46:34 +03:00
current_cfe - > isdnchannel = CHAN_B1 ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: isdnchannel = one " , current_cfe - > name ) ) ) ;
2001-01-06 16:00:10 +03:00
break ;
case 2 :
2002-03-27 16:46:34 +03:00
current_cfe - > isdnchannel = CHAN_B2 ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: isdnchannel = two " , current_cfe - > name ) ) ) ;
2001-01-06 16:00:10 +03:00
break ;
default :
2002-03-27 16:46:34 +03:00
log ( LL_DBG , " entry %s: isdnchannel value out of range " , current_cfe - > name ) ;
2001-01-06 16:00:10 +03:00
config_error_flag + + ;
break ;
}
break ;
case ISDNTIME :
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: isdntime = %d " , yylval . booln ) ) ) ;
isdntime = yylval . booln ;
break ;
case ISDNTXDELIN :
2002-03-27 16:46:34 +03:00
current_cfe - > isdntxdelin = yylval . num ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: isdntxdel-incoming = %d " , current_cfe - > name , yylval . num ) ) ) ;
2001-01-06 16:00:10 +03:00
break ;
case ISDNTXDELOUT :
2002-03-27 16:46:34 +03:00
current_cfe - > isdntxdelout = yylval . num ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: isdntxdel-outgoing = %d " , current_cfe - > name , yylval . num ) ) ) ;
2001-01-06 16:00:10 +03:00
break ;
case LOCAL_PHONE_DIALOUT :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: local_phone_dialout = %s " , current_cfe - > name , yylval . str ) ) ) ;
strcpy ( current_cfe - > local_phone_dialout , yylval . str ) ;
2001-01-06 16:00:10 +03:00
break ;
case LOCAL_PHONE_INCOMING :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: local_phone_incoming = %s " , current_cfe - > name , yylval . str ) ) ) ;
strcpy ( current_cfe - > local_phone_incoming , yylval . str ) ;
2001-01-06 16:00:10 +03:00
break ;
case MAILER :
strcpy ( mailer , yylval . str ) ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: mailer = %s " , yylval . str ) ) ) ;
break ;
case MAILTO :
strcpy ( mailto , yylval . str ) ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: mailto = %s " , yylval . str ) ) ) ;
break ;
case MONITORPORT :
monitorport = yylval . num ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: monitorport = %d " , yylval . num ) ) ) ;
break ;
case MONITORSW :
if ( yylval . booln & & inhibit_monitor )
{
do_monitor = 0 ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: monitor-enable overriden by command line flag " ) ) ) ;
}
else
{
do_monitor = yylval . booln ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: monitor-enable = %d " , yylval . booln ) ) ) ;
}
break ;
case NAME :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: name = %s " , current_cfe - > name , yylval . str ) ) ) ;
strcpy ( current_cfe - > name , yylval . str ) ;
2001-01-06 16:00:10 +03:00
break ;
case PPP_AUTH_RECHALLENGE :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: ppp-auth-rechallenge = %d " , current_cfe - > name , yylval . booln ) ) ) ;
2001-01-06 16:00:10 +03:00
if ( yylval . booln )
2002-03-27 16:46:34 +03:00
current_cfe - > ppp_auth_flags | = AUTH_RECHALLENGE ;
2001-01-06 16:00:10 +03:00
else
2002-03-27 16:46:34 +03:00
current_cfe - > ppp_auth_flags & = ~ AUTH_RECHALLENGE ;
2001-01-06 16:00:10 +03:00
break ;
case PPP_AUTH_PARANOID :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: ppp-auth-paranoid = %d " , current_cfe - > name , yylval . booln ) ) ) ;
2001-01-06 16:00:10 +03:00
if ( yylval . booln )
2002-03-27 16:46:34 +03:00
current_cfe - > ppp_auth_flags | = AUTH_REQUIRED ;
2001-01-06 16:00:10 +03:00
else
2002-03-27 16:46:34 +03:00
current_cfe - > ppp_auth_flags & = ~ AUTH_REQUIRED ;
2001-01-06 16:00:10 +03:00
break ;
case PPP_EXPECT_AUTH :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: ppp-expect-auth = %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
if ( ! ( strcmp ( yylval . str , " none " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > ppp_expect_auth = AUTH_NONE ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " pap " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > ppp_expect_auth = AUTH_PAP ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " chap " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > ppp_expect_auth = AUTH_CHAP ;
2001-01-06 16:00:10 +03:00
else
{
log ( LL_ERR , " ERROR parsing config file: unknown parameter for keyword \" ppp-expect-auth \" at line %d! " , lineno ) ;
config_error_flag + + ;
break ;
}
break ;
case PPP_EXPECT_NAME :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: ppp-expect-name = %s " , current_cfe - > name , yylval . str ) ) ) ;
if ( current_cfe - > ppp_expect_name )
free ( current_cfe - > ppp_expect_name ) ;
current_cfe - > ppp_expect_name = strdup ( yylval . str ) ;
2001-01-06 16:00:10 +03:00
break ;
case PPP_EXPECT_PASSWORD :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: ppp-expect-password = %s " , current_cfe - > name , yylval . str ) ) ) ;
if ( current_cfe - > ppp_expect_password )
free ( current_cfe - > ppp_expect_password ) ;
current_cfe - > ppp_expect_password = strdup ( yylval . str ) ;
2001-01-06 16:00:10 +03:00
break ;
case PPP_SEND_AUTH :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: ppp-send-auth = %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
if ( ! ( strcmp ( yylval . str , " none " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > ppp_send_auth = AUTH_NONE ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " pap " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > ppp_send_auth = AUTH_PAP ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " chap " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > ppp_send_auth = AUTH_CHAP ;
2001-01-06 16:00:10 +03:00
else
{
log ( LL_ERR , " ERROR parsing config file: unknown parameter for keyword \" ppp-send-auth \" at line %d! " , lineno ) ;
config_error_flag + + ;
break ;
}
break ;
case PPP_SEND_NAME :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: ppp-send-name = %s " , current_cfe - > name , yylval . str ) ) ) ;
if ( current_cfe - > ppp_send_name )
free ( current_cfe - > ppp_send_name ) ;
current_cfe - > ppp_send_name = strdup ( yylval . str ) ;
2001-01-06 16:00:10 +03:00
break ;
case PPP_SEND_PASSWORD :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: ppp-send-password = %s " , current_cfe - > name , yylval . str ) ) ) ;
if ( current_cfe - > ppp_send_password )
free ( current_cfe - > ppp_send_password ) ;
current_cfe - > ppp_send_password = strdup ( yylval . str ) ;
2001-01-06 16:00:10 +03:00
break ;
case PROTOCOL :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " controller %d: protocol = %s " , cur_ctrl - > bri , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
if ( ! ( strcmp ( yylval . str , " dss1 " ) ) )
2002-03-27 16:46:34 +03:00
cur_ctrl - > protocol = PROTOCOL_DSS1 ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " d64s " ) ) )
2002-03-27 16:46:34 +03:00
cur_ctrl - > protocol = PROTOCOL_D64S ;
2001-01-06 16:00:10 +03:00
else
{
log ( LL_ERR , " ERROR parsing config file: unknown parameter for keyword \" protocol \" at line %d! " , lineno ) ;
config_error_flag + + ;
}
break ;
case REACTION :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: dialin_reaction = %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
if ( ! ( strcmp ( yylval . str , " accept " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > dialin_reaction = REACT_ACCEPT ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " reject " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > dialin_reaction = REACT_REJECT ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " ignore " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > dialin_reaction = REACT_IGNORE ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " answer " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > dialin_reaction = REACT_ANSWER ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " callback " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > dialin_reaction = REACT_CALLBACK ;
2001-01-06 16:00:10 +03:00
else
{
log ( LL_ERR , " ERROR parsing config file: unknown parameter for keyword \" dialin_reaction \" at line %d! " , lineno ) ;
config_error_flag + + ;
}
break ;
case REMOTE_PHONE_DIALOUT :
2002-03-27 16:46:34 +03:00
if ( current_cfe - > remote_numbers_count > = MAXRNUMBERS )
2001-01-06 16:00:10 +03:00
{
log ( LL_ERR , " ERROR parsing config file: too many remote numbers at line %d! " , lineno ) ;
config_error_flag + + ;
break ;
}
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: remote_phone_dialout #%d = %s " ,
current_cfe - > name , current_cfe - > remote_numbers_count , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
2002-03-27 16:46:34 +03:00
strcpy ( current_cfe - > remote_numbers [ current_cfe - > remote_numbers_count ] . number , yylval . str ) ;
current_cfe - > remote_numbers [ current_cfe - > remote_numbers_count ] . flag = 0 ;
2001-01-06 16:00:10 +03:00
2002-03-27 16:46:34 +03:00
current_cfe - > remote_numbers_count + + ;
2001-01-06 16:00:10 +03:00
break ;
case REMOTE_NUMBERS_HANDLING :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: remdial_handling = %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
if ( ! ( strcmp ( yylval . str , " next " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > remote_numbers_handling = RNH_NEXT ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " last " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > remote_numbers_handling = RNH_LAST ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " first " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > remote_numbers_handling = RNH_FIRST ;
2001-01-06 16:00:10 +03:00
else
{
log ( LL_ERR , " ERROR parsing config file: unknown parameter for keyword \" remdial_handling \" at line %d! " , lineno ) ;
config_error_flag + + ;
}
break ;
case REMOTE_PHONE_INCOMING :
{
int n ;
2002-03-27 16:46:34 +03:00
n = current_cfe - > incoming_numbers_count ;
2001-01-06 16:00:10 +03:00
if ( n > = MAX_INCOMING )
{
log ( LL_ERR , " ERROR parsing config file: too many \" remote_phone_incoming \" entries at line %d! " , lineno ) ;
config_error_flag + + ;
break ;
}
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: remote_phone_incoming #%d = %s " , current_cfe - > name , n , yylval . str ) ) ) ;
strcpy ( current_cfe - > remote_phone_incoming [ n ] . number , yylval . str ) ;
current_cfe - > incoming_numbers_count + + ;
2001-01-06 16:00:10 +03:00
}
break ;
case RATESFILE :
strcpy ( ratesfile , yylval . str ) ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: ratesfile = %s " , yylval . str ) ) ) ;
break ;
case RATETYPE :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: ratetype = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > ratetype = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case RECOVERYTIME :
if ( yylval . num < RECOVERYTIME_MIN )
{
yylval . num = RECOVERYTIME_MIN ;
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: recoverytime < %d, min = %d " , current_cfe - > name , RECOVERYTIME_MIN , yylval . num ) ) ) ;
2001-01-06 16:00:10 +03:00
}
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: recoverytime = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > recoverytime = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case REGEXPR :
if ( nregexpr > = MAX_RE )
{
log ( LL_ERR , " system: regexpr #%d >= MAX_RE " , nregexpr ) ;
config_error_flag + + ;
break ;
}
if ( ( i = regcomp ( & ( rarr [ nregexpr ] . re ) , yylval . str , REG_EXTENDED | REG_NOSUB ) ) ! = 0 )
{
char buf [ 256 ] ;
regerror ( i , & ( rarr [ nregexpr ] . re ) , buf , sizeof ( buf ) ) ;
log ( LL_ERR , " system: regcomp error for %s: [%s] " , yylval . str , buf ) ;
config_error_flag + + ;
break ;
}
else
{
if ( ( rarr [ nregexpr ] . re_expr = malloc ( strlen ( yylval . str ) + 1 ) ) = = NULL )
{
log ( LL_ERR , " system: regexpr malloc error error for %s " , yylval . str ) ;
config_error_flag + + ;
break ;
}
strcpy ( rarr [ nregexpr ] . re_expr , yylval . str ) ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: regexpr %s stored into slot %d " , yylval . str , nregexpr ) ) ) ;
if ( rarr [ nregexpr ] . re_prog ! = NULL )
rarr [ nregexpr ] . re_flg = 1 ;
nregexpr + + ;
}
break ;
case REGPROG :
if ( nregprog > = MAX_RE )
{
log ( LL_ERR , " system: regprog #%d >= MAX_RE " , nregprog ) ;
config_error_flag + + ;
break ;
}
if ( ( rarr [ nregprog ] . re_prog = malloc ( strlen ( yylval . str ) + 1 ) ) = = NULL )
{
log ( LL_ERR , " system: regprog malloc error error for %s " , yylval . str ) ;
config_error_flag + + ;
break ;
}
strcpy ( rarr [ nregprog ] . re_prog , yylval . str ) ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: regprog %s stored into slot %d " , yylval . str , nregprog ) ) ) ;
if ( rarr [ nregprog ] . re_expr ! = NULL )
rarr [ nregprog ] . re_flg = 1 ;
nregprog + + ;
break ;
case ROTATESUFFIX :
strcpy ( rotatesuffix , yylval . str ) ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: rotatesuffix = %s " , yylval . str ) ) ) ;
break ;
case RTPRIO :
# ifdef USE_RTPRIO
rt_prio = yylval . num ;
if ( rt_prio < RTP_PRIO_MIN | | rt_prio > RTP_PRIO_MAX )
{
config_error_flag + + ;
log ( LL_ERR , " system: error, rtprio (%d) out of range! " , yylval . num ) ;
}
else
{
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: rtprio = %d " , yylval . num ) ) ) ;
}
# else
rt_prio = RTPRIO_NOTUSED ;
# endif
break ;
case TINAINITPROG :
strcpy ( tinainitprog , yylval . str ) ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: tinainitprog = %s " , yylval . str ) ) ) ;
break ;
case UNITLENGTH :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: unitlength = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > unitlength = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case UNITLENGTHSRC :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: unitlengthsrc = %s " , current_cfe - > name , yylval . str ) ) ) ;
2001-01-06 16:00:10 +03:00
if ( ! ( strcmp ( yylval . str , " none " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > unitlengthsrc = ULSRC_NONE ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " cmdl " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > unitlengthsrc = ULSRC_CMDL ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " conf " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > unitlengthsrc = ULSRC_CONF ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " rate " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > unitlengthsrc = ULSRC_RATE ;
2001-01-06 16:00:10 +03:00
else if ( ! ( strcmp ( yylval . str , " aocd " ) ) )
2002-03-27 16:46:34 +03:00
current_cfe - > unitlengthsrc = ULSRC_DYN ;
2001-01-06 16:00:10 +03:00
else
{
log ( LL_ERR , " ERROR parsing config file: unknown parameter for keyword \" unitlengthsrc \" at line %d! " , lineno ) ;
config_error_flag + + ;
}
break ;
case USRDEVICENAME :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: usrdevicename = %s " , current_cfe - > name , yylval . str ) ) ) ;
strncpy ( current_cfe - > usrdevicename , yylval . str , sizeof ( current_cfe - > usrdevicename ) ) ;
current_cfe - > usrdevice = lookup_l4_driver ( yylval . str ) ;
2002-04-17 19:26:13 +04:00
if ( current_cfe - > usrdevice < 0 )
2001-01-06 16:00:10 +03:00
{
log ( LL_ERR , " ERROR parsing config file: unknown parameter for keyword \" usrdevicename \" at line %d! " , lineno ) ;
config_error_flag + + ;
}
break ;
case USRDEVICEUNIT :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: usrdeviceunit = %d " , current_cfe - > name , yylval . num ) ) ) ;
current_cfe - > usrdeviceunit = yylval . num ;
2001-01-06 16:00:10 +03:00
break ;
case USEACCTFILE :
useacctfile = yylval . booln ;
DBGL ( DL_RCCF , ( log ( LL_DBG , " system: useacctfile = %d " , yylval . booln ) ) ) ;
break ;
case USEDOWN :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: usedown = %d " , current_cfe - > name , yylval . booln ) ) ) ;
current_cfe - > usedown = yylval . booln ;
2001-01-06 16:00:10 +03:00
break ;
case VALID :
2002-03-27 16:46:34 +03:00
DBGL ( DL_RCCF , ( log ( LL_DBG , " entry %s: valid = %s " , current_cfe - > name , yylval . str ) ) ) ;
parse_valid ( yylval . str ) ;
2001-01-06 16:00:10 +03:00
break ;
default :
log ( LL_ERR , " ERROR parsing config file: unknown keyword at line %d! " , lineno ) ;
config_error_flag + + ;
break ;
}
}
/*---------------------------------------------------------------------------*
* parse a date / time range
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
static void
2002-03-27 16:46:34 +03:00
parse_valid ( char * dt )
2001-01-06 16:00:10 +03:00
{
/* a valid string consists of some days of week separated by
* commas , where 0 = sunday , 1 = monday . . 6 = saturday and a special
* value of 7 which is a holiday from the holiday file .
* after the days comes an optional ( ! ) time range in the form
* aa : bb - cc : dd , this format is fixed to be parsable by sscanf .
* Valid specifications looks like this :
* 1 , 2 , 3 , 4 , 5 , 09 : 00 - 18 : 00 Monday - Friday 9 - 18 h
* 1 , 2 , 3 , 4 , 5 , 18 : 00 - 09 : 00 Monday - Friday 18 - 9 h
* 6 Saturday ( whole day )
* 0 , 7 Sunday and Holidays
*/
int day = 0 ;
int fromhr = 0 ;
int frommin = 0 ;
int tohr = 0 ;
int tomin = 0 ;
int ret ;
for ( ; ; )
{
if ( ( ( ( * dt > = ' 0 ' ) & & ( * dt < = ' 9 ' ) ) & & ( * ( dt + 1 ) = = ' : ' ) ) | |
( ( ( * dt > = ' 0 ' ) & & ( * dt < = ' 2 ' ) ) & & ( ( * ( dt + 1 ) > = ' 0 ' ) & & ( * ( dt + 1 ) < = ' 9 ' ) ) & & ( * ( dt + 2 ) = = ' : ' ) ) )
{
/* dt points to time spec */
ret = sscanf ( dt , " %d:%d-%d:%d " , & fromhr , & frommin , & tohr , & tomin ) ;
if ( ret ! = 4 )
{
log ( LL_ERR , " ERROR parsing config file: timespec [%s] error at line %d! " , * dt , lineno ) ;
config_error_flag + + ;
return ;
}
if ( fromhr < 0 | | fromhr > 24 | | tohr < 0 | | tohr > 24 | |
frommin < 0 | | frommin > 59 | | tomin < 0 | | tomin > 59 )
{
log ( LL_ERR , " ERROR parsing config file: invalid time [%s] at line %d! " , * dt , lineno ) ;
config_error_flag + + ;
return ;
}
break ;
}
else if ( ( * dt > = ' 0 ' ) & & ( * dt < = ' 7 ' ) )
{
/* dt points to day spec */
day | = 1 < < ( * dt - ' 0 ' ) ;
dt + + ;
continue ;
}
else if ( * dt = = ' , ' )
{
/* dt points to delimiter */
dt + + ;
continue ;
}
else if ( * dt = = ' \0 ' )
{
/* dt points to end of string */
break ;
}
else
{
/* dt points to illegal character */
log ( LL_ERR , " ERROR parsing config file: illegal character [%c=0x%x] in date/time spec at line %d! " , * dt , * dt , lineno ) ;
config_error_flag + + ;
return ;
}
}
2002-03-27 16:46:34 +03:00
current_cfe - > day = day ;
current_cfe - > fromhr = fromhr ;
current_cfe - > frommin = frommin ;
current_cfe - > tohr = tohr ;
current_cfe - > tomin = tomin ;
}
void
flush_config ( )
{
if ( current_cfe ! = NULL ) {
add_cfg_entry ( current_cfe ) ;
}
2001-01-06 16:00:10 +03:00
}
/*---------------------------------------------------------------------------*
* configuration validation and consistency check
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
static void
check_config ( void )
{
2002-03-27 16:46:34 +03:00
struct cfg_entry * cep = NULL ;
2001-01-06 16:00:10 +03:00
int i ;
int error = 0 ;
/* regular expression table */
for ( i = 0 ; i < MAX_RE ; i + + )
{
if ( ( rarr [ i ] . re_expr ! = NULL ) & & ( rarr [ i ] . re_prog = = NULL ) )
{
log ( LL_ERR , " check_config: regular expression %d without program! " , i ) ;
error + + ;
}
if ( ( rarr [ i ] . re_prog ! = NULL ) & & ( rarr [ i ] . re_expr = = NULL ) )
{
log ( LL_ERR , " check_config: regular expression program %d without expression! " , i ) ;
error + + ;
}
}
/* entry sections */
2002-03-27 16:46:34 +03:00
for ( cep = get_first_cfg_entry ( ) ; cep ; cep = NEXT_CFE ( cep ) ) {
2001-01-06 16:00:10 +03:00
/* numbers used for dialout */
if ( ( cep - > inout ! = DIR_INONLY ) & & ( cep - > dialin_reaction ! = REACT_ANSWER ) )
{
if ( cep - > remote_numbers_count = = 0 )
{
log ( LL_ERR , " check_config: remote-phone-dialout not set in entry %d! " , i ) ;
error + + ;
}
if ( strlen ( cep - > local_phone_dialout ) = = 0 )
{
log ( LL_ERR , " check_config: local-phone-dialout not set in entry %d! " , i ) ;
error + + ;
}
}
/* numbers used for incoming calls */
if ( cep - > inout ! = DIR_OUTONLY )
{
if ( strlen ( cep - > local_phone_incoming ) = = 0 )
{
log ( LL_ERR , " check_config: local-phone-incoming not set in entry %d! " , i ) ;
error + + ;
}
if ( cep - > incoming_numbers_count = = 0 )
{
log ( LL_ERR , " check_config: remote-phone-incoming not set in entry %d! " , i ) ;
error + + ;
}
}
if ( ( cep - > dialin_reaction = = REACT_ANSWER ) & & ( cep - > b1protocol ! = BPROT_NONE ) )
{
log ( LL_ERR , " check_config: b1protocol not raw for telephony in entry %d! " , i ) ;
error + + ;
}
if ( ( cep - > ppp_send_auth = = AUTH_PAP ) | | ( cep - > ppp_send_auth = = AUTH_CHAP ) )
{
2002-01-26 22:31:20 +03:00
if ( cep - > ppp_send_name = = NULL )
2001-01-06 16:00:10 +03:00
{
log ( LL_ERR , " check_config: no remote authentification name in entry %d! " , i ) ;
error + + ;
}
2002-01-26 22:31:20 +03:00
if ( cep - > ppp_send_password = = NULL )
2001-01-06 16:00:10 +03:00
{
log ( LL_ERR , " check_config: no remote authentification password in entry %d! " , i ) ;
error + + ;
}
}
if ( ( cep - > ppp_expect_auth = = AUTH_PAP ) | | ( cep - > ppp_expect_auth = = AUTH_CHAP ) )
{
2002-01-04 15:24:33 +03:00
if ( cep - > ppp_expect_name = = NULL )
2001-01-06 16:00:10 +03:00
{
log ( LL_ERR , " check_config: no local authentification name in entry %d! " , i ) ;
error + + ;
}
2002-01-04 15:24:33 +03:00
if ( cep - > ppp_expect_password = = NULL )
2001-01-06 16:00:10 +03:00
{
log ( LL_ERR , " check_config: no local authentification secret in entry %d! " , i ) ;
error + + ;
}
}
2002-01-26 22:31:20 +03:00
2002-03-17 23:57:24 +03:00
if ( cep - > ppp_expect_auth ! = AUTH_UNDEF
2002-03-20 14:39:49 +03:00
| | cep - > ppp_send_auth ! = AUTH_UNDEF )
2002-04-11 03:35:07 +04:00
set_isppp_auth ( cep ) ;
/*
* Only if AUTOUPDOWN_YES is the only bit set , otherwise
* we already have handled this interface .
*/
if ( cep - > autoupdown = = AUTOUPDOWN_YES )
set_autoupdown ( cep ) ;
2001-01-06 16:00:10 +03:00
}
2002-03-27 16:46:34 +03:00
if ( error ) {
2001-01-06 16:00:10 +03:00
log ( LL_ERR , " check_config: %d error(s) in configuration file, exit! " , error ) ;
do_exit ( 1 ) ;
}
}
/*---------------------------------------------------------------------------*
* print the configuration
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
static void
print_config ( void )
{
# define PFILE stdout
# ifdef I4B_EXTERNAL_MONITOR
extern struct monitor_rights * monitor_next_rights ( const struct monitor_rights * r ) ;
struct monitor_rights * m_rights ;
# endif
2002-03-27 16:46:34 +03:00
struct cfg_entry * cep = NULL ;
2001-01-06 16:00:10 +03:00
int i , j ;
time_t clock ;
char mytime [ 64 ] ;
time ( & clock ) ;
strcpy ( mytime , ctime ( & clock ) ) ;
mytime [ strlen ( mytime ) - 1 ] = ' \0 ' ;
fprintf ( PFILE , " #--------------------------------------------------------------------------- \n " ) ;
fprintf ( PFILE , " # system section (generated %s) \n " , mytime ) ;
fprintf ( PFILE , " #--------------------------------------------------------------------------- \n " ) ;
fprintf ( PFILE , " system \n " ) ;
fprintf ( PFILE , " useacctfile = %s \n " , useacctfile ? " on \t \t \t \t # update accounting information file " : " off \t \t \t \t # don't update accounting information file " ) ;
fprintf ( PFILE , " acctall = %s \n " , acct_all ? " on \t \t \t \t # put all events into accounting file " : " off \t \t \t \t # put only charged events into accounting file " ) ;
fprintf ( PFILE , " acctfile = %s \t \t # accounting information file \n " , acctfile ) ;
fprintf ( PFILE , " ratesfile = %s \t \t # charging rates database file \n " , ratesfile ) ;
# ifdef USE_RTPRIO
if ( rt_prio = = RTPRIO_NOTUSED )
fprintf ( PFILE , " # rtprio is unused \n " ) ;
else
fprintf ( PFILE , " rtprio = %d \t \t \t \t # isdnd runs at realtime priority \n " , rt_prio ) ;
# endif
/* regular expression table */
for ( i = 0 ; i < MAX_RE ; i + + )
{
if ( rarr [ i ] . re_expr ! = NULL )
{
fprintf ( PFILE , " regexpr = \" %s \" \t \t # scan logfile for this expression \n " , rarr [ i ] . re_expr ) ;
}
if ( rarr [ i ] . re_prog ! = NULL )
{
fprintf ( PFILE , " regprog = %s \t \t # program to run when expression is matched \n " , rarr [ i ] . re_prog ) ;
}
}
# ifdef I4B_EXTERNAL_MONITOR
fprintf ( PFILE , " monitor-allowed = %s \n " , do_monitor ? " on \t \t \t \t # remote isdnd monitoring allowed " : " off \t \t \t \t # remote isdnd monitoring disabled " ) ;
fprintf ( PFILE , " monitor-port = %d \t \t \t \t # TCP/IP port number used for remote monitoring \n " , monitorport ) ;
m_rights = monitor_next_rights ( NULL ) ;
if ( m_rights ! = NULL )
{
char * s = " error \n " ;
char b [ 512 ] ;
for ( ; m_rights ! = NULL ; m_rights = monitor_next_rights ( m_rights ) )
{
if ( m_rights - > local )
{
fprintf ( PFILE , " monitor = \" %s \" \t \t # local socket name for monitoring \n " , m_rights - > name ) ;
}
else
{
struct in_addr ia ;
ia . s_addr = ntohl ( m_rights - > net ) ;
switch ( m_rights - > mask )
{
case 0xffffffff :
s = " 32 " ;
break ;
case 0xfffffffe :
s = " 31 " ;
break ;
case 0xfffffffc :
s = " 30 " ;
break ;
case 0xfffffff8 :
s = " 29 " ;
break ;
case 0xfffffff0 :
s = " 28 " ;
break ;
case 0xffffffe0 :
s = " 27 " ;
break ;
case 0xffffffc0 :
s = " 26 " ;
break ;
case 0xffffff80 :
s = " 25 " ;
break ;
case 0xffffff00 :
s = " 24 " ;
break ;
case 0xfffffe00 :
s = " 23 " ;
break ;
case 0xfffffc00 :
s = " 22 " ;
break ;
case 0xfffff800 :
s = " 21 " ;
break ;
case 0xfffff000 :
s = " 20 " ;
break ;
case 0xffffe000 :
s = " 19 " ;
break ;
case 0xffffc000 :
s = " 18 " ;
break ;
case 0xffff8000 :
s = " 17 " ;
break ;
case 0xffff0000 :
s = " 16 " ;
break ;
case 0xfffe0000 :
s = " 15 " ;
break ;
case 0xfffc0000 :
s = " 14 " ;
break ;
case 0xfff80000 :
s = " 13 " ;
break ;
case 0xfff00000 :
s = " 12 " ;
break ;
case 0xffe00000 :
s = " 11 " ;
break ;
case 0xffc00000 :
s = " 10 " ;
break ;
case 0xff800000 :
s = " 9 " ;
break ;
case 0xff000000 :
s = " 8 " ;
break ;
case 0xfe000000 :
s = " 7 " ;
break ;
case 0xfc000000 :
s = " 6 " ;
break ;
case 0xf8000000 :
s = " 5 " ;
break ;
case 0xf0000000 :
s = " 4 " ;
break ;
case 0xe0000000 :
s = " 3 " ;
break ;
case 0xc0000000 :
s = " 2 " ;
break ;
case 0x80000000 :
s = " 1 " ;
break ;
case 0x00000000 :
s = " 0 " ;
break ;
}
fprintf ( PFILE , " monitor = \" %s/%s \" \t \t # host (net/mask) allowed to connect for monitoring \n " , inet_ntoa ( ia ) , s ) ;
}
b [ 0 ] = ' \0 ' ;
if ( ( m_rights - > rights ) & I4B_CA_COMMAND_FULL )
strcat ( b , " fullcmd, " ) ;
if ( ( m_rights - > rights ) & I4B_CA_COMMAND_RESTRICTED )
strcat ( b , " restrictedcmd, " ) ;
if ( ( m_rights - > rights ) & I4B_CA_EVNT_CHANSTATE )
strcat ( b , " channelstate, " ) ;
if ( ( m_rights - > rights ) & I4B_CA_EVNT_CALLIN )
strcat ( b , " callin, " ) ;
if ( ( m_rights - > rights ) & I4B_CA_EVNT_CALLOUT )
strcat ( b , " callout, " ) ;
if ( ( m_rights - > rights ) & I4B_CA_EVNT_I4B )
strcat ( b , " logevents, " ) ;
if ( b [ strlen ( b ) - 1 ] = = ' , ' )
b [ strlen ( b ) - 1 ] = ' \0 ' ;
fprintf ( PFILE , " monitor-access = %s \t \t # monitor access rights \n " , b ) ;
}
}
# endif
/* entry sections */
2002-03-27 16:46:34 +03:00
for ( cep = get_first_cfg_entry ( ) ; cep ; cep = NEXT_CFE ( cep ) ) {
2001-01-06 16:00:10 +03:00
fprintf ( PFILE , " \n " ) ;
fprintf ( PFILE , " #--------------------------------------------------------------------------- \n " ) ;
fprintf ( PFILE , " # entry section %d \n " , i ) ;
fprintf ( PFILE , " #--------------------------------------------------------------------------- \n " ) ;
fprintf ( PFILE , " entry \n " ) ;
fprintf ( PFILE , " name = %s \t \t # name for this entry section \n " , cep - > name ) ;
fprintf ( PFILE , " isdncontroller = %d \t \t # ISDN card number used for this entry \n " , cep - > isdncontroller ) ;
fprintf ( PFILE , " isdnchannel = " ) ;
switch ( cep - > isdnchannel )
{
case CHAN_ANY :
fprintf ( PFILE , " -1 \t \t # any ISDN B-channel may be used \n " ) ;
break ;
case CHAN_B1 :
fprintf ( PFILE , " 1 \t \t # only ISDN B-channel 1 may be used \n " ) ;
break ;
case CHAN_B2 :
fprintf ( PFILE , " 2 \t \t # only ISDN B-channel 2 ay be used \n " ) ;
break ;
}
2002-03-27 16:46:34 +03:00
fprintf ( PFILE , " usrdevicename = %s \t \t # name of userland ISDN B-channel device \n " , cep - > usrdevicename ) ;
2001-01-06 16:00:10 +03:00
fprintf ( PFILE , " usrdeviceunit = %d \t \t # unit number of userland ISDN B-channel device \n " , cep - > usrdeviceunit ) ;
fprintf ( PFILE , " b1protocol = %s \n " , cep - > b1protocol ? " hdlc \t \t # B-channel layer 1 protocol is HDLC " : " raw \t \t # No B-channel layer 1 protocol used " ) ;
2002-03-17 23:57:24 +03:00
fprintf ( PFILE , " direction = " ) ;
switch ( cep - > inout )
2001-01-06 16:00:10 +03:00
{
2002-03-17 23:57:24 +03:00
case DIR_INONLY :
fprintf ( PFILE , " in \t \t # only incoming connections allowed \n " ) ;
break ;
case DIR_OUTONLY :
fprintf ( PFILE , " out \t \t # only outgoing connections allowed \n " ) ;
break ;
case DIR_INOUT :
fprintf ( PFILE , " inout \t \t # incoming and outgoing connections allowed \n " ) ;
break ;
2001-01-06 16:00:10 +03:00
}
2002-03-17 23:57:24 +03:00
if ( cep - > remote_numbers_count > 1 )
2001-01-06 16:00:10 +03:00
{
2002-03-17 23:57:24 +03:00
for ( j = 0 ; j < cep - > remote_numbers_count ; j + + )
fprintf ( PFILE , " remote-phone-dialout = %s \t \t # telephone number %d for dialing out to remote \n " , cep - > remote_numbers [ j ] . number , j + 1 ) ;
2001-01-06 16:00:10 +03:00
fprintf ( PFILE , " remdial-handling = " ) ;
2002-03-17 23:57:24 +03:00
2001-01-06 16:00:10 +03:00
switch ( cep - > remote_numbers_handling )
{
case RNH_NEXT :
fprintf ( PFILE , " next \t \t # use next number after last successfull for new dial \n " ) ;
break ;
case RNH_LAST :
fprintf ( PFILE , " last \t \t # use last successfull number for new dial \n " ) ;
break ;
case RNH_FIRST :
fprintf ( PFILE , " first \t \t # always start with first number for new dial \n " ) ;
break ;
}
}
fprintf ( PFILE , " local-phone-dialout = %s \t \t # show this number to remote when dialling out \n " , cep - > local_phone_dialout ) ;
fprintf ( PFILE , " dialout-type = %s \n " , cep - > dialouttype ? " calledback \t \t # i am called back by remote " : " normal \t \t # i am not called back by remote " ) ;
}
if ( ! ( cep - > inout = = DIR_OUTONLY ) )
{
int n ;
fprintf ( PFILE , " local-phone-incoming = %s \t \t # incoming calls must match this (mine) telephone number \n " , cep - > local_phone_incoming ) ;
for ( n = 0 ; n < cep - > incoming_numbers_count ; n + + )
fprintf ( PFILE , " remote-phone-incoming = %s \t \t # this is a valid remote number to call me \n " ,
cep - > remote_phone_incoming [ n ] . number ) ;
fprintf ( PFILE , " dialin-reaction = " ) ;
switch ( cep - > dialin_reaction )
{
case REACT_ACCEPT :
fprintf ( PFILE , " accept \t \t # i accept a call from remote and connect \n " ) ;
break ;
case REACT_REJECT :
fprintf ( PFILE , " reject \t \t # i reject the call from remote \n " ) ;
break ;
case REACT_IGNORE :
fprintf ( PFILE , " ignore \t \t # i ignore the call from remote \n " ) ;
break ;
case REACT_ANSWER :
fprintf ( PFILE , " answer \t \t # i will start telephone answering when remote calls in \n " ) ;
break ;
case REACT_CALLBACK :
fprintf ( PFILE , " callback \t \t # when remote calls in, i will hangup and call back \n " ) ;
break ;
}
}
{
char * s ;
switch ( cep - > ppp_expect_auth )
{
case AUTH_NONE :
s = " none " ;
break ;
case AUTH_PAP :
s = " pap " ;
break ;
case AUTH_CHAP :
s = " chap " ;
break ;
default :
s = NULL ;
break ;
}
if ( s ! = NULL )
{
fprintf ( PFILE , " ppp-expect-auth = %s \t \t # the auth protocol we expect to receive on dial-in (none,pap,chap) \n " , s ) ;
if ( cep - > ppp_expect_auth ! = AUTH_NONE )
{
fprintf ( PFILE , " ppp-expect-name = %s \t \t # the user name allowed in \n " , cep - > ppp_expect_name ) ;
fprintf ( PFILE , " ppp-expect-password = %s \t \t # the key expected from the other side \n " , cep - > ppp_expect_password ) ;
fprintf ( PFILE , " ppp-auth-paranoid = %s \t \t # do we require remote to authenticate even if we dial out \n " , cep - > ppp_auth_flags & AUTH_REQUIRED ? " yes " : " no " ) ;
}
}
switch ( cep - > ppp_send_auth )
{
case AUTH_NONE :
s = " none " ;
break ;
case AUTH_PAP :
s = " pap " ;
break ;
case AUTH_CHAP :
s = " chap " ;
break ;
default :
s = NULL ;
break ;
}
if ( s ! = NULL )
{
fprintf ( PFILE , " ppp-send-auth = %s \t \t # the auth protocol we use when dialing out (none,pap,chap) \n " , s ) ;
if ( cep - > ppp_send_auth ! = AUTH_NONE )
{
fprintf ( PFILE , " ppp-send-name = %s \t \t # our PPP account used for dial-out \n " , cep - > ppp_send_name ) ;
fprintf ( PFILE , " ppp-send-password = %s \t \t # the key sent to the other side \n " , cep - > ppp_send_password ) ;
}
}
if ( cep - > ppp_send_auth = = AUTH_CHAP | |
cep - > ppp_expect_auth = = AUTH_CHAP ) {
fprintf ( PFILE , " ppp-auth-rechallenge = %s \t \t # rechallenge CHAP connections once in a while \n " , cep - > ppp_auth_flags & AUTH_RECHALLENGE ? " yes " : " no " ) ;
}
}
2002-04-11 03:35:07 +04:00
if ( cep - > autoupdown = = AUTOUPDOWN_NO )
fprintf ( PFILE , " autoupdown = no \n " ) ;
2001-01-06 16:00:10 +03:00
{
char * s ;
fprintf ( PFILE , " idletime-outgoing = %d \t \t # outgoing call idle timeout \n " , cep - > idle_time_out ) ;
switch ( cep - > shorthold_algorithm )
{
case SHA_FIXU :
s = " fix-unit-size " ;
break ;
case SHA_VARU :
s = " var-unit-size " ;
break ;
default :
s = " error!!! " ;
break ;
}
fprintf ( PFILE , " idle-algorithm-outgoing = %s \t \t # outgoing call idle algorithm \n " , s ) ;
}
if ( ! ( cep - > inout = = DIR_OUTONLY ) )
fprintf ( PFILE , " idletime-incoming = %d \t \t # incoming call idle timeout \n " , cep - > idle_time_in ) ;
{
fprintf ( PFILE , " unitlengthsrc = " ) ;
switch ( cep - > unitlengthsrc )
{
case ULSRC_NONE :
fprintf ( PFILE , " none \t \t # no unit length specified, using default \n " ) ;
break ;
case ULSRC_CMDL :
fprintf ( PFILE , " cmdl \t \t # using unit length specified on commandline \n " ) ;
break ;
case ULSRC_CONF :
fprintf ( PFILE , " conf \t \t # using unitlength specified by unitlength-keyword \n " ) ;
fprintf ( PFILE , " unitlength = %d \t \t # fixed unitlength \n " , cep - > unitlength ) ;
break ;
case ULSRC_RATE :
fprintf ( PFILE , " rate \t \t # using unitlength specified in rate database \n " ) ;
fprintf ( PFILE , " ratetype = %d \t \t # type of rate from rate database \n " , cep - > ratetype ) ;
break ;
case ULSRC_DYN :
fprintf ( PFILE , " aocd \t \t # using dynamically calculated unitlength based on AOCD subscription \n " ) ;
fprintf ( PFILE , " ratetype = %d \t \t # type of rate from rate database \n " , cep - > ratetype ) ;
break ;
}
fprintf ( PFILE , " earlyhangup = %d \t \t # early hangup safety time \n " , cep - > earlyhangup ) ;
}
{
fprintf ( PFILE , " answerprog = %s \t \t # program used to answer incoming telephone calls \n " , cep - > answerprog ) ;
fprintf ( PFILE , " alert = %d \t \t # number of seconds to wait before accepting a call \n " , cep - > alert ) ;
}
{
if ( cep - > dialin_reaction = = REACT_CALLBACK )
fprintf ( PFILE , " callbackwait = %d \t \t # i am waiting this time before calling back remote \n " , cep - > callbackwait ) ;
if ( cep - > dialouttype = = DIALOUT_CALLEDBACK )
fprintf ( PFILE , " calledbackwait = %d \t \t # i am waiting this time for a call back from remote \n " , cep - > calledbackwait ) ;
if ( ! ( cep - > inout = = DIR_INONLY ) )
{
fprintf ( PFILE , " dialretries = %d \t \t # number of dialing retries \n " , cep - > dialretries ) ;
fprintf ( PFILE , " recoverytime = %d \t \t # time to wait between dialling retries \n " , cep - > recoverytime ) ;
fprintf ( PFILE , " dialrandincr = %s \t \t # use random dialing time addon \n " , cep - > dialrandincr ? " on " : " off " ) ;
fprintf ( PFILE , " usedown = %s \n " , cep - > usedown ? " on \t \t # ISDN device switched off on excessive dial failures " : " off \t \t # no device switchoff on excessive dial failures " ) ;
if ( cep - > usedown )
{
fprintf ( PFILE , " downtries = %d \t \t # number of dialretries failures before switching off \n " , cep - > downtries ) ;
fprintf ( PFILE , " downtime = %d \t \t # time device is switched off \n " , cep - > downtime ) ;
}
}
}
fprintf ( PFILE , " \n " ) ;
}
2002-03-17 23:57:24 +03:00
static int
lookup_l4_driver ( const char * name )
{
msg_l4driver_lookup_t query ;
int e ;
memset ( & query , 0 , sizeof query ) ;
strncpy ( query . name , name , sizeof query . name ) ;
e = ioctl ( isdnfd , I4B_L4DRIVER_LOOKUP , & query ) ;
if ( e ! = 0 ) return - 1 ;
return query . driver_id ;
}