- second version of the new chargeint database

- isdnrep reanimated
This commit is contained in:
Andreas Kool 1999-01-24 19:02:51 +00:00
parent 6205840ce9
commit 5dffe2c95f
15 changed files with 1035 additions and 894 deletions

View File

@ -19,6 +19,18 @@
* along with this program; if not, write to the Free Software
*
* $Log$
* Revision 1.17 1999/01/10 15:23:07 akool
* - "message = 0" bug fixed (many thanks to
* Sebastian Kanthak <sebastian.kanthak@muehlheim.de>)
* - CITYWEEKEND via config-file possible
* - fixes from Michael Reinelt <reinelt@eunet.at>
* - fix a typo in the README from Sascha Ziemann <szi@aibon.ping.de>
* - Charge for .at optimized by Michael Reinelt <reinelt@eunet.at>
* - first alpha-Version of the new chargeinfo-Database
* ATTENTION: This version requires the following manual steps:
* cp /usr/src/isdn4k-utils/isdnlog/tarif.dat /usr/lib/isdn
* cp /usr/src/isdn4k-utils/isdnlog/samples/tarif.conf /etc/isdn
*
* Revision 1.16 1998/12/09 20:39:24 akool
* - new option "-0x:y" for leading zero stripping on internal S0-Bus
* - new option "-o" to suppress causes of other ISDN-Equipment
@ -283,14 +295,22 @@ void logger(int chan)
print_msg(PRT_ERR, "Can not open file `%s': %s!\n", logfile, strerror(errno));
else
{
fprintf(flog, "%s|%-16s|%-16s|%5d|%10d|%10d|%5d|%c|%3d|%10ld|%10ld|%s|%d|%d|%g|%s|%g|%03d|\n",
/* Tarif leider nicht bekannt. Daher besser auf
"kostenlos", als auf "DM 1,00 geschenkt" stellen!
*/
if (call[chan].pay == -1.00)
call[chan].pay = 0.0;
fprintf(flog, "%s|%-16s|%-16s|%5d|%10d|%10d|%5d|%c|%3d|%10ld|%10ld|%s|%d|%d|%g|%s|%g|%3d|%3d|\n",
s + 4, call[chan].num[CALLING], call[chan].num[CALLED],
(int)(call[chan].disconnect - call[chan].connect),
(int)call[chan].duration, (int)call[chan].connect,
call[chan].aoce, call[chan].dialin ? 'I' : 'O',
call[chan].cause, call[chan].ibytes, call[chan].obytes,
LOG_VERSION, call[chan].si1, call[chan].si11,
currency_factor, currency, call[chan].pay, call[chan].provider);
currency_factor, currency, call[chan].pay, call[chan].provider,
call[chan].zone);
fclose(flog);
}
@ -456,115 +476,3 @@ int ringer(int chan, int event)
return ProcessStarted;
} /* ringer */
/*****************************************************************************/
void initSondernummern()
{
register char *p1, *p2, *p3;
register int tarif;
auto FILE *f = fopen("/usr/lib/isdn/sonderrufnummern.dat", "r");
auto char s[BUFSIZ], msn[128], sinfo[256], linfo[256];
auto double grund1, grund2, takt1, takt2;
if (f != (FILE *)NULL) {
while ((p1 = fgets(s, BUFSIZ, f))) {
if (*p1 != '#') {
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
p3 = p2 - 1;
while (*p3 == ' ')
*p3-- = 0;
strcpy(msn, p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
if (!strcmp(p1, "City"))
tarif = 1;
else if (!strcmp(p1, "free"))
tarif = 0;
else
tarif = -1;
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
grund1 = atof(p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
grund2 = atof(p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
takt1 = atof(p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
takt2 = atof(p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
p3 = p2 - 1;
while (*p3 == ' ')
*p3-- = 0;
while (*p1 == ' ')
p1++;
strcpy(sinfo, p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '\n'))) {
*p2 = 0;
p3 = p2 - 1;
while (*p3 == ' ')
*p3-- = 0;
while (*p1 == ' ')
p1++;
strcpy(linfo, p1);
nSN++;
SN = realloc(SN, sizeof(SonderNummern) * nSN);
SN[nSN - 1].msn = strdup(msn);
SN[nSN - 1].sinfo = strdup(sinfo);
SN[nSN - 1].tarif = tarif;
SN[nSN - 1].grund1 = grund1;
SN[nSN - 1].grund2 = grund2;
SN[nSN - 1].takt1 = takt1;
SN[nSN - 1].takt2 = takt2;
} /* if */
} /* if */
} /* if */
} /* if */
} /* if */
} /* if */
} /* if */
} /* if */
} /* if */
} /* while */
fclose(f);
} /* if */
} /* initSondernummern */
int is_sondernummer(char *num)
{
register int i;
if ((strlen(num) >= interns0) && ((*num == '0') || (*num == '1')))
for (i = 0; i < nSN; i++)
if (!strncmp(num, SN[i].msn, strlen(SN[i].msn)))
return(i);
return(-1);
} /* sondernummer */

View File

@ -19,6 +19,18 @@
* along with this program; if not, write to the Free Software
*
* $Log$
* Revision 1.33 1999/01/10 15:23:13 akool
* - "message = 0" bug fixed (many thanks to
* Sebastian Kanthak <sebastian.kanthak@muehlheim.de>)
* - CITYWEEKEND via config-file possible
* - fixes from Michael Reinelt <reinelt@eunet.at>
* - fix a typo in the README from Sascha Ziemann <szi@aibon.ping.de>
* - Charge for .at optimized by Michael Reinelt <reinelt@eunet.at>
* - first alpha-Version of the new chargeinfo-Database
* ATTENTION: This version requires the following manual steps:
* cp /usr/src/isdn4k-utils/isdnlog/tarif.dat /usr/lib/isdn
* cp /usr/src/isdn4k-utils/isdnlog/samples/tarif.conf /etc/isdn
*
* Revision 1.32 1998/12/31 09:58:50 paul
* converted termio calls to termios
*
@ -1187,6 +1199,9 @@ int main(int argc, char *argv[], char *envp[])
initSondernummern();
initTarife(msg);
#ifdef Q931
if (!q931dmp)
#endif
if (*msg)
print_msg(PRT_NORMAL, "%s\n", msg);

View File

@ -20,6 +20,18 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log$
* Revision 1.15 1999/01/10 15:23:16 akool
* - "message = 0" bug fixed (many thanks to
* Sebastian Kanthak <sebastian.kanthak@muehlheim.de>)
* - CITYWEEKEND via config-file possible
* - fixes from Michael Reinelt <reinelt@eunet.at>
* - fix a typo in the README from Sascha Ziemann <szi@aibon.ping.de>
* - Charge for .at optimized by Michael Reinelt <reinelt@eunet.at>
* - first alpha-Version of the new chargeinfo-Database
* ATTENTION: This version requires the following manual steps:
* cp /usr/src/isdn4k-utils/isdnlog/tarif.dat /usr/lib/isdn
* cp /usr/src/isdn4k-utils/isdnlog/samples/tarif.conf /etc/isdn
*
* Revision 1.14 1998/12/09 20:39:30 akool
* - new option "-0x:y" for leading zero stripping on internal S0-Bus
* - new option "-o" to suppress causes of other ISDN-Equipment
@ -345,7 +357,6 @@ _EXTERN char isdnctrl2[FNSIZE];
_EXTERN char *outfile;
_EXTERN char tmpout[PATH_MAX];
_EXTERN int readkeyboard;
_EXTERN int interns0;
_EXTERN int other;
_EXTERN IFO ifo[ISDN_MAX_CHANNELS];
_EXTERN IO io[ISDN_MAX_CHANNELS];
@ -381,20 +392,14 @@ _EXTERN void clearchan(int chan, int total);
#define Exit(a) _Exit(__FILE__,__LINE__,a)
_EXTERN void _Exit(char *File, int Line, int RetCode);
#ifndef _REP_FUNC_C_
_EXTERN int print_msg(int Level, const char *fmt, ...);
#endif
_EXTERN int Change_Channel(int old_channel, int new_channel);
_EXTERN void set_time_str(void);
_EXTERN void now(void);
_EXTERN void logger(int chan);
_EXTERN int ringer(int chan, int event);
_EXTERN void initSondernummern(void);
_EXTERN int is_sondernummer(char *num);
_EXTERN void initTarife(char *msg);
_EXTERN void exitTarife(void);
_EXTERN void price(int chan, char *hint);
_EXTERN char *realProvidername(int prefix);
_EXTERN void preparecint(int chan, char *msg, char *hint);
_EXTERN int taktlaenge(int chan, char *why);
#undef _EXTERN
/****************************************************************************/

View File

