New feature: provider skipping.
Certain providers can be completely ignored (skipped) when loading the rate-file. The selection is done by Q: tags in rate.conf or by skipProv= in the parameter file. The syntax is explained in the new manual page rate.conf(5). Absurd settings for provider skipping may cause trouble. The version number will change to 4.70 in a few days after an update of the rate-de.dat.
This commit is contained in:
parent
4827b38772
commit
7604713269
|
@ -1,3 +1,14 @@
|
|||
2005-02-23 Tobias Becker <tobiasb@isdn4linux.de>
|
||||
* Makefile.in: Added file tools/rate_skip.o to object file lists.
|
||||
Added install instruction for new manual page rate.conf(5).
|
||||
|
||||
* configure.in: Added tools/rate.conf.5.in to list for text
|
||||
substitution. New variables MANDATE_RATE_CONF and VERSION_ISDNLOG
|
||||
for text replacement in manual pages. VERSION_ISDNLOG is set to
|
||||
VERSION from Makefile.in by grep.
|
||||
* configure: Same changes as for configure.in, generated by a
|
||||
patched autconf 2.53, which had been used for former revisions.
|
||||
|
||||
2004-12-10 Tobias Becker <tobiasb@isdn4linux.de>
|
||||
* Makefile.in (NATION): Export this variable to child processes, like
|
||||
make in subdirectories.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
## $Id: Makefile.in,v 1.217 2004/12/10 18:26:10 tobiasb Exp $
|
||||
## $Id: Makefile.in,v 1.218 2005/02/23 14:33:38 tobiasb Exp $
|
||||
##
|
||||
## ISDN accounting for isdn4linux.
|
||||
##
|
||||
|
@ -19,6 +19,15 @@
|
|||
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
##
|
||||
## $Log: Makefile.in,v $
|
||||
## Revision 1.218 2005/02/23 14:33:38 tobiasb
|
||||
## New feature: provider skipping.
|
||||
## Certain providers can be completely ignored (skipped) when loading the
|
||||
## rate-file. The selection is done by Q: tags in rate.conf or by skipProv=
|
||||
## in the parameter file. The syntax is explained in the new manual page
|
||||
## rate.conf(5). Absurd settings for provider skipping may cause trouble.
|
||||
## The version number will change to 4.70 in a few days after an update
|
||||
## of the rate-de.dat.
|
||||
##
|
||||
## Revision 1.217 2004/12/10 18:26:10 tobiasb
|
||||
## Let "make all" in the isdnlog directory create the necessary zone files.
|
||||
##
|
||||
|
@ -1694,6 +1703,8 @@ SERVICEFILE = /etc/services
|
|||
# DON'T EDIT BELOW THIS LINE
|
||||
######################################################################
|
||||
|
||||
# next line must match basic regexp "^VERSION \+= \+" and contain only
|
||||
# the isdnlog version number after it.
|
||||
VERSION = 4.69
|
||||
|
||||
# fallback to I4L-Version as set at configure time
|
||||
|
@ -1706,7 +1717,7 @@ endif
|
|||
MANPAGES = isdnlog/callerid.conf.5 isdnlog/isdn.conf.5 \
|
||||
isdnlog/isdnformat.5 isdnlog/isdnlog.5 isdnlog/isdnlog.8 \
|
||||
isdnlog/isdnlog.users.5 isdnrep/isdnrep.1 isdnconf/isdnconf.1 \
|
||||
tools/isdnrate.1 tools/rate-files.5 \
|
||||
tools/isdnrate.1 tools/rate-files.5 tools/rate.conf.5 \
|
||||
isdnrep/isdnbill.1
|
||||
MANPAGES += samples/isdn.conf \
|
||||
samples/isdn.conf.at samples/isdn.conf.de samples/isdn.conf.lu \
|
||||
|
@ -1798,7 +1809,8 @@ ISDNLOG_OBJS = isdnlog/isdnlog.o isdnlog/processor.o isdnlog/functions.o \
|
|||
connect/connect.o connect/socket.o tools/tools.o \
|
||||
connect/conv_address.o isdnlog/user_access.o \
|
||||
tools/isdnconf.o tools/telnum.o tools/dest.o \
|
||||
tools/rate.o tools/zone.o tools/holiday.o tools/zone/upack.o \
|
||||
tools/rate.o tools/rate_skip.o \
|
||||
tools/zone.o tools/holiday.o tools/zone/upack.o \
|
||||
isdnlog/asn1.o isdnlog/asn1_generic.o isdnlog/asn1_aoc.o \
|
||||
isdnlog/asn1_address.o isdnlog/asn1_diversion.o \
|
||||
isdnlog/asn1_basic_service.o isdnlog/asn1_comp.o \
|
||||
|
@ -1828,24 +1840,28 @@ endif
|
|||
|
||||
ISDNREP_OBJS = isdnrep/rep_main.o tools/tools.o tools/isdnconf.o \
|
||||
isdnlog/messages.o isdnrep/isdnrep.o isdnrep/opt_time.o \
|
||||
tools/rate.o tools/zone.o tools/holiday.o tools/dest.o \
|
||||
tools/telnum.o tools/zone/upack.o \
|
||||
tools/rate.o tools/rate_skip.o \
|
||||
tools/zone.o tools/holiday.o tools/dest.o \
|
||||
tools/telnum.o tools/zone/upack.o \
|
||||
$(LIBISDNDIR)/libisdn.a $(CDBEXTRALIBS)
|
||||
|
||||
ISDNBILL_OBJS = isdnrep/isdnbill.o tools/tools.o tools/isdnconf.o \
|
||||
isdnlog/messages.o \
|
||||
tools/rate.o tools/zone.o tools/holiday.o tools/dest.o \
|
||||
tools/rate.o tools/rate_skip.o \
|
||||
tools/zone.o tools/holiday.o tools/dest.o \
|
||||
tools/telnum.o tools/zone/upack.o \
|
||||
$(LIBISDNDIR)/libisdn.a $(CDBEXTRALIBS)
|
||||
|
||||
# Are these all necessary? I believe they are not. (tobiasb, 2005-02-05)
|
||||
ISDNCONF_OBJS= isdnconf/isdnconf.o tools/tools.o tools/isdnconf.o \
|
||||
tools/rate.o tools/zone.o tools/holiday.o \
|
||||
tools/rate.o tools/rate_skip.o \
|
||||
tools/zone.o tools/holiday.o \
|
||||
tools/telnum.o tools/dest.o tools/zone/upack.o \
|
||||
$(LIBISDNDIR)/libisdn.a $(CDBEXTRALIBS)
|
||||
|
||||
ISDNRATE_OBJS= tools/isdnrate.o tools/isdnconf.o tools/tools.o \
|
||||
tools/rate.o tools/zone.o tools/dest.o \
|
||||
tools/holiday.o \
|
||||
tools/rate.o tools/rate_skip.o \
|
||||
tools/zone.o tools/dest.o tools/holiday.o \
|
||||
tools/telnum.o tools/zone/upack.o \
|
||||
$(LIBISDNDIR)/libisdn.a $(CDBEXTRALIBS)
|
||||
|
||||
|
@ -2030,6 +2046,7 @@ install-data:
|
|||
$(INSTALL_DATA) isdnlog/isdnformat.5 $(DESTDIR)$(MAN5DIR)/isdnformat$(MAN5EXT)
|
||||
$(INSTALL_DATA) tools/isdnrate.1 $(DESTDIR)$(MAN1DIR)/isdnrate$(MAN1EXT)
|
||||
$(INSTALL_DATA) tools/rate-files.5 $(DESTDIR)$(MAN5DIR)/rate-files$(MAN5EXT)
|
||||
$(INSTALL_DATA) tools/rate.conf.5 $(DESTDIR)$(MAN5DIR)/rate.conf$(MAN5EXT)
|
||||
$(INSTALL_DATA) country-de.dat $(DESTDIR)$(DATADIR)/country.dat
|
||||
$(INSTALL_DATA) rate-$(NATION).dat $(DESTDIR)$(DATADIR)
|
||||
$(INSTALL_DATA) holiday-$(NATION).dat $(DESTDIR)$(DATADIR)
|
||||
|
|
|
@ -1250,6 +1250,7 @@ DATADIR=`eval echo $datadir`
|
|||
DOCDIR=`eval echo $DOCDIR`
|
||||
MANDATE_CALLERID=`grep CHECKIN isdnlog/callerid.conf.5.in | awk '{print $4}'`
|
||||
MANDATE_ISDN_CONF=`grep CHECKIN isdnlog/isdn.conf.5.in | awk '{print $4}'`
|
||||
MANDATE_RATE_CONF=`grep CHECKIN tools/rate.conf.5.in | awk '{print $4}'`
|
||||
MANDATE_ISDNFORMAT=`grep CHECKIN isdnlog/isdnformat.5.in | awk '{print $4}'`
|
||||
MANDATE_ISDNLOG5=`grep CHECKIN isdnlog/isdnlog.5.in | awk '{print $4}'`
|
||||
MANDATE_ISDNLOG8=`grep CHECKIN isdnlog/isdnlog.8.in | awk '{print $4}'`
|
||||
|
@ -1257,6 +1258,7 @@ MANDATE_ISDNLOG_USERS=`grep CHECKIN isdnlog/isdnlog.users.5.in | awk '{print $4}
|
|||
MANDATE_ISDNREP=`grep CHECKIN isdnrep/isdnrep.1.in | awk '{print $4}'`
|
||||
MANDATE_ISDNBILL=`grep CHECKIN isdnrep/isdnbill.1.in | awk '{print $4}'`
|
||||
MANDATE_ISDNCONF=`grep CHECKIN isdnconf/isdnconf.1.in | awk '{print $4}'`
|
||||
ISDNLOG_VERSION=`grep "^VERSION \+= \+" Makefile.in | awk '{print $3}'`
|
||||
|
||||
if test "$CONFIG_LIB_AREACODE" = "y" ; then
|
||||
ALIB=area
|
||||
|
@ -4337,7 +4339,9 @@ esac
|
|||
|
||||
|
||||
|
||||
ac_config_files="$ac_config_files Makefile isdnlog/callerid.conf.5 isdnlog/isdn.conf.5 isdnlog/isdnformat.5 isdnlog/isdnlog.5 isdnlog/isdnlog.8 isdnlog/isdnlog.users.5 isdnrep/isdnrep.1 isdnrep/isdnbill.1 isdnconf/isdnconf.1 samples/isdn.conf samples/isdn.conf.at samples/isdn.conf.de samples/isdn.conf.lu samples/isdn.conf.nl samples/isdn.conf.no samples/isdn.conf.pl"
|
||||
|
||||
|
||||
ac_config_files="$ac_config_files Makefile isdnlog/callerid.conf.5 isdnlog/isdn.conf.5 tools/rate.conf.5 isdnlog/isdnformat.5 isdnlog/isdnlog.5 isdnlog/isdnlog.8 isdnlog/isdnlog.users.5 isdnrep/isdnrep.1 isdnrep/isdnbill.1 isdnconf/isdnconf.1 samples/isdn.conf samples/isdn.conf.at samples/isdn.conf.de samples/isdn.conf.lu samples/isdn.conf.nl samples/isdn.conf.no samples/isdn.conf.pl"
|
||||
cat >confcache <<\_ACEOF
|
||||
# This file is a shell script that caches the results of configure
|
||||
# tests run on this system so they can be shared between configure
|
||||
|
@ -4812,6 +4816,7 @@ do
|
|||
"Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
|
||||
"isdnlog/callerid.conf.5" ) CONFIG_FILES="$CONFIG_FILES isdnlog/callerid.conf.5" ;;
|
||||
"isdnlog/isdn.conf.5" ) CONFIG_FILES="$CONFIG_FILES isdnlog/isdn.conf.5" ;;
|
||||
"tools/rate.conf.5" ) CONFIG_FILES="$CONFIG_FILES tools/rate.conf.5" ;;
|
||||
"isdnlog/isdnformat.5" ) CONFIG_FILES="$CONFIG_FILES isdnlog/isdnformat.5" ;;
|
||||
"isdnlog/isdnlog.5" ) CONFIG_FILES="$CONFIG_FILES isdnlog/isdnlog.5" ;;
|
||||
"isdnlog/isdnlog.8" ) CONFIG_FILES="$CONFIG_FILES isdnlog/isdnlog.8" ;;
|
||||
|
@ -4948,6 +4953,7 @@ s,@AREAPREFIX@,$AREAPREFIX,;t t
|
|||
s,@NATION@,$NATION,;t t
|
||||
s,@NATION_MACRO@,$NATION_MACRO,;t t
|
||||
s,@I4LVERSION@,$I4LVERSION,;t t
|
||||
s,@ISDNLOG_VERSION@,$ISDNLOG_VERSION,;t t
|
||||
s,@DATADIR@,$DATADIR,;t t
|
||||
s,@DOCDIR@,$DOCDIR,;t t
|
||||
s,@RELOADCMD@,$RELOADCMD,;t t
|
||||
|
@ -4955,6 +4961,7 @@ s,@STOPCMD@,$STOPCMD,;t t
|
|||
s,@REBOOTCMD@,$REBOOTCMD,;t t
|
||||
s,@MANDATE_CALLERID@,$MANDATE_CALLERID,;t t
|
||||
s,@MANDATE_ISDN_CONF@,$MANDATE_ISDN_CONF,;t t
|
||||
s,@MANDATE_RATE_CONF@,$MANDATE_RATE_CONF,;t t
|
||||
s,@MANDATE_ISDNFORMAT@,$MANDATE_ISDNFORMAT,;t t
|
||||
s,@MANDATE_ISDNLOG5@,$MANDATE_ISDNLOG5,;t t
|
||||
s,@MANDATE_ISDNLOG8@,$MANDATE_ISDNLOG8,;t t
|
||||
|
|
|
@ -63,6 +63,7 @@ DATADIR=`eval echo $datadir`
|
|||
DOCDIR=`eval echo $DOCDIR`
|
||||
MANDATE_CALLERID=`grep CHECKIN isdnlog/callerid.conf.5.in | awk '{print $4}'`
|
||||
MANDATE_ISDN_CONF=`grep CHECKIN isdnlog/isdn.conf.5.in | awk '{print $4}'`
|
||||
MANDATE_RATE_CONF=`grep CHECKIN tools/rate.conf.5.in | awk '{print $4}'`
|
||||
MANDATE_ISDNFORMAT=`grep CHECKIN isdnlog/isdnformat.5.in | awk '{print $4}'`
|
||||
MANDATE_ISDNLOG5=`grep CHECKIN isdnlog/isdnlog.5.in | awk '{print $4}'`
|
||||
MANDATE_ISDNLOG8=`grep CHECKIN isdnlog/isdnlog.8.in | awk '{print $4}'`
|
||||
|
@ -70,6 +71,7 @@ MANDATE_ISDNLOG_USERS=`grep CHECKIN isdnlog/isdnlog.users.5.in | awk '{print $4}
|
|||
MANDATE_ISDNREP=`grep CHECKIN isdnrep/isdnrep.1.in | awk '{print $4}'`
|
||||
MANDATE_ISDNBILL=`grep CHECKIN isdnrep/isdnbill.1.in | awk '{print $4}'`
|
||||
MANDATE_ISDNCONF=`grep CHECKIN isdnconf/isdnconf.1.in | awk '{print $4}'`
|
||||
ISDNLOG_VERSION=`grep "^VERSION \+= \+" Makefile.in | awk '{print $3}'`
|
||||
|
||||
if test "$CONFIG_LIB_AREACODE" = "y" ; then
|
||||
ALIB=area
|
||||
|
@ -240,6 +242,7 @@ AC_SUBST(AREAPREFIX)
|
|||
AC_SUBST(NATION)
|
||||
AC_SUBST(NATION_MACRO)
|
||||
AC_SUBST(I4LVERSION)
|
||||
AC_SUBST(ISDNLOG_VERSION)
|
||||
AC_SUBST(DATADIR)
|
||||
AC_SUBST(DOCDIR)
|
||||
AC_SUBST(RELOADCMD)
|
||||
|
@ -247,6 +250,7 @@ AC_SUBST(STOPCMD)
|
|||
AC_SUBST(REBOOTCMD)
|
||||
AC_SUBST(MANDATE_CALLERID)
|
||||
AC_SUBST(MANDATE_ISDN_CONF)
|
||||
AC_SUBST(MANDATE_RATE_CONF)
|
||||
AC_SUBST(MANDATE_ISDNFORMAT)
|
||||
AC_SUBST(MANDATE_ISDNLOG5)
|
||||
AC_SUBST(MANDATE_ISDNLOG8)
|
||||
|
@ -255,4 +259,4 @@ AC_SUBST(MANDATE_ISDNREP)
|
|||
AC_SUBST(MANDATE_ISDNBILL)
|
||||
AC_SUBST(MANDATE_ISDNCONF)
|
||||
AC_SUBST(CDBEXTRALIBS)
|
||||
AC_OUTPUT(Makefile isdnlog/callerid.conf.5 isdnlog/isdn.conf.5 isdnlog/isdnformat.5 isdnlog/isdnlog.5 isdnlog/isdnlog.8 isdnlog/isdnlog.users.5 isdnrep/isdnrep.1 isdnrep/isdnbill.1 isdnconf/isdnconf.1 samples/isdn.conf samples/isdn.conf.at samples/isdn.conf.de samples/isdn.conf.lu samples/isdn.conf.nl samples/isdn.conf.no samples/isdn.conf.pl)
|
||||
AC_OUTPUT(Makefile isdnlog/callerid.conf.5 isdnlog/isdn.conf.5 tools/rate.conf.5 isdnlog/isdnformat.5 isdnlog/isdnlog.5 isdnlog/isdnlog.8 isdnlog/isdnlog.users.5 isdnrep/isdnrep.1 isdnrep/isdnbill.1 isdnconf/isdnconf.1 samples/isdn.conf samples/isdn.conf.at samples/isdn.conf.de samples/isdn.conf.lu samples/isdn.conf.nl samples/isdn.conf.no samples/isdn.conf.pl)
|
||||
|
|
|
@ -1,3 +1,13 @@
|
|||
2005-02-23 Tobias Becker <tobiasb@isdn4linux.de>
|
||||
|
||||
* isdnlog.c (read_param_file): Store value for skipProv from
|
||||
parameter file to param_skipprov, a new variable at file scope.
|
||||
* isdnlog.c (main): Call add_skipped_provider with param_skipprov
|
||||
before initRate. Added debug info about list of skipped providers,
|
||||
output is classified as PRT_DEBUG_GENERAL which seems to be almost
|
||||
unused so far. After initRate and debug output, the list of
|
||||
skipped providers is freed.
|
||||
|
||||
2005-01-02 Tobias Becker <tobiasb@isdn4linux.de>
|
||||
|
||||
* processor.c (buildnumber): Repeat test for special number and
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
.\" $Id: isdnlog.8.in,v 1.16 2004/12/16 22:40:30 tobiasb Exp $
|
||||
.\" CHECKIN $Date: 2004/12/16 22:40:30 $
|
||||
.\" $Id: isdnlog.8.in,v 1.17 2005/02/23 14:33:39 tobiasb Exp $
|
||||
.\" CHECKIN $Date: 2005/02/23 14:33:39 $
|
||||
.TH isdnlog 8 "@MANDATE_ISDNLOG8@" "ISDN 4 Linux @I4LVERSION@" "Linux System Administration"
|
||||
.PD 0
|
||||
.SH NAME
|
||||
|
@ -33,6 +33,7 @@ show version information and exit.
|
|||
.BI \-f FILE
|
||||
read options from the config file
|
||||
.IR FILE .
|
||||
This file is also called the parameter file of isdnlog.
|
||||
The first line should be
|
||||
"[options]". You may use blank lines and comments (starting with a #).
|
||||
All config files for isdnlog have the format described in isdn.conf(5).
|
||||
|
@ -73,6 +74,13 @@ Values are e.g. "010" for DE, "10" for AT, "16:17" for NL, "9" for FR.
|
|||
Set the preselected (i.e the provider choosen, if no prefix is dialed)
|
||||
provider to value. Value should be without \fIvbn\fR.
|
||||
|
||||
.TP
|
||||
.BI skipProv= skiplist
|
||||
(There is no commandline option for this.)
|
||||
Ignore certain providers from the rate-file. The format of
|
||||
.I skiplist
|
||||
is the same as for Q: tags in rate.conf and described in rate.conf(5).
|
||||
|
||||
.TP
|
||||
.B \-0\fIx:y\fB trim="value[:value]"
|
||||
Suppress leading digits. If isdnlog is connected through a PABX, it is
|
||||
|
@ -579,7 +587,9 @@ start=yes # enable starting programs
|
|||
.SH SEE ALSO
|
||||
.B isdnconf(1) isdn.conf(5) callerid.conf(5)
|
||||
.br
|
||||
.B isdnlog(5) isdnrep(1) rate-files(5) isdnrate(1)
|
||||
.B rate-files(5) rate.conf(5)
|
||||
.br
|
||||
.B isdnlog(5) isdnrep(1) isdnrate(1)
|
||||
|
||||
.SH AUTHOR
|
||||
This manual page was written by Andreas Jellinghaus <aj@dungeon.inka.de>,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: isdnlog.c,v 1.75 2004/12/16 22:40:30 tobiasb Exp $
|
||||
/* $Id: isdnlog.c,v 1.76 2005/02/23 14:33:39 tobiasb Exp $
|
||||
*
|
||||
* ISDN accounting for isdn4linux. (log-module)
|
||||
*
|
||||
|
@ -19,6 +19,15 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
*
|
||||
* $Log: isdnlog.c,v $
|
||||
* Revision 1.76 2005/02/23 14:33:39 tobiasb
|
||||
* New feature: provider skipping.
|
||||
* Certain providers can be completely ignored (skipped) when loading the
|
||||
* rate-file. The selection is done by Q: tags in rate.conf or by skipProv=
|
||||
* in the parameter file. The syntax is explained in the new manual page
|
||||
* rate.conf(5). Absurd settings for provider skipping may cause trouble.
|
||||
* The version number will change to 4.70 in a few days after an update
|
||||
* of the rate-de.dat.
|
||||
*
|
||||
* Revision 1.75 2004/12/16 22:40:30 tobiasb
|
||||
* Fix for rate computation of outgoing calls from other devices and for logging
|
||||
* of calls from and to the observed card (simultaneous SETUP messages).
|
||||
|
@ -541,6 +550,7 @@
|
|||
|
||||
#include "isdnlog.h"
|
||||
#include "dest.h"
|
||||
#include "rate_skip.h"
|
||||
#ifdef POSTGRES
|
||||
#include "postgres.h"
|
||||
#endif
|
||||
|
@ -591,6 +601,7 @@ static char **hup_argv; /* args to restart with */
|
|||
static int sqldump = 0;
|
||||
|
||||
static char *param_myarea = NULL;
|
||||
static char *param_skipprov = NULL;
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
|
@ -1326,6 +1337,9 @@ static int read_param_file(char *FileName)
|
|||
if (p && *p)
|
||||
param_myarea = p;
|
||||
}
|
||||
else
|
||||
if (!strcmp(Ptr->name,CONF_ENT_SKIPPROV))
|
||||
param_skipprov = strdup(Ptr->value);
|
||||
else
|
||||
print_msg(PRT_ERR,"Error: Invalid entry `%s'!\n",Ptr->name);
|
||||
|
||||
|
@ -1718,21 +1732,46 @@ int main(int argc, char *argv[], char *envp[])
|
|||
|
||||
if (!Q931dmp) {
|
||||
initHoliday(holifile, &version);
|
||||
|
||||
if (*version)
|
||||
print_msg(PRT_NORMAL, "%s\n", version);
|
||||
|
||||
initDest(destfile, &version);
|
||||
|
||||
if (*version)
|
||||
print_msg(PRT_NORMAL, "%s\n", version);
|
||||
|
||||
initRate(rateconf, ratefile, zonefile, &version);
|
||||
if (param_skipprov) {
|
||||
i = add_skipped_provider(param_skipprov, &version);
|
||||
if (i)
|
||||
print_msg(PRT_WARN, "%s in parameter file contains an error: %s\n",
|
||||
CONF_ENT_SKIPPROV, version);
|
||||
i = dump_skipped_provider(s, sizeof s);
|
||||
if (i > -1)
|
||||
print_msg(PRT_DEBUG_GENERAL, "dump_skipped_provider after "
|
||||
"add_skipped_provider for parameter file: >%s< (%i).\n",
|
||||
s, i);
|
||||
else
|
||||
print_msg(PRT_DEBUG_GENERAL, "dump_skipped_provider after "
|
||||
"add_skipped_provider for parameter file: FAILED.\n");
|
||||
free(param_skipprov);
|
||||
param_skipprov = NULL;
|
||||
}
|
||||
|
||||
initRate(rateconf, ratefile, zonefile, &version);
|
||||
if (*version)
|
||||
print_msg(PRT_NORMAL, "%s\n", version);
|
||||
} /* if */
|
||||
|
||||
|
||||
i = dump_skipped_provider(s, sizeof s);
|
||||
if (i > -1)
|
||||
print_msg(PRT_DEBUG_GENERAL, "dump_skipped_provider after initRate:"
|
||||
" >%s< (%i).\n", s, i);
|
||||
else
|
||||
print_msg(PRT_DEBUG_GENERAL, "dump_skipped_provider after initRate:"
|
||||
"FAILED.\n");
|
||||
i = clear_skipped_provider();
|
||||
print_msg(PRT_DEBUG_GENERAL, "clear_skipped_provider: %i freed.\n", i);
|
||||
|
||||
if (sqldump) {
|
||||
auto FILE *fo = fopen(((sqldump == 2) ? "/tmp/isdnconf.csv" : "/tmp/isdn.conf.sql"), "w");
|
||||
register int i;
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
country
|
||||
isdnrate.1
|
||||
rate.conf.5
|
||||
rate_skip
|
||||
rate-files.5
|
||||
|
|
|
@ -1,3 +1,16 @@
|
|||
2005-02-23 Tobias Becker <tobiasb@isdn4linux.de>
|
||||
|
||||
* rate_skip.c, rate_skip.h: This implements the new feature of
|
||||
provider skipping. For end user information there is a new
|
||||
manual page rate.conf(5), the interface is described in rate_skip.c.
|
||||
|
||||
* rate.c (initRate): Call add_skipped_provider for Q: tags in
|
||||
rate.conf. Moved parsing of P: tag from rate-file to new function
|
||||
parse_P. Added provider skipping for rate-file reading and parsing.
|
||||
|
||||
* tools.h (CONF_ENT_SKIPPROV): New constant for name of skipProv
|
||||
entry in parameter file.
|
||||
|
||||
2005-01-12 Tobias Becker <tobiasb@isdn4linux.de>
|
||||
|
||||
* dest.c (getDest): Do not shorten the given number to less than one
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
'\" t
|
||||
'\" ** above should format a table **
|
||||
.\" CHECKIN $Date: 2004/10/04 14:50:41 $
|
||||
.\" CHECKIN $Date: 2005/02/23 14:33:40 $
|
||||
.TH rate-files 5 "@MANDATE@" -lt-
|
||||
.SH NAME
|
||||
rate-files \- Format of rate-files
|
||||
|
@ -469,6 +469,7 @@ T:[01.01.2004]E,H/*=0.06/60 weekend
|
|||
.SH SEE ALSO
|
||||
.IR isdnlog(8) ,
|
||||
.IR isdnrate(1) ,
|
||||
.IR rate.conf(5) ,
|
||||
isdnlog/README, rate-at.dat
|
||||
.SH AUTHOR
|
||||
Leopold Toetsch <lt@toetsch.at> (of this man page of course).
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* #define DEBUG_REDIRZ */
|
||||
|
||||
/* $Id: rate.c,v 1.89 2005/01/02 16:37:21 tobiasb Exp $
|
||||
/* $Id: rate.c,v 1.90 2005/02/23 14:33:40 tobiasb Exp $
|
||||
*
|
||||
* Tarifdatenbank
|
||||
*
|
||||
|
@ -21,6 +21,15 @@
|
|||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* $Log: rate.c,v $
|
||||
* Revision 1.90 2005/02/23 14:33:40 tobiasb
|
||||
* New feature: provider skipping.
|
||||
* Certain providers can be completely ignored (skipped) when loading the
|
||||
* rate-file. The selection is done by Q: tags in rate.conf or by skipProv=
|
||||
* in the parameter file. The syntax is explained in the new manual page
|
||||
* rate.conf(5). Absurd settings for provider skipping may cause trouble.
|
||||
* The version number will change to 4.70 in a few days after an update
|
||||
* of the rate-de.dat.
|
||||
*
|
||||
* Revision 1.89 2005/01/02 16:37:21 tobiasb
|
||||
* Improved utilization of special number information from ratefile.
|
||||
*
|
||||
|
@ -765,6 +774,7 @@ extern const char *basename (const char *name);
|
|||
#include "zone.h"
|
||||
#include "dest.h"
|
||||
#include "rate.h"
|
||||
#include "rate_skip.h"
|
||||
|
||||
#define LENGTH 1024 /* max length of lines in data file */
|
||||
#define STRINGS 8 /* number of buffers for printRate() */
|
||||
|
@ -867,6 +877,16 @@ typedef struct {
|
|||
int _zone; /* internal zone */
|
||||
} PRSEL;
|
||||
|
||||
/* takes parsing result for P:[\[daterange\]]nn[,v] description */
|
||||
typedef struct {
|
||||
int prefix; /* nn -- provider number, not internal prefix */
|
||||
int variant; /* v -- provider variant or UNKNOWN if missing */
|
||||
time_t from_d; /* begin of daterange or 0 if not given */
|
||||
time_t to_d; /* end of daterange or 0 if not given */
|
||||
char *name; /* description/name for provider or NULL if missing */
|
||||
int booked; /* is this provider booked by a rate-conf P: entry? */
|
||||
} PLINE; /* in case of syntax errors, prefix will be UNKNOWN */
|
||||
|
||||
static char Format[STRINGL]="";
|
||||
static PROVIDER *Provider=NULL;
|
||||
static int nProvider=0;
|
||||
|
@ -1297,6 +1317,54 @@ static char * epnum(int prefix) {
|
|||
}
|
||||
|
||||
|
||||
/* parse s="P:[\[daterange\]]nn[,v] description" from file *dat into *res */
|
||||
static void parse_P(char *s, char *dat, PLINE *res) {
|
||||
int i;
|
||||
|
||||
/* set default values */
|
||||
res->prefix = res->variant = UNKNOWN;
|
||||
res->from_d = res->to_d = 0;
|
||||
res->name = NULL;
|
||||
res->booked = 0;
|
||||
|
||||
/* parsing code taken from initRate */
|
||||
s+=2;
|
||||
while (isblank(*s))
|
||||
s++;
|
||||
if (*s == '[')
|
||||
if (!parse2dates(dat, &s, &res->from_d, &res->to_d))
|
||||
return;
|
||||
if (!isdigit(*s)) {
|
||||
warning (dat, "Invalid provider-number '%c'", *s);
|
||||
return;
|
||||
}
|
||||
res->prefix = strtol(s, &s ,10);
|
||||
while (isblank(*s))
|
||||
s++;
|
||||
if (*s == ',') {
|
||||
s++;
|
||||
while (isblank(*s))
|
||||
s++;
|
||||
if (!isdigit(*s)) {
|
||||
warning (dat, "Invalid variant '%c'", *s);
|
||||
res->prefix = UNKNOWN;
|
||||
return;
|
||||
}
|
||||
res->variant = strtol(s, &s, 10);
|
||||
}
|
||||
while (isblank(*s))
|
||||
s++;
|
||||
res->name = *s ? strdup(s) : NULL;
|
||||
|
||||
/* booked search also taken from initRate */
|
||||
for (i = 0; i < nBooked; i++)
|
||||
if (Booked[i]._variant == res->variant &&
|
||||
Booked[i]._prefix == res->prefix) {
|
||||
res->booked = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void parse_X(char *s, char *dat)
|
||||
{
|
||||
char *c;
|
||||
|
@ -1443,18 +1511,19 @@ int initRate(char *conf, char *dat, char *dom, char **msg)
|
|||
char buffer[LENGTH], path[LENGTH], Version[LENGTH]="";
|
||||
char *c, *s;
|
||||
int Comments=0;
|
||||
int Areas=0, Zones=0, Hours=0;
|
||||
int Areas=0, Zones=0, Hours=0, Skipped = 0;
|
||||
int where=DOMESTIC, prefix=UNKNOWN;
|
||||
int zone, zone1, zone2, day1, day2, hour1, hour2, freeze, delay;
|
||||
int *number, numbers;
|
||||
int i, n, t, u, v, z;
|
||||
int any;
|
||||
PLINE prov;
|
||||
time_t from_d, to_d;
|
||||
#define MAX_INCLUDE 3
|
||||
int lines[MAX_INCLUDE];
|
||||
FILE *streams[MAX_INCLUDE];
|
||||
char *files[MAX_INCLUDE];
|
||||
int include = 0;
|
||||
int include = 0, skip = 0;
|
||||
|
||||
initTelNum(); /* we need defnum */
|
||||
mytld = getMynum()->tld;
|
||||
|
@ -1525,6 +1594,12 @@ int initRate(char *conf, char *dat, char *dom, char **msg)
|
|||
parse_X(s, conf);
|
||||
break;
|
||||
|
||||
case 'Q': /* skipped providers list, see rate.conf(5) */
|
||||
i = add_skipped_provider(s+2, &c);
|
||||
if (i)
|
||||
warning(conf, "error in contents of Q: %s", c);
|
||||
break;
|
||||
|
||||
default:
|
||||
warning(conf, "Unknown tag '%c'", *s);
|
||||
}
|
||||
|
@ -1566,6 +1641,11 @@ again:
|
|||
continue;
|
||||
}
|
||||
|
||||
/* When skipping provider, ignore all lines until next P:-Tag,
|
||||
* includes and exceptions are ignored too */
|
||||
if (skip && *s != 'P')
|
||||
continue;
|
||||
|
||||
switch (*s) {
|
||||
case 'I': /* I:file include */
|
||||
s+=2; while(isblank(*s)) s++;
|
||||
|
@ -1608,7 +1688,20 @@ again:
|
|||
parse_X(s, dat);
|
||||
break;
|
||||
|
||||
case 'P': /* P:\[daterange\]nn[,v] Bezeichnung */
|
||||
case 'P': /* P:[\[daterange\]]nn[,v] description */
|
||||
/* At first parse the entire line in order to check for a skipped
|
||||
* provider. In case of skipping, nothing further happens */
|
||||
parse_P(s, dat, &prov);
|
||||
skip = 0;
|
||||
if (prov.prefix != UNKNOWN &&
|
||||
is_skipped_provider(prov.prefix, prov.variant, prov.booked)) {
|
||||
skip = 1;
|
||||
Skipped++;
|
||||
if (prov.name)
|
||||
free(prov.name);
|
||||
continue; /* try to read next line */
|
||||
}
|
||||
|
||||
/* the "end of provider" code below also occurs after the input loop */
|
||||
if (zone!=UNKNOWN) {
|
||||
Provider[prefix].Zone[zone].Domestic = (where & DOMESTIC) == DOMESTIC;
|
||||
|
@ -1622,7 +1715,8 @@ again:
|
|||
#endif
|
||||
line++;
|
||||
}
|
||||
else if(nProvider && !Provider[prefix].nRedir) { /* silently ignore empty providers */
|
||||
/* silently ignore empty providers, may be also useful when skipping */
|
||||
else if(nProvider && !Provider[prefix].nRedir) {
|
||||
free_provider(prefix);
|
||||
nProvider--;
|
||||
}
|
||||
|
@ -1637,44 +1731,24 @@ again:
|
|||
zone = UNKNOWN;
|
||||
where = DOMESTIC;
|
||||
|
||||
s+=2; while (isblank(*s)) s++;
|
||||
from_d = to_d = 0;
|
||||
if (*s == '[')
|
||||
if (!parse2dates(dat, &s, &from_d, &to_d))
|
||||
continue;
|
||||
if (!isdigit(*s)) {
|
||||
warning (dat, "Invalid provider-number '%c'", *s);
|
||||
prefix=UNKNOWN;
|
||||
continue;
|
||||
/* almost the old (before provider skipping) syntax error handling */
|
||||
if (prov.prefix == UNKNOWN) {
|
||||
prefix = UNKNOWN;
|
||||
continue;
|
||||
}
|
||||
prefix = strtol(s, &s ,10);
|
||||
|
||||
prefix = prov.prefix;
|
||||
Provider=realloc(Provider, (nProvider+1)*sizeof(PROVIDER));
|
||||
memset(&Provider[nProvider], 0, sizeof(PROVIDER));
|
||||
Provider[nProvider]._provider._prefix=prefix;
|
||||
prefix=nProvider; /* the internal prefix */
|
||||
nProvider++;
|
||||
Provider[prefix]._provider._variant=UNKNOWN;
|
||||
Provider[prefix].FromDate = from_d;
|
||||
Provider[prefix].ToDate = to_d;
|
||||
while (isblank(*s)) s++;
|
||||
if (*s == ',') {
|
||||
s++; while (isblank(*s)) s++;
|
||||
if (!isdigit(*s)) {
|
||||
warning (dat, "Invalid variant '%c'", *s);
|
||||
prefix=UNKNOWN;
|
||||
continue;
|
||||
}
|
||||
v=strtol(s, &s, 10);
|
||||
Provider[prefix]._provider._variant=v;
|
||||
}
|
||||
while (isblank(*s)) s++;
|
||||
Provider[prefix].Name=*s?strdup(s):NULL;
|
||||
for (i = 0; i < nBooked; i++)
|
||||
if (Booked[i]._variant==Provider[prefix]._provider._variant &&
|
||||
Booked[i]._prefix==Provider[prefix]._provider._prefix) {
|
||||
Provider[prefix].booked=1;
|
||||
break;
|
||||
}
|
||||
Provider[prefix]._provider._variant = prov.variant;
|
||||
Provider[prefix].FromDate = prov.from_d;
|
||||
Provider[prefix].ToDate = prov.to_d;
|
||||
Provider[prefix].Name = prov.name;
|
||||
Provider[prefix].booked = prov.booked;
|
||||
|
||||
break;
|
||||
|
||||
case 'B': /* B: VBN */
|
||||
|
@ -2170,8 +2244,8 @@ again:
|
|||
default:
|
||||
warning (dat, "Unknown tag '%c'", *s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} /* /switch tag */
|
||||
} /* /while read from current ratefile sucessful */
|
||||
fclose(stream);
|
||||
if (include) {
|
||||
free(files[include]);
|
||||
|
@ -2213,13 +2287,18 @@ again:
|
|||
prsel_find_zone_area();
|
||||
fix_redirz(dat);
|
||||
|
||||
if (msg) snprintf (message, LENGTH,
|
||||
"Rates Version %s loaded [%d Providers, %d Zones, %d Areas, %d Services, %d Comments, %d eXceptions, %d Redirects, %d Rates from %s]",
|
||||
Version, nProvider, Zones, Areas, nService, Comments, nPrsel, nRedir, Hours, dat);
|
||||
if (msg)
|
||||
snprintf(message, LENGTH,
|
||||
"Rates Version %s loaded [%d Providers, %d skipped, %d Zones, "
|
||||
"%d Areas, %d Services, %d Comments, %d eXceptions, %d Redirects, "
|
||||
"%d Rates from %s]",
|
||||
Version, nProvider, Skipped, Zones,
|
||||
Areas, nService, Comments, nPrsel, nRedir,
|
||||
Hours, dat);
|
||||
free(files[0]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
} /* /initRate */
|
||||
|
||||
char *getProvider (int prefix)
|
||||
{
|
||||
|
|
|
@ -0,0 +1,199 @@
|
|||
.\" $Id: rate.conf.5.in,v 1.1 2005/02/23 14:33:40 tobiasb Exp $
|
||||
.\" CHECKIN $Date: 2005/02/23 14:33:40 $
|
||||
.TH rate.conf 5 "@MANDATE_RATE_CONF@" "ISDN 4 Linux @I4LVERSION@" "isdnlog @ISDNLOG_VERSION@"
|
||||
|
||||
.SH NAME
|
||||
@I4LCONFDIR@/rate.conf \- rate and provider configuration
|
||||
|
||||
.SH DESCRIPTION
|
||||
isdnlog and related programs like isdnrep or isdnrate obtain the
|
||||
information about telephone rates or fees from a rate-file.
|
||||
In addition to the general data from the rate-file it is necessary
|
||||
to provide information about the individual situation.
|
||||
This is the purpose of the configuration file rate.conf.
|
||||
|
||||
Words below consisting of uppercase letters like
|
||||
.SB RATEFILE
|
||||
refer to the so named setting in the general isdnlog configuration file
|
||||
.IR @I4LCONFDIR@/@CONFFILE@ .
|
||||
|
||||
.SS General Concepts
|
||||
|
||||
The rate-file contains one or more providers for a country.
|
||||
A provider covers an offer of a telephone company.
|
||||
Usually there are now many telephone companies in a country and
|
||||
most companies offer several different price lists.
|
||||
|
||||
A provider is identified by provider number and provider variant or
|
||||
sub number. The provider number, short
|
||||
.IR pnum ,
|
||||
is commonly used for all offers of one company.
|
||||
The provider variant, short
|
||||
.IR var ,
|
||||
is used to number these offers starting from 0.
|
||||
A specific provider is referenced as
|
||||
.IB pnum , var
|
||||
or
|
||||
.IB pnum _ var
|
||||
depending on the context.
|
||||
|
||||
.SB VBN
|
||||
contains the shared leading digits of the carrier selection prefixes.
|
||||
The entire prefix for a provider is specified in the rate-file by the B: tag.
|
||||
In Germany the carrier selection prefix begins with 010 followed by
|
||||
two or three digits which make the
|
||||
.I pnum
|
||||
ranging from 10 to 199.
|
||||
A mapping like this is not required but common.
|
||||
|
||||
The overall format of rate.conf is similar to the rate-file, lines
|
||||
starting with tags
|
||||
.BR P: ", " X: ", or " Q:
|
||||
may occur in any order and quantity.
|
||||
(Of course, the resulting configuration should make sense.)
|
||||
|
||||
.SS Provider Booking
|
||||
|
||||
.BI P: pnum = var
|
||||
|
||||
Mark the provider specified by
|
||||
.IR pnum " and " var
|
||||
as booked or active.
|
||||
Only booked providers are taken into account when isdnlog computes
|
||||
the connection costs. Booking also tells isdnlog the provider
|
||||
variant to use if there are more than one.
|
||||
|
||||
Beside computation of real connections booking also splits the providers
|
||||
in two groups: the booked ones that are available at the specific subscriber
|
||||
line at the not booked ones that are less important for price comparison.
|
||||
|
||||
One provider in booked group is declared the default provider by setting
|
||||
.SB PRESELECTED
|
||||
to its
|
||||
.IR pnum .
|
||||
This provider is assumed to be used if a connection is made without a
|
||||
carrier selection prefix and no exceptions matching.
|
||||
|
||||
.SS Exceptions to Provider Selection
|
||||
|
||||
.BI X: number = pnum
|
||||
.br
|
||||
.BI X: number = pnum z zone
|
||||
|
||||
Connections to
|
||||
.I number
|
||||
will be assigned the booked provider with
|
||||
.I pnum
|
||||
as provider number regardless of a dialed provider selection prefix or the
|
||||
.SB PRESELECTED
|
||||
setting.
|
||||
.I zone
|
||||
if present
|
||||
replaces the normal zone selection based on destination codes.
|
||||
Exceptions can also be given in the rate-file.
|
||||
|
||||
In rate.conf exceptions may become necessary if there different
|
||||
preselected providers for local and distance calls for example or if
|
||||
preselection does not apply generally, e.g. not for connections to special
|
||||
numbers.
|
||||
|
||||
.SS Provider Skipping
|
||||
|
||||
At least for some countries there are universal rate-files distributed with
|
||||
isdnlog or provided elsewhere. In this case it is desirable to keep the
|
||||
rate-file unmodified so that updates require no further changes beyond
|
||||
installing the new rate-file. If a rate-file aims to cover the telephone
|
||||
market in an entire nation there will be always providers in it which are
|
||||
not available or not suitable for a specific installation.
|
||||
Such providers can be disabled by not booking them but they remain present
|
||||
and may be displayed as overall cheapest provider or the like.
|
||||
|
||||
Provider skipping completely ignores selected, so called skipped providers,
|
||||
from the rate-file. To be more precise, the effect of skipped provider
|
||||
could also be achieved by deleting its lines starting from its P: tag to
|
||||
the last line before the P: tag of the next provider from the rate-file.
|
||||
|
||||
Providers to skip can also be configured in the parameter file of isdnlog
|
||||
using the syntax described below in a line starting with
|
||||
.BR skipProv= " instead of " Q: .
|
||||
|
||||
.BR Q: [ ! | ~ ]\fIlist\fP
|
||||
|
||||
.TP
|
||||
.I list
|
||||
:=
|
||||
.IR range [\fB;\fP list ]
|
||||
|
||||
.TP
|
||||
.I range
|
||||
:=
|
||||
.RI (\fB*\fP| prov | prov \fB-\fP|\fB-\fP prov | prov\fB-\fPprov )[\fB!\fP|\fB~\fP]
|
||||
|
||||
.TP
|
||||
.I prov
|
||||
:=
|
||||
.IR pnum [\fB,\fR var ]
|
||||
|
||||
.P
|
||||
Skipping applies to all providers that are matched by a given
|
||||
.IR range.
|
||||
If
|
||||
.I var
|
||||
is missing, all providers with
|
||||
.I pnum
|
||||
are skipped.
|
||||
|
||||
.B *
|
||||
matches all providers.
|
||||
|
||||
Booked providers are not skipped unless
|
||||
.B !
|
||||
is given at end of the
|
||||
.I range
|
||||
or in front of the entire list where it applies to whole line.
|
||||
|
||||
The
|
||||
.B ~
|
||||
can be given alternatively to
|
||||
.BR !.
|
||||
Providers that match such a
|
||||
.I range
|
||||
are not skipped under any circumstances.
|
||||
|
||||
Space can occur anywhere in the line after
|
||||
.BR Q:.
|
||||
|
||||
Example:
|
||||
.br
|
||||
Q:*; 13,1~; 33-33,1~; 200-299!; 321-323!
|
||||
|
||||
This skips all not booked providers except 13_1, 33_0, and 33_1.
|
||||
Additionally all providers with a
|
||||
.I pnum
|
||||
between 200 and 299 or 321 and 323 are skipped.
|
||||
|
||||
.SH FILES
|
||||
.TP
|
||||
.B @I4LCONFDIR@/rate.conf
|
||||
This file.
|
||||
.SB RATECONF
|
||||
may be used to specify an alternative rate and provider configuration file.
|
||||
|
||||
.TP
|
||||
.BI @DATADIR@/rate- CC .dat
|
||||
The rate-file for your country. Replace
|
||||
.I CC
|
||||
with your two letter country code, e.g.
|
||||
.I de
|
||||
for Germany.
|
||||
.SB RATEFILE
|
||||
defines the rate-file to use.
|
||||
|
||||
.SH AUTHOR
|
||||
Tobias Becker <tobiasb@isdn4linux.de>
|
||||
|
||||
.SH SEE ALSO
|
||||
.BR isdnlog (8)
|
||||
.BR rate-files (5)
|
||||
.BR isdn.conf (5)
|
||||
|
|
@ -0,0 +1,470 @@
|
|||
/*
|
||||
* $Id: rate_skip.c,v 1.1 2005/02/23 14:33:40 tobiasb Exp $
|
||||
*
|
||||
* rate database (Tarifdatenbank) -- skipping of providers
|
||||
*
|
||||
* Copyright 2005 Tobias Becker <tobiasb@isdn4linux.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Skipped providers: The user may decide to completely ignore ("skip")
|
||||
* a subset of providers defined in the rate file. This done by Q:<...>
|
||||
* lines in rate.conf and/or a skipProv=<...> line in the parameter file.
|
||||
* Skipping is either unconditional or takes place only if the provider
|
||||
* is not explicit mentioned by a P:... line in rate.conf.
|
||||
*
|
||||
* The internal list of skipped providers is kept simple as it will be
|
||||
* used only while reading the ratefile. No care is taken about
|
||||
* overlapping entries and similar things.
|
||||
*
|
||||
* If the rate file uses redirs (R:...), disabling all non booked providers by
|
||||
* the * wildcard entry will probably cause error during rate file loading like
|
||||
* "rate-de.dat:@1938 Couldn't find provider 33_1 for redir #3 pnum 33_2 (7)".
|
||||
* Because of this, a second list of entries becomes necessary. If a provider
|
||||
* is matched by this "white" list, it is not skipped, regardless of any
|
||||
* entries in the regular "black" list.
|
||||
*
|
||||
* Interface:
|
||||
*
|
||||
* int add_skipped_provider(char *line, char **msg);
|
||||
* Parse line as list of skipped providers. The format is explained in
|
||||
* rate.conf(5). The return value is 0 for proper input and 1 otherwise.
|
||||
* If msg is not NULL, it will be used for an description in case of error.
|
||||
* line is modified during parsing.
|
||||
*
|
||||
* int is_skipped_provider(int prov, int var, int booked);
|
||||
* Returns 1 if the provider written as P:prov,var in the rate file is to
|
||||
* be skipped or 0 otherwise. var may be UNKNOWN (-1). booked states
|
||||
* whether there is a line P:prov=var in rate.conf or not.
|
||||
*
|
||||
* int clear_skipped_provider(void);
|
||||
* This clears the internal list of skipped providers. Returns the number
|
||||
* of freed list entries.
|
||||
*
|
||||
* int dump_skipped_provider(char *str, int len);
|
||||
* Write the internal list of skipped providers to str with a maxium of len
|
||||
* characters. The format of the output is the same as expected for input
|
||||
* in add_skipped_provider. Returns the number of list entries or -1 in
|
||||
* case of error.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "rate_skip.h"
|
||||
|
||||
#ifndef UNKNOWN /* tools.h is a little too heavy ... */
|
||||
#define UNKNOWN (-1)
|
||||
#endif
|
||||
|
||||
#define BLACK 0 /* indices for regular and */
|
||||
#define WHITE 1 /* exceptional list */
|
||||
|
||||
#define FLAG_ALL 0x1 /* matches all providers */
|
||||
#define FLAG_UNCOND 0x2 /* valid for booked providers too */
|
||||
#define FLAG_PROV0 0x4 /* value for prov[0] present */
|
||||
#define FLAG_PROV1 0x8 /* value for prov[1] present */
|
||||
#define FLAG_VAR0 0x10 /* value for var[0] present */
|
||||
#define FLAG_VAR1 0x20 /* value for var[1] present */
|
||||
#define FLAG_WHITE 0x40 /* value for entry in white list */
|
||||
|
||||
struct skip {
|
||||
struct skip *next; /* next entry in list or NULL if last */
|
||||
int flags; /* details about kind of entry */
|
||||
int prov[2]; /* first [0] and last [1] provider number */
|
||||
int var[2]; /* same for variant number */
|
||||
};
|
||||
|
||||
static struct skip *list[2] = {NULL, NULL};
|
||||
|
||||
/* remove space and comment in string */
|
||||
static void strip (char *from) {
|
||||
char *to = from;
|
||||
while (*from && *from != '#') {
|
||||
if (!isspace(*from))
|
||||
*to++ = *from;
|
||||
++from;
|
||||
}
|
||||
*to = '\0';
|
||||
}
|
||||
|
||||
|
||||
int add_skipped_provider(char *line, char **msg) {
|
||||
char *next, *p[2], *q;
|
||||
int l, colour, uncond = 0, all_white = 0;
|
||||
struct skip entry, *add, *last[2] = {NULL, NULL};
|
||||
static char errmsg[128];
|
||||
|
||||
*msg = errmsg;
|
||||
**msg = '\0';
|
||||
|
||||
strip(line);
|
||||
|
||||
/* whole line unconditional? */
|
||||
if (*line == '!') {
|
||||
uncond = 1;
|
||||
line++;
|
||||
}
|
||||
/* whole line for white list? */
|
||||
else if (*line == '~') {
|
||||
all_white = 1;
|
||||
line++;
|
||||
}
|
||||
|
||||
while (1) {
|
||||
next = strchr(line, ';');
|
||||
if (next)
|
||||
*next++ = '\0';
|
||||
|
||||
/* silently ignore empty ranges */
|
||||
if (!*line) {
|
||||
if (next) {
|
||||
line = next;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
/* select default list */
|
||||
colour = all_white ? WHITE : BLACK;
|
||||
|
||||
/* line points to a NUL-terminated range */
|
||||
entry.flags = uncond ? FLAG_UNCOND : 0;
|
||||
|
||||
/* current entry unconditional? */
|
||||
l = strlen(line);
|
||||
if ( *(line + l - 1) == '!' ) {
|
||||
*(line + --l) = '\0';
|
||||
entry.flags |= FLAG_UNCOND;
|
||||
}
|
||||
/* current entry for white list? */
|
||||
else if ( *(line + l - 1) == '~' ) {
|
||||
*(line + --l) = '\0';
|
||||
colour = WHITE;
|
||||
}
|
||||
if (colour == WHITE) {
|
||||
entry.flags |= FLAG_WHITE;
|
||||
/* either on white list or uncondional or none of both */
|
||||
entry.flags &= ~FLAG_UNCOND;
|
||||
}
|
||||
/* wildcard entry? */
|
||||
if (*line == '*') {
|
||||
if (*(line + 1)) {
|
||||
snprintf(*msg, sizeof errmsg, "unexpected characters after '*': %s",
|
||||
line +1);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
entry.flags |= FLAG_ALL;
|
||||
}
|
||||
/* range entry: <prov>- | -<prov> | <prov>-<prov> | <prov> */
|
||||
else {
|
||||
if (*line == '-') {
|
||||
p[0] = NULL;
|
||||
p[1] = line+1;
|
||||
}
|
||||
else if (*(line + l - 1) == '-') {
|
||||
*(line + --l) = '\0';
|
||||
p[0] = line;
|
||||
p[1] = NULL;
|
||||
}
|
||||
else if ( (q = strchr(line,'-')) ) {
|
||||
*q = '\0';
|
||||
p[0] = line;
|
||||
p[1] = q + 1;
|
||||
}
|
||||
else {
|
||||
p[0] = p[1] = line;
|
||||
}
|
||||
for (l=0; l < 2; l++) {
|
||||
if (!p[l])
|
||||
continue;
|
||||
q = NULL;
|
||||
entry.prov[l] = (int) strtol(p[l], &q, 10);
|
||||
entry.flags |= l ? FLAG_PROV1 : FLAG_PROV0;
|
||||
if (q && *q == ',') {
|
||||
p[l] = q + 1;
|
||||
q = NULL;
|
||||
entry.var[l] = (int) strtol(p[l], &q, 10);
|
||||
entry.flags |= l ? FLAG_VAR1 : FLAG_VAR0;
|
||||
}
|
||||
if (q && *q) {
|
||||
snprintf(*msg, sizeof errmsg,
|
||||
"unexpected characters for prov[,var]: %s", q);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
} /* /range entry */
|
||||
|
||||
/* entry is complete, save it to list */
|
||||
add = malloc(sizeof(struct skip));
|
||||
if (!add) {
|
||||
snprintf(*msg, sizeof errmsg, "Out of memory!");
|
||||
return 1;
|
||||
}
|
||||
*add = entry;
|
||||
/* wildcard entries are added on top of list */
|
||||
if (entry.flags & FLAG_ALL) {
|
||||
add->next = list[colour];
|
||||
list[colour] = add;
|
||||
}
|
||||
else {
|
||||
if (!last[colour] && list[colour]) {
|
||||
last[colour] = list[colour];
|
||||
while (last[colour]->next)
|
||||
last[colour] = last[colour]->next;
|
||||
}
|
||||
if (last[colour])
|
||||
last[colour]->next = add;
|
||||
else
|
||||
list[colour] = add;
|
||||
add->next = NULL;
|
||||
last[colour] = add;
|
||||
}
|
||||
|
||||
if (next)
|
||||
line = next;
|
||||
else
|
||||
break;
|
||||
} /* /loop over ranges: <range>;<range> */
|
||||
|
||||
*msg = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int on_list(struct skip *testlist, int prov, int var, int booked) {
|
||||
struct skip *test = testlist;
|
||||
register int match, flags;
|
||||
|
||||
while (test) {
|
||||
/* compare entry with query */
|
||||
match = 1;
|
||||
flags = test->flags;
|
||||
if (!(flags & FLAG_ALL)) {
|
||||
if (match && flags & FLAG_PROV0 && prov < test->prov[0])
|
||||
match = 0;
|
||||
if (match && flags & FLAG_PROV1 && prov > test->prov[1])
|
||||
match = 0;
|
||||
if (match && var != UNKNOWN) {
|
||||
if (flags & FLAG_PROV0 && prov == test->prov[0] &&
|
||||
flags & FLAG_VAR0 && var < test->var[0])
|
||||
match = 0;
|
||||
if (match && flags & FLAG_PROV1 && prov == test->prov[1] &&
|
||||
flags & FLAG_VAR1 && var > test->var[1])
|
||||
match = 0;
|
||||
}
|
||||
/* for UNKNOWN variant, entry must be valid for whole provider,
|
||||
* not only for some variant of this provider
|
||||
*/
|
||||
if (match && var == UNKNOWN) {
|
||||
if (flags & FLAG_PROV0 && prov == test->prov[0] && flags & FLAG_VAR0)
|
||||
match = 0;
|
||||
if (match && flags & FLAG_PROV1 && prov == test->prov[1] &&
|
||||
flags & FLAG_VAR1)
|
||||
match = 0;
|
||||
}
|
||||
} /* /no wildcard entry */
|
||||
|
||||
if (match && ((test->flags & FLAG_UNCOND) == FLAG_UNCOND) >= booked)
|
||||
return 1;
|
||||
|
||||
test = test->next;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int is_skipped_provider(int prov, int var, int booked) {
|
||||
/* first look at white list, where there is no booked attribute */
|
||||
if (on_list(list[WHITE], prov, var, 0))
|
||||
return 0;
|
||||
|
||||
return on_list(list[BLACK], prov, var, booked);
|
||||
}
|
||||
|
||||
|
||||
static int clear_list(struct skip **alist) {
|
||||
struct skip *this, *next = *alist;
|
||||
int n = 0;
|
||||
|
||||
while ( (this=next) != NULL ) {
|
||||
next = this->next;
|
||||
free(this);
|
||||
++n;
|
||||
}
|
||||
|
||||
*alist = NULL;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
int clear_skipped_provider(void) {
|
||||
return clear_list(&list[WHITE]) + clear_list(&list[BLACK]);
|
||||
}
|
||||
|
||||
|
||||
int dump_skipped_provider(char *str, int len) {
|
||||
int colour = BLACK;
|
||||
struct skip *entry = list[colour];
|
||||
char *end = str + len, *p;
|
||||
int n = 0, v;
|
||||
char range[64];
|
||||
|
||||
if (len < 1)
|
||||
return -1;
|
||||
*str = '\0';
|
||||
|
||||
if (!entry && colour == BLACK)
|
||||
entry = list[colour = WHITE];
|
||||
while (entry && str < end) {
|
||||
|
||||
/* build string from range: * | [<prov>[,<var>][-][<prov>[,<var>]] */
|
||||
p = range;
|
||||
*p = '\0';
|
||||
if (entry->flags & FLAG_PROV0) {
|
||||
p += snprintf(p, 15, "%i", entry->prov[0]);
|
||||
if (entry->flags & FLAG_VAR0)
|
||||
p += snprintf(p, 15, ",%i", entry->var[0]);
|
||||
}
|
||||
/* write '-' separator when necessary:
|
||||
* - not both provider numbers present
|
||||
* - different provider numbers
|
||||
* (both provider number present and identical and:)
|
||||
* - both variants present and different
|
||||
* - exact one variant present
|
||||
*/
|
||||
if ((entry->flags & (FLAG_PROV0|FLAG_PROV1)) != (FLAG_PROV0|FLAG_PROV1) ||
|
||||
entry->prov[0] != entry->prov[1] ||
|
||||
( (v=(entry->flags & (FLAG_VAR0|FLAG_VAR1))) == (FLAG_VAR0|FLAG_VAR1)
|
||||
&& entry->var[0] != entry->var[1] ) ||
|
||||
v == FLAG_VAR0 || v== FLAG_VAR1) {
|
||||
*p++ = '-';
|
||||
if (entry->flags & FLAG_PROV1) {
|
||||
p += snprintf(p, 15, "%i", entry->prov[1]);
|
||||
if (entry->flags & FLAG_VAR1)
|
||||
p += snprintf(p, 15, ",%i", entry->var[1]);
|
||||
}
|
||||
}
|
||||
if (entry->flags & FLAG_ALL) {
|
||||
/* range should be "-" */
|
||||
range[0] = '*';
|
||||
range[1] = '\0';
|
||||
}
|
||||
|
||||
str += snprintf(str, end-str, "%s%s%s%s", n ? ";" : "", range,
|
||||
entry->flags & FLAG_WHITE ? "~" : "",
|
||||
entry->flags & FLAG_UNCOND ? "!" : "");
|
||||
|
||||
++n;
|
||||
entry = entry->next;
|
||||
if (!entry && colour == BLACK)
|
||||
entry = list[colour = WHITE];
|
||||
}
|
||||
|
||||
return (entry) ? -1 : n;
|
||||
}
|
||||
|
||||
|
||||
#ifdef STANDALONE
|
||||
/* build it using
|
||||
gcc -g -Wall -DSTANDALONE -o rate_skip rate_skip.c
|
||||
*/
|
||||
|
||||
int main (int argc, char *argv[]) {
|
||||
char input[BUFSIZ], *p;
|
||||
int ret, prov, var, booked;
|
||||
|
||||
printf("Testing provider skipping, available commands:\n"
|
||||
" a<string> -- add string to list of skipped providers\n"
|
||||
" c -- clear list of skipped providers\n"
|
||||
" d -- dump list of skipped providers\n"
|
||||
" i<prov> <var> <booked> -- is <prov> ... on list?\n"
|
||||
" q -- quit\n"
|
||||
" s<string> -- strip <string>\n");
|
||||
|
||||
do {
|
||||
printf(".");
|
||||
fflush(stdout);
|
||||
fgets(input, BUFSIZ, stdin);
|
||||
input[BUFSIZ-1] = '\0';
|
||||
switch (*input) {
|
||||
case 'a': ret = add_skipped_provider(input+1, &p);
|
||||
if (ret)
|
||||
printf("msg = %s\n", p);
|
||||
printf("ret = %i (%s)\n", ret, ret ? "ERROR" : "OK");
|
||||
break;
|
||||
|
||||
case 'c': ret = clear_skipped_provider();
|
||||
printf("ret = %i (number of freed entries)\n", ret);
|
||||
break;
|
||||
|
||||
case 'd': ret = dump_skipped_provider(input, BUFSIZ);
|
||||
printf("out =>%s<\n", input);
|
||||
printf("ret = %i (%s)\n", ret,
|
||||
ret >= 0 ? "number dumped entries" : "ERROR");
|
||||
break;
|
||||
|
||||
case 'i': p = input + 1;
|
||||
prov = var = UNKNOWN;
|
||||
booked = 0;
|
||||
prov = (int) strtol(p, &p, 10);
|
||||
if (p && *p) {
|
||||
var = (int) strtol(p, &p, 10);
|
||||
if (p && *p)
|
||||
booked = (int) strtol(p, NULL, 10);
|
||||
}
|
||||
ret = is_skipped_provider(prov, var, booked);
|
||||
printf("ret = %i (%s) for prov = %i, var = %i, booked = %i\n",
|
||||
ret, ret ? "YES" : "NO", prov, var, booked);
|
||||
break;
|
||||
|
||||
case 'q':
|
||||
break;
|
||||
|
||||
case 's': strip(input+1);
|
||||
printf("res =>%s<\n", input+1);
|
||||
break;
|
||||
|
||||
default: printf("Unknown command (q to quit)\n");
|
||||
break;
|
||||
|
||||
} /* /switch */
|
||||
} while (*input != 'q');
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* STANDALONE */
|
||||
|
||||
|
||||
/*
|
||||
* $Log: rate_skip.c,v $
|
||||
* Revision 1.1 2005/02/23 14:33:40 tobiasb
|
||||
* New feature: provider skipping.
|
||||
* Certain providers can be completely ignored (skipped) when loading the
|
||||
* rate-file. The selection is done by Q: tags in rate.conf or by skipProv=
|
||||
* in the parameter file. The syntax is explained in the new manual page
|
||||
* rate.conf(5). Absurd settings for provider skipping may cause trouble.
|
||||
* The version number will change to 4.70 in a few days after an update
|
||||
* of the rate-de.dat.
|
||||
*
|
||||
*/
|
||||
|
||||
/* vim:set ts=2: */
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* $Id: rate_skip.h,v 1.1 2005/02/23 14:33:40 tobiasb Exp $
|
||||
*
|
||||
* rate database (Tarifdatenbank) -- skipping of providers
|
||||
*
|
||||
* Copyright 2005 Tobias Becker <tobiasb@isdn4linux.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef _RATE_SKIP_H_
|
||||
#define _RATE_SKIP_H_
|
||||
|
||||
int add_skipped_provider(char *line, char **msg);
|
||||
int is_skipped_provider(int prov, int var, int booked);
|
||||
int clear_skipped_provider(void);
|
||||
int dump_skipped_provider(char *str, int len);
|
||||
|
||||
#endif /* _RATE_SKIP_H_ */
|
||||
|
||||
/*
|
||||
* $Log: rate_skip.h,v $
|
||||
* Revision 1.1 2005/02/23 14:33:40 tobiasb
|
||||
* New feature: provider skipping.
|
||||
* Certain providers can be completely ignored (skipped) when loading the
|
||||
* rate-file. The selection is done by Q: tags in rate.conf or by skipProv=
|
||||
* in the parameter file. The syntax is explained in the new manual page
|
||||
* rate.conf(5). Absurd settings for provider skipping may cause trouble.
|
||||
* The version number will change to 4.70 in a few days after an update
|
||||
* of the rate-de.dat.
|
||||
*
|
||||
*/
|
||||
|
||||
/* vim:set ts=2: */
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: tools.h,v 1.63 2004/09/29 21:02:02 tobiasb Exp $
|
||||
/* $Id: tools.h,v 1.64 2005/02/23 14:33:40 tobiasb Exp $
|
||||
*
|
||||
* ISDN accounting for isdn4linux.
|
||||
*
|
||||
|
@ -20,6 +20,15 @@
|
|||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* $Log: tools.h,v $
|
||||
* Revision 1.64 2005/02/23 14:33:40 tobiasb
|
||||
* New feature: provider skipping.
|
||||
* Certain providers can be completely ignored (skipped) when loading the
|
||||
* rate-file. The selection is done by Q: tags in rate.conf or by skipProv=
|
||||
* in the parameter file. The syntax is explained in the new manual page
|
||||
* rate.conf(5). Absurd settings for provider skipping may cause trouble.
|
||||
* The version number will change to 4.70 in a few days after an update
|
||||
* of the rate-de.dat.
|
||||
*
|
||||
* Revision 1.63 2004/09/29 21:02:02 tobiasb
|
||||
* Changed handling of multiple "calling party number" information elements.
|
||||
* The network provided number is now preferred in any case. The other
|
||||
|
@ -910,6 +919,8 @@
|
|||
#define CONF_ENT_PROVIDERCHANGE "PROVIDERCHANGE"
|
||||
#define CONF_ENT_CLOSEFDS "CLOSEFDS"
|
||||
#define CONF_ENT_IGNOREUPD "IGNOREUPD"
|
||||
#define CONF_ENT_SKIPPROV "SKIPPROV"
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* Keywords for isdn.conf */
|
||||
|
|
Loading…
Reference in New Issue