isdnlog 3.09 : support for all Internet-by-call numbers

This commit is contained in:
akool 1999-03-20 16:54:37 +00:00
parent 5255397dca
commit 1fd2b336c0
6 changed files with 109 additions and 71 deletions

View File

@ -1,4 +1,4 @@
## $Id: Makefile.in,v 1.61 1999/03/20 14:32:29 akool Exp $
## $Id: Makefile.in,v 1.62 1999/03/20 16:54:37 akool Exp $
##
## ISDN accounting for isdn4linux.
##
@ -19,6 +19,9 @@
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
##
## $Log: Makefile.in,v $
## Revision 1.62 1999/03/20 16:54:37 akool
## isdnlog 3.09 : support for all Internet-by-call numbers
##
## Revision 1.61 1999/03/20 14:32:29 akool
## - isdnlog Version 3.08
## - more tesion)) Tarife from Michael Graw <Michael.Graw@bartlmae.de>
@ -484,7 +487,7 @@ SERVICEFILE = /etc/services
# DON'T EDIT BELOW THIS LINE
######################################################################
VERSION = 3.08
VERSION = 3.09
MANPAGES = isdnlog/callerid.conf.5 isdnlog/isdn.conf.5 isdnlog/isdnformat.5 isdnlog/isdnlog.5 isdnlog/isdnlog.8 isdnlog/isdnlog.users.5 isdnrep/isdnrep.1 isdnconf/isdnconf.1

View File