@ -19,6 +19,18 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log$
* Revision 1.36 1999/01/10 15:23:23 akool
* - "message = 0" bug fixed (many thanks to
* Sebastian Kanthak <sebastian.kanthak@muehlheim.de>)
* - CITYWEEKEND via config-file possible
* - fixes from Michael Reinelt <reinelt@eunet.at>
* - fix a typo in the README from Sascha Ziemann <szi@aibon.ping.de>
* - Charge for .at optimized by Michael Reinelt <reinelt@eunet.at>
* - first alpha-Version of the new chargeinfo-Database
* ATTENTION: This version requires the following manual steps:
* cp /usr/src/isdn4k-utils/isdnlog/tarif.dat /usr/lib/isdn
* cp /usr/src/isdn4k-utils/isdnlog/samples/tarif.conf /etc/isdn
*
* Revision 1.35 1998/12/09 20:39:36 akool
* - new option "-0x:y" for leading zero stripping on internal S0-Bus
* - new option "-o" to suppress causes of other ISDN-Equipment
@ -1558,9 +1570,6 @@ static int AOC_1TR6(int l, char *p)
{
auto int EH = 0;
auto int digit = 0;
#if 0
static char curr[64];
#endif
#ifdef ISDN_NL
@ -1954,31 +1963,9 @@ static void decode(int chan, register char *p, int type, int version, int tei)
(call[chan].cause == 16) || /* "Normal call clearing" */
(call[chan].cause == 18) || /* "No user responding" */
(call[chan].cause == 26)) { /* "non-selected user clearing" */
#if 0
auto char sx[200];
if ((call[chan].cause != -1) && (call[chan].cause != cause)) {
sprintf(sx, "USING cause %d:%s (%s),\nOVERWRITING cause %d:%s (%s)",
cause, qmsg(TYPE_CAUSE, version, cause), location(loc),
call[chan].cause, qmsg(TYPE_CAUSE, version, call[chan].cause), location(call[chan].loc));
info(chan, PRT_SHOWHANGUP, STATE_HANGUP, sx);
} /* if */
#endif
call[chan].cause = cause;
call[chan].loc = loc;
}
#if 0
else {
auto char sx[200];
sprintf(sx, "IGNORING cause %d:%s (%s),\nLEAVING cause %d:%s (%s)",
cause, qmsg(TYPE_CAUSE, version, cause), location(loc),
call[chan].cause, qmsg(TYPE_CAUSE, version, call[chan].cause), location(call[chan].loc));
info(chan, PRT_SHOWHANGUP, STATE_HANGUP, sx);
} /* else */
#endif
} /* if */
#ifdef Q931
if (q931dmp)
@ -2075,32 +2062,6 @@ static void decode(int chan, register char *p, int type, int version, int tei)
if (n == AOC_OTHER)
; /* info(chan, PRT_SHOWAOCD, STATE_AOCD, asnm); */
#if 0
else if (!memcmp(call[chan].provider, "01019", 5) ||
!memcmp(call[chan].provider, "01070", 5)) {
if (type != FACILITY) { /* "AOC-E" Meldung */
if (!memcmp(call[chan].provider, "01019", 5)) { /* Mobilcom */
tx = cur_time - call[chan].connect;
call[chan].aoce = (int)((tx + 59) / 60);
call[chan].pay = call[chan].aoce * 0.19;
if (tx)
sprintf(s, "%s %s (%s)",
currency,
double2str(call[chan].pay, 6, 2, DEB),
double2clock(tx));
else
sprintf(s, "%s %s",
currency,
double2str(call[chan].pay, 6, 2, DEB));
info(chan, PRT_SHOWAOCD, STATE_AOCD, s);
} /* if */
} /* if */
}
#endif
else {
/* Dirty-Hack: Falls auch AOC-E als AOC-D gemeldet wird:
@ -2169,7 +2130,7 @@ static void decode(int chan, register char *p, int type, int version, int tei)
double2str(call[chan].pay, 6, 2, DEB));
} /* else */
if (chargemax != 0.0) {
if (!replay && (chargemax != 0.0)) {
if (day != known[c]->day) {
sprintf(s1, "CHARGEMAX resetting %s's charge (day %d->%d)",
known[c]->who, (known[c]->day == -1) ? 0 : known[c]->day, day);
@ -2197,7 +2158,7 @@ static void decode(int chan, register char *p, int type, int version, int tei)
chargemaxAction(chan, (known[c]->charge - chargemax));
} /* if */
if (connectmax != 0.0) {
if (!replay && (connectmax != 0.0)) {
if (month != known[c]->month) {
sprintf(s1, "CONNECTMAX resetting %s's online (month %d->%d)",
known[c]->who, (known[c]->month == -1) ? 0 : known[c]->month, month);
@ -2291,7 +2252,7 @@ static void decode(int chan, register char *p, int type, int version, int tei)
/* muss mit Teles-Karte sein, da eigene MSN bekannt */
/* seit 2 Gebuehrentakten kein Traffic mehr! */
if (watchdog && ((c = call[chan].confentry[OTHER]) > -1)) {
if (!replay && watchdog && ((c = call[chan].confentry[OTHER]) > -1)) {
if ((type == FACILITY) && (version == VERSION_EDSS1) && expensive(call[chan].bchan) && (*known[c]->interface > '@')) {
if (call[chan].aoce > call[chan].traffic + watchdog + 2)
emergencyStop(chan, 4);
@ -2309,7 +2270,7 @@ static void decode(int chan, register char *p, int type, int version, int tei)
known[c]->charge -= known[c]->rcharge;
known[c]->charge += pay;
if (chargemax != 0.0) { /* only used here if no AOC-D */
if (!replay && (chargemax != 0.0)) { /* only used here if no AOC-D */
if (day != known[c]->day) {
sprintf(s, "CHARGEMAX resetting %s's charge (day %d->%d)",
known[c]->who, (known[c]->day == -1) ? 0 : known[c]->day, day);
@ -2322,7 +2283,7 @@ static void decode(int chan, register char *p, int type, int version, int tei)
} /* if */
} /* if */
if (connectmax != 0.0) { /* only used here if no AOC-D */
if (!replay && (connectmax != 0.0)) { /* only used here if no AOC-D */
if (month != known[c]->month) {
sprintf(s, "CONNECTMAX resetting %s's online (month %d->%d)",
known[c]->who, (known[c]->month == -1) ? 0 : known[c]->month, month);
@ -3505,33 +3466,6 @@ static void huptime(int chan, int bchan, int setup)
newchargeint = taktlaenge(chan, why);
#ifdef ISDN_DE
if (call[chan].provider == 19) { /* Mobilcom 60/60 Takt */
newchargeint = 60;
sprintf(why, "via %s", Providername(call[chan].provider));
}
else if (call[chan].provider == 24) { /* TelePasswort 1s Takt */
newchargeint = 1;
sprintf(why, "via %s", Providername(call[chan].provider));
}
else if (call[chan].provider == 70) { /* Arcor 1s Takt */
newchargeint = 1;
sprintf(why, "via %s", Providername(call[chan].provider));
}
else if (call[chan].provider == 30) { /* TelDaFax 1s Takt */
newchargeint = 1;
sprintf(why, "via %s", Providername(call[chan].provider));
}
else if (call[chan].provider == 13) { /* Tele 2 1s Takt */
newchargeint = 1;
sprintf(why, "via %s", Providername(call[chan].provider));
}
else if (call[chan].provider == 24) { /* TelePassport 1/1 Takt */
newchargeint = 1;
sprintf(why, "via %s", Providername(call[chan].provider));
} /* else */
#endif
#if NET_DV >= NETDV_CHARGEINT
if (net_dv >= NETDV_CHARGEINT) {
if (hup1 && hup2)
@ -3971,6 +3905,7 @@ void clearchan(int chan, int total)
call[chan].aoce = -1;
call[chan].provider = -1;
call[chan].zone = -1;
for (i = 0; i < MAXMSNS; i++) {
strcpy(call[chan].vnum[i], "?");
@ -3982,25 +3917,7 @@ void clearchan(int chan, int total)
} /* clearchan */
static void dumpme()
{
register int chan;
auto char s[BUFSIZ];
for (chan = 0; chan < MAXCHAN; chan++) {
sprintf(s, "^CHAN[%d]: %s -> %s\n",
chan,
call[chan].vnum[0],
call[chan].vnum[CALLED]);
print_msg(PRT_SHOWNUMBERS, "%s", s);
} /* for */
} /* dumpme */
/* mode :: 0 = Add new entry, 1 = change existing entry, 2 = Terminate entry, 3 = dump */
static void addlist(int chan, int type, int mode)
static void addlist(int chan, int type, int mode) /* mode :: 0 = Add new entry, 1 = change existing entry, 2 = Terminate entry, 3 = dump */
{
#define MAXLIST 1000
@ -4469,8 +4386,6 @@ static void processctrl(int card, char *s)
decode(chan, ps, type, version, tei);
/* dumpme(); */
if (call[chan].channel) { /* jetzt muesste einer da sein */
chan = call[chan].channel - 1;
@ -4597,6 +4512,13 @@ static void processctrl(int card, char *s)
sprintf(sx, "NEXT CHARGEINT IN %s (%s)", double2clock(call[chan].cint), why);
info(chan, PRT_SHOWCONNECT, STATE_CONNECT, sx);
call[chan].disconnect = cur_time + 1;
price(chan, why);
sprintf(sx, "1.CI %s %s (now)", currency, double2str(call[chan].pay, 6, 3, DEB));
info(chan, PRT_SHOWCONNECT, STATE_CONNECT, sx);
} /* if */
} /* if */
@ -4755,7 +4677,7 @@ doppelt:break;
else if (call[chan].pay)
sprintf(sx, "HANGUP (%s %s %s%s)",
currency,
double2str(call[chan].pay, 6, 2, DEB),
((call[chan].pay == -1.0) ? "UNKNOWN" : double2str(call[chan].pay, 6, 2, DEB)),
double2clock((double)(call[chan].disconnect - call[chan].connect)), s2);
else
sprintf(sx, "HANGUP (%s%s) %s (%s)",
@ -4940,6 +4862,8 @@ retry:
} /* if */
processcint();
if (!memcmp(p3, "idmap:", 6) ||
!memcmp(p3, "chmap:", 6) ||
!memcmp(p3, "drmap:", 6) ||
@ -5083,7 +5007,7 @@ void processcint()
for (chan = 0; chan < 2; chan++) {
if (OUTGOING && (call[chan].cint > 1)) {
if (call[chan].nextcint == cur_time) {
if (cur_time >= call[chan].nextcint) {
dur = cur_time - call[chan].connect;
@ -5101,8 +5025,13 @@ void processcint()
call[chan].cinth = hour;
call[chan].ctakt++;
sprintf(sx, "START %d.CHARGEINT (%s)",
call[chan].disconnect = cur_time;
price(chan, why);
sprintf(sx, "%d.CI %s %s (after %s) ",
call[chan].ctakt,
currency,
double2str(call[chan].pay, 6, 3, DEB),
double2clock((double)dur));
info(chan, PRT_SHOWCONNECT, STATE_CONNECT, sx);

View File

@ -23,14 +23,10 @@
#define _TAKT_C_
#include "isdnlog.h"
#define DTAG 0
#define DTAGI 0
#define MOBILCOM 1
#define TELE 2
#define CITYCALL 0
#define REGIOCALL 1
#define GERMANCALL 2
#define DTAG_PREIS 0.121
#define MOBILCOM_PREIS 0.19
@ -419,7 +415,7 @@ float taktlaenge(int chan, char *description)
return(-1);
if ((provider == 19) || (provider == 33)) {
takt = gebuehr[(provider == 33) ? DTAG : MOBILCOM][zeit[tm->tm_hour]][tarifzeit(tm, why)][zone];
takt = gebuehr[(provider == 33) ? DTAGI : MOBILCOM][zeit[tm->tm_hour]][tarifzeit(tm, why)][zone];
if (description) sprintf(description, "%s, %s, %s", zeiten[zeit[tm->tm_hour]], why, zonen[zone]);
return(takt);
}

View File

@ -1,4 +1,4 @@
/*
/* $Id:
*
* ISDN accounting for isdn4linux. (log-module)
*
@ -18,6 +18,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log:
*/
/*
@ -63,50 +64,25 @@
#include "isdnlog.h"
#endif
#ifdef 0 /* STANDALONE */
#define TARIFE "tarif.dat"
#define TARIFCONF "tarif.conf"
#define SPARBUCH "sparbuch"
#else
#define TARIFE "/usr/lib/isdn/tarif.dat"
#define TARIFCONF "/etc/isdn/tarif.conf"
#define SPARBUCH "/etc/isdn/sparbuch"
#endif
#define DATADIR "/usr/lib/isdn"
#define TEST 181 /* Sekunden Verbindung kostet? */
#define SHIFT (double)1000.0
#define UNKNOWN -1
#define SHIFT (double)1 /* 1000.0 */
#define MAXZONEN 17
#define MAXDAYS 2
#define MAXSTUNDEN 24
#define MAXPROVIDER 100
#define CITYCALL 0
#define REGIOCALL 1
#define GERMANCALL 2
#define C_NETZ 3
#define C_MOBILBOX 4
#define D1_NETZ 5
#define D2_NETZ 6
#define E_PLUS_NETZ 7
#define E2_NETZ 8
#define EURO_CITY 9
#define EURO_1 10
#define EURO_2 11
#define WELT_1 12
#define WELT_2 13
#define WELT_3 14
#define WELT_4 15
#define INTERNET 16
#define WT 0 /* Werktag */
#define WE 1 /* Wochenende, Feiertag */
#define FE 2 /* Feiertag */
#define ZJ 3 /* Werktag 27. .. 30.12. */
#define IMMER 99 /* Werktag, Wochenende, Feiertag */
#ifndef STANDALONE
#define MUTT 3
#define KARF 4
#define OST1 5
@ -122,6 +98,8 @@
#define A_FEI 17
#define WAEHRUNG "DM"
#define FAKTOR 1.95583
struct w_ftag {
char tag;
@ -160,27 +138,38 @@ static struct w_ftag t_ftag[A_FEI] = {
{ 0, 0, 0, "Buss- und Bettag" }, /* nur bis incl. 1994 (wg. Pflegeversicherung abgeschafft) */
{ 25, 12, 1, "1. Weihnachtsfeiertag" },
{ 26, 12, 1, "2. Weihnachtsfeiertag" }};
#endif
typedef struct {
int used;
char *Provider;
char *InternetZugang;
int takt1, takt2;
double taktpreis;
int tarif[MAXZONEN][MAXDAYS][MAXSTUNDEN];
double Verbindungsentgelt;
int takt1[MAXZONES], takt2[MAXZONES];
double taktpreis[MAXZONES];
double tarif[MAXZONES][MAXDAYS][MAXSTUNDEN];
int frei;
} TARIF;
static char *zonen[] = { "City", "Region 50", "Fern", "C-Netz", "C-Mobilbox",
"D1-Netz", "D2-Netz", "E-plus-Netz", "E2-Netz",
"Euro City", "Euro 1", "Euro 2", "Welt 1", "Welt 2",
"Welt 3", "Welt 4", "Internet" };
char *zonen[MAXZONES] = { "Intern", "CityCall", "RegioCall", "GermanCall",
"C-Netz", "C-Mobilbox", "D1-Netz", "D2-Netz",
"E-plus-Netz", "E2-Netz", "Euro City", "Euro 1",
"Euro 2", "Welt 1", "Welt 2", "Welt 3", "Welt 4",
"Internet", "GlobalCall" };
static TARIF t[MAXPROVIDER];
static int line = 0;
static int use[MAXPROVIDER];
#ifdef STANDALONE
typedef struct {
int prefix;
double tarif;
} SORT;
static SORT sort[MAXPROVIDER];
#endif
static void warning(char *s)
{
@ -192,6 +181,7 @@ static void warning(char *s)
} /* warning */
#ifndef STANDALONE
static int schalt(register int j)
{
return(((j % 4 == 0) && (j % 100 != 0)) || (j % 400 == 0));
@ -344,6 +334,7 @@ static int tarifzeit(struct tm *tm, char *why, int cwe)
strcpy(why, "Werktag");
return(WT);
} /* tarifzeit */
#endif
static int days(register char c)
@ -368,24 +359,24 @@ static int zones(register char c)
switch (toupper(c)) {
case '0' : return( 0); /* City (CityCall) */
case '1' : return( 1); /* Region 50 (RegioCall) */
case '2' : return( 2); /* Fern (GermanCall) */
case '3' : return( 3); /* C-Netz */
case '4' : return( 4); /* C-Mobilbox */
case '5' : return( 5); /* D1-Netz */
case '6' : return( 6); /* D2-Netz */
case '7' : return( 7); /* E-plus-Netz */
case '8' : return( 8); /* E2-Netz */
case '9' : return( 9); /* Euro City */
case 'A' : return(10); /* Euro 1 */
case 'B' : return(11); /* Euro 2 */
case 'C' : return(12); /* Welt 1 */
case 'D' : return(13); /* Welt 2 */
case 'E' : return(14); /* Welt 3 */
case 'F' : return(15); /* Welt 4 */
case 'G' : return(16); /* Internet */
default : sprintf(sx, "Unknown zone \"%c\", please use 0 .. G", c);
case '1' : return(CITYCALL);
case '2' : return(REGIOCALL);
case '3' : return(GERMANCALL);
case '4' : return(C_NETZ);
case '5' : return(C_MOBILBOX);
case '6' : return(D1_NETZ);
case '7' : return(D2_NETZ);
case '8' : return(E_PLUS_NETZ);
case '9' : return(E2_NETZ);
case 'A' : return(EURO_CITY);
case 'B' : return(EURO_1);
case 'C' : return(EURO_2);
case 'D' : return(WELT_1);
case 'E' : return(WELT_2);
case 'F' : return(WELT_3);
case 'G' : return(WELT_4);
case 'H' : return(INTERNET);
default : sprintf(sx, "Unknown zone \"%c\", please use 1 .. H", c);
warning(sx);
return(UNKNOWN);
} /* switch */
@ -401,6 +392,20 @@ static int n0(int n)
} /* n0 */
static int zoneknown(int prefix, int zone)
{
if (!t[prefix].used)
return(0);
if ((t[prefix].takt1[zone] == UNKNOWN) &&
(t[prefix].takt1[zone] == UNKNOWN) &&
(t[prefix].taktpreis[zone] == (double)UNKNOWN))
return(0);
return(1);
} /* zoneknown */
static double tpreis(int prefix, int zone, int day, int hour, int duration)
{
auto double tarif;
@ -411,39 +416,42 @@ static double tpreis(int prefix, int zone, int day, int hour, int duration)
if (!t[prefix].used)
return(UNKNOWN);
tarif = t[prefix].tarif[zone][day][hour] / SHIFT;
tarif = t[prefix].tarif[zone][day][hour];
if (tarif == UNKNOWN) /* Preis unbekannt oder nicht angeboten */
return(tarif);
if (t[prefix].takt1 == UNKNOWN) { /* Abrechnung nach Takten */
duration -= t[prefix].frei;
if (t[prefix].takt1[zone] == UNKNOWN) { /* Abrechnung nach Takten */
takte = (duration + tarif) / tarif;
return(takte * t[prefix].taktpreis);
return((takte * t[prefix].taktpreis[zone]) + t[prefix].Verbindungsentgelt);
}
else { /* Abrechnung nach Preis/Minute */
#if 0 /* AK:FALSCH! So wird bei 60/60 aus z.b. 5 Sekunden immer 2 Takte! */
if (t[prefix].takt1 > 1) { /* Mindestdauer pro Verbindung */
if (duration < t[prefix].takt1)
duration = t[prefix].takt1;
if (t[prefix].takt1[zone] > 1) { /* Mindestdauer pro Verbindung */
if (duration < t[prefix].takt1[zone])
duration = t[prefix].takt1[zone];
} /* if */
#endif
if (t[prefix].takt2 == 1) /* Abrechnung Sekundengenau */
return(tarif * duration / 60);
if (t[prefix].takt2[zone] == 1) /* Abrechnung Sekundengenau */
return((tarif * duration / 60) + t[prefix].Verbindungsentgelt);
/* Abrechnung in "takt2" Einheiten */
takte = (duration + t[prefix].takt2) / n0(t[prefix].takt2);
takte = (duration + t[prefix].takt2[zone]) / n0(t[prefix].takt2[zone]);
if (t[prefix].takt2 == 60) /* Abrechnung Minutengenau */
return(tarif * takte);
if (t[prefix].takt2[zone] == 60) /* Abrechnung Minutengenau */
return((tarif * takte) + t[prefix].Verbindungsentgelt);
preis1 = tarif / (60 / n0(t[prefix].takt2));
return(takte * preis1);
preis1 = tarif / (60 / n0(t[prefix].takt2[zone]));
return((takte * preis1) + t[prefix].Verbindungsentgelt);
} /* else */
} /* tpreis */
#if 0 /* ndef STANDALONE */
static double preisgenau(int prefix, int zone, int day, int hour, int duration, time_t dialin)
{
/*
@ -454,6 +462,7 @@ static double preisgenau(int prefix, int zone, int day, int hour, int duration,
*/
return(UNKNOWN);
} /* preisgenau */
#endif
#ifndef STANDALONE
@ -464,7 +473,7 @@ int taktlaenge(int chan, char *why)
if ((call[chan].sondernummer[CALLED] != UNKNOWN) &&
(call[chan].provider == 33) &&
(call[chan].provider == DTAG) &&
((call[chan].zone < C_NETZ) || (call[chan].zone > E2_NETZ)) &&
!SN[call[chan].sondernummer[CALLED]].tarif) {
strcpy(why, "FreeCall");
@ -479,21 +488,21 @@ int taktlaenge(int chan, char *why)
} /* if */
tm = localtime(&call[chan].connect);
tarif = t[call[chan].provider].tarif[call[chan].zone][call[chan].tz][tm->tm_hour] / SHIFT;
tarif = t[call[chan].provider].tarif[call[chan].zone][call[chan].tz][tm->tm_hour];
if (tarif == UNKNOWN) { /* Preis unbekannt oder nicht angeboten */
strcpy(why, "UNKNOWN TARIF");
return(UNKNOWN);
} /* if */
if (t[call[chan].provider].takt1 == UNKNOWN) /* Abrechnung nach Takten */
if (t[call[chan].provider].takt1[call[chan].zone] == UNKNOWN) /* Abrechnung nach Takten */
return(tarif);
else if (t[call[chan].provider].takt2 < 10) { /* Wenn Takt < 10 Sekunden, 1 Minute! */
sprintf(why, "TRUE charging is %d/%d", t[call[chan].provider].takt1, t[call[chan].provider].takt2);
else if (t[call[chan].provider].takt2[call[chan].zone] < 10) { /* Wenn Takt < 10 Sekunden, 1 Minute! */
sprintf(why, "TRUE charging is %d/%d", t[call[chan].provider].takt1[call[chan].zone], t[call[chan].provider].takt2[call[chan].zone]);
return(60);
}
else
return(t[call[chan].provider].takt2);
return(t[call[chan].provider].takt2[call[chan].zone]);
} /* taktlaenge */
@ -514,13 +523,30 @@ void preparecint(int chan, char *msg, char *hint)
auto double tarif = 0.0, tarif1, providertarif = 0.0, cheaptarif;
*hint = 0;
tm = localtime(&call[chan].connect);
if (call[chan].intern[CALLED]) {
call[chan].zone = INTERN;
call[chan].tarifknown = 0;
sprintf(msg, "CHARGE: free of charge - internal call");
return;
} /* if */
provider = ((call[chan].provider == UNKNOWN) ? preselect : call[chan].provider);
if ((call[chan].sondernummer[CALLED] != UNKNOWN) &&
(SN[call[chan].sondernummer[CALLED]].tarif == 1))
if ((call[chan].sondernummer[CALLED] != UNKNOWN) && /* Sonderrufnummer, Abrechnung zum CityCall-Tarif */
(SN[call[chan].sondernummer[CALLED]].tarif == 1) &&
(provider == DTAG))
zone = CITYCALL;
else if ((call[chan].sondernummer[CALLED] != UNKNOWN) && /* Sonderrufnummer, kostenlos */
(SN[call[chan].sondernummer[CALLED]].tarif == 0) &&
(provider == DTAG)) {
call[chan].zone = CITYCALL;
call[chan].tarifknown = 0;
sprintf(msg, "CHARGE: free of charge - FreeCall");
return;
}
else if (!memcmp(call[chan].num[CALLED], "01610", 5) ||
!memcmp(call[chan].num[CALLED], "01617", 5) ||
!memcmp(call[chan].num[CALLED], "01619", 5))
@ -539,7 +565,7 @@ void preparecint(int chan, char *msg, char *hint)
else if (!memcmp(call[chan].num[CALLED], "0176", 4) ||
!memcmp(call[chan].num[CALLED], "0179", 4))
zone = E2_NETZ;
else if ((t[provider].InternetZugang != NULL) && !strcmp(call[chan].onum[CALLED], t[provider].InternetZugang))
else if (t[provider].used && (t[provider].InternetZugang != NULL) && !strcmp(call[chan].onum[CALLED], t[provider].InternetZugang))
zone = INTERNET;
else {
zone = area_diff(NULL, call[chan].num[CALLED]);
@ -547,36 +573,43 @@ void preparecint(int chan, char *msg, char *hint)
if ((zone == AREA_ERROR) || (zone == AREA_UNKNOWN))
zone = UNKNOWN;
else if (zone == AREA_ABROAD) /* FIXME: muss noch stark verbessert werden! */
zone = EURO_CITY;
else
zone--; /* area_diff() liefert relativ zu 1 */
zone = GLOBALCALL;
} /* else */
provider = ((call[chan].provider == UNKNOWN) ? preselect : call[chan].provider);
tz = tarifzeit(tm, why, ((provider == 33) && CityWeekend));
tz = tarifzeit(tm, why, ((provider == DTAG) && CityWeekend));
if ((tz == FE) || (tz == ZJ)) /* FIXME: stimmt das bei allen Providern? */
tz = WE;
if (zone != UNKNOWN)
tarif = t[provider].tarif[zone][tz][tm->tm_hour] / SHIFT;
tarif = t[provider].tarif[zone][tz][tm->tm_hour];
call[chan].zone = zone;
call[chan].provider = provider;
call[chan].tz = tz;
if (t[provider].takt1 == UNKNOWN)
sprintf(s, "DM %5.3f/%7.3fs", t[provider].taktpreis, tarif);
if (zoneknown(provider, zone)) {
if (t[provider].takt1[zone] == UNKNOWN)
sprintf(s, "%s %s/%ss", WAEHRUNG,
double2str(t[provider].taktpreis[zone], 5, 3, DEB),
double2str(tarif, 5, 1, DEB));
else
sprintf(s, "DM %5.3f/Min, Takt %d/%d", tarif, t[provider].takt1, t[provider].takt2);
sprintf(s, "%s %s/Min, Takt %d/%d", WAEHRUNG, double2str(tarif, 5, 3, DEB),
t[provider].takt1[zone], t[provider].takt2[zone]);
sprintf(msg, "CHARGE: %s, %s, %s", why, ((zone == UNKNOWN) ? "Unknown zone" : zonen[zone]), s);
call[chan].tarifknown = 1;
}
else {
sprintf(msg, "CHARGE: Oppps: No charge infos for provider %d, Zone %d %s",
provider, zone,
((call[chan].sondernummer[CALLED] != UNKNOWN) ? SN[call[chan].sondernummer[CALLED]].sinfo : ""));
call[chan].tarifknown = 0;
} /* else */
*hint = 0;
cheaptarif = 99999.9;
call[chan].tip = UNKNOWN;
call[chan].hint = UNKNOWN;
if (zone != UNKNOWN) {
for (i = 0; i < MAXPROVIDER; i++) {
@ -594,18 +627,21 @@ void preparecint(int chan, char *msg, char *hint)
} /* if */
} /* for */
if ((cheapest != UNKNOWN) && (cheapest != provider)) {
tarif = t[cheapest].tarif[zone][tz][tm->tm_hour] / SHIFT;
if ((cheapest != UNKNOWN) && (cheaptarif < providertarif)) {
tarif = t[cheapest].tarif[zone][tz][tm->tm_hour];
if (t[cheapest].takt1 == UNKNOWN)
sprintf(s, "DM %5.3f/%7.3fs", t[cheapest].taktpreis, tarif);
if (t[cheapest].takt1[zone] == UNKNOWN)
sprintf(s, "%s %s/%ss", WAEHRUNG, double2str(t[cheapest].taktpreis[zone], 5, 3, DEB),
double2str(tarif, 5, 1, DEB));
else
sprintf(s, "DM %5.3f/Min, Takt %d/%d", tarif, t[cheapest].takt1, t[cheapest].takt2);
sprintf(s, "%s %s/Min, Takt %d/%d", WAEHRUNG, double2str(tarif, 5, 3, DEB),
t[cheapest].takt1[zone], t[cheapest].takt2[zone]);
sprintf(hint, "HINT: Better use 010%02d:%s, %s, saves DM %5.3f/%d s",
cheapest, t[cheapest].Provider, s, providertarif - cheaptarif, TEST);
sprintf(hint, "HINT: Better use 010%02d:%s, %s, saving %s %s/%ds",
cheapest, t[cheapest].Provider, s, WAEHRUNG,
double2str(providertarif - cheaptarif, 5, 3, DEB), TEST);
call[chan].tip = cheapest;
call[chan].hint = cheapest;
} /* if */
} /* if */
@ -615,22 +651,30 @@ void preparecint(int chan, char *msg, char *hint)
void price(int chan, char *hint)
{
auto int duration = (int)(call[chan].disconnect - call[chan].connect);
auto double pay2 = -1.0, onesec, spar = 0.0;
auto double pay2 = -1.0, onesec;
auto char sx[BUFSIZ], sy[BUFSIZ], sz[BUFSIZ];
auto struct tm *tm;
register int p, cheapest = UNKNOWN;
auto double payx, payy, prepreis = -1.0, tippreis = -1.0;
auto double payx, payy, prepreis = -1.0, hintpreis = -1.0;
#if DEBUG
auto FILE *fo;
auto double spar = 0.0;
#endif
*hint = 0;
if (call[chan].zone == INTERN) {
call[chan].pay = 0.0;
return;
} /* if */
if (OUTGOING && (duration > 0) && *call[chan].num[CALLED]) {
tm = localtime(&call[chan].connect);
if ((call[chan].sondernummer[CALLED] != UNKNOWN) &&
(call[chan].provider == 33) &&
(call[chan].provider == DTAG) &&
((call[chan].zone < C_NETZ) || (call[chan].zone > E2_NETZ))) {
switch (SN[call[chan].sondernummer[CALLED]].tarif) {
case -1 : if (!strcmp(call[chan].num[CALLED] + 3, "11833")) /* Sonderbedingung Auskunft Inland */
@ -654,24 +698,28 @@ void price(int chan, char *hint)
#endif
call[chan].pay = tpreis(call[chan].provider, call[chan].zone, call[chan].tz, tm->tm_hour, duration);
if ((duration > 600) && (call[chan].zone > 1) && (call[chan].provider == 33)) {
if ((duration > 600) && (call[chan].zone > CITYCALL) && (call[chan].provider == DTAG)) {
onesec = call[chan].pay / duration;
pay2 = (duration - 600) * onesec * 0.30;
sprintf(sx, "10plus DM %s - DM %s = DM %s",
sprintf(sx, "10plus %s %s - %s %s = %s %s",
WAEHRUNG,
double2str(call[chan].pay, 6, 2, DEB),
WAEHRUNG,
double2str(pay2, 6, 2, DEB),
WAEHRUNG,
double2str(call[chan].pay - pay2, 6, 2, DEB));
call[chan].pay -= pay2;
print_msg(PRT_NORMAL, sx);
/* print_msg(PRT_NORMAL, sx); FIXME */
} /* if */
}
else
call[chan].pay = pay2;
if (call[chan].tarifknown) {
cheapest = UNKNOWN;
payx = 99999.9;
@ -681,8 +729,8 @@ void price(int chan, char *hint)
if (p == preselect)
prepreis = payy;
if (p == call[chan].tip)
tippreis = payy;
if (p == call[chan].hint)
hintpreis = payy;
if ((payy > 0) && (payy < payx)) {
payx = payy;
@ -693,24 +741,28 @@ void price(int chan, char *hint)
*sx = *sy = *sz = 0;
if ((cheapest != UNKNOWN) && (cheapest != call[chan].provider))
sprintf(sx, "Cheapest 010%02d:%s DM %s, more payed DM %s",
cheapest, t[cheapest].Provider,
double2str(payx, 6, 2, DEB),
double2str(call[chan].pay - payx, 6, 2, DEB));
sprintf(sx, "Cheapest 010%02d:%s %s %s, more payed %s %s",
cheapest, t[cheapest].Provider, WAEHRUNG,
double2str(payx, 6, 3, DEB),
WAEHRUNG,
double2str(call[chan].pay - payx, 6, 3, DEB));
if ((call[chan].provider != preselect) && (prepreis != -1.00))
sprintf(sy, "saved vs. preselect (010%02d:%s) DM %s",
sprintf(sy, " saving vs. preselect (010%02d:%s) %s %s",
preselect, t[preselect].Provider,
double2str(prepreis - call[chan].pay, 6, 2, DEB));
WAEHRUNG,
double2str(prepreis - call[chan].pay, 6, 3, DEB));
if ((call[chan].tip != UNKNOWN) && (call[chan].tip != cheapest))
sprintf(sz, "saved vs. tip (010%02d:%s) DM %s",
call[chan].tip, t[call[chan].tip].Provider,
double2str(tippreis - call[chan].pay, 6, 2, DEB));
if ((call[chan].hint != UNKNOWN) && (call[chan].hint != cheapest))
sprintf(sz, " saving vs. hint (010%02d:%s) %s %s",
call[chan].hint, t[call[chan].hint].Provider,
WAEHRUNG,
double2str(hintpreis - call[chan].pay, 6, 3, DEB));
if (*sx || *sy || *sz)
sprintf(hint, "HINT: %s, %s, %s LCR:%s", sx, sy, sz, ((cheapest == call[chan].provider) ? "OK" : "FAILED"));
sprintf(hint, "HINT: %s%s%s LCR:%s", sx, sy, sz, ((cheapest == call[chan].provider) ? "OK" : "FAILED"));
#if DEBUG
if ((fo = fopen(SPARBUCH, "r")) != (FILE *)NULL) {
fscanf(fo, "%lg", &spar);
fclose(fo);
@ -722,6 +774,9 @@ void price(int chan, char *hint)
fprintf(fo, "%g", spar);
fclose(fo);
} /* if */
#endif
} /* if */
} /* if */
} /* price */
#endif
@ -729,19 +784,33 @@ void price(int chan, char *hint)
void initTarife(char *msg)
{
register char *p;
auto char s[BUFSIZ], sx[BUFSIZ], Version[BUFSIZ], infos[BUFSIZ];
register char *p, *p1;
auto char s[BUFSIZ], sx[BUFSIZ], Version[BUFSIZ], infos[BUFSIZ], fn[BUFSIZ];
auto FILE *fi;
auto int prefix = UNKNOWN, zone1 = UNKNOWN, zone2 = UNKNOWN;
auto int day, hour1, hour2, pay2, version = UNKNOWN, ignore = 0;
auto int day, hour1, hour2, version = UNKNOWN, ignore = 0;
auto int d, h, z;
auto double pay1;
auto int nprovider = 0;
auto double pay1, pay2;
auto double taktpreis = (double)UNKNOWN;
auto int takt1 = UNKNOWN, takt2 = UNKNOWN;
*msg = *infos = 0;
line = 0;
if ((fi = fopen(TARIFCONF, "r")) != (FILE *)NULL) {
for (d = 0; d < MAXPROVIDER; d++) {
t[d].used = 0;
for (z = 0; z < MAXZONES; z++) {
t[d].takt1[z] = t[d].takt1[z] = UNKNOWN;
t[d].taktpreis[z] = (double)UNKNOWN;
} /* for */
} /* for */
sprintf(fn, "%s/tarif.conf", I4LCONFDIR);
if ((fi = fopen(fn, "r")) != (FILE *)NULL) {
while (fgets(s, BUFSIZ, fi)) {
line++;
@ -780,7 +849,9 @@ void initTarife(char *msg)
line = 0;
prefix = UNKNOWN;
if ((fi = fopen(TARIFE, "r")) != (FILE *)NULL) {
sprintf(fn, "%s/tarif.dat", DATADIR);
if ((fi = fopen(fn, "r")) != (FILE *)NULL) {
while (fgets(s, BUFSIZ, fi)) {
line++;
@ -825,20 +896,20 @@ void initTarife(char *msg)
} /* if */
t[prefix].Provider = strdup(p);
t[prefix].takt1 = t[prefix].takt2 = UNKNOWN;
t[prefix].taktpreis = (double)UNKNOWN;
t[prefix].Verbindungsentgelt = 0.0;
for (z = 0; z < MAXZONEN; z++)
for (z = 0; z < MAXZONES; z++)
for (d = 0; d < MAXDAYS; d++)
for (h = 0; h < MAXSTUNDEN; h++)
t[prefix].tarif[z][d][h] = UNKNOWN * SHIFT;
t[prefix].tarif[z][d][h] = UNKNOWN;
sprintf(sx, "%02d", prefix);
if (*infos)
strcat(infos, ", ");
strcat(infos, ",");
strcat(infos, sx);
nprovider++;
}
else {
sprintf(sx, "Invalid provider-number %d", prefix);
@ -861,22 +932,23 @@ void initTarife(char *msg)
} /* if */
break;
case 'A' : if (!ignore) { /* A:n/n od. A:0.12 Taktpreis oder L„nge */
case '+' : if (!ignore) { /* +:nnn Verbindungsentgelt pro Gespraech */
if (prefix == UNKNOWN) {
warning("Unexpected tag 'A'");
warning("Unexpected tag 'I'");
break;
} /* if */
if ((p = strchr(s, '/'))) {
*p = 0;
t[prefix].takt1 = atoi(s + 2);
t[prefix].takt2 = atoi(p + 1);
t[prefix].taktpreis = (double)UNKNOWN;
}
else {
t[prefix].taktpreis = atof(s + 2);
t[prefix].takt1 = t[prefix].takt2 = UNKNOWN;
} /* else */
t[prefix].Verbindungsentgelt = atof(s + 2);
} /* if */
break;
case '-' : if (!ignore) { /* -:nnn kostenlose Sekunden */
if (prefix == UNKNOWN) {
warning("Unexpected tag 'I'");
break;
} /* if */
t[prefix].frei = atoi(s + 2);
} /* if */
break;
@ -896,18 +968,35 @@ void initTarife(char *msg)
break;
} /* if */
if (t[prefix].takt1 + t[prefix].takt2 + t[prefix].taktpreis == (double)-3.0) {
warning("Unexpected tag 'Z', please specify 'A' before 'Z'");
break;
} /* if */
p = s + 2;
if ((zone1 = zone2 = zones(s[2])) == UNKNOWN)
if ((zone1 = zone2 = zones(*p)) == UNKNOWN)
break;
if (s[3] == '-') {
if ((zone2 = zones(s[4])) == UNKNOWN)
p++;
if (*p == '-') {
p++;
if ((zone2 = zones(*p)) == UNKNOWN)
break;
p++;
} /* if */
if (*p == ',') { /* Taktung */
if ((p1 = strchr(p + 1, '/'))) {
*p1 = 0;
takt1 = atoi(p + 1);
takt2 = atoi(p1 + 1);
taktpreis = (double)UNKNOWN;
}
else {
taktpreis = atof(p + 1);
takt1 = takt2 = UNKNOWN;
} /* else */
}
else
warning("Missing \",Taktung\"");
} /* if */
break;
@ -957,13 +1046,17 @@ void initTarife(char *msg)
} /* else */
if (*p == '=') {
pay1 = atof(p + 1) * SHIFT;
pay1 = atof(p + 1);
pay2 = pay1;
hour2--;
for (z = zone1; z <= zone2; z++) {
t[prefix].takt1[z] = takt1;
t[prefix].takt2[z] = takt2;
t[prefix].taktpreis[z] = taktpreis;
h = hour1;
while (h != (hour2 + 1)) {
@ -997,7 +1090,8 @@ void initTarife(char *msg)
} /* while */
fclose(fi);
sprintf(msg, "Tarife Version %s loaded [Provider %s]", Version, infos);
sprintf(msg, "Tarife Version %s loaded [%d Provider (%s), %d Tarife]",
Version, nprovider, infos, nprovider * MAXZONES * MAXDAYS * MAXSTUNDEN);
} /* if */
} /* initTarife */
@ -1015,30 +1109,220 @@ void exitTarife()
} /* exitTarife */
void initSondernummern()
{
register char *p1, *p2, *p3;
register int tarif;
auto FILE *f;
auto char s[BUFSIZ], msn[128], sinfo[256], linfo[256], fn[BUFSIZ];
auto double grund1, grund2, takt1, takt2;
sprintf(fn, "%s/sonderrufnummern.dat", DATADIR);
if ((f = fopen(fn, "r")) != (FILE *)NULL) {
while ((p1 = fgets(s, BUFSIZ, f))) {
if (*p1 != '#') {
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
p3 = p2 - 1;
while (*p3 == ' ')
*p3-- = 0;
strcpy(msn, p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
if (!strcmp(p1, "City"))
tarif = 1;
else if (!strcmp(p1, "free"))
tarif = 0;
else
tarif = UNKNOWN;
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
grund1 = atof(p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
grund2 = atof(p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
takt1 = atof(p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
takt2 = atof(p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
p3 = p2 - 1;
while (*p3 == ' ')
*p3-- = 0;
while (*p1 == ' ')
p1++;
strcpy(sinfo, p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '\n'))) {
*p2 = 0;
p3 = p2 - 1;
while (*p3 == ' ')
*p3-- = 0;
while (*p1 == ' ')
p1++;
strcpy(linfo, p1);
nSN++;
SN = realloc(SN, sizeof(SonderNummern) * nSN);
SN[nSN - 1].msn = strdup(msn);
SN[nSN - 1].sinfo = strdup(sinfo);
SN[nSN - 1].tarif = tarif;
SN[nSN - 1].grund1 = grund1;
SN[nSN - 1].grund2 = grund2;
SN[nSN - 1].takt1 = takt1;
SN[nSN - 1].takt2 = takt2;
} /* if */
} /* if */
} /* if */
} /* if */
} /* if */
} /* if */
} /* if */
} /* if */
} /* if */
} /* while */
fclose(f);
} /* if */
} /* initSondernummern */
int is_sondernummer(char *num)
{
register int i;
if ((strlen(num) >= interns0) && ((*num == '0') || (*num == '1')))
for (i = 0; i < nSN; i++)
if (!strncmp(num, SN[i].msn, strlen(SN[i].msn)))
return(i);
return(-1);
} /* sondernummer */
#ifdef STANDALONE
int compare(const SORT *s1, const SORT *s2)
{
return(s1->tarif > s2->tarif);
} /* compare */
int main(int argc, char *argv[], char *envp[])
{
register int prefix, z, d, h;
auto double n;
auto char why[BUFSIZ];
register int prefix, z, d, h, n = 0, n1, cheapest = UNKNOWN;
auto char why[BUFSIZ], s[BUFSIZ];
auto double cheaptarif, providertarif, tarif;
printf("Initializing ...\n");
initTarife(why);
if (*why)
printf("%s\n", why);
printf("sizeof(t) = %d\n\n", sizeof(t));
if (argc > 1) {
cheaptarif = 99999.9;
z = GERMANCALL; /* CITYCALL; */
for (prefix = 0; prefix < MAXPROVIDER; prefix++) {
if (t[prefix].used) {
printf("PROVIDER:%s (010%02d)\n", t[prefix].Provider, prefix);
for (z = 0; z < MAXZONEN; z++) {
printf("\tZone:%s:\n", zonen[z]);
tarif = tpreis(prefix, z, WT, 12, TEST);
if (prefix == DTAG)
providertarif = tarif;
if ((tarif > 0.0) && (tarif < cheaptarif)) {
cheaptarif = tarif;
cheapest = prefix;
} /* if */
sort[n].prefix = prefix;
sort[n].tarif = tarif;
n++;
} /* if */
} /* for */
if (cheapest != UNKNOWN) {
tarif = t[cheapest].tarif[z][WT][12];
if (t[cheapest].takt1[z] == UNKNOWN)
sprintf(s, "DM %5.3f/%7.3fs", t[cheapest].taktpreis[z], tarif);
else
sprintf(s, "DM %5.3f/Min, Takt %d/%d", tarif, t[cheapest].takt1[z], t[cheapest].takt2[z]);
printf("Use 010%02d:%s, %s, costs DM %7.3f, saving DM %7.3f/%ds vs. DTAG\n",
cheapest, t[cheapest].Provider, s,
cheaptarif,
providertarif - cheaptarif, TEST);
} /* if */
qsort(sort, n, sizeof(SORT), compare);
for (n1 = 0; n1 < n; n1++)
printf("010%02d:%s\t\tDM %5.3f\n", sort[n1].prefix, t[sort[n1].prefix].Provider, sort[n1].tarif);
}
else { /* dump */
for (prefix = 0; prefix < MAXPROVIDER; prefix++) {
if (t[prefix].used) {
printf("PROVIDER:%s (010%02d)", t[prefix].Provider, prefix);
if (t[prefix].Verbindungsentgelt)
printf(" (zzgl. DM %6.3f/Verbindung)", t[prefix].Verbindungsentgelt);
if (t[prefix].frei)
printf(" (die ersten %d Sekunden frei)", t[prefix].frei);
printf("\n");
for (z = 0; z < MAXZONES; z++) {
if (zoneknown(prefix, z)) {
printf("\tZone:%s:", zonen[z]);
if (t[prefix].takt1[z] == UNKNOWN)
printf(" [Takt DM %6.3f/x s]\n", t[prefix].taktpreis[z]);
else
printf(" [Takt %d/%d]\n", t[prefix].takt1[z], t[prefix].takt2[z]);
for (d = 0; d < MAXDAYS; d++) {
printf("\t\t%s:\n", (d ? "Wochenende" : "Wochentag"));
for (h = 0; h < MAXSTUNDEN; h++)
printf("\t\t\t%2d Uhr: %10.3f DM\n", h, tpreis(prefix, z, d, h, TEST));
printf("\t\t\t%2d Uhr: %10.3f %s, %10.3f DM\n",
h, t[prefix].tarif[z][d][h],
((t[prefix].takt1[z] == UNKNOWN) ? "s" : "DM"),
tpreis(prefix, z, d, h, TEST));
} /* for */
} /* if */
} /* for */
} /* if */
} /* for */
@ -1047,22 +1331,26 @@ int main(int argc, char *argv[], char *envp[])
for (prefix = 0; prefix < MAXPROVIDER; prefix++) {
if (t[prefix].used) {
printf("%s (010%02d)",
t[prefix].Provider, prefix);
if (t[prefix].takt1 == UNKNOWN)
printf(", [DM %6.3f/%6f Sekunden]\n", t[prefix].taktpreis, (t[prefix].tarif[GERMANCALL][WT][16] / SHIFT));
else
printf(", [%d/%d] (%6.3f)\n", t[prefix].takt1, t[prefix].takt2, t[prefix].tarif[GERMANCALL][WE][13] / SHIFT);
printf("%s (010%02d):\n", t[prefix].Provider, prefix);
if (zoneknown(prefix, CITYCALL))
printf("\t\t\tCITY : %6.3f DM\n", tpreis(prefix, CITYCALL, WT, 16, TEST));
if (zoneknown(prefix, REGIOCALL))
printf("\t\t\tREGIO : %6.3f DM\n", tpreis(prefix, REGIOCALL, WT, 16, TEST));
if (zoneknown(prefix, GERMANCALL))
printf("\t\t\tFERN : %6.3f DM\n", tpreis(prefix, GERMANCALL, WT, 16, TEST));
if (zoneknown(prefix, D2_NETZ))
printf("\t\t\tD2 : %6.3f DM\n", tpreis(prefix, D2_NETZ, WT, 16, TEST));
if (zoneknown(prefix, INTERNET))
printf("\t\t\tINTERNET: %6.3f DM\n", tpreis(prefix, INTERNET, WT, 16, TEST));
} /* if */
} /* for */
} /* else */
exitTarife();

View File

@ -23,14 +23,10 @@
#define _TAKT_C_
#include "isdnlog.h"
#define DTAG 0
#define DTAGI 0
#define MOBILCOM 1
#define TELE 2
#define CITYCALL 0
#define REGIOCALL 1
#define GERMANCALL 2
#define DTAG_PREIS 0.121
#define MOBILCOM_PREIS 0.19
@ -405,7 +401,7 @@ float taktlaenge(int chan, char *description)
return(-1);
if ((provider == 19) || (provider == 33)) {
takt = gebuehr[(provider == 33) ? DTAG : MOBILCOM][zeit[tm->tm_hour]][tarifzeit(tm, why)][zone];
takt = gebuehr[(provider == 33) ? DTAGI : MOBILCOM][zeit[tm->tm_hour]][tarifzeit(tm, why)][zone];
if (description) sprintf(description, "%s, %s, %s", zeiten[zeit[tm->tm_hour]], why, zonen[zone]);
return(takt);
}

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
*
* ISDN accounting for isdn4linux.
*
* Copyright 1995, 1998 by Andreas Kool (akool@isdn4linux.de)
* Copyright 1995, 1999 by Andreas Kool (akool@isdn4linux.de)
* and Stefan Luethje (luethje@sl-gw.lake.de)
*
* This program is free software; you can redistribute it and/or modify
@ -20,6 +20,17 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log$
* Revision 1.11 1998/11/24 20:52:46 akool
* - changed my email-adress
* - new Option "-R" to supply the preselected provider (-R24 -> Telepassport)
* - made Provider-Prefix 6 digits long
* - full support for internal S0-bus implemented (-A, -i Options)
* - isdnlog now ignores unknown frames
* - added 36 allocated, but up to now unused "Auskunft" Numbers
* - added _all_ 122 Providers
* - Patch from Jochen Erwied <mack@Joker.E.Ruhr.DE> for Quante-TK-Anlagen
* (first dialed digit comes with SETUP-Frame)
*
* Revision 1.10 1998/03/29 19:54:17 luethje
* idnrep: added html feature (incoming/outgoing calls)
*
@ -75,19 +86,6 @@
/*****************************************************************************/
#ifdef _CHEAP_C_
#define _EXTERN
#else
#define _EXTERN extern
#endif
_EXTERN double cheap96(time_t when, int zone, int *zeit);
_EXTERN double cheap(time_t when, int zone);
#undef _EXTERN
/*****************************************************************************/
#ifdef _REP_FUNC_C_
#define _EXTERN
#define _SET_NULL = NULL
@ -130,6 +128,7 @@ _EXTERN time_t begintime _SET_0;
_EXTERN time_t endtime _SET_0;
_EXTERN int preselect _SET_33;
#undef _SET_NULL
#undef _SET_0
#undef _SET_1
@ -141,6 +140,7 @@ _EXTERN int preselect _SET_33;
#define LOG_VERSION_1 "1.0"
#define LOG_VERSION_2 "2.0"
#define LOG_VERSION_3 "3.0"
#define LOG_VERSION_4 "3.1"
/*****************************************************************************/
@ -159,7 +159,7 @@ typedef struct {
int connects;
time_t connect[MAXCONNECTS];
int cause;
} UNKNOWN;
} UNKNOWNS;
/*****************************************************************************/

View File

@ -2,7 +2,7 @@
*
* ISDN accounting for isdn4linux. (Report-module)
*
* Copyright 1995, 1998 by Andreas Kool (akool@isdn4linux.de)
* Copyright 1995, 1999 by Andreas Kool (akool@isdn4linux.de)
* and Stefan Luethje (luethje@sl-gw.lake.de)
*
* This program is free software; you can redistribute it and/or modify
@ -20,6 +20,17 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log$
* Revision 1.6 1998/11/24 20:52:55 akool
* - changed my email-adress
* - new Option "-R" to supply the preselected provider (-R24 -> Telepassport)
* - made Provider-Prefix 6 digits long
* - full support for internal S0-bus implemented (-A, -i Options)
* - isdnlog now ignores unknown frames
* - added 36 allocated, but up to now unused "Auskunft" Numbers
* - added _all_ 122 Providers
* - Patch from Jochen Erwied <mack@Joker.E.Ruhr.DE> for Quante-TK-Anlagen
* (first dialed digit comes with SETUP-Frame)
*
* Revision 1.5 1998/03/29 19:54:22 luethje
* idnrep: added html feature (incoming/outgoing calls)
*
@ -142,6 +153,7 @@
*
*/
#define _ISDNREP_C_
#include "isdnrep.h"
/*****************************************************************************/

View File

@ -1,4 +1,4 @@
# Kennzahl 98, mögliche Varianten:
# Kennzahl 98, moegliche Varianten:
# 0=Nikoma Minutentakt
# 1=Nikoma Sekundentakt
# 2=Nikocity Minutentakt

View File

@ -164,6 +164,8 @@
01914 |City| | | | | Online-Dienste AOL Zugang | Selbstwahlverbindungen zum Zugang Online-Dienst von AOL Es gelten die Preise f<>r CityCall Verbindungen
0191023 |City| | | | | Online-Dienste 1&1 |
0191501 |? | | | | | o.tel.o Online Zugang PPP |
01928 |? | | | | | Mobilcom Online Zugang, Tomorrow-Tarif |
01929 |? | | | | | Mobilcom Online Zugang, Freenet-Tarif |
02000 |? | | | | | Expo 2000 Hotline | Expo 2000 Hotline. Eine T-Net-Verbindung kostet 5 TE inkl. 60 Sek. + nach 60 Sek. 1 TE je angefangene 12 Sek. 12 12
0800 |free| | | | | freecall 0800 | freecall 0800. Eine T-Net-Verbindung zu dieser Rufnummer ist kostenfrei.
110 |free| | | | | Polizei/Notruf | Polizeinotruf. Eine T-Net-Verbindung zu dieser Rufnummer ist kostenfrei.
@ -221,4 +223,4 @@
# QUELLE: Programm "t-tarife.exe" Version: 1.16 Stand: 07.1998
# http://www.telekom.de
# http://www.regtp.de
# sowie eigene Recherchen, Stand: 06-Jan-99
# sowie eigene Recherchen, Stand: 14-Jan-99

View File

@ -1,60 +1,80 @@
# @(#)tarif.dat 08-Jan-99 21:00
# @(#)tarif.dat 1.03 23-Jan-99 19:49
#
# Copyright 1995, 1999 by Andreas Kool (akool@isdn4linux.de)
#
V:1.00 [08-Jan-99]
V:1.03 [23-Jan-99]
#
# P: Provider
# G: tt.mm.jjjj Tarif g<>ltig ab
# C: Comment's
# A: Takt
# +: Verbindungsentgelt pro Gespräch
# -: kostenlose Zeit in Sekunden
# I: Internet-Zugangsnummer
# Z: (Zone)
# 0=City 8=E2-Netz G=Internet
# 1=Region 50 9=Euro City
# 2=Fern A=Euro 1
# 3=C-Netz B=Euro 2
# 4=C-Mobilbox C=Welt 1
# 5=D1-Netz D=Welt 2
# 6=D2-Netz E=Welt 3
# 7=E-plus-Netz F=Welt 4
# 1=City 9=E2-Netz H=Internet
# 2=Region 50 A=Euro City
# 3=Fern B=Euro 1
# 4=C-Netz C=Euro 2
# 5=C-Mobilbox D=Welt 1
# 6=D1-Netz E=Welt 2
# 7=D2-Netz G=Welt 3
# 8=E-plus-Netz G=Welt 4
#
# T: (Tag)
# W=Werktag
# E=Wochenende/Feiertag
# *=jeder Tag (flat rate)
#
################################################################
P:11=o.tel.o
G:01.01.1999
C:Homepage: http://www.o-tel-o.de
C:Hotline: 01803/1998 oder 0800/7370 (Geschaeftskunden)
C:Adresse: 96038 Bamberg
A:60/60
I:010110191501
Z:1-2
Z:2-3,60/60
T:W09-18=0.29
T:W18-22=0.15
T:W22-09=0.15
T:E=0.15
Z:3-8
Z:4-9,60/60
T:W08-21=0.89
T:W21-08=0.49
T:E=0.49
Z:G
Z:H,60/60
T:W09-18=0.16
T:W18-22=0.16
T:W22-09=0.10
T:E=0.10
################################################################
P:15=RSL COM
A:60/60
Z:1-2
P:13=Tele 2
G:01.07.1998
C:Homepage: http://www.tele2.de
C:Hotline: 0800/24-01013
C:Adresse: Postfach 130840, 40558
C: Düsseldorf
Z:2-3,1/1
T:W09-18=0.20
T:W18-09=0.15
T:E=0.10
Z:4-9,1/1
T:W08-18=0.92
T:W18-08=0.82
T:E=0.82
Z:D,1/1
T:W08-18=0.68
T:W18-08=0.58
T:E=0.58
################################################################
P:15,0=RSL COM
C:Clever call
Z:2-3,60/60
T:W08-18=0.25 # Standard
T:W18-21=0.13 # Abend
T:W21-08=0.07 # Nacht
T:E08-21=0.13
T:E21-08=0.07
Z:3-8
Z:4-9,60/60
T:W08-21=0.65
T:W21-08=0.45
T:E=0.45
@ -65,48 +85,75 @@ C:MobilCom AG
C:Homepage: http://www.mobilcom.de
C:Hotline: 01805/191919
C:Adresse: Postfach 1249, 24822 Schleswig
A:60/60
I:0101901929 # (Benutzername: mobilcom; Passwort: mobilcom)
Z:1-2
Z:2-3,60/60
T:*=0.19
Z:3-8
Z:4-9,60/60
T:*=0.99
Z:9-C
Z:A-D,60/60
T:*=0.69
Z:G
Z:H,60/60
T:*=0.19
################################################################
P:23=tesion ))
G:01.08.1998
C:Name: tesion )) Neue
C: Telekommunikation
C:Homepage: http://www.tesion.de
C: Hotline: 0800/711 0 711
C: Telefon: 0711/20 21-610
C: Telefax: 0711/20 21-611
C: Adresse: Kriegsbergstraße 11,
C: 70174 Stuttgart
+:0.06
Z:2-3,1/1
T:W09-19=0.44
T:W19-09=0.24
T:E=0.24
Z:4-9,1/1
T:W09-19=0.81
T:W19-09=0.48
Z:D,1/1
T:*=0.81
Z:E,1/1
T:*=1.61
################################################################
P:28=Telebridge
G:01.01.1999
C:Hotline: 01805/335 440
C:Adresse: Zeppelinstraße 3, 73105
C: Dürnau
C:Reseller von COLT
A:60/60
Z:0
-:5
Z:1,60/60
T:*=0.09
Z:1
Z:2,60/60
T:*=0.14
Z:2
Z:3,60/60
T:*=0.22
Z:3-8
Z:4-9,60/60
T:*=0.49
################################################################
P:30=TelDaFax
A:1/1
Z:1-2
Z:2-3,1/1
T:W09-18=0.17
T:W18-09=0.09
T:E=0.09
Z:3-8
Z:4-9,1/1
T:W08-21=0.835
T:W21-08=0.476
T:E=0.476
################################################################
P:33=DTAG
C:Deutsche Telekom AG
A:0.12
Z:0
P:33,0=DTAG
C:Name: Deutsche Telekom AG
C:Homepage: http://www.dtag.de
C:Hotline: 0800/33-01000
C:Internet-Zugang: Citytarif zzgl. DM 0.05/Minute Nutzungsentgeld
C: pro Monat 2 Stunden Nutzungsentgelt frei
C: monatliche Grundgeb<65>hr DM 8,00
C:ISDN-Tarif
I:0191011
Z:1,0.12
T:W02-05=240 # Nacht
T:W05-09=150 # Spar
T:W09-18=90 # Standard
@ -114,42 +161,72 @@ T:W18-21=150 # Spar
T:W21-02=240 # Mondschein
T:E05-21=150 # Spar
T:E21-05=240 # Mondschein
Z:1-2
Z:2-3,0.12
T:W02-05=120 # Nacht
T:W05-09=60 # Spar
T:W09-18=30 # Standard
T:W18-21=60 # Spar
T:W21-02=60 # Mondschein
T:E=60 # Spar
Z:3-8
Z:4-9,0.12
T:W09-18=7.5 # Standard
T:W18-09=15 # Spar
T:E=15 # Spar
Z:4
T:W09-18=5.267 # Standard
T:W18-09=3.592 # Spar
T:E=3.592 # Spar
Z:7
T:W09-18=11.333 # Standard
T:W18-09=4.683 # Spar
T:E=4.683 # Spar
Z:5,60/60
T:W09-18=0.632 # Standard
T:W18-09=0.431 # Spar
T:E=0.431 # Spar
Z:8,60/60
T:W09-18=1.36 # Standard
T:W18-09=0.562 # Spar
T:E=0.562 # Spar
################################################################
P:49=ACC
G:01.01.1999
C:Name: ACC Telecom
C:Homepage: http://www.acctelecom.de
C:Hotline: 0800/122 55 222 bzw.
C: 0800/1 CALL ACC
C:Telefax: 0800/1329 222 bzw.
C: 0800/1 FAX ACC
Z:1,30/30
T:W08-18=0.12
T:W18-08=0.09
T:E=0.09
Z:2-3,30/30
T:W08-18=0.18
T:W18-08=0.09
T:E=0.09
Z:4-9,1/1
T:W08-18=0.73
T:W18-08=0.36
T:E=0.36
Z:8,1/1
T:W08-18=0.99
T:W18-08=0.45
T:E=0.45
Z:D,1/1
T:W08-18=0.64
T:W18-08=0.55
T:E=0.55
Z:E,1/1
T:*=1.64
################################################################
P:50=Talkline
G:15.01.1999
C:Homepage: http://www.null1050.de
C:Hotline: 01802/2002
C:Faxabruf: 01802/2001
A:60/60
I:01050/019251 # (Benutzername: talknet; Passwort: talknet; Nameserver: 195.252.128.53)
Z:1-2
Z:2-3,60/60
T:W09-18=0.29
T:W18-21=0.19
T:W21-09=0.09
T:E09-21=0.19
T:E21-09=0.09
Z:3-8
Z:4-9,60/60
T:*=0.99
Z:G
Z:H,180/180
T:W09-18=0.16
T:W18-21=0.09
T:W21-09=0.09
@ -157,29 +234,30 @@ T:E=0.09
################################################################
P:70=Arcor
C:Mannesmann Arcor
A:60/60
I:010700192070 # (Benutzername: arcor; Passwort: internet; Proxy: proxy.arcor-ip.de:80; Startseite: http://www.call.arcor.net)
Z:1-2
Z:2-3,60/60
T:W09-18=0.18 # Standard
T:W18-09=0.10 # Spar
T:E=0.10 # Spar
Z:3-5
Z:4-6,60/60
T:W09-18=0.96
T:W18-09=0.48
T:E=0.48
Z:6
Z:7,60/60
T:W09-18=0.94
T:W18-09=0.46
T:E=0.46
Z:7
Z:8,60/60
T:W09-18=1.25
T:W18-09=0.56
T:E=0.56
Z:8
Z:9,60/60
T:W09-18=0.96
T:W18-09=0.48
T:E=0.48
Z:G
Z:G,60/60
T:*=2.72 # FIXME
Z:H,60/60
T:*09-18=0.14
T:*18-09=0.10
################################################################
@ -190,95 +268,87 @@ C:Telefon: 069/94 994-0
C:Telefax: 069/94 994-100
C:Adresse: Hanauer Landstraße 187-189,
C: 60314 Frankfurt am Main
A:30/1
Z:1-2
Z:2-3,30/1
T:W09-18=0.16
T:W18-09=0.09
T:E=0.09
Z:3-8
Z:4-9,30/1
T:W09-21=0.73
T:W21-09=0.36
T:E=0.36
################################################################
P:90=Viag Intercom
A:60/60
Z:1-2
Z:2-3,60/60
T:W08-18=0.17
T:W18-08=0.10
T:E=0.10
Z:3-8
Z:4-9,60/60
T:W08-21=0.99
T:W21-08=0.59
T:E=0.59
Z:G
Z:H,60/60
T:*=0.10
################################################################
P:98,0=Nikoma Minutentakt
G:01.01.1999
C:Nikoma Media Works GmbH
C:Reseller von Star Telecom
A:60/60
Z:1-2
Z:2-3,60/60
T:*09-21=0.15
T:*21-09=0.12
Z:3-8
Z:4-9,60/60
T:*=0.50
################################################################
P:98,1=Nikoma Sekundentakt
G:01.01.1999
C:Nikoma Media Works GmbH
C:Reseller von Star Telecom
A:1/1
Z:1-2
Z:2-3,1/1
T:*09-21=0.168
T:*21-09=0.134
Z:3-8
Z:4-9,1/1
T:*=0.56
################################################################
P:98,2=Nikoma Nikocity Minutentakt
G:01.01.1999
C:Nikoma Media Works GmbH
C:Reseller von Star Telecom
A:60/60
Z:0
Z:1,60/60
T:W09-21=0.8
T:W21-09=0.6
Z:1-2
Z:2-3,60/60
T:*09-21=0.15
T:*21-09=0.10
Z:3-8
Z:4-9,60/60
T:*=0.50
################################################################
P:98,3=Nikoma Nikocity Sekundentakt
G:01.01.1999
C:Nikoma Media Works GmbH
C:Reseller von Star Telecom
A:1/1
Z:0
Z:1,1/1
T:W09-21=0.896
T:W21-09=0.672
Z:1-2
Z:2-3,1/1
T:*09-21=0.168
T:*21-09=0.134
Z:3-8
Z:4-9,1/1
T:*=0.56
################################################################
P:98,4=Mox
G:01.01.1999
C:Mox Telecom AG
C:Reseller von Star Telecom
A:1/1
Z:1-2
Z:2-3,1/1
T:*=0.159
Z:3-8
Z:4-9,1/1
T:*=0.559
################################################################
P:98,5=C@llas L
G:01.11.1998
C:C@llas Clever Communications
C:Reseller von Star Telecom
A:60/60
Z:1-2
Z:2-3,60/60
T:*=0.22
Z:3-8
Z:4-9,60/60
T:*=0.64

View File

@ -2,7 +2,7 @@
*
* ISDN accounting for isdn4linux. (Utilities)
*
* Copyright 1995, 1998 by Andreas Kool (akool@isdn4linux.de)
* Copyright 1995, 1999 by Andreas Kool (akool@isdn4linux.de)
* and Stefan Luethje (luethje@sl-gw.lake.de)
*
* This program is free software; you can redistribute it and/or modify
@ -20,6 +20,17 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log$
* Revision 1.20 1998/11/24 20:53:03 akool
* - changed my email-adress
* - new Option "-R" to supply the preselected provider (-R24 -> Telepassport)
* - made Provider-Prefix 6 digits long
* - full support for internal S0-bus implemented (-A, -i Options)
* - isdnlog now ignores unknown frames
* - added 36 allocated, but up to now unused "Auskunft" Numbers
* - added _all_ 122 Providers
* - Patch from Jochen Erwied <mack@Joker.E.Ruhr.DE> for Quante-TK-Anlagen
* (first dialed digit comes with SETUP-Frame)
*
* Revision 1.19 1998/09/26 18:30:08 akool
* - quick and dirty Call-History in "-m" Mode (press "h" for more info) added
* - eat's one more socket, Stefan: sockets[3] now is STDIN, FIRST_DESCR=4 !!
@ -1566,7 +1577,6 @@ static int readoldconfig(char *myname)
known[knowns]->dur[CALLING] = known[knowns]->dur[CALLED] = 0.0;
known[knowns]->eh = 0;
known[knowns]->usage[DIALOUT] = known[knowns]->usage[DIALIN] = 0;
known[knowns]->dm = 0.0;
known[knowns]->day = -1;
known[knowns]->charge = 0.0;

View File

@ -20,6 +20,18 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log$
* Revision 1.25 1999/01/10 15:24:36 akool
* - "message = 0" bug fixed (many thanks to
* Sebastian Kanthak <sebastian.kanthak@muehlheim.de>)
* - CITYWEEKEND via config-file possible
* - fixes from Michael Reinelt <reinelt@eunet.at>
* - fix a typo in the README from Sascha Ziemann <szi@aibon.ping.de>
* - Charge for .at optimized by Michael Reinelt <reinelt@eunet.at>
* - first alpha-Version of the new chargeinfo-Database
* ATTENTION: This version requires the following manual steps:
* cp /usr/src/isdn4k-utils/isdnlog/tarif.dat /usr/lib/isdn
* cp /usr/src/isdn4k-utils/isdnlog/samples/tarif.conf /etc/isdn
*
* Revision 1.24 1998/12/09 20:40:27 akool
* - new option "-0x:y" for leading zero stripping on internal S0-Bus
* - new option "-o" to suppress causes of other ISDN-Equipment
@ -304,7 +316,7 @@
/****************************************************************************/
#define LOG_VERSION "3.1"
#define LOG_VERSION "3.2"
/****************************************************************************/
@ -314,6 +326,9 @@
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define abs(x) (((x) < 0) ? -(x) : (x))
#define UNKNOWN -1
#define UNDEFINED -2
/****************************************************************************/
#define MAXDIG 128
@ -325,11 +340,11 @@
/****************************************************************************/
#define NUMSIZE 20
#define NUMSIZE 30
#define FNSIZE 64
#define RETSIZE 128
#define MAXRET 5
#define MAXZONES 6
#define MAXZONES 19
#define MAXCHAN 7
#define MAXCARDS 2
@ -341,6 +356,30 @@
/****************************************************************************/
#define INTERN 0
#define CITYCALL 1
#define REGIOCALL 2
#define GERMANCALL 3
#define C_NETZ 4
#define C_MOBILBOX 5
#define D1_NETZ 6
#define D2_NETZ 7
#define E_PLUS_NETZ 8
#define E2_NETZ 9
#define EURO_CITY 10
#define EURO_1 11
#define EURO_2 12
#define WELT_1 13
#define WELT_2 14
#define WELT_3 15
#define WELT_4 16
#define INTERNET 17
#define GLOBALCALL 18
#define DTAG 33
/****************************************************************************/
#define CALLING 0
#define CALLED 1
#define DATETIME 2
@ -632,8 +671,9 @@ typedef struct {
int ctakt;
int zone;
int uid;
int tip;
int hint;
int tz;
int tarifknown;
} CALL;
/****************************************************************************/
@ -662,7 +702,7 @@ typedef struct {
int usage[2];
double dur[2];
int eh;
double dm;
double pay;
double charge;
double rcharge;
double scharge;
@ -685,7 +725,7 @@ typedef struct {
int err;
double din;
double dout;
double dm;
double pay;
long ibytes;
long obytes;
} sum_calls;
@ -698,7 +738,6 @@ typedef struct {
time_t t;
int dir;
double duration;
double dm;
char num[2][NUMSIZE];
char who[2][NUMSIZE];
long ibytes;
@ -710,6 +749,7 @@ typedef struct {
char currency[32];
double pay;
int provider;
int zone;
} one_call;
/****************************************************************************/
@ -787,6 +827,7 @@ _EXTERN char mlabel[BUFSIZ];
_EXTERN char *amtsholung;
_EXTERN SonderNummern *SN;
_EXTERN int nSN;
_EXTERN int interns0;
#undef _EXTERN
/****************************************************************************/
@ -848,7 +889,15 @@ _EXTERN char *Providername(int number);
_EXTERN int iprintf(char *obuf, int chan, register char *fmt, ...);
_EXTERN char *qmsg(int type, int version, int val);
_EXTERN char *Myname;
_EXTERN void initTarife(char *msg);
_EXTERN void exitTarife(void);
_EXTERN void price(int chan, char *hint);
_EXTERN char *realProvidername(int prefix);
_EXTERN void preparecint(int chan, char *msg, char *hint);
_EXTERN int taktlaenge(int chan, char *why);
_EXTERN void initSondernummern(void);
_EXTERN int is_sondernummer(char *num);
_EXTERN char *zonen[MAXZONES];
#undef _EXTERN
/****************************************************************************/