My _german_ README files ;-(

This commit is contained in:
luethje 1997-03-03 22:12:14 +00:00
parent fa05d6b60f
commit 7b34b61983
3 changed files with 514 additions and 0 deletions

112
lib/README.Syntax.conffile Normal file
View File

@ -0,0 +1,112 @@
Syntax zu den Konfigurationsdateien:
====================================
Leere Zeilen werden ignoriert. Wenn in einer Zeile ein "#" enthalten ist,
wird der Rest der Zeile als Kommentar gewertet.
Steht am Ende einer Nicht-Kommentarzeile ein "\", so wird die Zeile mit der
naechste Zeile zu einer "verschmolzen". Das Zeichen "\" muss als letztes
Zeichen stehen, und darf nicht von Tab's oder Leerzeichen gefolgt werden.
Innerhalb eines String braucht es nicht geqoutet werden.
Ein Eintrag wie
FRED = c:\sinnlos\
\sinnlos.exe
# ^ Hier besagt es Zeilenende, die anderen beiden "\"
# sind normale Zeichen.
# Die zweite Zeile muss dann direkt am Anfang beginnen,
# da sonst die Leerzeichen/Tabulatoren mit ausgewertet
# werden.
ist so erlaubt. Das Ergebnis dieser Zeile ist folgendes:
FRED = c:\sinnlos\sinnlos.exe
Die Datei hat eine aehnliche Syntax wie die smb.conf, win.ini usw.
Es gibt dort Sektionen und darunter Eintraege.
Die Syntax wurde allerdings um Untersektionen erweitert. Ein Eintrag kann
wieder eine Sektion darstellen. Diese Untersektionen koennen beliebig oft
verschachtelt sein.
Es wird die Gross/Kleinschreibung bei den Eintrags- und Sektionsnamen
ignoriert. Also vor dem Gleichheitszeichen. Danach wird sehr wohl in
Gross und Kleinschreibung unterschieden.
In den Sektions- und Eintragnamen duerfen folgende Zeichen nicht verwendet
werden: "*?|&/"
Wenn diese Zeichen werden beim Einlesen ignoriert.
Am Anfang einer Zeile (sowohl Sektionsname als auch einem Eintrag) koennen
beliebig viele Leerzeichen als auch Tabulatoren stehen:
[SECTION]
und
[SECTION]
sind equivalent.
In dem folgenden Beispiel sind Kommentare enthalten, die weitere Regeln
beschreiben, welche unbedingt beachtet werden muessen.
Beispiel:
BEGIN-OF-FILE
[SECTION1]
ENTRY1=blabla1
entry2 = blabla2
# ^^^-------- Es duerfen vor und nach dem Gleichheitszeichen beliebig
# Spaces und Tabulatoren verwendet werden.
# Das erste erkannte Zeichen nach dem
# Gleichheitszeichen darf weder ein space noch ein Tabublator
# sein.
Entry3 = {
# ^----- Dieses Zeichen besagt, das dieser Eintrag ein oder mehrere
# Untersectionen beinhaltet. Es MUSS in der gleichen Zeile
# stehen, wie der Eintragsnamen und das Gleichheitszeichen.
# ^^^^^^--------- "Entry3", "entry3" und "ENTRY3" sind equivalent!
[SUBSECTION1]
entry1 = bla1
...
[ subsection2 ]
# ^-----------^- Hier koennen wieder beliebige Spaces und Tabulatoren stehen.
# ^^^^^^^^^^--- "subsection2" und "SUBSECTION2" sind equivalent!
...
}
# ^-------------- Hier wird das Ende von Eintrag "ENTRY3" eingeleitet.
# Das Zeichen "}" muss in einer seperaten Zeile alleine
# stehen.
[SECTION2]
...
END-OF-FILE
Anders als bei Windows und Samba wird hier das Zeichen ";" NICHT
als Kommentarzeichen erkannt, sondern nur "#".
Es ist möglich eine weitere Datei einzubinden. Das wird durch den Eintrag
INCLUDE(Datei)
erreicht. Wird "Datei" mit einem relativen Pfad (oder ganz ohne Pfad)
angegeben, dann wird als aktuelles Verzeichnis, das angesehen,
wo die Datei liegt, die dieses INCLUDE enthaelt. Die Zeile "INCLUDE"
kann an beliebiger Stelle in der Konfigurationsdatei vorkommen.
Der Dateiname darf allerdings keine Leerzeichen und Tabulatoren enthalten.
Beispiel:
Datei /etc/myconfig/fred enthaelt folgende Zeile:
INCLUDE(../myinclude)
Dann wird nach der Datei /etc/myinclude gesucht. Es ist voellig
unabhaengig davon, in welchem Verzeichnis das Programm gestartet wurde,
das die Konfigurationsdatei lesen soll.
Wenn Dateien rekursiv eingebunden werden, fuehrt dieses mit Sicherheit
zum Absturz des Programmes. Dieses wird von der Library nicht verhindert.

190
lib/README.conffile Normal file
View File

@ -0,0 +1,190 @@
CONFFILE LIB 25-FEB-97
Datenstrukuren:
Die Entries:
typedef struct _entry {
char *name; /* Name des Entries z.B. "NUMBER", hier stehen _immer
Grossbuchstaben! */
char *value; /* Hier steht der Wert, oder NULL, wenn subsection
belegt ist, da nur einer von beiden einen Wert
haben kann */
struct _section *subsection; /* Hier kann wieder eine Subsection
kommen oder NULL */
struct _entry *next; /* Hier beginnt die verkettete Liste mit dem
naechsten Entry einer Section */
char flag; /* Interne Zwecke */
} entry;
typedef struct _section {
char *name; /* Name der Setcion z.B. "GLOBAL", hier stehen _immer
Grossbuchstaben! */
entry *entries; /* Hier haengt die Liste der Entries fuer diese
Section. */
struct _section *next; /* Hier kommen die naechsten Sectionen.
Ist eine verkettete Liste */
char flag; /* Interne Zwecke */
} section;
-----------------------------------------------------------------------------
Funktion:
int Get_Type_Value(section *Section, char *Path, int Type, void **Pointer)
Section: ist der Pointer der auf die Sectionen zeigt. Diesen erhaelt man
von einer Funktion, die die Konfigurationsdateien einliest.
Path: Beschreibt, welchen Wert man haben will in Form eines UNIX-Pfades.
Da ein Entry immer in der zweiten Ebene und eine Vielfache davon ist,
muss die Pfad-Anzahl immer modulo 2 sein:
"NUMBER/ALIAS" (Section,Entry)
"NUMBER/START/FLAG/PROGRAMM" (Section,Entry,SubSection,Entry)
Type: Beschreibt den Rueckgabewert. Kann einen der folgenden Werte annehmen:
#define R_TYPE_INT 0
#define R_TYPE_LONG 1
#define R_TYPE_DOUBLE 2
#define R_TYPE_CHAR 3
#define R_TYPE_STRING 4
Pointer: ist die Variable, in der der Wert gespeichert werden soll. Fuer
einen integer, long, double, char und char* immer "&var" verwenden.
Bei char* darf kein String uebergeben werden, sonder ein Pointer
auf einen char, da hier nur der gefundene String einsetzt wird,
und nicht kopiert wird.
Als Rueckgabewert erhaelt man -1 bei einem Fehler (nicht gefunden),
0 bei int, long, double, und char, und bei char* die Laenge des Strings.
Diese Funktion kann in einer while-Schleife verwendet werden. Wenn Section und
Path beim ersten Aufruf mit einem Wert ungleich NULL belegt werden zur
Initialisierung. Dann kann man diese bei den naechsten Aufrufen auf NULL
setzen. Das Prinzip ist das gleich wie die Funktion strtok().
Beispiel:
...
path ="*/double*";
while (Get_Type_Value(ptr,path,R_TYPE_INT,&iV) >= 0)
{
...
ptr = NULL;
path = NULL;
}
In diesem Beispiel werden dann alle Werte ausgelesen, die folgende Konditionen
entsprechen:
- Section muss mit "*" matchen.
- Entry muss mit "double*" matchen. ("double" und "DOUBLE" ist das gleiche.)
- Der Wert _muss_ ein double sein!
-----------------------------------------------------------------------------
Funtion:
Get_Type_Match(section *Section, char *Path, char* Pattern,
int (*_match)(char*, char*), int Type, void **Pointer)
Hat die gleiche Funktionsweise und Parameter, wie Get_Type_Value.
Zusaetzliche Parameter:
Pattern: Ist ein String, der fuer die Funktion match zum Vergleichen
verwendet wird.
(*_match): Hier kann eine Funktion uebergeben werden, mit dem der String
("NUMBER= 07531 / 21103", der Teil nach dem "=" ist der String)
mit dem Pattern in folgender Form aufgerufen wird:
_match(Pattern,String). Hier kann man funktionen wie
strcpy(char*,char*) und num_match(char*,char*) (ist eine Funktion
zum Vergleichen von Telefonnummern auf Gleichheit) verwenden.
Zu dem obigen Beispiel muesste neben diesen drei Bedingungen noch folgende
gelten:
- _match(Pattern,String) liefert 0 zurueck.
-----------------------------------------------------------------------------
Funktion:
char *Get_Value(section *Section, char *Path)
Liefert die erste Section zurueck, die auf dem Pfad matched.
Section: ist der Pointer der auf die Sectionen zeigt. Diesen erhaelt man
von einer Funktion, die die Konfigurationsdateien einliest.
Path: Beschreibt, welchen Wert man haben will in Form eines UNIX-Pfades.
Da ein Entry immer in der zweiten Ebene und eine Vielfache davon ist,
muss die Pfad-Anzahl immer modulo 2 sein:
"NUMBER/ALIAS" (Section,Entry)
"NUMBER/START/FLAG/PROGRAMM" (Section,Entry,SubSection,Entry)
Liefert die Section, die auf den Pfad matched, zurueck. Wenn keine (mehr)
vorhanden ist, dann ist der Rückgabewert NULL.
Diese Funktion kann in einer while-Schleife aufgrufen werden. Dafuer muessen
die beiden Parameter beim zweiten und weiteren Aufrufen auf NULL gesetzt
werden.
-----------------------------------------------------------------------------
Funktion:
section* Get_Section_Match(section* Section, char *Path,
char* Value, int (*_match)(char*, char*),
entry **RetEntry )
Liefert die erste Section zurueck, die auf dem Pfad und auf Value (dieser
Wert muss mit dem entsprchenden Wert von dem Entry passen, der im Pfad
gegeben ist. z.B. "NUMBER/NUMBER") matched.
Section: ist der Pointer der auf die Sectionen zeigt. Diesen erhaelt man
von einer Funktion, die die Konfigurationsdateien einliest.
Path: Beschreibt, welchen Wert man haben will in Form eines UNIX-Pfades.
Da ein Entry immer in der zweiten Ebene und eine Vielfache davon ist,
muss die Pfad-Anzahl immer modulo 2 sein:
"NUMBER/ALIAS" (Section,Entry)
"NUMBER/START/FLAG/PROGRAMM" (Section,Entry,SubSection,Entry)
(*_match): Hier kann eine Funktion uebergeben werden, mit dem der String
("NUMBER= 07531 / 21103", der Teil nach dem "=" ist der String)
mit dem Pattern in folgender Form aufgerufen wird:
_match(Pattern,String). Hier kann man funktionen wie
strcpy(char*,char*) und num_match(char*,char*) (ist eine Funktion
zum Vergleichen von Telefonnummern auf Gleichheit) verwenden.
Wird fuer diesen Parameter NULL uebergeben, wird ein normaler
strcmp() durchgefuert.
Wert: Ist ein Pattern, der mit dem Wert des Entries passen muss.
Wenn nach einer Subection gesucht wird, dann kann dieser Parameter
genau so wie _match NULL sein.
RetEntry: Optional. Hier wird sonst ein Pointer auf einen Pointer auf
einen Entry eingetragen. Dieser liefert dann den gefundenen
Entry zurueck.
Rueckgabewert:
Einweder die gefundene Section oder NULL.
Diese Funktion kann in einer while-Schleife aufgrufen werden. Dafuer muessen
die beiden Parameter beim zweiten und weiteren Aufrufen auf NULL gesetzt
werden.
-----------------------------------------------------------------------------
Da noch nicht mehr dokumentiert ist, verweise ich mal frech auf die Dateien
lib/conffile.c und vboxgetty/vboxlib.c ;-(((

212
lib/README.isdntools Normal file
View File

@ -0,0 +1,212 @@
ISDNTOOLS 25-FEB-97
-----------------------------------------------------------------------------
Funktion:
void set_print_fct_for_lib(int (*new_print_msg)(const char *, ...))
Alle Ausgaben werden nicht durch printf() oder aehnlichem in dieser gesamten
Lib realisiert, sondern durch die Funktion, die hier gesetzt wird. Daher
sollte diese Funktion zuerst aufgerufen werden, bevor eine andere Funktion
aus dieser Lib verwendet wird.
new_print_msg: Hat die glieche Syntax wie printf.
Wenn diese Funtktion vorher nicht aufgerufen wird, wird printf verwendet.
-----------------------------------------------------------------------------
Funktion:
int num_match(char* Pattern, char *number)
Vergleicht zwei Nummern miteinander.
Pattern: Ist eine Telefonnummer, die auch Wildcards, wie '*' und '?'
beinhalten kann. Es koennen hier auch mehrere Nummern hinter
einander stehen, durch Kommata getrennt:
"21103", "07531 / 2110-*", "+49 7531 21103, 9124*, 441777"
Es muessen hier weder eine Laender- noch eine Ortsvorwahl
vorhanden sein. Diese werden durch AREACODE und COUNTRYCODE
ergaenzt.
number: Ist _eine_ _vollstaendige_ (mit Laender- und Ortsvorwahl) Nummer.
Das Prefix der Laendervorwahl muss identisch sein mit S_COUNTRY_PREFIX!
S_COUNTRY_PREFIX = "00" -> "0049753121103"
S_COUNTRY_PREFIX = "haha" -> "haha49753121103"
Liefert bei Gleichheit 0 zurück, andernfalls != 0.
-----------------------------------------------------------------------------
Funktion:
char *expand_number(char *s)
Expandiert eine Nummer auf ihre volle Laenge mit Laender- und Ortsvorwahl.
Der Prefix der Laendervorwahl wird S_COUNTRY_PREFIX gesetzt.
Es werden folgende Zeichen herausgefiltert: " /-". Wenn das '+' an erster
Stelle steht, wird es durch S_COUNTRY_PREFIX ersetzt.
"21103" -> "0049753121103"
"040/441777" -> "004940441777"
"+49 7531/2110*" -> "004975312110*"
s: Beinhaltet die Telefonnummer, die expandiert werden soll.
Der Rueckgabewert ist _immer_ ein String. Im Fehlerfall ein leerer String.
Der Rueckgabewert ist eine statische Variable. Daher sollte der Rueckgabewert
immer anschliessend kopiert werden. Wenn diese Funktion zweimal hinter einander
aufgerufen wird, wird der erste Rueckgabewert ueberschrieben.
-----------------------------------------------------------------------------
Funktion:
char *expand_file(char *s)
Expandiert ein Dateinamen fuer einen Benutzerverzeichnis:
User fred: "~/..." -> "/home/fred/..."
"~hans/..." -> "/home/hans/..."
s: beinhaltet den zu expandierenden Dateinamen.
Der Rueckgabewert ist _immer_ ein String. Im Fehlerfall ein leerer String.
Der Rueckgabewert ist eine statische Variable. Daher sollte der Rueckgabewert
immer anschliessend kopiert werden. Wenn diese Funktion zweimal hinter einander
aufgerufen wird, wird der erste Rueckgabewert ueberschrieben.
-----------------------------------------------------------------------------
Funktion:
char *confdir(void)
Liefert das aktuelle Konfigurations-Verzeichnis fuer isdn zurueck.
Der Ruekgabewert enthaelt defaultmaessig den eincompilierten Pfad (/etc/isdn).
Wenn die Umgebungsvariable "ISDN_CONF_PATH" gesetzt ist, wird dieser
zurueckgeliefert.
-----------------------------------------------------------------------------
Funktion:
int create_runfile(const char *progname)
Legt eine PID-Datei im Verzeichnis RUNDIR (/var/run) an. In der Datei
steht im ASCII-Format die Prozess-ID des aktuellen Prozesses.
progname: Ist der Name, der als PID-Datei angelegt wird.
"fred" -> "/var/run/fred.pid"
"isdnlog.tty2" -> "/var/run/isdnlog.tty2.pid"
Rueckgabewert:
Wenn schon ein gueltiger/laufender Prozess mit der ID besteht liefert
Die Funktion die PID zurueck.
Wenn die Datei ordnungsgemaess angelegt werden konnte liefert sie 0 zurueck,
andernfalls -1.
-----------------------------------------------------------------------------
Funktion:
int delete_runfile(const char *progname)
Loescht eine PID-Datei im Verzeichnis RUNDIR (/var/run).
progname: Ist der Name, der als PID-Datei geloescht werden soll.
"fred" -> "/var/run/fred.pid"
"isdnlog.tty2" -> "/var/run/isdnlog.tty2.pid"
Rueckgabewert:
Im Erfolgsfall 0, sonst -1.
-----------------------------------------------------------------------------
Funktion:
int Set_Codes(section* Section)
Setzt die Eintraege der Section [GLOBAL] in die entsprechenden
Variablen. Ausserdem wird die Section [VARIABLES] gesetzt. Alle Entries
aus dieser Section werden als Umgebungsvariablen gesetzt.
Section: ist der Pointer der auf die Sectionen zeigt. Diesen erhaelt man
von einer Funktion, die die Konfigurationsdateien einliest.
Es werden folgende Variablen gesetzt:
COUNTRYCODE -> mycountry
AREACODE -> myarea
AREALIB -> acFileName
AVONLIB -> avonlib
Rueckgabewert:
Wenn nicht mindestens COUNTRYCODE und AREACODE gesetzt werden, liefert
die Funktion -1 zurueck, andernfalls 0.
-----------------------------------------------------------------------------
Funktion:
char *get_areacode(char *code, int *Len, int flag)
Liefert zu der uebergebenen Telefonnummer den Ortsnamen oder falls diese
nicht bekannt den Laendernamen (falls diese bekannt ist ;-)).
Diese Informationen werden entweder dem areacode oder dem AVON entnommen
(je nachdem mit was diese Lib uebersetzt wurde.
code: Beinhaltet die Telefonnummer.
Len: Wenn dieser Wert != NULL, wird hier der Laenge der Vorwahl oder
der Laenderkennung (je nachdem was gefunden wurde) zurueckgegeben.
Wenn kein Name vorhanden ist, wird -1 zurueckgeliefert.
flag: Kann folgende Werte besitzen, die mit ODER verknuepft werden koennen:
C_NO_EXPAND: Die Telefonnummer soll vorher nicht mit expand_number()
expandiert werden.
C_NO_WARN : Es sollen keine Warings-Meldungen ausgegeben werden.
C_NO_ERROR : Es sollen keine Error-Meldungen ausgegeben werden.
Rueckgabewert:
Wenn ein Name gefunden wurde, wird dieser zurueck geliefert.
Der Rueckgabewert ist eine statische Variable. Daher sollte der Rueckgabewert
immer anschliessend kopiert werden. Wenn diese Funktion zweimal hinter einander
aufgerufen wird, wird der erste Rueckgabewert ueberschrieben.
Im Fehlerfall wird NULL zurueckgeliefert.
-----------------------------------------------------------------------------
Funktion:
int read_conffiles(section **Section, char *groupfile)
Liest die Konfigurationsfiles "`confdir()`/isdn.conf", groupfile und "~/.isdn"
nacheinander ein und stellt sicher, dass die Sectionen [MSN] und [NUMBER]
anhand von von der Telefonnummer (Entry NUMBER) eindeutig sind.
Anschliessend wird Set_Codes() ausgefuehrt.
Diese Funktion liest die Sectionen nur neu ein, wenn einer der oben
genannten Dateien veraendert wurde. Nur beim ersten mal werden die
Informationen auf jeden Fall gelesen.
Section: ist der Pointer des Pointers der auf die Sectionen zeigt. Dieser
_MUSS_ beim ersten Aufruf NULL sein. Andernfalls ist mit einem
Absturz zu rechnen!!!!
groupfile: Wird fuer Ghandi's vbox benoetigt.
Rueckgabewert:
Liefert 1 zurueck, wenn die Konfiguration neu eingelesen wurde. Wurde keine
Konfiguration seit dem letzten Einlesen veraendert, wird 0 zurueck geliefert.
Im Fehlerfalle wird -1 geliefert.
-----------------------------------------------------------------------------