* Uwe Furchheim <[EMAIL PROTECTED]> schrieb:
> nur isdnrep hat ein problem: es wird als provider immer nur der
> defaultprovider (telekom) ausgegeben!!! keine fehlermeldungen oder
> warnungen von isdnrep...

 Hier existiert tats�chlich ein Fehler in isdnrep.  Verbindungen �ber
Provider, deren Nummer wie etwa in der rate.conf angegeben gr��er gleich
der Anzahl der in der rate-de.dat aufgef�hrten Provider ist, werden dem
preselected-Provider zugerechnet.  Gegenw�rtig mit 58 Provider betrifft
das die 01058 und alle folgenden.


 Im folgenden meine behutsam editierten Notizen, die mich zu dieser
Aussage und einer Probleml�sung f�hrten.

 Anhand der genannten Fehlereingrenzung auf isdnrep findet sich 
auf den ersten Blick findet sich in Zeile 2250 in
isdnlog/isdnrep/isdnrep.c eine Anweisung, die f�r diese Zuordnung
verantwortlich sein k�nnte.

Funktion set_caller_infos:
>       case  17: if (!adapt) {
>                   cur_call->provider = atoi(array[i]);
>                   /* Korrektur der falschen Eintrage bis zum 16-Jan-99 */
>                   if (cur_call->provider <= UNKNOWN || cur_call->provider >= 
>MAXPROVIDER)
>                     cur_call->provider = preselect;
>                   /* -lt- provider-# may change during time */
>                   cur_call->provider = pnum2prefix(cur_call->provider,cur_call->t);
>                 } /* if */
>                 break;

 case 17: behandelt das 18. Feld eines Logfileeintrags, also die
Providernummer.

 adapt kann mit 0 angenommen werden, solange die Zielrufnummer nicht mit
+4010(19|33|70) beginnt.

 UNKNOWN ist -1, UNDEFINED w�re -2 (aus isdnlog/tools/tools.h).

 MAXPROVIDER ist anf�nglich 1000 (aus isdnlog/tools/tools.h), an dieser
Stelle aber ein Alias f�r getNProvider() aus isdnlog/tools/rate.c, das
die Anzahl der Provider angibt, gegenw�rtig (mit rate-de.dat V:3.04)
sind dies 58.

 Damit trifft diese Abfrage, die wohl ung�ltige Providernummern
verhindern soll, z. B. auf eine | 78| im Logfile zu, da nicht so
viele (Anzahl) Provider definiert sind.  Es sollte daher f�r diesen
Test nicht die im Logfile angegebene Nummer, die Kennzahl des Providers
(010xx) verwendet werden, sondern der interne Z�hlindex dieses
Providers.

 pnum2prefix weiter unten macht folgendes
(nach/in isdnlog/tools/rate.c:)
 * int pnum2prefix(int pnum, time_t when)
 *   converts the external provider number to the internal prefix at
 *   the given date/time when, or know if when is 0

 Der zweite Parameter dient zum Handling von zeitlichen G�ltigkeiten der
Bauform P:[from-to]pnum,var aus der rate-de.dat; soll hier nicht weiter
interessieren.

 Findet pnum2prefix nichts, wird UNKNOWN zur�ckgeben.

 Somit bietet sich folgende L�sung an (ohne Anspruch auf maximale
Eleganz):

>       case  17: if (!adapt) {
>                   cur_call->provider = atoi(array[i]);
>                   /* Korrektur der falschen Eintrage bis zum 16-Jan-99 */
>                   if (cur_call->provider <= UNKNOWN)
>                     cur_call->provider = preselect;
>                   /* -lt- provider-# may change during time */
>                   cur_call->provider = pnum2prefix(cur_call->provider,cur_call->t);
>                   /* provider from logfile unknown in ratefile or rateconf
>                    * --> default to preselected provider */
>                   if (cur_call->provider == UNKNOWN)
>                     cur_call->provider = pnum2prefix(preselect, cur_call->t);
>                 } /* if */
>                 break;

 Vor Umwandlung der Providernummer aus dem logfile in die interne
Providernummer (in dieser Nachricht auch als interner Z�hlindex
bezeichnet) wird nur noch gegen zu kleine Angaben gepr�ft.  Die Pr�fung
nach oben entf�llt -- gegenw�rtig w�re 299 f�r 0190-0-99 das maximal
denkbare --, stattdessen werden alle unbekannten oder in der rate.conf
nicht aktivierten Provider dem preselected-Previder zugewiesen.

 Noch etwas zur Historie dieser Quelltextdatei:  Der Aufrug von
pnum2prefix erschient in Revision 1.88 am 2000/02/07 mit isdnlog 4.09,
die Pr�fung cur_call->provider >= MAXPROVIDER in Revision 1.91 am
2000/05/27 mit isdnlog 4.25.


 Ende der Details zur Fehlerursache.  Der Patch mit der oben gezeigten
�nderung f�r ~/isdn4k-utils/isdnlog/isdnrep/isdnrep.c ist angehangen
und sollte sich mittels patch -p0 < patchfile im Verzeichnis 
~/isdn4k-utils/isdnlog anwenden lassen.


 Gru� Tobias

-- 
Tobias Becker            E-Mail [EMAIL PROTECTED]       PGP 0xD06BB70D
* Beschr�nke dich nicht auf den Zweig oder das Blatt, sonst vergisst du,
dass sie Teil eines Baumes sind. Und beschr�nke dich nicht auf den Baum,
sonst vergisst du, dass er Teil eines Waldes ist. * Mario Vargas Llosa *
Index: isdnrep/isdnrep.c
===================================================================
RCS file: /i4ldev/isdn4k-utils/isdnlog/isdnrep/isdnrep.c,v
retrieving revision 1.95
diff -u -r1.95 isdnrep.c
--- isdnrep/isdnrep.c   2001/03/21 10:24:01     1.95
+++ isdnrep/isdnrep.c   2003/01/16 16:02:53
@@ -2246,10 +2246,14 @@
                        case  17: if (!adapt) {
                                    cur_call->provider = atoi(array[i]);
                                                                        /* Korrektur 
der falschen Eintrage bis zum 16-Jan-99 */
-                                                                       if 
(cur_call->provider <= UNKNOWN || cur_call->provider >= MAXPROVIDER)
+                                                                       if 
+(cur_call->provider <= UNKNOWN)
                                                                                
cur_call->provider = preselect;
                                                                        /* -lt- 
provider-# may change during time */
                                                                        
cur_call->provider = pnum2prefix(cur_call->provider,cur_call->t);
+                                                                       /* provider 
+from logfile unknown in ratefile or rateconf
+                                                                        * --> default 
+to preselected provider */
+                                                                       if 
+(cur_call->provider == UNKNOWN)
+                                                                               
+cur_call->provider = pnum2prefix(preselect, cur_call->t);
                                                                } /* if */
                                                                break;
 

Reply via email to