- second version of the new chargeint database
- isdnrep reanimated
This commit is contained in:
parent
6205840ce9
commit
5dffe2c95f
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
/****************************************************************************/
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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
|
@ -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;
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Kennzahl 98, mögliche Varianten:
|
||||
# Kennzahl 98, moegliche Varianten:
|
||||
# 0=Nikoma Minutentakt
|
||||
# 1=Nikoma Sekundentakt
|
||||
# 2=Nikocity Minutentakt
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
/****************************************************************************/
|
||||
|
|
Loading…
Reference in New Issue