@ -1,4 +1,4 @@
/* $Id: processor.c,v 1.45 1999/03/20 14:33:07 akool Exp $
/* $Id: processor.c,v 1.46 1999/03/20 16:54:45 akool Exp $
*
* ISDN accounting for isdn4linux. (log-module)
*
@ -19,6 +19,9 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: processor.c,v $
* Revision 1.46 1999/03/20 16:54:45 akool
* isdnlog 3.09 : support for all Internet-by-call numbers
*
* Revision 1.45 1999/03/20 14:33:07 akool
* - isdnlog Version 3.08
* - more tesion)) Tarife from Michael Graw <Michael.Graw@bartlmae.de>
@ -612,7 +615,7 @@ static char *location(int loc)
} /* location */
static void buildnumber(char *num, int oc3, int oc3a, char *result, int version, int *provider, int *sondernummer, int *intern, int dir, int who)
static void buildnumber(char *num, int oc3, int oc3a, char *result, int version, int *provider, int *sondernummer, int *intern, int *internetnumber, int dir, int who)
{
auto char n[BUFSIZ];
auto int partner = ((dir && (who == CALLING)) || (!dir && (who == CALLED)));
@ -620,6 +623,7 @@ static void buildnumber(char *num, int oc3, int oc3a, char *result, int version,
*sondernummer = UNKNOWN;
*intern = 0;
*internetnumber = 0;
#ifdef Q931
if (q931dmp) {
@ -769,42 +773,41 @@ static void buildnumber(char *num, int oc3, int oc3a, char *result, int version,
} /* if */
#endif
if (!dir && (who == CALLED)) {
*sondernummer = is_sondernummer(num, *provider);
*intern = strlen(num) < interns0;
if (*sondernummer == UNKNOWN)
*sondernummer = is_sondernummer(num, DTAG); /* try with DTAG, these provider must support them all (i think) */
if (!dir && (who == CALLED) && !*intern) {
*internetnumber = isInternetAccess(*provider, num);
#ifdef 0
/* Das ist doch totaler Bloedsinn, oder?
* Schliesslich ist in *sondernummer doch der Index des Tabelleneintrags
* gespeichert. Den kann man doch nicht einfach auf 1 setzten. */
if (*sondernummer == UNKNOWN) {
if (!memcmp(num, "019", 3)) /* anything like 019xx is a Sondernummer! */
*sondernummer = 1;
if (!*internetnumber) {
*sondernummer = is_sondernummer(num, *provider);
if (*sondernummer == UNKNOWN)
*sondernummer = is_sondernummer(num, DTAG); /* try with DTAG, these provider must support them all (i think) */
} /* if */
#endif
} /* if */
*intern = strlen(num) < interns0;
#ifdef Q931
if (q931dmp) {
if (*sondernummer != UNKNOWN) {
auto char s[256];
if (q931dmp) {
auto char s[BUFSIZ];
sprintf(s, "(Sonderrufnummer %s : %s)", num,
sondernummername(*sondernummer));
if (*sondernummer != UNKNOWN) {
sprintf(s, "(Sonderrufnummer %s : %s)", num, sondernummername(*sondernummer));
Q931dump(TYPE_STRING, -1, s, version);
} /* if */
if (*internetnumber) {
sprintf(s, "(Internet access number %s)", num);
Q931dump(TYPE_STRING, -1, s, version);
} /* if */
if (*intern)
Q931dump(TYPE_STRING, -1, "(Interne Nummer)", version);
} /* if */
} /* if */
#endif
if ((*sondernummer == UNKNOWN) && !*intern)
if ((*sondernummer == UNKNOWN) && !*intern && !*internetnumber)
switch (oc3 & 0x70) { /* Calling party number Information element, Octet 3 - Table 4-11/Q.931 */
case 0x00 : if (*num) { /* 000 Unknown */
@ -852,12 +855,12 @@ static void buildnumber(char *num, int oc3, int oc3a, char *result, int version,
} /* switch */
if (*num)
strcat(result, num);
strcat(result, num);
else
strcpy(result, "");
print_msg(PRT_DEBUG_DECODE, " DEBUG> %s: num=\"%s\", oc3=%s(%02x), result=\"%s\", sonder=%d, int=%d, partner=%d\n",
st + 4, n, i2a(oc3, 8, 2), oc3 & 0x70, result, *sondernummer, *intern, partner);
print_msg(PRT_DEBUG_DECODE, " DEBUG> %s: num=\"%s\", oc3=%s(%02x), result=\"%s\", sonder=%d, intern=%d, internet=%d, partner=%d\n",
st + 4, n, i2a(oc3, 8, 2), oc3 & 0x70, result, *sondernummer, *intern, *internetnumber, partner);
} /* buildnumber */
@ -882,7 +885,7 @@ static int facility(int type, int l)
{
register int ls, i, ServedUserNr;
register char *px, *px1, *px2, *px3;
auto int c, result = 0, a1, a2, a3, oc3 = 0;
auto int c, result = 0, a1, a2, a3, a4, oc3 = 0;
static int ID = 0, OP = 0, EH = 0, MP = 0;
static char curr[64];
auto char s[BUFSIZ], s1[BUFSIZ], dst[BUFSIZ], src[BUFSIZ];
@ -1150,9 +1153,9 @@ static int facility(int type, int l)
sprintf(s1, "\"%s\"", src);
aoc_debug(-2, s1);
buildnumber(src, 0, 0, call[6].num[CLIP], VERSION_EDSS1, &a1, &a2, &a3, 0, 999);
buildnumber(src, 0, 0, call[6].num[CLIP], VERSION_EDSS1, &a1, &a2, &a3, &a4, 0, 999);
strcpy(vsrc, vnum(6, CLIP));
buildnumber(dst, oc3 * 16, 0, call[6].num[CLIP], VERSION_EDSS1, &a1, &a2, &a3, 0, 999);
buildnumber(dst, oc3 * 16, 0, call[6].num[CLIP], VERSION_EDSS1, &a1, &a2, &a3, &a4, 0, 999);
strcpy(vdst, vnum(6, CLIP));
/* sprintf(s, "%s %s/%s -> %s (%s)", px1, src, px2, dst, px3); */
@ -1240,7 +1243,7 @@ static int facility(int type, int l)
sprintf(s1, "\"%s\"", dst);
aoc_debug(-2, s1);
buildnumber(dst, 0, 0, call[6].num[CLIP], VERSION_EDSS1, &a1, &a2, &a3, 0, 999);
buildnumber(dst, 0, 0, call[6].num[CLIP], VERSION_EDSS1, &a1, &a2, &a3, &a4, 0, 999);
strcpy(vdst, vnum(6, CLIP));
sprintf(s, "deactivate %s %s/%s", px1, vdst, px2);
@ -2460,7 +2463,7 @@ static void decode(int chan, register char *p, int type, int version, int tei)
strcpy(s, s1);
} /* if */
buildnumber(s, oc3, oc3a, call[chan].num[CALLED], version, &call[chan].provider, &call[chan].sondernummer[CALLED], &call[chan].intern[CALLED], 0, CALLED);
buildnumber(s, oc3, oc3a, call[chan].num[CALLED], version, &call[chan].provider, &call[chan].sondernummer[CALLED], &call[chan].intern[CALLED], &call[chan].internetnumber[CALLED], 0, CALLED);
if (!dual)
strcpy(call[chan].vnum[CALLED], vnum(chan, CALLED));
@ -2516,7 +2519,7 @@ static void decode(int chan, register char *p, int type, int version, int tei)
if (strcmp(call[chan].onum[CALLING], s)) /* different! */
if ((call[chan].screening == 3) && ((oc3a & 3) < 3)) { /* we believe the first one! */
strcpy(call[chan].onum[CLIP], s);
buildnumber(s, oc3, oc3a, call[chan].num[CLIP], version, &call[chan].provider, &call[chan].sondernummer[CLIP], &call[chan].intern[CLIP], 0, 0);
buildnumber(s, oc3, oc3a, call[chan].num[CLIP], version, &call[chan].provider, &call[chan].sondernummer[CLIP], &call[chan].intern[CLIP], &call[chan].internetnumber[CLIP], 0, 0);
strcpy(call[chan].vnum[CLIP], vnum(6, CLIP));
#ifdef Q931
if (q931dmp && (*call[chan].vnum[CLIP] != '?') && *call[chan].vorwahl[CLIP] && oc3 && ((oc3 & 0x70) != 0x40)) {
@ -2556,7 +2559,7 @@ static void decode(int chan, register char *p, int type, int version, int tei)
call[chan].screening = (oc3a & 3);
strcpy(call[chan].onum[CALLING], s);
buildnumber(s, oc3, oc3a, call[chan].num[CALLING], version, &call[chan].provider, &call[chan].sondernummer[CALLING], &call[chan].intern[CALLING], call[chan].dialin, CALLING);
buildnumber(s, oc3, oc3a, call[chan].num[CALLING], version, &call[chan].provider, &call[chan].sondernummer[CALLING], &call[chan].intern[CALLING], &call[chan].internetnumber[CALLING], call[chan].dialin, CALLING);
strcpy(call[chan].vnum[CALLING], vnum(chan, CALLING));
#ifdef Q931
@ -2610,10 +2613,10 @@ static void decode(int chan, register char *p, int type, int version, int tei)
call[chan].oc3 = oc3;
#ifdef Q931
if (q931dmp)
buildnumber(s, oc3, -1, call[chan].num[CALLED], version, &call[chan].provider, &call[chan].sondernummer[CALLED], &call[chan].intern[CALLED], call[chan].dialin, CALLED);
buildnumber(s, oc3, -1, call[chan].num[CALLED], version, &call[chan].provider, &call[chan].sondernummer[CALLED], &call[chan].intern[CALLED], &call[chan].internetnumber[CALLED], call[chan].dialin, CALLED);
#endif
buildnumber(call[chan].digits, oc3, -1, call[chan].num[CALLED], version, &call[chan].provider, &call[chan].sondernummer[CALLED], &call[chan].intern[CALLED], call[chan].dialin, CALLED);
buildnumber(call[chan].digits, oc3, -1, call[chan].num[CALLED], version, &call[chan].provider, &call[chan].sondernummer[CALLED], &call[chan].intern[CALLED], &call[chan].internetnumber[CALLED], call[chan].dialin, CALLED);
strcpy(call[chan].vnum[CALLED], vnum(chan, CALLED));
@ -2635,7 +2638,7 @@ static void decode(int chan, register char *p, int type, int version, int tei)
}
else {
strcpy(call[chan].onum[CALLED], s);
buildnumber(s, oc3, -1, call[chan].num[CALLED], version, &call[chan].provider, &call[chan].sondernummer[CALLED], &call[chan].intern[CALLED], call[chan].dialin, CALLED);
buildnumber(s, oc3, -1, call[chan].num[CALLED], version, &call[chan].provider, &call[chan].sondernummer[CALLED], &call[chan].intern[CALLED], &call[chan].internetnumber[CALLED], call[chan].dialin, CALLED);
strcpy(call[chan].vnum[CALLED], vnum(chan, CALLED));
#ifdef Q931
@ -2690,7 +2693,7 @@ static void decode(int chan, register char *p, int type, int version, int tei)
*pd = 0;
strcpy(call[chan].onum[REDIR], s);
buildnumber(s, oc3, -1, call[chan].num[REDIR], version, &call[chan].provider, &call[chan].sondernummer[REDIR], &call[chan].intern[REDIR], 0, 0);
buildnumber(s, oc3, -1, call[chan].num[REDIR], version, &call[chan].provider, &call[chan].sondernummer[REDIR], &call[chan].intern[REDIR], &call[chan].internetnumber[REDIR], 0, 0);
strcpy(call[chan].vnum[REDIR], vnum(chan, REDIR));
#ifdef Q931
@ -4504,7 +4507,7 @@ static void processctrl(int card, char *s)
#endif
if (dual && *call[chan].digits) {
strcpy(call[chan].onum[CALLED], call[chan].digits);
buildnumber(call[chan].digits, call[chan].oc3, -1, call[chan].num[CALLED], version, &call[chan].provider, &call[chan].sondernummer[CALLED], &call[chan].intern[CALLED], call[chan].dialin, CALLED);
buildnumber(call[chan].digits, call[chan].oc3, -1, call[chan].num[CALLED], version, &call[chan].provider, &call[chan].sondernummer[CALLED], &call[chan].intern[CALLED], &call[chan].internetnumber[CALLED], call[chan].dialin, CALLED);
strcpy(call[chan].vnum[CALLED], vnum(chan, CALLED));
} /* if */

View File

@ -1,4 +1,4 @@
/* $Id: takt_de.c,v 1.15 1999/03/20 14:33:40 akool Exp $
/* $Id: takt_de.c,v 1.16 1999/03/20 16:54:54 akool Exp $
*
* ISDN accounting for isdn4linux. (log-module)
*
@ -19,6 +19,9 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: takt_de.c,v $
* Revision 1.16 1999/03/20 16:54:54 akool
* isdnlog 3.09 : support for all Internet-by-call numbers
*
* Revision 1.15 1999/03/20 14:33:40 akool
* - isdnlog Version 3.08
* - more tesion)) Tarife from Michael Graw <Michael.Graw@bartlmae.de>
@ -602,11 +605,21 @@ char *realProvidername(int prefix)
} /* realProvidername */
int isInternetAccess(int provider, char *number)
{
if (t[provider].used && (t[provider].InternetZugang != NULL) &&
!strcmp(number, t[provider].InternetZugang))
return(1);
else
return(0);
} /* isInternetAccess */
void preparecint(int chan, char *msg, char *hint, int viarep)
{
register int zone = UNKNOWN, provider = UNKNOWN, tz, i, cheapest = UNKNOWN;
auto struct tm *tm;
auto char why[BUFSIZ], s[BUFSIZ];
auto char why[BUFSIZ], s[BUFSIZ], s1[BUFSIZ];
auto double tarif = 0.0, tarif1, providertarif = 0.0, cheaptarif;
@ -627,9 +640,11 @@ void preparecint(int chan, char *msg, char *hint, int viarep)
sprintf(s, "Unknown Sonderrufnummer for provider %s. Using chargeinfos from provider DTAG.",
Providername(provider));
info(chan, PRT_SHOWCONNECT, STATE_CONNECT, s);
}
} /* if */
if ((call[chan].sondernummer[CALLED] != UNKNOWN) && /* Sonderrufnummer, Abrechnung zum CityCall-Tarif */
if (call[chan].internetnumber[CALLED])
zone = INTERNET;
else if ((call[chan].sondernummer[CALLED] != UNKNOWN) && /* Sonderrufnummer, Abrechnung zum CityCall-Tarif */
(sondertarif(call[chan].sondernummer[CALLED]) == SO_CITYCALL))
zone = CITYCALL;
else if ((call[chan].sondernummer[CALLED] != UNKNOWN) && /* Sonderrufnummer, kostenlos */
@ -735,8 +750,13 @@ void preparecint(int chan, char *msg, char *hint, int viarep)
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, saving %s %s/%ds",
cheapest, t[cheapest].Provider, s, WAEHRUNG,
if (zone == INTERNET)
sprintf(s1, "-%s", t[cheapest].InternetZugang);
else
*s1 = 0;
sprintf(hint, "HINT: Better use 010%02d%s:%s, %s, saving %s %s/%ds",
cheapest, s1, t[cheapest].Provider, s, WAEHRUNG,
double2str(providertarif - cheaptarif, 5, 3, DEB), TEST);
call[chan].hint = cheapest;
@ -961,9 +981,16 @@ void initTarife(char *msg)
if ((p = strchr(s, '#')))
*p = 0;
if ((p = strchr(s, '\n')))
else if ((p = strchr(s, '\n')))
*p = 0;
else
p = s + strlen(s) - 1;
p--;
while (*p == ' ')
*p-- = 0;
if (*s) {
@ -1037,7 +1064,7 @@ void initTarife(char *msg)
case '+' : if (!ignore) { /* +:nnn Verbindungsentgelt pro Gespraech */
if (prefix == UNKNOWN) {
warning("Unexpected tag 'I'");
warning("Unexpected tag '+'");
break;
} /* if */
@ -1047,7 +1074,7 @@ void initTarife(char *msg)
case '-' : if (!ignore) { /* -:nnn kostenlose Sekunden */
if (prefix == UNKNOWN) {
warning("Unexpected tag 'I'");
warning("Unexpected tag '-'");
break;
} /* if */

View File

@ -1,8 +1,8 @@
# @(#)tarif.dat 1.10 17-Mar-99 22:09
# @(#)tarif.dat 1.11 20-Mar-99 17:51
#
# Copyright 1995, 1999 by Andreas Kool (akool@isdn4linux.de)
#
V:1.10 [17-Mar-99]
V:1.11 [20-Mar-99]
#
# P: Provider
# G: tt.mm.jjjj Tarif g<>ltig ab
@ -33,7 +33,7 @@ G:01.03.1999
C:Homepage: http://www.o-tel-o.de
C:Hotline: 01803/1998 oder 0800/7370 (Geschaeftskunden)
C:Adresse: 96038 Bamberg
I:010110191501 # (Benutzername: otelo; Passwort: online)
I:0191501 # (Benutzername: otelo; Passwort: online)
Z:2-3,60/60
T:W08-18=0.20
T:W18-08=0.10
@ -43,11 +43,7 @@ T:W08-18=0.94
T:W18-08=0.47
T:E=0.47
Z:H,60/60
T:W08-09=0.06
T:W09-18=0.11
T:W18-22=0.08
T:W22-08=0.06
T:E=0.06
T:*=0.059
################################################################
P:13=Tele 2
G:08.02.1999
@ -95,7 +91,7 @@ C:MobilCom AG
C:Homepage: http://www.mobilcom.de
C:Hotline: 01805/191919
C:Adresse: Postfach 1249, 24822 Schleswig
I:0101901929 # (Benutzername: mobilcom; Passwort: mobilcom)
I:01929 # (Benutzername: mobilcom; Passwort: mobilcom)
Z:2-3,60/60
T:*07-19=0.16
T:*19-22=0.08
@ -105,7 +101,7 @@ T:*=0.49
Z:A-D,60/60
T:*=0.49
Z:H,60/60
T:*=0.06
T:*=0.05
################################################################
P:23=tesion ))
G:01.02.1999
@ -248,7 +244,7 @@ G:03.03.1999
C:Homepage: http://www.null1050.de
C:Hotline: 01802/2002
C:Faxabruf: 01802/2001
I:01050/019251 # (Benutzername: talknet; Passwort: talknet; Nameserver: 195.252.128.53)
I:019251 # (Benutzername: talknet; Passwort: talknet; Nameserver: 195.252.128.53)
Z:2-3,60/60
T:W08-21=0.18
T:W21-08=0.09
@ -273,7 +269,7 @@ T:*=0.09
P:70=Arcor
G:01.01.1999
C:Mannesmann Arcor
I:010700192070 # (Benutzername: arcor; Passwort: internet; Proxy: proxy.arcor-ip.de:80; Startseite: http://www.call.arcor.net)
I:0192070 # (Benutzername: arcor; Passwort: internet; Proxy: proxy.arcor-ip.de:80; Startseite: http://www.call.arcor.net)
Z:2-3,60/60
T:W09-18=0.18 # Standard
T:W18-09=0.10 # Spar
@ -297,8 +293,7 @@ T:E=0.48
Z:G,60/60
T:*=2.72 # FIXME
Z:H,60/60
T:*09-18=0.14
T:*18-09=0.10
T:*=0.06
################################################################
P:79=Viatel
G:24.12.1999
@ -340,7 +335,7 @@ C:keine Tarifdaten veroeffentlicht!
C:Vielmehr handelt es sich hier nur um die Tarife fuer den
C:UUnet Ortstarif-Zugang!
I:0191999
Z:1,0.12
Z:H,0.12
T:W02-05=240 # Nacht
T:W05-09=150 # Spar
T:W09-18=90 # Standard

View File

@ -1,4 +1,4 @@
/* $Id: tools.c,v 1.20 1999/03/20 14:34:10 akool Exp $
/* $Id: tools.c,v 1.21 1999/03/20 16:55:22 akool Exp $
*
* ISDN accounting for isdn4linux. (Utilities)
*
@ -19,6 +19,9 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: tools.c,v $
* Revision 1.21 1999/03/20 16:55:22 akool
* isdnlog 3.09 : support for all Internet-by-call numbers
*
* Revision 1.20 1999/03/20 14:34:10 akool
* - isdnlog Version 3.08
* - more tesion)) Tarife from Michael Graw <Michael.Graw@bartlmae.de>
@ -569,17 +572,19 @@ char *vnum(int chan, int who)
flag |= C_NO_ERROR;
#endif
if ((call[chan].sondernummer[who] != -1) || call[chan].intern[who]) {
if ((call[chan].sondernummer[who] != UNKNOWN) || call[chan].intern[who] || call[chan].internetnumber[who]) {
strcpy(call[chan].rufnummer[who], call[chan].num[who]);
if (cnf > -1)
strcpy(retstr[retnum], call[chan].alias[who]);
else if (call[chan].sondernummer[who] != -1) {
else if (call[chan].sondernummer[who] != UNKNOWN) {
if ((l1 = strlen(sondernum(call[chan].sondernummer[who]))) < l)
sprintf(retstr[retnum], "%s - %s", sondernummername(call[chan].sondernummer[who]), call[chan].num[who] + l1);
else
strcpy(retstr[retnum], sondernummername(call[chan].sondernummer[who]));
strcpy(retstr[retnum], sondernummername(call[chan].sondernummer[who]));
}
else if (call[chan].internetnumber[who])
sprintf(retstr[retnum], "INTERNET %s", call[chan].num[who]);
else
sprintf(retstr[retnum], "TN %s", call[chan].num[who]);
@ -732,7 +737,7 @@ static char *ltoa(register unsigned long num, register char *p, register int rad
while (--i);
return(p);
}
}
*/
/****************************************************************************/

View File

@ -1,4 +1,4 @@
/* $Id: tools.h,v 1.31 1999/03/20 14:34:17 akool Exp $
/* $Id: tools.h,v 1.32 1999/03/20 16:55:27 akool Exp $
*
* ISDN accounting for isdn4linux.
*
@ -20,6 +20,9 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: tools.h,v $
* Revision 1.32 1999/03/20 16:55:27 akool
* isdnlog 3.09 : support for all Internet-by-call numbers
*
* Revision 1.31 1999/03/20 14:34:17 akool
* - isdnlog Version 3.08
* - more tesion)) Tarife from Michael Graw <Michael.Graw@bartlmae.de>
@ -691,6 +694,7 @@ typedef struct {
char vnum[MAXMSNS][256];
int provider;
int sondernummer[MAXMSNS];
int internetnumber[MAXMSNS];
int intern[MAXMSNS];
char id[32];
char usage[16];
@ -970,6 +974,7 @@ _EXTERN void showcheapest(int zone, int duration, int ignoreprovider, char *in
_EXTERN void price(int chan, char *hint, int viarep);
_EXTERN char *realProvidername(int prefix);
_EXTERN void preparecint(int chan, char *msg, char *hint, int viarep);
_EXTERN int isInternetAccess(int provider, char *number);
_EXTERN int taktlaenge(int chan, char *why);
_EXTERN void initSondernummern(char *msg);
_EXTERN int is_sondernummer(char *number, int provider);