From f68fc8e2190984e5a61e7d599170bbe2015a4b53 Mon Sep 17 00:00:00 2001 From: Matthias Urlichs Date: Wed, 8 Nov 1995 19:17:48 +0100 Subject: [PATCH] isdn-19 --- DOKU | 136 +++++++++++--- Makefile | 3 - README | 14 ++ alaw/alaw.c | 2 +- alaw/tools/toalaw.c | 2 +- alaw/tools/tosnd.c | 2 +- cards/Makefile | 2 +- cards/arnet/arnet.c | 379 ++++++++++++++++++++------------------- cards/capi/bintec.c | 27 +-- cards/dumb/shell.c | 7 +- cards/loader.c | 6 +- compat/Makefile | 9 - compat/compat.c | 16 +- fakeh/fakeh.c | 2 +- include/f_user.h | 2 +- include/kernel.h | 10 +- include/loader.h | 7 +- include/primitives.h | 4 +- include/streamlib.h | 2 +- include/streams.h | 4 +- include/sys/aux-stream.h | 2 +- include/vectcmp.h | 2 +- ip_mon/ip_mon.c | 2 +- ip_mon/tools/monitor.c | 2 +- isdn_2/isdn_2.c | 10 +- isdn_3/capi.c | 24 +-- isdn_3/isdn_3.c | 63 +++---- isdn_3/prot_1TR6_1.c | 44 +++-- isdn_3/prot_ETS.c | 6 +- isdn_4/cf.c | 4 +- isdn_4/conn.c | 45 +++-- isdn_4/info.c | 94 +++++----- isdn_4/master.c | 18 +- isdn_4/master.h | 37 ++-- isdn_4/match.c | 55 ++++-- isdn_4/nr.c | 6 +- isdn_4/texts.c | 13 +- isdn_4/work.c | 71 +++++--- ksupport/count.c | 2 +- ksupport/log.c | 2 +- ksupport/logh.c | 2 +- ksupport/proto.c | 30 ++-- ksupport/qinfo.c | 2 +- pr_on/pr_on.c | 2 +- rate/rate.c | 2 +- reconnect/reconnect.c | 2 +- str_if/str_in.c | 2 +- str_if/str_in2.c | 2 +- str_if/str_linux.c | 3 +- str_if/str_none.c | 2 +- str_if/str_str.c | 2 +- str_if/tools/slipto.c | 2 +- streams/Makefile | 7 - streams/stream.h | 4 +- streams/streams_io.c | 32 ++-- streams/streams_sys.c | 7 +- strslip/strslip.c | 2 +- support/sioctl.c | 2 +- support/streams.c | 2 +- t70/t70.c | 2 +- timer/timer.c | 2 +- tools/isdn.conf | 4 +- tools/rc.isdn | 5 +- v110/v110.c | 2 +- van_j/van_j.c | 2 +- x75/x75.c | 1 - 66 files changed, 711 insertions(+), 554 deletions(-) diff --git a/DOKU b/DOKU index 4a02333..445dfe6 100644 --- a/DOKU +++ b/DOKU @@ -16,6 +16,11 @@ unter der GPL bzw. ihrem deutschen Achtung: ======= +Es gibt eine Mailingliste zum Thema: linux-isdn@uranus.central.de. +"Bitte trag mich ein"-Requests bitte _nicht_ drothin, sondern an +linux-isdn-request@uranus.central.de. + + Version 14: Die CL- und DL-Zeilen haben sich geändert (erweitert um -Parameter). Intelligente Karten funktionieren NOCH NICHT. @@ -140,14 +145,19 @@ wer kann und will, m Kernelpatches ============= -Die Patches basieren auf dem in der Versionsnummer bezeichneten Kernel. +Die Patches basieren auf dem Kernel 1.2.11. Frühere bzw. spätere Kernels auf eigene Gefahr bzw. Bastelei. +Insbesondere sollten die Leute, die meckern, weil sie den Kram nicht unter +1.3.xx zum Laufen bekommen, sich ernsthaft fragen, wieso sie einen Kernel +einsetzen, der ausdrücklich für Leute gedacht ist, die selber nach Bugs +suchen können. Was die einzelnen Patches machen und ob sie benötigt werden, steht in den einzelnen Dateien am Anfang. Lesen, bevor der Kernel verändert wird! -Der Kernel sollte mit CONFIG_MODVERSIONS gebaut werden. +Der Kernel sollte mit CONFIG_MODVERSIONS gebaut werden; das ist zwar nicht +unbedingt notwendig, aber sinnvoll. Das modutils-1.2.8-Paket wird in jedem Fall benötigt, um Parameter an die einzelnen Module zu übergeben. @@ -223,16 +233,24 @@ for i in biglog more_free setnoswap ; do patch -p0 -d /usr/src/linux < $i done # Andere Patche in diesem Verzeichnis ansehen, evtl. ebenfalls installieren. +# Vorsicht, die Patches beruhen auf Linux 1.2.11. # # Kernel installieren und booten. # (alten Kernel unbedingt zu Backupzwecken erhalten!) # Danach: -vi config/config.data -# Zeile "PROTOCOLS" und "SUBPROTOCOLS" ansehen. Siehe unten "DL-Zeile". make.isdn -# Als Superuser: +# Wenn er nun über config.new und config.data meckert: +# Siehe unten Probleme. +# mv config/config.new config/config.data +# vi config/config.data +# # Insbesondere: Zeilen "PROTOCOLS" und "SUBPROTOCOLS" ansehen. +# # Siehe unten "DL-Zeile". +# Danach: Nochmal make.isdn starten. +# +# Nun als Superuser: make.isdn +# oder einfach "make install". Editiere /lib/modules/modules.isdn: -o Tel0 isdn/teles.o name=$(cardname Tel0) mem=0xD6000 irq=5 ipl=1 anstatt @@ -245,6 +263,54 @@ vi /etc/isdn.conf # ISDN-Nummern, Dienste, etc. eintragen Sämtliche Gerätedateien werden automatisch angelegt. +Probleme bei der Installation +-------- + +Als allererstes: Der obige Hinweis re Kernel installieren sollte ernst +genommen werden. Grund: Jeder modularisierte Treiber _braucht_ Zugriff auf +die korrekt konfigurierten Sourcen genau des Kernels, unter dem er später +laufen soll. Dies gilt ganz besonders, wenn der Kernel mit +CONFIG_MODVERSIONS gebaut wurde (das ist um einiges sicherer!). + +Wenn sich die Module nicht laden lassen, weil insmod Sachen wie "kfree" +nicht findet, dann liegt das daran, daß die Version der Sourcen des +Kernels, des laufenden Kernels, und der ISDN-Treiber, nicht übereinstimmt. + +Also: cd /wo/auch/immer/ist/src/linux; make config; make dep; make; +make modules; make modules_install; cp arch/i386/boot/zImage /boot/linux\ +.versionsnummer; vi /etc/lilo.conf; lilo; reboot. + +Disclaimer: So mache ich das. + + +config.new und config.dist und config.data. Das Problem ist, daß ich an der +config.data gelegentlich was ändern muß, aber der Benutzer daran auch +rumspielt (dazu ist die Datei da). Was tun? +Einfach: Mit den Parametern der alten config.data wird die neue config.dist +"geladen", und das Ergebnis liegt nun in config.new. Dasselbe passiert, +wenn es noch keine config.data gibt. In beiden Fällen tut man gut daran, +sich die Datei config.new näher anzusehen, evtl. mit der alten config.data +zu vergleichen, und dann "mv config.new config.data". Sicherheitshalber +weigert sich das Makefile in config/, ohne diesen Schritt weiterzuarbeiten. + + +Autoconfig und wieso nicht: Nein, ich weigere mich (momentan), automatisch +nach Karten, deren Interrupts, deren Konfigurationsregister etc.pp. zu +suchen. Bei einem laufenden Kernel ist das alles andere als einfach! + +Stattdessen müssen die entsprechenden Daten in /lib/modules/modules.isdn +eingetragen werden. Wenn irgendwas nicht stimmt, wird im allgemeinen die +Karte nicht erkannt und das Treibermodul nicht geladen. +Ausnahme: IRQs, die werden momentan nicht überprüft. Das kann man manuell +machen: nach der installation der Treiber beim ISDN-Anschluß der Karte +anrufen. Dann "cat /proc/interrupts". Wenn neben dem Wort ISDN eine Zahl +kleiner drei steht, stimmt was nicht -- anderen Interrupt probieren, +BIOS-Konfiguration überprüfen: auch korrekt eingestellte Interrupts können +Probleme machen, wenn zB das BIOS eines PCI-Rechners den Interrupt zu einem +PCI- anstatt zu einem ISA-Slot routet. (Evtl müssen da trotz BIOS- +Konfiguration noch Jumper auf dem Mainboard umgesetzt werden. Doku des +Teils lesen!) + Treiberparameter: ----------------- @@ -284,8 +350,9 @@ Beispiel: insmod d_teles.o rmmod Tel0 ; rmmod d_teles.o -Alle Treiber können vor oder nach Start des Masterprogramms geladen oder -wieder entfernt werden. Aktive Verbindungen werden (unsauber) abgebrochen. +Alle Kartentreiber können vor oder nach Start des Masterprogramms geladen +oder wieder entfernt werden. Aktive Verbindungen werden (unsauber) +abgebrochen. Testen: @@ -561,6 +628,10 @@ Alle Zeilentypen: möglich (Beispiel: "Bin0/23".) sind einzelne Buchstaben, die der betreffenden Zeile eine Sonder- behandlung verpassen. Welche, ist jeweils beschrieben. + Die Unterscheidung "mehrere gleichzeitig" oder "nur eine + gleichzeitig" bei Wählverbindungen bezieht sich jeweils auf eine + Art/Partner-Kombination; allgemeinere Einschränkungen werden mit + einer Extra-CL-Zeile realisiert. ist eine Folge von einem oder mehr Parameter-Wert-Angaben. (Manche Parameter haben keine Wertangabe.) Merke: Zeilen ohne Parameter sind nicht besonders sinnvoll. @@ -592,7 +663,7 @@ Parameter: kommende abgewiesen werden. (Default: Der abgehende Ruf wird abgebrochen.) :yi Bei einem ankommeden Ruf wird automatisch ein abgehender gestartet und - der ankommende wird abgewiesen. + der ankommende wird abgewiesen (Callback). :bi Bei einem ankommenden Ruf, der nicht angenommen werden kann (belegt?), wird automatisch auf einer anderen Leitung zurückgerufen. :fr ebenfalls zu setzen ist meist sinnvoll. @@ -651,8 +722,14 @@ X Wenn diese Zeile (oder eine dar i für ankommende Verbindungen o für abgehende Verbindungen f für Festverbindungen -d für Wählverbindungen +d für Wählverbindungen (nur eine gleichzeitig) +m für Wählverbindungen (mehrere gleichzeitig) p für Verbindungsaufbau nach Bedarf + Ist keines der Zeichen 'd','p','f' vorhanden, wird 'd' angenommen, mit + dem Unterschied, daß die so bezeichnete Verbindung mehrmals unabhängig + voneinander aufgebaut werden kann (z.B. Login). 'd' bezeichnet eine + nur einmal herstellbare Verbindung (TCP, wenn das Interface nach + Verbindungsende verschwinden soll). Der Suchalgorithmus findet zunächst eine zur Verbindung passende Zeile mit R-Flag und hängt an deren Parameterliste alle ebenfalls passenden Zeilen @@ -686,7 +763,8 @@ Mod: i für ankommende Verbindungen o für abgehende Verbindungen f für Festverbindungen -d für Wählverbindungen +d für Wählverbindungen (nur eine gleichzeitig) +m für Wählverbindungen (mehrere gleichzeitig) p für Verbindungsaufbau nach Bedarf ,# Verzögerung bei Verbindungsende, in Sekunden, für sauberes Herunterfahren des B-Kanalprotokolls. @@ -714,7 +792,8 @@ Mod: i für ankommende Verbindungen o für abgehende Verbindungen f für Festverbindungen -d für Wählverbindungen +d für Wählverbindungen (nur eine gleichzeitig) +m für Wählverbindungen (mehrere gleichzeitig) p für Verbindungsaufbau nach Bedarf u für Parameter, die nur beim Programmstart gesetzt werden (x75-Kram zB) a für Parameter, die bei Neueinlesen der Konfigdaten gesetzt werden @@ -740,8 +819,11 @@ Mod: i für ankommende Verbindungen o für abgehende Verbindungen f für Festverbindungen (der zu verwendende B-Kanal steht in der P-Zeile) -d für Wählverbindungen +d für Wählverbindungen (nur eine gleichzeitig) +m für Wählverbindungen (mehrere gleichzeitig) p für Verbindungsaufbau nach Bedarf +B Backup-Nummer, wird nur verwendet, wenn das Wählen anderer Nummern + mindestens einmal fehlschlug. TM-Zeile ("Time") @@ -864,8 +946,8 @@ Die Reihenfolge ist wichtig. :lp X X X CAPI-Bitmasken für EAZ, Service, Infos. Hexadezimal. Default: 03FF E7BF 003F. :st XXXXX Protokollstack XXXXX laden. Siehe Handbuch zur Karte. - Default ist u_1tr6_pmp (wenn "german" und nicht "euro" inn - config/config-data angegeben wurde) oder u_dss1_pmp (sonst). + Default ist u_1tr6_pmp (wenn "german" und nicht "euro" in + config/config.data angegeben wurde) oder u_dss1_pmp (sonst). :ea N NNN EAZ N auf lokale Nummer (MSN) NNN mappen. Default ist die letzte Ziffer der Nummer. Nicht bei :pb verwenden. @@ -956,7 +1038,8 @@ B Die Verbindung wird beim Hochfahren des Managers automatisch aufgebaut. i für ankommende Verbindungen o für abgehende Verbindungen f für Festverbindungen. "B" wird hier normalerweise ebenfalls angegeben. -d für Wählverbindungen +d für Wählverbindungen (nur eine gleichzeitig) +m für Wählverbindungen (mehrere gleichzeitig) p für Verbindungsaufbau nach Bedarf ("reconn"-Modul nicht vergessen!); wird beim Programmstart automatisch mitgestartet. Die eigentliche ISDN-Verbindung wird hierdurch _nicht_ aufgebaut, dafür ist "B" gedacht. @@ -1343,14 +1426,16 @@ Steuerprogramm f Hintergrund setzt. -f dev Steuerdevice anstelle von /dev/isdnmon. -I Debugbefehle werden von stdin gelesen. --t Testflag. Nicht verwenden. -l setzt ein strlog-Modul auf die Steuerverbindung. Debugging. --L setzt ein qinfo-Modul auf die Steuerverbindung. Debugging. --w setzt ein strlog-Modul auf die programminterne Verbindung zwischen - dem eigentlichen Programm und dem ISDN-Level-3-Code. Debugging. +-w setzt ein logh-Modul auf die programminterne Verbindung zwischen + dem Treiber im Kernel und dem Masterprozeß. Debugging. +-L, -W wie -l / -w, jedoch im Kernel-Log anstatt auf stderr. +-m schreibt die programminterne Verbindung zwischen Ebene 3 und 4 + auf stderr mit. Sehr wichtig beim Debuggen. +-M schreibt diverse andere Debugginginfo nach stderr. -x file Datei mit (internen) Steuerbefehlen, die nach dem vollständigen Start des ISDN-Krams ausgeführt wird. Ungetestet. -file... Steuerdateien. +file... Konfigurationsdateien. monitor @@ -1416,13 +1501,12 @@ Hackers Corner ============== Debuggingoptionen: -Das Masterprogramm schickt Debugkram nach stdout. Umleiten nach /dev/null -wenn's stört. +Das Masterprogramm schickt Debugkram nach stderr und manches andere nach +stdout. Umleiten nach /dev/null wenn's stört; die Debugsachen werden +sukzessive abgestellt, wenn ich mal wieder ein wenig Zeit habe. :-/ -In isdn/cards/dumb/Config.c stehen ein paar DEBUG_*-Flags. - -In isdn/config/config.data finden sich die Konstanten CONF_DEBUG und -CONF_MOD2, die das Verhalten von isdn_2/isdn_2.c kontrollieren. +Das Debuggingverhalten des Haupttreibers im Kernel läßt sich durch die +isdn2_debug- und isdn2_log-Flags steuern; siehe isdn_2/isdn_2.c. Hinweis: Wenn alles funktioniert, kann man die Debuggerei getrost abschalten. Allerdings ist dann die Fehlersuche so gut wie unmöglich... diff --git a/Makefile b/Makefile index a858b10..d5d3ab7 100644 --- a/Makefile +++ b/Makefile @@ -6,9 +6,6 @@ SUBDIRS = config include compat streams support isdn_3 isdn_4 tools \ .PHONY: depend all:: .diddepend -depend:: - $(MAKE) -C compat depend - $(MAKE) -C streams depend dep: depend diff --git a/README b/README index 09d5452..d703126 100644 --- a/README +++ b/README @@ -4,6 +4,20 @@ Die Anleitung und der ganze Kram findet sich in der Datei DOKU, oder README.isdn in den Kernelsourcen. +*** 1995-11-06 + +Release 19. Kleinere Bugfixes, insbesondere funktioniert das Senden von +EAZ unter 1TR6 wieder... + +Der Backoff-Algorithmus, wennn die Gegenstelle nicht antwortet, wurde von +"konstant oder linear" auf "exponentiell" umgestellt. Sorry, aber das muß +so sein -- sonst meckert die Telekomik. + +Der Master spuckt jetzt seine ganzen Debugmeldungen auf stderr aus und +protokolliert Statusmeldungen (Gebühreneinheiten) auf stdout. +VORHER WAR DAS UMGEKEHRT, das hat manchen Benutzer durcheinandergebracht. + + *** 1995-10-30 Release 17. diff --git a/alaw/alaw.c b/alaw/alaw.c index 80f4f1d..52a03dd 100644 --- a/alaw/alaw.c +++ b/alaw/alaw.c @@ -16,7 +16,7 @@ #include #include #include "streams.h" -#include +#include "stropts.h" /* #include */ #include #include "streamlib.h" diff --git a/alaw/tools/toalaw.c b/alaw/tools/toalaw.c index 215024c..eff63a7 100644 --- a/alaw/tools/toalaw.c +++ b/alaw/tools/toalaw.c @@ -11,7 +11,7 @@ #include #include #ifdef linux -#include +#include #endif short mx[] = {16,32,64,128,256,512,1024,2048}; diff --git a/alaw/tools/tosnd.c b/alaw/tools/tosnd.c index cc9445f..9ff12fa 100644 --- a/alaw/tools/tosnd.c +++ b/alaw/tools/tosnd.c @@ -11,7 +11,7 @@ #include #include #ifdef linux -#include +#include #endif short mult[] = {2,2,4,8,16,32,64,128}; diff --git a/cards/Makefile b/cards/Makefile index 199af8d..769fff6 100644 --- a/cards/Makefile +++ b/cards/Makefile @@ -6,7 +6,7 @@ REALSOURCE=loader.c OBJS=$(addsuffix .o,$(CARDS)) EXTRA_CFLAGS= -DCARDTYPE=$(basename $@ .o) -SUBDIRS=capi dumb +SUBDIRS=capi dumb arnet include $(TOPDIR)/Make.rules diff --git a/cards/arnet/arnet.c b/cards/arnet/arnet.c index a84b7ed..04970bc 100644 --- a/cards/arnet/arnet.c +++ b/cards/arnet/arnet.c @@ -14,7 +14,7 @@ #include "f_malloc.h" #include #include "streams.h" -#include +#include "stropts.h" /* #ifdef DONT_ADDERROR */ #include "f_user.h" /* #endif */ @@ -23,14 +23,16 @@ #include #include #include "streamlib.h" -#include "lap.h" #include +#include "loader.h" #include #include #include #include #include +#include +#include "loader.h" extern void log_printmsg (void *log, const char *text, mblk_t * mp, const char*); extern void logh_printmsg (void *log, const char *text, mblk_t * mp); @@ -134,16 +136,21 @@ static unsigned short memsz[] = { }; #define NRMEM (sizeof(memsz)/sizeof(memsz[0])) -struct arnet_info { unsigned char *membase; short irq; short ioaddr; +struct arnet_info { + struct cardinfo info,*infoptr; + struct arnet_info *next; unsigned short nports; short handshake; struct tq_struct queue; char usage; unsigned char ena01; unsigned char ena23; unsigned char irqf; struct arnet_port port[4]; ARNET_ADDR memsize; ARNET_ADDR freemem[NRMEM]; ARNET_ADDR limmem; - ARNET_ADDR curpage; } - arnet_list[3] = {{NULL,}}; + ARNET_ADDR curpage; }; -short arnet_ncards = 0; +#define ARNET_NCARDS 4 +#define ARNET_NPORTS 4 + +static struct arnet_info *arnet_map[NR_IRQS] = { NULL, }; +static struct arnet_info *arnet_cards[ARNET_NCARDS]; const char *astr(char x) { @@ -163,7 +170,7 @@ ldprintf(".%d.",__LINE__); } -#define MEM(type,arn,offset) *(volatile unsigned type *)((void *)((arn)->membase + ((offset) & 0x3FFF))) +#define MEM(type,arn,offset) *(volatile unsigned type *)((void *)((arn)->info.memaddr + ((offset) & 0x3FFF))) #define ADDR_SCA0 0xe110babe #define ADDR_SCA1 0xca11babe @@ -175,29 +182,29 @@ arnet_page(struct arnet_info *arn, ARNET_ADDR addr) switch(addr) { case ADDR_NONE: if(dodebug) { if(arn->curpage != ADDR_NONE) { arn->curpage = ADDR_NONE; dprintf("C-_"); } } - outb_p(0x00,arn->ioaddr+8); + outb_p(0x00,arn->info.ioaddr+8); return NULL; case ADDR_SCA0: if(dodebug) { if(arn->curpage != ADDR_NONE) { arn->curpage = ADDR_NONE; dprintf("C0_"); } } - outb_p(0xC0,arn->ioaddr+8); + outb_p(0xC0,arn->info.ioaddr+8); break; case ADDR_SCA1: if(dodebug) { if(arn->curpage != ADDR_NONE) { arn->curpage = ADDR_NONE; dprintf("C1_"); } } - outb_p(0xE0,arn->ioaddr+8); + outb_p(0xE0,arn->info.ioaddr+8); break; default: dprintf(" BadPage 0x%lx ",addr); return NULL; } SLOW_DOWN_IO; SLOW_DOWN_IO; - return arn->membase; + return (void *)arn->info.memaddr; } inline static void * arnet_mempage(struct arnet_info *arn, ARNET_ADDR addr) { - outb_p(((addr >> 14) & 0x0F) | 0x80, arn->ioaddr+8); + outb_p(((addr >> 14) & 0x0F) | 0x80, arn->info.ioaddr+8); if(dodebug) { if(arn->curpage != (addr & ~0x3FFF)) { arn->curpage = addr & ~0x3FFF; dprintf("P%lx_",0x0F&(addr >> 14)); } } - return arn->membase+(addr & 0x3FFF); + return (void *)arn->info.memaddr+(addr & 0x3FFF); } #define SEL_SCA(arp) arnet_page((arp)->inf,((arp)->portnr > 1) ? ADDR_SCA1 : ADDR_SCA0) @@ -295,7 +302,7 @@ if(dodebug>1)ddprintf("v "); } while(nszoff > 0); arn->limmem = (arn->limmem + nlsz) & ~0x3FFF; - printf("ARNET %d: mem limit at %ldk\n",arn-arnet_list, (arn->limmem+0x4000) >> 10); + printf("ARNET %d: mem limit at %ldk\n",arn->info.ipl, (arn->limmem+0x4000) >> 10); } thisaddr = arn->limmem; arn->limmem += lsz; @@ -508,7 +515,7 @@ arnet_mode(struct arnet_port *arp, int mode) unsigned char offset; long flags; int err; - unsigned char inb3 = inb_p(arn->ioaddr+3); + unsigned char inb3 = inb_p(arn->info.ioaddr+3); dprintf("ARNET_MODE %d of %d: ",mode,arp->portnr); @@ -520,22 +527,22 @@ dprintf("ARNET_MODE %d of %d: ",mode,arp->portnr); case 0: offset = 0x20; arn->ena01 = arn->ena01 & ~0x15; - outb_p(arn->ena01,arn->ioaddr+0x09); break; + outb_p(arn->ena01,arn->info.ioaddr+0x09); break; break; case 1: offset = 0x40; arn->ena01 = arn->ena01 & ~0x2A; - outb_p(arn->ena01,arn->ioaddr+0x09); break; + outb_p(arn->ena01,arn->info.ioaddr+0x09); break; break; case 2: offset = 0x20; arn->ena23 = arn->ena23 & ~0x15; - outb_p(arn->ena23,arn->ioaddr+0x0E); break; + outb_p(arn->ena23,arn->info.ioaddr+0x0E); break; break; case 3: offset = 0x40; arn->ena23 = arn->ena23 & ~0x2A; - outb_p(arn->ena23,arn->ioaddr+0x0E); break; + outb_p(arn->ena23,arn->info.ioaddr+0x0E); break; break; default: restore_flags(flags); @@ -560,22 +567,22 @@ dprintf(" ... unknown portnr\n"); case 0: offset = 0x20; if(mode & 2) arn->ena01 &= ~0x10; - outb_p(arn->ena01,arn->ioaddr+0x09); break; + outb_p(arn->ena01,arn->info.ioaddr+0x09); break; break; case 1: offset = 0x40; if(mode & 2) arn->ena01 &= ~0x20; - outb_p(arn->ena01,arn->ioaddr+0x09); break; + outb_p(arn->ena01,arn->info.ioaddr+0x09); break; break; case 2: offset = 0x20; if(mode & 2) arn->ena23 &= ~0x10; - outb_p(arn->ena23,arn->ioaddr+0x0E); break; + outb_p(arn->ena23,arn->info.ioaddr+0x0E); break; break; case 3: offset = 0x40; if(mode & 2) arn->ena23 &= ~0x20; - outb_p(arn->ena23,arn->ioaddr+0x0E); break; + outb_p(arn->ena23,arn->info.ioaddr+0x0E); break; break; default: dprintf(" ... unknown portnr\n"); @@ -634,25 +641,25 @@ dprintf(" ... mode unknown\n"); offset = 0x20; arn->ena01 |= 0x05; if(((inb3 >> 5) != 3) && !(mode & 2)) arn->ena01 |= 0x10; - outb_p(arn->ena01,arn->ioaddr+0x09); + outb_p(arn->ena01,arn->info.ioaddr+0x09); break; case 1: offset = 0x40; arn->ena01 |= 0x0A; if(((inb3 >> 5) != 3) && !(mode & 2)) arn->ena01 |= 0x20; - outb_p(arn->ena01,arn->ioaddr+0x09); + outb_p(arn->ena01,arn->info.ioaddr+0x09); break; case 2: offset = 0x20; arn->ena23 |= 0x05; if(((inb3 >> 5) != 3) && !(mode & 2)) arn->ena23 |= 0x10; - outb_p(arn->ena23,arn->ioaddr+0x0E); + outb_p(arn->ena23,arn->info.ioaddr+0x0E); break; case 3: offset = 0x40; arn->ena23 |= 0x0A; if(((inb3 >> 5) != 3) && !(mode & 2)) arn->ena23 |= 0x20; - outb_p(arn->ena23,arn->ioaddr+0x0E); + outb_p(arn->ena23,arn->info.ioaddr+0x0E); break; } arp->mode = mode; @@ -840,7 +847,7 @@ dprintf("G %d @ %d ",buf[arp->recvcur].buflen,arp->recvcur); arp->recvend = (arp->recvend == arp->recvnum) ? 0 : (arp->recvend + 1); thebuf = RBUFPTR(&buf[arp->recvend]); -dprintf("F %d @ %ld:%x ",arp->recvlen,arp->recvend,thebuf); +dprintf("F %d @ %d:%lx ",arp->recvlen,arp->recvend,thebuf); SEL_SCA(arp); MEM(long ,arn,dmaoff+0x00) = thebuf; MEM(short,arn,dmaoff+0x0E) = arp->recvlen; @@ -1101,13 +1108,13 @@ ldprintf(".%d.",__LINE__); } if(irq2 & 0x01) { unsigned char errs = MEM(char,arn,dmaoff+0x10); - dprintf(":DMI err rcv, s%02x m%02x ", errs, + dprintf(":DMI err rcv %d, s%02x m%02x ", errs, MEM(char ,arn,dmaoff+0x14), MEM(short,arn,dmaoff+0x0E)); if(msk2 & 0x01) { errs &= MEM(char,arn,dmaoff+0x14); if(errs & 0x20) { /* buffer overrun receive -- fatal */ - printf(" * ARNET %d.%d: buffer overrun\n",arp->inf-arnet_list,arp->portnr); + printf(" * ARNET %d.%d: buffer overrun\n",arp->inf->info.ipl,arp->portnr); if(!arp->recvsingle) { if(0) { struct dmabuf *buf = arnet_mempage(arn,arp->dmarecv); @@ -1140,7 +1147,7 @@ ldprintf(".%d.",__LINE__); } } else if(errs & 0x10) { /* counter overflow */ - printf(" * ARNET %d.%d: counter overrun\n",arp->inf-arnet_list,arp->portnr); + printf(" * ARNET %d.%d: counter overrun\n",arp->inf->info.ipl,arp->portnr); } } else dprintf(" RE-masked-; "); @@ -1167,7 +1174,7 @@ ldprintf(".%d.",__LINE__); MEM(short,arn,dmaoff+0x2E)); if(msk2 & 0x04) { if(errs & 0x20) { /* buffer over/underrun */ - if(dodebug>1)printf(" * ARNET %d.%d: buffer underrun\n",arp->inf-arnet_list,arp->portnr); + if(dodebug>1)printf(" * ARNET %d.%d: buffer underrun\n",arp->inf->info.ipl,arp->portnr); if(0)arnet_memdump(arn,"Buf Underrun"); if(arp->sendoverflow > 1) { } else { @@ -1175,7 +1182,7 @@ ldprintf(".%d.",__LINE__); } } if(errs & 0x10) { /* counter overflow */ - printf(" * ARNET %d.%d: counter underrun\n",arp->inf-arnet_list,arp->portnr); + printf(" * ARNET %d.%d: counter underrun\n",arp->inf->info.ipl,arp->portnr); if(arp->sendsingle) { } else { } @@ -1256,66 +1263,79 @@ if(dodebug)dprintf("TxI Off; "); } static void -arnet_intr(int irq, struct pt_regs *foo) +arnet_intrx(struct arnet_info *arn) { - int arc = arnet_ncards; - struct arnet_info *arn = arnet_list; + unsigned long flags; unsigned char irqf; -ldprintf(".%d.",__LINE__); - while(arc > 0) { - unsigned long flags; - - save_flags(flags); cli(); - if(arn->usage++) { - if(irq != 0) { - if(dodebug>1)dprintf(".D."); - queue_task(&arn->queue,&tq_timer); - } - restore_flags(flags); - goto next; - } + save_flags(flags); cli(); + if(arn->usage++) { + if(dodebug>1)dprintf(".D."); + queue_task(&arn->queue,&tq_timer); restore_flags(flags); - - if((irq != 0) && (arn->irq != irq)) - goto next; - irqf = inb_p(arn->ioaddr+0x07); - if((irq != 0) && !(irqf & 1)) { - if(0)dprintf("stray interrupt! "); - goto next; - } - while(irqf & 0x01) { -if(dodebug>1)ddprintf("k "); - arnet_intr1(&arn->port[0]); - if(arn->nports > 1) - arnet_intr1(&arn->port[1]); - if(arn->nports > 2) - arnet_intr1(&arn->port[2]); - if(arn->nports > 3) - arnet_intr1(&arn->port[3]); - irqf = inb_p(arn->ioaddr+0x07); - } - if((irqf ^ arn->irqf) & 0x1E) { - dprintf("ARNET: DCD changed: from %02x to %02x\n", - irqf,arn->irqf); - /* TODO */ - } - arn->irqf = irqf; - next: - arn->usage--; - arc--; - arn++; + goto next; } + restore_flags(flags); + + irqf = inb_p(arn->info.ioaddr+0x07); + while(irqf & 0x01) { +if(dodebug>1)ddprintf("k "); + arnet_intr1(&arn->port[0]); + if(arn->nports > 1) + arnet_intr1(&arn->port[1]); + if(arn->nports > 2) + arnet_intr1(&arn->port[2]); + if(arn->nports > 3) + arnet_intr1(&arn->port[3]); + irqf = inb_p(arn->info.ioaddr+0x07); + } + if((irqf ^ arn->irqf) & 0x1E) { + dprintf("ARNET: DCD changed: from %02x to %02x\n", + irqf,arn->irqf); + /* TODO */ + } + arn->irqf = irqf; +next: + arn->usage--; } static void -arnet_exit1(struct arnet_info *arn) +arnet_intr(int irq, struct pt_regs *foo) { - int cnt; - struct arnet_port *arp = arn->port; -ldprintf(".%d.",__LINE__); - arn->usage = 99; + struct arnet_info *arn; + for(arn=arnet_map[irq];arn != NULL; arn = arn->next) + arnet_intrx(arn); +} + +void NAME(REALNAME,exit)(struct cardinfo *inf) +{ + struct arnet_info **parn, *arn = NULL; + int cnt; + struct arnet_port *arp; + +ldprintf(".%d.",__LINE__); + + parn = &arnet_map[inf->irq]; + while(*parn != NULL) { + if((*parn)->infoptr == inf) { + arn = *parn; + *parn = arn->next; + break; + } + } + if(arn == NULL) { + printf("ARNET error: exit: info record not found!\n"); + return; + } + if(arnet_cards[inf->ipl] != arn) { + printf("ARNET error: exit: info record not found!\n"); + return; + } + arnet_cards[inf->ipl] = NULL; + + arn->usage = 99; + arp = arn->port; for(cnt=0;cnt < arn->nports; arp++,cnt++) { dprintf("Port %d: ",cnt); if(arp->inf != arn) { @@ -1328,42 +1348,65 @@ dprintf("Port %d: ",cnt); MEM(char,arn, 0x14) = 0x00; /* IRQ off */ MEM(char,arn, 0x15) = 0x00; /* IRQ off */ MEM(char,arn, 0x16) = 0x00; /* IRQ off */ - if(arn->irq != 0) - free_irq(arn->irq); - release_region(arn->ioaddr,16); + + if((arnet_map[arn->info.irq] == NULL) && (arn->info.irq != 0)) + free_irq(arn->info.irq); + release_region(arn->info.ioaddr,16); + kfree(arn); } -static int -arnet_init1(struct arnet_info *arn) +int NAME(REALNAME,init)(struct cardinfo *inf) { uchar_t inb3, inb4, inb5, inb6, inbc; unsigned short x; struct arnet_port *arp; + struct arnet_info *arn; printf("Arnet: "); + if(inf->ioaddr < 0x100) { + printf("IOADDR %d bad\n",inf->ioaddr); + return -EINVAL; + } + if(inf->ipl >= ARNET_NCARDS) { + printf("IPL %d bad, 0 <= ipl <= %d\n",inf->ipl,ARNET_NCARDS-1); + return -EINVAL; + } + if(arnet_cards[inf->ipl] != NULL) { + printf("IPL %d busy!\n",inf->ipl); + return -EBUSY; + } + arn = kmalloc(sizeof(*arn),GFP_KERNEL); + if(arn == NULL) { + printf("no memory!\n"); + return -ENOMEM; + } + bzero(arn,sizeof(*arn)); arn->usage = 99; - bzero(&arn->queue,sizeof(arn->queue)); - arn->queue.routine = (void *)&arnet_intr; - arn->queue.data = (void *)(long)arn->irq; + arn->queue.routine = (void *)&arnet_intrx; + arn->queue.data = (void *)arn; + arn->infoptr = inf; + arn->info = *inf; for(x=0;xfreemem[x] = 0; arn->limmem = 256; - inb3 = inb_p(arn->ioaddr+3); - inb4 = inb_p(arn->ioaddr+4); - inb5 = inb_p(arn->ioaddr+5); - inb6 = inb_p(arn->ioaddr+6); - if(check_region(arn->ioaddr,16)) { - printf("*** region 0x%x..0x%x blocked\n",arn->ioaddr,arn->ioaddr+15); - return 0; + inb3 = inb_p(arn->info.ioaddr+3); + inb4 = inb_p(arn->info.ioaddr+4); + inb5 = inb_p(arn->info.ioaddr+5); + inb6 = inb_p(arn->info.ioaddr+6); + if(check_region(arn->info.ioaddr,16)) { + printf("*** region 0x%x..0x%x blocked\n",arn->info.ioaddr,arn->info.ioaddr+15); + kfree(arn); + return -EBUSY; } arn->memsize = 1<<(((inb3&0x1C)>>2)+16); - printf("cf %02x: %d kByte, memory at %p, bus %d, adapter %s; %d ports; rev %02x; ", inb3, arn->memsize>>10, arn->membase, inb3&3, astr(inb3>>5), inb5, inb4); - if((unsigned long)arn->membase & 0xFF003FFF) { - printf("*** invalid membase: 0x%p\n",arn->membase); - return 0; + printf("cf %02x: %ld kByte, memory at %lx, bus %d, adapter %s; %d ports; rev %02x; ", inb3, arn->memsize>>10, arn->info.memaddr, inb3&3, astr(inb3>>5), inb5, inb4); + if(((unsigned long)arn->info.memaddr & 0xFF003FFF) || ((unsigned long)arn->info.memaddr < 0x80000)) { + printf("*** invalid memaddr: 0x%lx\n",arn->info.memaddr); + kfree(arn); + return -EINVAL; } { unsigned long i; @@ -1379,7 +1422,8 @@ arnet_init1(struct arnet_info *arn) arn->nports = inb5; if(arn->nports != 2 && arn->nports != 4) { printf("huh? card with %d ports?\n",arn->nports); - return 0; + kfree(arn); + return -EIO; } arn->handshake = inb6; if(inb6 == 0) @@ -1404,14 +1448,14 @@ arnet_init1(struct arnet_info *arn) arp->mode = -1; } - outb_p(0x00,arn->ioaddr+0x09); + outb_p(0x00,arn->info.ioaddr+0x09); if(arn->nports > 2) - outb_p(0x00,arn->ioaddr+0x0E); + outb_p(0x00,arn->info.ioaddr+0x0E); udelay(2); - outb_p(0x40,arn->ioaddr+0x09); + outb_p(0x40,arn->info.ioaddr+0x09); udelay(500); arn->ena01 = arn->ena23 = 0x70; - switch(arn->irq) { + switch(arn->info.irq) { case 0: inbc = 0; break; case 3: inbc = 1; break; case 5: inbc = 2; break; @@ -1421,15 +1465,16 @@ arnet_init1(struct arnet_info *arn) case 12: inbc = 6; break; case 15: inbc = 7; break; default: - printf("*** unknown IRQ %d\n",arn->irq); - return 0; + printf("*** unknown IRQ %d\n",arn->info.irq); + kfree(arn); + return -EBUSY; } inbc <<= 1; - inbc |= 1 | (((long)arn->membase >> 10) & 0x30); - outb_p((long)arn->membase >> 16, arn->ioaddr+13); - outb_p(inbc, arn->ioaddr+12); - arn->irqf = inb_p(arn->ioaddr+7); - printf("inbc %02x, inbd %02lx; irqf %02x",inbc,(((long)arn->membase)>>16)&0xFF, arn->irqf); + inbc |= 1 | (((long)arn->info.memaddr >> 10) & 0x30); + outb_p((long)arn->info.memaddr >> 16, arn->info.ioaddr+13); + outb_p(inbc, arn->info.ioaddr+12); + arn->irqf = inb_p(arn->info.ioaddr+7); + printf("inbc %02x, inbd %02lx; irqf %02x",inbc,(((long)arn->info.memaddr)>>16)&0xFF, arn->irqf); /* Now checking memory access */ @@ -1455,27 +1500,31 @@ arnet_init1(struct arnet_info *arn) if(MEM(char,arn,0x33) != 0xAA) { if((arn->nports <= 2) || (MEM(char,arn,0x33) != 0x5A)) { printf("ERROR: Readback A, %02x\n", MEM(char,arn,0x33)); - return 0; + return -EIO; } printf("ERROR: second chip unselectable A, %02x\n", MEM(char,arn,0x33)); - return 0; + kfree(arn); + return -EIO; } if(MEM(char,arn,0x53) != 0x55) { if((arn->nports <= 2) || (MEM(char,arn,0x53) != 0xA5)) { printf("ERROR: Readback B, %02x\n", MEM(char,arn,0x53)); - return 0; + return -EIO; } printf("ERROR: second chip unselectable B, %02x\n", MEM(char,arn,0x53)); - return 0; + kfree(arn); + return -EIO; } if(arn->nports > 2) { arnet_page(arn,ADDR_SCA1); if(MEM(char,arn,0x33) != 0x5A) { printf("ERROR: Readback C, %02x\n", MEM(char,arn,0x33)); - return 0; + kfree(arn); + return -EIO; } else if(MEM(char,arn,0x53) != 0xA5) { printf("ERROR: Readback D, %02x\n", MEM(char,arn,0x53)); - return 0; + kfree(arn); + return -EIO; } } @@ -1488,71 +1537,46 @@ arnet_init1(struct arnet_info *arn) MEM(char,arn,0x53) = 0xFF; } - if((arn->irq != 0) && request_irq(arn->irq,arnet_intr,0 /* SA_INTERRUPT */,"arnet")) { - printf("*** IRQ %d not available\n",arn->irq); - return 0; + if((arn->info.irq != 0) && (arnet_map[arn->info.irq] == NULL) && request_irq(arn->info.irq,arnet_intr,0 /* SA_INTERRUPT */,"arnet")) { + printf("*** IRQ %d not available\n",arn->info.irq); + kfree(arn); + return -EBUSY; } - request_region(arn->ioaddr,16,"arnet"); + request_region(arn->info.ioaddr,16,"arnet"); + + arn->next = arnet_map[arn->info.irq]; + arnet_map[arn->info.irq] = arn; + arnet_cards[arn->info.ipl] = arn; + printf("\n"); arn->usage = 0; - return 1; + return 0; } -static int -arnet_init (void) -{ -ldprintf(".%d.",__LINE__); - arnet_ncards = 0; - - arnet_list[arnet_ncards].membase = (void *)0xCC000; - arnet_list[arnet_ncards].irq = 15; - arnet_list[arnet_ncards].ioaddr = 0x300; - if(arnet_init1(&arnet_list[0])) arnet_ncards++; - - printf ("ARNET: %d cards found\n",arnet_ncards); - if(arnet_ncards == 0) - return -ESRCH; - else - return 0; -} - -static void -arnet_exit(void) -{ - int arc = arnet_ncards; - struct arnet_info *arn = arnet_list; -ldprintf(".%d.",__LINE__); - - while(arc > 0) { -dprintf("Exit, %d ports: ",arn->nports); -ddprintf("l "); - arnet_exit1(arn); - arc--; - arn++; - } - -} /* Streams code to open the driver. */ static int arnet_open (queue_t * q, dev_t dev, int flag, int sflag ERR_DECL) { - struct arnet_info *arn = arnet_list; + struct arnet_info **parn = arnet_cards; + struct arnet_info *arn = NULL; struct arnet_port *arp; - int mdev = arnet_ncards; + int mdev = ARNET_NCARDS-1; int cdev; int err; ldprintf(".%d.",__LINE__); dev = minor (dev); cdev = dev & 0x0F; - while(mdev > 0 && cdev >= arn->nports) { + while(mdev > 0 && cdev >= 0) { + if((arn = *parn) != NULL && cdev < arn->nports) + break; ddprintf("n "); - cdev -= arn->nports; - arn++; + cdev -= ARNET_NPORTS; + parn++; mdev --; } - if(mdev == 0) { + if(mdev == 0 || cdev < 0) { ERR_RETURN(-ENXIO); } arn->usage++; @@ -1567,13 +1591,11 @@ ddprintf("n "); arp->q = q; arp->mode = dev >> 4; - MORE_USE; WR (q)->q_ptr = (caddr_t) arp; q->q_ptr = (caddr_t) arp; if((err = arnet_mode(arp,arp->mode)) < 0) { arnet_dmaexit(arp); - LESS_USE; arn->usage--; q->q_ptr = NULL; WR(q)->q_ptr = NULL; @@ -1595,6 +1617,7 @@ ddprintf("n "); arp->recvend, MEM(short,arn,dmaoff+0x0C)); } + (*arn->info.use_count)++; return dev; } @@ -1620,7 +1643,7 @@ arnet_close (queue_t *q, int dummy) arp->q = NULL; arn->usage--; - LESS_USE; + (*arn->info.use_count)--; return; } @@ -1630,7 +1653,7 @@ static void arnet_wput (queue_t *q, mblk_t *mp) { struct arnet_port *arp = (struct arnet_port *) q->q_ptr; - struct arnet_info *arn = arp->inf; + /* struct arnet_info *arn = arp->inf; */ ldprintf(".%d.",__LINE__); #ifdef CONFIG_DEBUG_STREAMS @@ -1641,13 +1664,13 @@ ldprintf(".%d.",__LINE__); freemsg(mp); return; } - switch (DATATYPE(mp)) { + switch (DATA_TYPE(mp)) { case M_IOCTL: DATA_TYPE(mp) = M_IOCNAK; ((struct iocblk *)mp->b_rptr)->ioc_error = EINVAL; qreply (q, mp); break; - CASE_DATA + case CASE_DATA: putq (q, mp); break; case M_FLUSH: @@ -1763,7 +1786,6 @@ if(dodebug>1)ddprintf("q "); } - #ifdef MODULE static int devmajor1 = 0; static int devmajor2 = 0; @@ -1773,18 +1795,13 @@ static int do_init_module(void) int err; ldprintf(".%d.",__LINE__); - if((err = arnet_init()) < 0) - return err; err = register_strdev(0,&arnet_info,0); - if(err < 0) { - arnet_exit(); + if(err < 0) return err; - } devmajor1 = err; - err = register_strdev(0,&arnet_tinfo,arnet_ncards); + err = register_strdev(0,&arnet_tinfo,ARNET_NCARDS); if(err < 0) { unregister_strdev(devmajor1,&arnet_info,0); - arnet_exit(); return err; } devmajor2 = err; @@ -1794,9 +1811,9 @@ ldprintf(".%d.",__LINE__); static int do_exit_module(void) { int err1 = unregister_strdev(devmajor1,&arnet_info,0); - int err2 = unregister_strdev(devmajor2,&arnet_tinfo,arnet_ncards); + int err2 = unregister_strdev(devmajor2,&arnet_tinfo,ARNET_NCARDS); ldprintf(".%d.",__LINE__); - arnet_exit(); return err1 || err2; } #endif + diff --git a/cards/capi/bintec.c b/cards/capi/bintec.c index 621611a..760dec1 100644 --- a/cards/capi/bintec.c +++ b/cards/capi/bintec.c @@ -26,7 +26,7 @@ #include "isdn_proto.h" #include "smallq.h" #include "isdn_limits.h" -#include +#include "stream.h" #include "streamlib.h" #include #include @@ -49,13 +49,6 @@ #define SetSPL(x) spl((x)) #endif -/* This is ANSI... */ -#define xxappxx(a,b) a##b -#define NAME(a,b) xxappxx(a,b) /* isn't C wonderful */ -#define xxstrxx(a) #a -#define STRING(a) xxstrxx(a) /* ditto */ - - extern void log_printmsg (void *log, const char *text, mblk_t * mp, const char*); static void reset_card(struct _bintec *bp); static void toss_unknown (struct _bintec *bp); @@ -253,7 +246,8 @@ bd_msgout( struct _bintec *bp ) } if(++count > 1000) { printf("\n%sBINTEC: The board seems to be in an infinite loop.\n",KERN_ERR); - isdn2_new_state(&bp->card,2); + if(bp->waitmsg == 0) + isdn2_new_state(&bp->card,2); CTRL_RESET(bp); return -EIO; } @@ -262,7 +256,8 @@ bd_msgout( struct _bintec *bp ) if (*bp->state & 0x80) { /* board failed */ CTRL_RESET(bp); /* reset board */ printf("BINTEC: msgout: board failed???\n"); - isdn2_new_state(&bp->card,2); + if(bp->waitmsg == 0) + isdn2_new_state(&bp->card,2); return -EIO; } return 0; @@ -1042,8 +1037,7 @@ pushone(struct _bintec *bp, int thechan) if(err == 0) { freeb(mb); S_enqueue(&bp->chan[0].q_out,mr); - if(bp->chan[0].q_out.nblocks == 1) - sendone(bp,0); + sendone(bp,0); } else if(err == -EAGAIN) { S_requeue(&chan->q_in, mb); freemsg(mr); @@ -1084,8 +1078,7 @@ postproc(struct _bintec *bp, mblk_t *mb, int ch) isdn2_chstate(&bp->card,MDL_ERROR_IND,0); return -EIO; } - if(bp->chan[0].q_out.nblocks == 1) - sendone(bp,0); + sendone(bp,0); break; case CAPI_DATAB3_IND: { @@ -1117,8 +1110,7 @@ postproc(struct _bintec *bp, mblk_t *mb, int ch) card instead. */ isdn2_chstate(&bp->card,MDL_ERROR_IND,0); } - if(chan->q_in.nblocks == 1) - pushone(bp,ch); + pushone(bp,ch); } break; case CAPI_DATAB3_CONF: @@ -1216,8 +1208,7 @@ process_unknown (struct _bintec *bp) cr->ncci = ci->ncci; cr->blknum = ci->blknum; S_enqueue(&bp->chan[0].q_out,mr); - if(bp->chan[0].q_out.nblocks == 1) - sendone(bp,0); + sendone(bp,0); } freemsg(mb); } diff --git a/cards/dumb/shell.c b/cards/dumb/shell.c index 557792a..80630c7 100644 --- a/cards/dumb/shell.c +++ b/cards/dumb/shell.c @@ -50,7 +50,7 @@ CMDR 41 #include "smallq.h" #include "isdn_limits.h" #include "isdn_proto.h" -#include +#include "stream.h" #include "streamlib.h" #include #ifdef SCO @@ -199,11 +199,6 @@ typedef struct _hscx { #define DUMBTIME 300 /* poll: times per second */ -#define xxappxx(a,b) a##b -#define NAME(a,b) xxappxx(a,b) /* isn't C wonderful */ -#define xxstrxx(a) #a -#define STRING(a) xxstrxx(a) /* ditto */ - void NAME(REALNAME,poll)(struct _dumb *dumb); #else void NAME(REALNAME,poll)(void *); diff --git a/cards/loader.c b/cards/loader.c index ce96171..cc6243e 100644 --- a/cards/loader.c +++ b/cards/loader.c @@ -8,11 +8,6 @@ #error "You have to define CARDTYPE for this to work." #endif -#define xxappxx(a,b) a##b -#define NAME(a,b) xxappxx(a,b) /* isn't C wonderful */ -#define xxstrxx(a) #a -#define STRING(a) xxstrxx(a) /* ditto */ - extern int NAME(CARDTYPE,init)(struct cardinfo *inf); extern void NAME(CARDTYPE,exit)(struct cardinfo *inf); @@ -38,6 +33,7 @@ static int do_init_module(void) inf.memaddr = mem; inf.ID = name; inf.debug = debug; + inf.use_count = &mod_use_count_; return NAME(CARDTYPE,init)(&inf); } diff --git a/compat/Makefile b/compat/Makefile index 0fd5153..59a3139 100644 --- a/compat/Makefile +++ b/compat/Makefile @@ -1,14 +1,5 @@ -all:: - -depend:: - rm -f syscompat.h linux - ln -s compat.h syscompat.h - ln -s . linux - KERNEL=1 TOPDIR=.. include $(TOPDIR)/Make.rules -clean:: - rm -f linux diff --git a/compat/compat.c b/compat/compat.c index 41b6bd0..071c80b 100644 --- a/compat/compat.c +++ b/compat/compat.c @@ -348,14 +348,14 @@ char kernel_version[] = UTS_RELEASE; int init_module(void) { -/* This should work... */ -#if defined(__ELF__) -#define U -#else -#define U "_" -#endif - rename_module_symbol(U "do_i_sleep_on",U "interruptible_sleep_on"); - rename_module_symbol(U "do_sleep_on",U "sleep_on"); +/* This should _really_ work... */ + printk("If exactly two \"rename...\" errors follow, ignore them.\n"); + if(!rename_module_symbol("_do_i_sleep_on","_interruptible_sleep_on") && + !rename_module_symbol( "do_i_sleep_on", "interruptible_sleep_on")) + return -ENOENT; + if(!rename_module_symbol("_do_sleep_on","_sleep_on") && + !rename_module_symbol( "do_sleep_on", "sleep_on")) + return -ENOENT; return 0; } diff --git a/fakeh/fakeh.c b/fakeh/fakeh.c index 6949e2d..5685b6d 100644 --- a/fakeh/fakeh.c +++ b/fakeh/fakeh.c @@ -13,7 +13,7 @@ #include #include #include "streams.h" -#include +#include "stropts.h" #ifdef DONT_ADDERROR #include "f_user.h" #endif diff --git a/include/f_user.h b/include/f_user.h index cc64493..beaf8b9 100644 --- a/include/f_user.h +++ b/include/f_user.h @@ -4,7 +4,7 @@ #ifdef KERNEL #ifdef linux -#include +#include "compat.h" #endif #ifdef M_UNIX /* SCO et al */ diff --git a/include/kernel.h b/include/kernel.h index d39a93b..675bf04 100644 --- a/include/kernel.h +++ b/include/kernel.h @@ -1,10 +1,10 @@ #ifndef _INC_KERNEL #define _INC_KERNEL -#ifndef KERNEL - #if defined(linux) #include #endif + +#ifndef KERNEL #include #include #include @@ -36,7 +36,13 @@ extern void panic(const char *x, ...); #define kfree(a) free((a)) #define kfree_s(a,b) free((a)) +#undef HZ +#define HZ 10 /* don't need more granularity */ + #else /* KERNEL */ +#ifndef __KERNEL__ +#define __KERNEL__ +#endif #include char *loghdr(char level); #undef KERN_EMERG diff --git a/include/loader.h b/include/loader.h index 817e859..a2e9dc3 100644 --- a/include/loader.h +++ b/include/loader.h @@ -8,8 +8,13 @@ struct cardinfo { unsigned char irq, ipl; unsigned long ID; unsigned int debug; - + long *use_count; }; +#define xxappxx(a,b) a##b +#define NAME(a,b) xxappxx(a,b) /* isn't C wonderful */ +#define xxstrxx(a) #a +#define STRING(a) xxstrxx(a) /* ditto */ + #endif diff --git a/include/primitives.h b/include/primitives.h index feb4b7b..d2eccb0 100644 --- a/include/primitives.h +++ b/include/primitives.h @@ -2,7 +2,7 @@ #define _PRIM_H #include -#include +#include "compat.h" #include "config.h" #include "kernel.h" @@ -12,7 +12,7 @@ #ifdef linux #include #ifdef KERNEL -#include +#include "compat.h" #else #include /* printf */ #include diff --git a/include/streamlib.h b/include/streamlib.h index ef1419c..80ee07f 100644 --- a/include/streamlib.h +++ b/include/streamlib.h @@ -18,7 +18,7 @@ #include "f_signal.h" #include #include -#include +#include "stropts.h" #include "streams.h" #include "config.h" diff --git a/include/streams.h b/include/streams.h index 0996fa8..f0a46a9 100644 --- a/include/streams.h +++ b/include/streams.h @@ -7,10 +7,10 @@ #if !(defined(__sys_stream_h) || defined(_SYS_STREAM_H) || defined(_LINUX_STREAM_H)) #ifdef KERNEL -#include +#include "stream.h" #else #ifdef linux -#include +#include "stream.h" #else #include #endif /* KERNEL */ diff --git a/include/sys/aux-stream.h b/include/sys/aux-stream.h index c4afd3c..cfb9d38 100644 --- a/include/sys/aux-stream.h +++ b/include/sys/aux-stream.h @@ -4,7 +4,7 @@ #include #include #include -#include +#include "stropts.h" #include #define MAX_STRDEV MAX_CHRDEV /* don't change */ diff --git a/include/vectcmp.h b/include/vectcmp.h index 27d0e58..315ae32 100644 --- a/include/vectcmp.h +++ b/include/vectcmp.h @@ -1,4 +1,4 @@ -#include +#include "stream.h" /* * Compare two feature vectors, mask off certain bits. * Return..: diff --git a/ip_mon/ip_mon.c b/ip_mon/ip_mon.c index c853f01..6e2c589 100644 --- a/ip_mon/ip_mon.c +++ b/ip_mon/ip_mon.c @@ -13,7 +13,7 @@ #include #include #include "streams.h" -#include +#include "stropts.h" #ifdef DONT_ADDERROR #include "f_user.h" #endif diff --git a/ip_mon/tools/monitor.c b/ip_mon/tools/monitor.c index b23f7d1..f720519 100644 --- a/ip_mon/tools/monitor.c +++ b/ip_mon/tools/monitor.c @@ -14,7 +14,7 @@ #include #include #include "ip_mon.h" -#include +#include "stropts.h" #include #include #include diff --git a/isdn_2/isdn_2.c b/isdn_2/isdn_2.c index c707595..450350d 100644 --- a/isdn_2/isdn_2.c +++ b/isdn_2/isdn_2.c @@ -18,7 +18,7 @@ #include "f_malloc.h" #include #include "streams.h" -#include +#include "stropts.h" /* #ifdef DONT_ADDERROR */ #include "f_user.h" /* #endif */ @@ -2219,7 +2219,13 @@ isdn2_wput (queue_t *q, mblk_t *mp) switch (DATA_TYPE(mp)) { case M_IOCTL: DATA_TYPE(mp) = M_IOCNAK; - ((struct iocblk *)mp->b_rptr)->ioc_error = EINVAL; + ((struct iocblk *)mp->b_rptr)->ioc_error = +#ifdef LINUX + ENOIOCTLCMD +#else + EINVAL +#endif + ; qreply (q, mp); break; case CASE_DATA: diff --git a/isdn_3/capi.c b/isdn_3/capi.c index b095c02..e253319 100644 --- a/isdn_3/capi.c +++ b/isdn_3/capi.c @@ -1091,7 +1091,7 @@ recv (isdn3_talk talk, char isUI, mblk_t * data) } } else { - printf("CAPI error: DISCONNECTB3_CONF in wrong state %d\n",conn->state); + printf("CAPI error: DISCONNECTB3_CONF in wrong state %d, wf 0x%lx\n",conn->state,conn->waitflags); err = -EIO; break; } @@ -1209,7 +1209,7 @@ recv (isdn3_talk talk, char isUI, mblk_t * data) setstate(conn,0); } } else { - printf("CAPI error: DISCONNECT_CONF in wrong state %d, info %04x\n",conn->state,c2->info); + printf("CAPI error: DISCONNECT_CONF in wrong state %d, info %04x, wf 0x%lx\n",conn->state,c2->info,conn->waitflags); isdn3_setup_conn (conn, EST_DISCONNECT); setstate(conn,0); report_terminate(conn,c2->info,0); @@ -1251,7 +1251,7 @@ recv (isdn3_talk talk, char isUI, mblk_t * data) } } else { - printf("CAPI error: CONNECT_CONF in wrong state %d, info %04x\n",conn->state,c2->info); + printf("CAPI error: CONNECT_CONF in wrong state %d, info %04x, wf 0x%lx\n",conn->state,c2->info,conn->waitflags); isdn3_setup_conn (conn, EST_DISCONNECT); report_terminate(conn,c2->info,0); if(send_disconnect(conn,0,N1_LocalProcErr) < 0) @@ -1276,7 +1276,7 @@ recv (isdn3_talk talk, char isUI, mblk_t * data) conn->waitflags &=~ (1<state,c2->info); + printf("CAPI error: SELECTB2_CONF in wrong state %d, info %04x, wf 0x%lx\n",conn->state,c2->info,conn->waitflags); report_terminate(conn,c2->info,0); if(send_disconnect(conn,0,N1_OutOfOrder) < 0) setstate(conn,0); @@ -1299,7 +1299,7 @@ recv (isdn3_talk talk, char isUI, mblk_t * data) conn->waitflags &=~ (1<state,c2->info); + printf("CAPI error: SELECTB3_CONF in wrong state %d, info %04x, wf 0x%lx\n",conn->state,c2->info,conn->waitflags); report_terminate(conn,c2->info,0); if(send_disconnect(conn,0,N1_OutOfOrder) < 0) setstate(conn,0); @@ -1322,7 +1322,7 @@ recv (isdn3_talk talk, char isUI, mblk_t * data) conn->waitflags &=~ (1<state); + printf("CAPI error: CONNECTACTIVE_IND in wrong state %d, wf 0x%lx\n",conn->state,conn->waitflags); if(send_disconnect(conn,0,N1_OutOfOrder) < 0) setstate(conn,0); } @@ -1362,7 +1362,7 @@ recv (isdn3_talk talk, char isUI, mblk_t * data) conn->ncci0 = c2->ncci; err = after_active(conn,1); } else { - printf("CAPI error: CONNECTB3_IND in wrong state %d\n",conn->state); + printf("CAPI error: CONNECTB3_IND in wrong state %d, wf 0x%lx\n",conn->state,conn->waitflags); if(send_disconnect(conn,0,N1_OutOfOrder) < 0) setstate(conn,0); } @@ -1404,7 +1404,7 @@ recv (isdn3_talk talk, char isUI, mblk_t * data) err = after_active(conn,0); } else { err = -EIO; - printf("CAPI error: LISTENB3_CONF in wrong state %d, info %04x\n",conn->state,c2->info); + printf("CAPI error: LISTENB3_CONF in wrong state %d, info %04x, wf 0x%lx\n",conn->state,c2->info,conn->waitflags); if(send_disconnect(conn,0,N1_OutOfOrder) < 0) setstate(conn,0); } @@ -1428,7 +1428,7 @@ recv (isdn3_talk talk, char isUI, mblk_t * data) err = after_active(conn,1); } else { err = -EIO; - printf("CAPI error: CONNECTB3_CONF in wrong state %d, info %04x\n",conn->state,c2->info); + printf("CAPI error: CONNECTB3_CONF in wrong state %d, info %04x, wf 0x%lx\n",conn->state,c2->info,conn->waitflags); if(send_disconnect(conn,0,N1_OutOfOrder) < 0) setstate(conn,0); } @@ -1451,7 +1451,7 @@ recv (isdn3_talk talk, char isUI, mblk_t * data) conn->waitflags &=~ (1<state); + printf("CAPI error: CONNECTB3ACTIVE_IND in wrong state %d, wf 0x%lx\n",conn->state,conn->waitflags); if(send_disconnect(conn,0,N1_OutOfOrder) < 0) setstate(conn,0); } @@ -2093,12 +2093,12 @@ recv (isdn3_talk talk, char isUI, mblk_t * data) err = after_active(conn,0); } else { err = -EIO; - printf("CAPI error: CONTROL_EAZ in wrong state %d, info %04x\n",conn->state,c2->info); + printf("CAPI error: CONTROL_EAZ in wrong state %d, info %04x, wf 0x%lx\n",conn->state,c2->info,conn->waitflags); if(send_disconnect(conn,0,N1_OutOfOrder) < 0) setstate(conn,0); } } else if(talk->tstate < STATE_CONF_FIRST || talk->tstate > STATE_CONF_LAST) { - printf("CAPI error: CONTROL_EAZ in wrong state %d, info %04x\n",conn->state,c2->info); + printf("CAPI error: CONTROL_EAZ in wrong tstate %ld\n",talk->tstate); } if(c2->info != 0) { printf("CAPI error: EAZMAPPING failed %04x\n",c2->info); diff --git a/isdn_3/isdn_3.c b/isdn_3/isdn_3.c index 404246c..e9d2cf0 100644 --- a/isdn_3/isdn_3.c +++ b/isdn_3/isdn_3.c @@ -1,5 +1,3 @@ -/* Show the reasons for not changing connection states */ -#define REPORT /** ** ISDN Level 3 control module @@ -13,7 +11,7 @@ #include #include #include "streams.h" -#include +#include "stropts.h" #ifdef DONT_ADDERROR #include "f_user.h" #endif @@ -44,6 +42,11 @@ ushort_t hdrseq = 2; +/* Show the reasons for not changing connection states? */ +#ifdef DO_DEBUGGING +#define REPORT +#endif + /* * Global data. These should be allocated dynamically. They are not because * most kernels don't have a way to find out how much kernel memory is left, @@ -226,7 +229,9 @@ isdn3_killconn (isdn3_conn conn, char force) isdn3_talk talk = conn->talk; +#ifdef REPORT printf ("Conn %ld: Killing %d St %lo: min %d, at %d", conn->call_ref, force, conn->minorstate, conn->minor, conn->fminor); +#endif if(force) conn->id = 0; @@ -383,7 +388,7 @@ isdn3_killconn (isdn3_conn conn, char force) int i; for(i=0;iminor); + if(0)printf("ISDN_3 DeadConn %p, at pos %d, minor %d\n",minor2conn[i],i,conn->minor); minor2conn[i]=NULL; } } @@ -877,7 +882,9 @@ Xisdn3_setup_conn (isdn3_conn conn, char established, const char *deb_file, unsi mblk_t *mp; isdn23_hdr hdr; +#ifdef REPORT printf ("Disconnect %d.",established); +#endif /* The connection isn't in the process of being established any more. */ if (conn->minorstate & MS_CONNDELAY_TIMER) { conn->minorstate &= ~MS_CONNDELAY_TIMER; @@ -2299,8 +2306,7 @@ printf("ErX k\n"); if(call_ref != 0) conn->call_ref = call_ref; } -if(theID == CMD_OFF) printf(" D1 "); - printf ("* Conn%p: min %d at %d; minor %d min %d; callref %ld connref %d \n", + if(0)printf ("* Conn%p: min %d at %d; minor %d min %d; callref %ld connref %d \n", conn, conn->minor, conn->fminor, minor, fminor, conn->call_ref, conn->conn_id); if (conn->minor == 0 && !nodisc && (theID != CMD_OFF)) { @@ -2308,11 +2314,9 @@ if(theID == CMD_OFF) printf(" D1 "); if (conn->minor != 0) minor2conn[conn->minor] = conn; } -else printf(" D4 "); if (do_talk) conn->minorstate |= MS_FORCING; if (conn->minor != 0) { -if(theID == CMD_OFF) printf(" D5 "); if (conn->fminor == 0) conn->fminor = fminor; minor2conn[conn->minor] = conn; @@ -2322,7 +2326,6 @@ if(theID == CMD_OFF) printf(" D5 "); if (conn->stack[0] == 0) memcpy(conn->stack,stack,sizeof(conn->stack)); if(do_int != 0) { -if(theID == CMD_OFF) printf(" D6 "); if(conn->minor == 0) { printf("\n*** CM Zero!\n"); } else if(do_int > 0) @@ -2330,11 +2333,9 @@ if(theID == CMD_OFF) printf(" D6 "); else minorflags[conn->minor] &=~ MINOR_INT; } -if(theID == CMD_OFF) printf(" D7 "); conn->lockit++; isdn3_setup_conn (conn, EST_NO_CHANGE); conn->lockit--; -if(theID == CMD_OFF) printf(" D8 "); if(conn->state == 0) { /* XXX */ } @@ -2345,7 +2346,6 @@ if(theID == CMD_OFF) printf(" D8 "); printf ("ErrOut t of %d is %d\n", talk->hndl->SAPI, err); goto err_out; } -if(theID == CMD_OFF) printf(" D9 "); break; } /* ok_out: */ @@ -2448,7 +2448,7 @@ isdn3_findminor (ushort_t minor) if (minor2conn[minor] == NULL) return NULL; conn = minor2conn[minor]; - printf (".FindMinor%p %d gets C %d:%d\n", conn, minor, conn->minor, conn->fminor); + if(0)printf (".FindMinor%p %d gets C %d:%d\n", conn, minor, conn->minor, conn->fminor); return conn; } @@ -2482,15 +2482,19 @@ isdn3_findtalk (isdn3_card card, isdn3_hndl hndl, mblk_t *info, int create) int i; int err; -char systr[200] = ""; -if(card->info != NULL) - sprintf(systr+strlen(systr),"'%-*s'",card->info->b_wptr-card->info->b_rptr,card->info->b_rptr); -else strcat(systr,"NULL"); -strcat(systr," and info "); -if(info != NULL) - sprintf(systr+strlen(systr),"'%-*s'",info->b_wptr-info->b_rptr,info->b_rptr); -else strcat(systr,"NULL"); -syslog(LOG_DEBUG,"====== Create 0x%02x with card %s",hndl->SAPI,systr); +#if 0 + char systr[200] = ""; + if(card->info != NULL) + sprintf(systr+strlen(systr),"'%-*s'",card->info->b_wptr-card->info->b_rptr,card->info->b_rptr); + else + strcat(systr,"NULL"); + strcat(systr," and info "); + if(info != NULL) + sprintf(systr+strlen(systr),"'%-*s'",info->b_wptr-info->b_rptr,info->b_rptr); + else + strcat(systr,"NULL"); + syslog(LOG_DEBUG,"====== Create 0x%02x with card %s",hndl->SAPI,systr); +#endif if(card->info != NULL) { mblk_t *mi = card->info; streamchar *sta = mi->b_rptr; @@ -2661,7 +2665,7 @@ isdn3_findconn (isdn3_talk talk, long protocol, long call_ref) for (conn = talk->conn; conn != NULL; conn = conn->next) if (conn->subprotocol == protocol && conn->call_ref == call_ref && (conn->state != 0)) { - printf(".FindConn%p, ref %ld:",conn,call_ref); + if(0)printf(".FindConn%p, ref %ld:",conn,call_ref); return conn; } return NULL; @@ -2735,7 +2739,7 @@ isdn3_open (queue_t * q, dev_t dev, int flag, int sflag ERR_DECL) WR (q)->q_ptr = (caddr_t) & isdn3_q; q->q_ptr = (caddr_t) isdn3_q; - printf ("ISDN Master driver %d opened.\n", dev); + if(0)printf ("ISDN Master driver %d opened.\n", dev); return 0; } @@ -2746,7 +2750,7 @@ isdn3_close (queue_t *q, int dummy) { flushq (q, FLUSHALL); flushq (WR (q), FLUSHALL); - printf ("ISDN Master driver closed.\n"); + if(0)printf ("ISDN Master driver closed.\n"); isdn3_q = NULL; return; } @@ -2942,8 +2946,7 @@ isdn3_rsrv (queue_t * q) isdn3_talk talk; if (conn == NULL) { - if (0) - printf ("XData: Conn for minor %d nf\n", hdr.hdr_detach.minor); + if (0) printf ("XData: Conn for minor %d nf\n", hdr.hdr_detach.minor); break; } if ((talk = conn->talk) == NULL) { @@ -3041,7 +3044,7 @@ isdn3_rsrv (queue_t * q) break; } if (minorflags[hdr.hdr_open.minor] & MINOR_OPEN) { - printf ("Open: Minor %d open\n", hdr.hdr_open.minor); + if(0)printf ("Open: Minor %d open\n", hdr.hdr_open.minor); break; } @@ -3070,7 +3073,7 @@ isdn3_rsrv (queue_t * q) isdn3_conn conn = isdn3_findminor (hdr.hdr_close.minor); mblk_t *mx; - printf("\n*** Closed %d\n",hdr.hdr_close.minor); + if(0)printf("\n*** Closed %d\n",hdr.hdr_close.minor); minorflags[hdr.hdr_close.minor] = 0; if (conn != 0 && conn->minor == hdr.hdr_close.minor) { SUBDEV cm = conn->minor; @@ -3239,7 +3242,7 @@ printf(" *SM %d: %d %d.%d\n",__LINE__,conn->conn_id,conn->minor,conn->fminor); if (hdr.hdr_notify.SAPI == SAPI_INVALID) { for (talk = card->talk; talk != NULL; talk = talk->next) { - printf("chstate for SAPI %x\n",talk->hndl->SAPI); + if(0)printf("chstate for SAPI %x\n",talk->hndl->SAPI); (*talk->hndl->chstate) (talk, hdr.hdr_notify.ind, hdr.hdr_notify.add); } switch (hdr.hdr_notify.ind) { diff --git a/isdn_3/prot_1TR6_1.c b/isdn_3/prot_1TR6_1.c index 7c7ed40..c8327ff 100644 --- a/isdn_3/prot_1TR6_1.c +++ b/isdn_3/prot_1TR6_1.c @@ -1135,11 +1135,13 @@ recv (isdn3_conn conn, uchar_t msgtype, char isUI, uchar_t * data, ushort_t len) phone_sendback (conn, MT_N1_CONN_ACK, NULL); pr_setstate (conn, 10); break; - case MT_N1_INFO:{ + case MT_N1_INFO: + { QD_INIT (data, len) break; report_n1_info (conn, data, len); QD { - QD_CASE (0, PT_N0_netSpecFac):{ + QD_CASE (0, PT_N0_netSpecFac): + { char nlen; uchar_t facility; @@ -1153,9 +1155,11 @@ recv (isdn3_conn conn, uchar_t msgtype, char isUI, uchar_t * data, ushort_t len) if (facility != N1_FAC_Forward1 && facility != N1_FAC_Forward2) { pr_setstate (conn, 3); } - } break; + } + break; } - } break; + } + break; case MT_N1_REL: /* send REL up */ phone_sendback (conn, MT_N1_REL, NULL); @@ -1801,7 +1805,7 @@ recv (isdn3_conn conn, uchar_t msgtype, char isUI, uchar_t * data, ushort_t len) static int chstate (isdn3_conn conn, uchar_t ind, short add) { - printf ("PHONE state for card %d says %d:%o\n", conn->card->nr, ind, add); + if(0)printf ("PHONE state for card %d says %d:%o\n", conn->card->nr, ind, add); if(conn->p_data == NULL) { if((conn->p_data = malloc(sizeof(struct t_info))) == NULL) { return -ENOMEM; @@ -1976,16 +1980,18 @@ sendcmd (isdn3_conn conn, ushort_t id, mblk_t * data) case ARG_SPV: svc = 1; break; - case ARG_LNUMBER:{ + case ARG_LNUMBER: + { + char nbuf[MAXNR]; m_getskip (data); - if (data->b_rptr > data->b_wptr+2) { - data->b_rptr = oldpos; + if ((err = m_getstr (data, nbuf, MAXNR)) != 0) { printf("GetX EAZ: "); conn->lockit--; - return -EINVAL; + return err; } - ((struct t_info *)conn->p_data)->eaz = data->b_rptr[1]; - } break; + ((struct t_info *)conn->p_data)->eaz = nbuf[strlen(nbuf)-1]; + } + break; case ARG_NUMBER: m_getskip (data); if ((err = m_getstr (data, (char *) ((struct t_info *)conn->p_data)->nr, MAXNR)) != 0) { @@ -2164,16 +2170,18 @@ sendcmd (isdn3_conn conn, ushort_t id, mblk_t * data) return err; } break; - case ARG_LNUMBER:{ + case ARG_LNUMBER: + { + char nbuf[MAXNR]; m_getskip (data); - if (data->b_rptr > data->b_wptr-2) { - data->b_rptr = oldpos; - printf("GetEAZAns "); + if ((err = m_getstr (data, nbuf, MAXNR)) != 0) { + printf("GetX EAZans: "); conn->lockit--; - return -EINVAL; + return err; } - ((struct t_info *)conn->p_data)->eaz = data->b_rptr[1]; - } break; + ((struct t_info *)conn->p_data)->eaz = nbuf[strlen(nbuf)-1]; + } + break; } } { diff --git a/isdn_3/prot_ETS.c b/isdn_3/prot_ETS.c index ae830e4..260ed69 100644 --- a/isdn_3/prot_ETS.c +++ b/isdn_3/prot_ETS.c @@ -983,8 +983,10 @@ Xreport_ET_terminate (isdn3_conn conn, uchar_t * data, int len, int deb_line) int err = 0; mblk_t *mb = allocb (256, BPRI_MED); + extern int log_34; -printf("\nET Terminate at %d.\n",deb_line); + if(log_34 & 2) + printf("\nET Terminate at %d.\n",deb_line); if (mb == NULL) { pr_setstate (conn, 0); return; @@ -2120,7 +2122,7 @@ printf (" ET: Recv %x in state %d\n", msgtype, conn->state); static int chstate (isdn3_conn conn, uchar_t ind, short add) { - printf ("PHONE state for card %d says %d:%o\n", conn->card->nr, ind, add); + if(0)printf ("PHONE state for card %d says %d:%o\n", conn->card->nr, ind, add); switch (ind) { case DL_ESTABLISH_IND: case DL_ESTABLISH_CONF: diff --git a/isdn_4/cf.c b/isdn_4/cf.c index 7d6a9af..cd834ef 100644 --- a/isdn_4/cf.c +++ b/isdn_4/cf.c @@ -438,9 +438,7 @@ read_args (void *nix) } } - if(nexttime == 0) - nexttime = 60; - else if(nexttime > 32767/HZ/60) + if((nexttime == 0) || (nexttime > 32767/HZ/60)) nexttime = 32767/HZ/60; #ifdef NEW_TIMEOUT classtimer = diff --git a/isdn_4/conn.c b/isdn_4/conn.c index d80257d..125aaf4 100644 --- a/isdn_4/conn.c +++ b/isdn_4/conn.c @@ -73,7 +73,7 @@ Xsetconnref(const char *deb_file, unsigned int deb_line, conninfo conn, int conn /* Print the text foo onto all ATL/ channels. */ void -connreport(char *foo, char *card) +connreport(char *foo, char *card, int minor) { conninfo conn; mblk_t xx; @@ -92,6 +92,8 @@ connreport(char *foo, char *card) continue; if(!wildmatch(conn->cardname,card)) continue; + if(minor != 0 && conn->minor != minor) + continue; if(conn->lastMsg != NULL && !strcmp(conn->lastMsg,foo)) continue; if(conn->lastMsg != NULL) @@ -116,14 +118,16 @@ connreport(char *foo, char *card) /* Print the state of this connection with connreport(). */ void -ReportConn(conninfo conn) +ReportOneConn(conninfo conn, int minor) { - char sp[200], *spf = sp; - spf += sprintf(spf,"%s%d:%d %s %s %s %d %s/%s %ld %ld %s", + char is1[10]="",sp[200], *spf = sp; + if(conn->state == c_off) + sprintf(is1,".%d",conn->retiming); + spf += sprintf(spf,"%s%d:%d %s %s %s %d %s%s/%s %ld %ld %s", conn->ignore?"!":"", conn->minor, conn->seqnum, conn->cg ? conn->cg->site : "-", conn->cg ? conn->cg->protocol : "-", conn->cg ? conn->cg->cclass : "-", - conn->pid, state2str(conn->state), + conn->pid, state2str(conn->state), is1, conn->cg ? conn->cg->card : (conn->cardname ? conn->cardname : "-"), conn->charge, conn->ccharge, FlagInfo(conn->flags)); if(conn->cg != NULL && (conn->cg->flags ^ conn->flags) != 0) { @@ -143,7 +147,20 @@ ReportConn(conninfo conn) else if(conn->cg != NULL && conn->cg->oldlnr != NULL) spf += sprintf(spf, ";%s",conn->cg->oldlnr); spf += sprintf(spf," %s", CauseInfo(conn->cause, conn->causeInfo)); - connreport(sp,(conn->cg ? conn->cg->card : "*")); + connreport(sp,(conn->cg ? conn->cg->card : "*"),minor); +} + +int retimeout(conninfo conn) +{ + /* Exponential backoff. Sorry but this is necessary. */ + if(conn->charge != 0) + return 5*60*(1<<++conn->retiming); + else if (conn->cause == ID_priv_Busy) + return 5*(1<<(++conn->retiming/6)); + else if(conn->flags & F_FASTREDIAL) + return 2+(1<<(++conn->retiming/4)); + else + return 5+(1<<(++conn->retiming/2)); } /* Sets the state of a connection; does all the housekeeping associated @@ -157,11 +174,11 @@ Xsetconnstate(const char *deb_file, unsigned int deb_line,conninfo conn, CState printf(" -> %s\n",state2str(state)); else printf("\n"); - if(conn->timer_reconn && (state == c_offdown || (state >= c_going_up + if(conn->timer_reconn && (state == c_off || state == c_offdown || (state >= c_going_up && conn->state < c_going_up))) { conn->timer_reconn = 0; untimeout(time_reconn,conn); - } else if(!conn->timer_reconn && state < c_going_up && conn->state >= c_going_up) { + } else if(!conn->timer_reconn && state != c_off && state < c_going_up && conn->state >= c_going_up) { if(conn->want_fast_reconn) { conn->want_fast_reconn = 0; } else { @@ -253,7 +270,7 @@ Xsetconnstate(const char *deb_file, unsigned int deb_line,conninfo conn, CState } if((state == c_off) && !conn->retime && (conn->flags & F_PERMANENT)) { conn->retime = 1; - timeout(retime,conn,((conn->charge != 0) ? 5*60*++conn->retiming : (conn->cause == ID_priv_Busy) ? 5 : (conn->flags & F_FASTREDIAL) ? 2 : 5)*HZ); + timeout(retime,conn,retimeout(conn)*HZ); } else if((state != c_off) && conn->retime) { conn->retime = 0; untimeout(retime,conn); @@ -269,10 +286,10 @@ Xdropconn (struct conninfo *conn, const char *deb_file, unsigned int deb_line) { chkone(conn); if(conn->locked) { - if(1)printf ("DropConn %s:%d: LOCK %d/%d/%ld\n", deb_file,deb_line, conn->minor, conn->fminor, conn->connref); + if(log_34 & 2)printf ("DropConn %s:%d: LOCK %d/%d/%ld\n", deb_file,deb_line, conn->minor, conn->fminor, conn->connref); return; } - if(1)printf ("DropConn %s:%d: %d/%d/%ld\n", deb_file,deb_line, conn->minor, conn->fminor, conn->connref); + if(log_34 & 2)printf ("DropConn %s:%d: %d/%d/%ld\n", deb_file,deb_line, conn->minor, conn->fminor, conn->connref); if(!conn->ignore) { conn->ignore=1; setconnstate(conn,c_forceoff); @@ -314,7 +331,7 @@ Xdropconn (struct conninfo *conn, const char *deb_file, unsigned int deb_line) { /* Say that we forgot the thing. */ char xs[10]; sprintf(xs,"-%d",conn->seqnum); - connreport(xs,conn->cg ? conn->cg->card : "*"); + connreport(xs,conn->cg ? conn->cg->card : "*",0); } dropgrab(conn->cg); if(conn->lastMsg != NULL) @@ -404,10 +421,8 @@ try_reconn(struct conninfo *conn) cg->lnr = NULL; cg->lnrsuf = NULL; cg->card = conn->cardname ? conn->cardname : "*"; cg->cclass = conn->classname ? conn->classname : "*"; - cg->flags &=~(F_MOVEFLAGS|F_INCOMING|F_OUTCOMPLETE|F_LNRCOMPLETE); + cg->flags &=~(F_MASKFLAGS|F_INCOMING|F_OUTCOMPLETE|F_LNRCOMPLETE); cg->flags |= F_OUTGOING; - if((cg->flags & (F_PERMANENT|F_LEASED)) == F_PERMANENT) - cg->flags |= F_DIALUP; if(cg->par_out != NULL) freemsg(cg->par_out); if((cg->par_out = allocb(256,BPRI_LO)) == NULL) { diff --git a/isdn_4/info.c b/isdn_4/info.c index 48db261..dc9c233 100644 --- a/isdn_4/info.c +++ b/isdn_4/info.c @@ -246,7 +246,7 @@ find_conn(void) if(conn == NULL) conn = xconn; if(conn != NULL) { - printf("Found Conn %d/%d, cref %ld\n",conn->minor,conn->fminor,conn->connref); + if(0)printf("Found Conn %d/%d, cref %ld\n",conn->minor,conn->fminor,conn->connref); } if (conn != NULL && ind != IND_OPEN) { if (conn->minor == 0 && minor != 0) { @@ -312,9 +312,11 @@ init_vars (void) *(ulong_t *) crd = 0; crd[4] = '\0'; - printf ("HL R "); - dumpascii (data, len); - printf ("\n"); + if(log_34 & 1) { + printf ("HL R "); + dumpascii (data, len); + printf ("\n"); + } data[len] = '\0'; xx.b_rptr = data; xx.b_wptr = data + len; @@ -406,7 +408,7 @@ do_card(void) io[0].iov_len = xlen; len = 1; if(dl->args != NULL) { - printf ("+ "); + if(log_34 & 1)printf ("+ "); io[len].iov_base = ":: "; io[len].iov_len = 3; len++; @@ -514,7 +516,7 @@ do_cardproto(void) xx.b_rptr = xx.b_wptr = ans; db.db_base = ans; db.db_lim = ans + sizeof (ans); - if(1)printf("Dis10 "); + if(log_34 & 2)printf("Dis10 "); m_putid (&xx, CMD_OFF); if(minor > 0) { m_putsx (&xx, ARG_MINOR); @@ -549,7 +551,7 @@ do_cardproto(void) xx.b_rptr = xx.b_wptr = ans; db.db_base = ans; db.db_lim = ans + sizeof (ans); - if(1)printf("Dis11 "); + if(log_34 & 2)printf("Dis11 "); m_putid (&xx, CMD_OFF); if(minor > 0) { m_putsx (&xx, ARG_MINOR); @@ -667,7 +669,7 @@ do_incoming(void) incomplete = 0; goto inc_err; } - cg->flags = F_INCOMING|F_DIALUP|F_PERMANENT|F_NRCOMPLETE|F_LNRCOMPLETE; + cg->flags = F_INCOMING|F_MULTIDIALUP|F_DIALUP|F_PERMANENT|F_NRCOMPLETE|F_LNRCOMPLETE; cinf = allocb(len,BPRI_LO); if(cinf == NULL) { resp = "OutOfMemFoo"; @@ -696,12 +698,13 @@ do_incoming(void) } { char *sit = NULL,*pro = NULL,*car = NULL,*cla = NULL; /* GCC */ + long flg; ulong_t sub = 0; if(0)printf("Hunt for %s/%s/%s/%s/%o\n",cg->site,cg->protocol,cg->card,cg->cclass,cg->flags); /* Figure out which program to run. */ for (cfr = cf_R; cfr != NULL; cfr = cfr->next) { if(cfr->got_err) continue; - if (!matchflag(cg->flags,cfr->type)) continue; + if ((flg = matchflag (cg->flags,cfr->type)) == 0) continue; if ((sit = wildmatch (cg->site, cfr->site)) == NULL) continue; if ((pro = wildmatch (cg->protocol, cfr->protocol)) == NULL) continue; if ((car = wildmatch (cg->card, cfr->card)) == NULL) continue; @@ -735,7 +738,7 @@ do_incoming(void) mz = allocb(40,BPRI_HI); if(mz == NULL) goto cont; if(*resp != '+') { /* Throw away the incoming call */ - if(1)printf("Dis1 "); + if(log_34 & 2)printf("Dis1 "); m_putid (mz, CMD_OFF); m_putsx (mz, ARG_NODISC); m_putsx (mz, ARG_FORCE); @@ -784,7 +787,7 @@ do_incoming(void) } resp = NULL; } else { /* Throw away the outgoing call */ - if(1)printf("Dis2 "); + if(log_34 & 2)printf("Dis2 "); m_putid (mz, CMD_OFF); m_putsx (mz, ARG_NODISC); m_putsx (mz, ID_N0_cause); @@ -869,7 +872,7 @@ do_incoming(void) db.db_base = ans; db.db_lim = ans + sizeof (ans); - if(1)printf("Dis3 "); + if(log_34 & 2)printf("Dis3 "); m_putid (&xx, CMD_OFF); if(connref != 0) { m_putsx (&xx, ARG_CONNREF); @@ -1118,7 +1121,7 @@ do_disc(void) xx.b_rptr = xx.b_wptr = ans; db.db_base = ans; db.db_lim = ans + sizeof (ans); - if(1)printf("Dis4d "); + if(log_34 & 2)printf("Dis4d "); m_putid (&xx, CMD_CLOSE); m_putsx (&xx, ARG_MINOR); m_puti (&xx, minor); @@ -1189,7 +1192,7 @@ do_disc(void) xx.b_rptr = xx.b_wptr = ans; db.db_base = ans; db.db_lim = ans + sizeof (ans); - if(1)printf("Dis4 "); + if(log_34 & 2)printf("Dis4 "); m_putid (&xx, CMD_OFF); m_putsx (&xx, ARG_MINOR); m_puti (&xx, minor); @@ -1222,7 +1225,7 @@ do_close(void) if (conn->pid == 0) dropconn (conn); else { - printf("PID still %d\n",conn->pid); + if(log_34 & 2)printf("PID still %d\n",conn->pid); kill(conn->pid,SIGHUP); } } @@ -1239,7 +1242,7 @@ do_close(void) if (conn->pid == 0) dropconn (conn); else { - printf("PID still %d\n",conn->pid); + if(log_34 & 2)printf("PID still %d\n",conn->pid); kill(conn->pid,SIGHUP); } } @@ -1378,7 +1381,7 @@ do_hasconnected(void) { if (conn != NULL) { if (conn->cg != NULL) - conn->flags |= conn->cg->flags & F_MOVEFLAGS; + conn->flags = (conn->flags &~ F_MASKFLAGS) | (conn->cg->flags & F_MOVEFLAGS); setconnstate(conn,c_up); } resp = "CONNECT"; @@ -1438,7 +1441,7 @@ do_disconnect(void) xx.b_rptr = xx.b_wptr = ans; db.db_base = ans; db.db_lim = ans + sizeof (ans); - if(1)printf("Dis5 "); + if(log_34 & 2)printf("Dis5 "); m_putid (&xx, CMD_OFF); m_putsx (&xx, ARG_MINOR); m_puti (&xx, minor); @@ -1465,7 +1468,7 @@ do_hasdisconnect(void) m_putid (&xx, PROTO_MODULE); m_putsx (&xx, PROTO_MODULE); m_putsz (&xx, (uchar_t *) "proto"); - printf("On4 %p %d\n",conn,dialin); + if(log_34 & 2)printf("On4 %p %d\n",conn,dialin); m_putsx (&xx, ((conn != NULL) || (dialin > 0)) ? PROTO_ONLINE : PROTO_OFFLINE); xlen = xx.b_wptr - xx.b_rptr; DUMPW (xx.b_rptr, xlen); @@ -1476,7 +1479,7 @@ do_hasdisconnect(void) xx.b_rptr = xx.b_wptr = ans; db.db_base = ans; db.db_lim = ans + sizeof (ans); - if(1)printf("Dis6 "); + if(log_34 & 2)printf("Dis6 "); m_putid (&xx, CMD_OFF); m_putsx (&xx, ARG_MINOR); m_puti (&xx, minor); @@ -1555,7 +1558,7 @@ do_wantconnect(void) xx.b_rptr = xx.b_wptr = ans; db.db_base = ans; db.db_lim = ans + sizeof (ans); - if(1)printf("Dis7 "); + if(log_34 & 2)printf("Dis7 "); m_putid (&xx, CMD_OFF); m_putsx (&xx, ARG_MINOR); m_puti (&xx, minor); @@ -1715,7 +1718,7 @@ do_atcmd(void) setconnstate(conn, c_forceoff); else setconnstate(conn, c_down); - if(1)printf("Dis8 "); + if(log_34 & 2)printf("Dis8 "); if(mb != NULL) { { @@ -1755,12 +1758,8 @@ do_atcmd(void) case 'L': /* List connections and state changes. */ { struct conninfo *fconn; - char *sp; - msgbuf = malloc(10240); - if(msgbuf == NULL) { - resp = "NO MEMORY.6"; - return 1; - } + char buf[30]; + conn = malloc(sizeof(*conn)); if(conn == NULL) { free(msgbuf); @@ -1791,29 +1790,22 @@ do_atcmd(void) } else conn->cardname = "*"; } - sp = resp = msgbuf; - sp += sprintf(sp,"#:ref id site protocol class pid state/card cost total flags,rem.nr;loc.nr cause\r\n"); + conn->seqnum = ++connseq; + conn->ignore = 3; + conn->minor = minor; + conn->next = isdn4_conn; isdn4_conn = conn; + + connreport("#:ref id site protocol class pid state/card cost total flags,remNr;locNr cause\r\n","*",minor); for(fconn = isdn4_conn; fconn != NULL; fconn = fconn->next) { if(fconn->ignore >= 3) continue; if((fconn->cg != NULL) && (fconn->cg->card != NULL)) if(!wildmatch(fconn->cg->card,conn->cardname)) continue; - sp += sprintf(sp,"%s%d:%d %s %s %s %d %s/%s %ld %ld %s %s\r\n", - fconn->ignore?"!":"", fconn->minor, fconn->seqnum, - (fconn->cg && fconn->cg->site) ? fconn->cg->site : "-", - (fconn->cg && fconn->cg->protocol) ? fconn->cg->protocol : "-", - (fconn->cg && fconn->cg->cclass) ? fconn->cg->cclass : "-", - fconn->pid, state2str(fconn->state), - (fconn->cg && fconn->cg->card) ? fconn->cg->card : (fconn->cardname ? fconn->cardname : "-"), - fconn->charge, fconn->ccharge, FlagInfo(fconn->flags), - CauseInfo(fconn->cause, fconn->causeInfo)); + ReportOneConn(fconn,minor); } - conn->seqnum = ++connseq; - conn->ignore = 3; - conn->minor = minor; - conn->next = isdn4_conn; isdn4_conn = conn; - sp += sprintf(sp,"# Waiting %s...",conn->cardname); + sprintf(buf,"# Waiting %s...",conn->cardname); + resp = str_enter(buf); return 1; } @@ -1970,7 +1962,7 @@ do_atcmd(void) m_putid (&yy, PROTO_MODULE); m_putsx (&yy, PROTO_MODULE); m_putsz (&yy, (uchar_t *) "proto"); - printf("On5\n"); + if(log_34 & 2)printf("On5\n"); m_putsx (&yy, PROTO_ONLINE); xlen = yy.b_wptr - yy.b_rptr; DUMPW (yy.b_rptr, xlen); @@ -1988,7 +1980,7 @@ do_atcmd(void) yy.b_rptr = yy.b_wptr = ans; dbb.db_base = ans; dbb.db_lim = ans + sizeof (ans); - if(1)printf("Dis9 "); + if(log_34 & 2)printf("Dis9 "); m_putid (&yy, CMD_OFF); m_putsx (&yy, ARG_MINOR); m_puti (&yy, minor); @@ -2095,14 +2087,14 @@ do_atcmd(void) } if(conn != NULL) { - setconnref(conn,connrefs); - connrefs += 2; + setconnref(conn,isdn4_connref); + isdn4_connref += 2; cg->refs++; dropgrab(conn->cg); conn->cg = cg; } - cg->flags = F_OUTGOING|F_DIALUP; + cg->flags = F_OUTGOING|F_MULTIDIALUP|F_DIALUP; if(m3 != NULL) cg->card = str_enter(m3); else @@ -2225,7 +2217,7 @@ printf("GotAnError: Minor %ld, connref %ld, hdr %s\n",minor,connref,HdrName(hdrv cf cfr; for (cfr = cf_R; cfr != NULL; cfr = cfr->next) { - if (!matchflag(conn->cg->flags,cfr->type)) continue; + if (matchflag (conn->cg->flags,cfr->type) == 0) continue; if (wildmatch (conn->cg->site, cfr->site) == NULL) continue; if (wildmatch (conn->cg->protocol, cfr->protocol) == NULL) continue; if (wildmatch (conn->cg->card, cfr->card) == NULL) continue; @@ -2259,7 +2251,7 @@ printf("GotAnError: Minor %ld, connref %ld, hdr %s\n",minor,connref,HdrName(hdrv db.db_lim = ans + sizeof (ans); *xx.b_wptr++ = PREF_NOERR; - if(1)printf("DisA "); + if(log_34 & 2)printf("DisA "); m_putid (&xx, CMD_OFF); m_putsx(&xx,ARG_FORCE); if(minor > 0) { diff --git a/isdn_4/master.c b/isdn_4/master.c index 442c0c7..9070dd6 100644 --- a/isdn_4/master.c +++ b/isdn_4/master.c @@ -37,12 +37,18 @@ main (int argc, char *argv[]) else progname++; - while ((x = getopt (argc, argv, "iIf:dlLwWqQ"))!= EOF) { + while ((x = getopt (argc, argv, "iIf:dlLwWqQmM"))!= EOF) { switch (x) { /* * Logging. Small letters are usermode, capitals log in the kernel. * 'l' is raw data, 'w' is interpreted data, 'q' is queue info. */ + case 'm': + log_34 |= 1; + break; + case 'M': + log_34 |= 2; + break; case 'l': pushlog |= 1; break; @@ -124,6 +130,12 @@ main (int argc, char *argv[]) #ifdef HAVE_SETPGRP_0 setpgrp(); #endif + } + { /* Switch stdout and stderr */ + int fd = dup(1); + dup2(2,1); + dup2(fd,2); + close(fd); } #ifdef linux @@ -166,7 +178,7 @@ main (int argc, char *argv[]) mknod (idevname (i), S_IFCHR | S_IRUSR | S_IWUSR, MKDEV(isdnstd,i)); chmod (idevname (i), S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); } - syslog(LOG_DEBUG,"ISDN: isdn/XX: major number %d",isdnstd); + if(0)syslog(LOG_DEBUG,"ISDN: isdn/XX: major number %d",isdnstd); } if(isdnterm == 0) @@ -175,7 +187,7 @@ main (int argc, char *argv[]) int i; for(i=1;i #include #include -#include #include "f_signal.h" +#include "kernel.h" #include -#include #include #include "streams.h" #include "sioctl.h" @@ -29,8 +28,7 @@ #include "f_ioctl.h" #include "f_termio.h" #include -#include -#include "f_signal.h" +#include "stropts.h" #include #include "f_strings.h" #include @@ -41,10 +39,7 @@ #include #include #include -#include "streams.h" -#include "sioctl.h" #include "streamlib.h" -#include "isdn_34.h" #include "phone_1TR6.h" #include "phone_ETSI.h" #include "isdn_proto.h" @@ -57,8 +52,6 @@ #include "isdn_23.h" #endif #include "isdn_limits.h" -#include "dump.h" -#include "timeout.h" #include "x75.h" #include "proto.h" @@ -155,10 +148,11 @@ EXTERN uid_t user[NMINOR]; /* Unique refnum, always incremented by two */ /* The lower level also has one of these, but with the low bit set */ -EXTERN long connrefs INIT(2); +EXTERN long isdn4_connref INIT(2); EXTERN int fd_mon; /* the lower/layer connection */ EXTERN char *progname; +EXTERN int log_34 INIT(0); EXTERN int testonly INIT(0); /* set if fd_mon is not actually connected */ EXTERN int igstdin INIT(1); /* Ignore stdin */ EXTERN int in_boot INIT(1); /* We're still coming up */ @@ -182,7 +176,7 @@ EXTERN int connseq INIT(0); EXTERN struct xstream *xs_mon; /* Pseudo-stream for the L3 engine */ -#define DUMPW(s,l) do { printf("HL W "); dumpascii((uchar_t *)(s),(l)); printf("\n"); } while(0) +#define DUMPW(s,l) do { if(!(log_34 & 1)) break; printf("HL W "); dumpascii((uchar_t *)(s),(l)); printf("\n"); } while(0) /* String database. Should probably be an AVL tree or a hash but I'm lazy. */ /** The purpose of this thing is to be able not to bother with keeping track @@ -307,25 +301,27 @@ typedef struct conninfo { #define F_INTERRUPT 01 /* interrupt, don't disconnect */ #define F_PREFOUT 02 /* drop incoming connection on call collision */ #define F_FORCEOUT 04 /* always drop incoming connection */ -#define F_IGNORELIMIT 010 /* override card limit */ +#define F_IGNORELIMIT 010 /* override connection limit */ #define F_FASTDROP 020 /* immediate connection reject */ #define F_FASTREDIAL 040 /* don't delay as much when a dialup attempt fails */ -#define F_PERMANENT 0100 /* connection doesn't really die */ -#define F_LEASED 0200 /* leased line */ +#define F_PERMANENT 0100 /* dialup connection which doesn't really die */ +#define F_LEASED 0200 /* connection on leased line */ #define F_CHANBUSY 0400 /* busy if no free channel */ #define F_NRCOMPLETE 01000 /* remote number is complete */ #define F_LNRCOMPLETE 02000 /* local number is complete */ #define F_INCOMING 04000 /* incoming call */ #define F_OUTGOING 010000 /* outgoing call */ -#define F_DIALUP 020000 /* dialup line */ -#define F_IGNORELIMIT2 040000 /* override card limit */ +#define F_DIALUP 020000 /* dialup connection */ +#define F_MULTIDIALUP 040000 /* dialup connection, independent */ #define F_OUTCOMPLETE 0100000 /* outgoing call info complete */ #define F_SETINITIAL 0200000 /* initial connection setup */ #define F_SETLATER 0400000 /* later re-setup */ #define F_NOREJECT 01000000 /* don't cause "temp unavailable" messages */ #define F_BACKCALL 02000000 /* callback on B if incoming call on A busy */ +#define F_FOOBAR 04000000 /* dummy flag to return TRUE */ -#define F_MOVEFLAGS (F_IGNORELIMIT|F_IGNORELIMIT2) +#define F_MOVEFLAGS (F_IGNORELIMIT|F_PERMANENT|F_DIALUP|F_MULTIDIALUP|F_LEASED) +#define F_MASKFLAGS (F_PERMANENT|F_DIALUP|F_MULTIDIALUP) /* FLags we set on start of a connection from the conngrab */ /* @@ -363,11 +359,12 @@ void do_quitnow(void *nix); #define setconnref(a,b) Xsetconnref(__FILE__,__LINE__,(a),(b)) void Xsetconnref(const char *deb_file,unsigned int deb_line, conninfo conn, int connref); -void connreport(char *foo, char *card); +void connreport(char *foo, char *card, int minor); /* Changing a connection status, and things to do */ const char *CauseInfo(int cause, char *pri); -void ReportConn(conninfo conn); +void ReportOneConn(conninfo conn, int minor); +#define ReportConn(a) ReportOneConn((a),0) #define setconnstate(a,b) Xsetconnstate(__FILE__,__LINE__,(a),(b)) void Xsetconnstate(const char *deb_file, unsigned int deb_line,conninfo conn, CState state); @@ -462,7 +459,7 @@ void Xdropconn (struct conninfo *conn, const char *deb_file, unsigned int deb_li void rdropconn (struct conninfo *conn, int deb_line); void deadkid (void); -int matchflag(long flags, char *ts); +long matchflag(long flags, char *ts); cf getcards(conngrab cg, cf list); void Xbreak(void); diff --git a/isdn_4/match.c b/isdn_4/match.c index 5673d04..4f913e6 100644 --- a/isdn_4/match.c +++ b/isdn_4/match.c @@ -10,18 +10,19 @@ /* Verify that the connection mode matches the stated flags. */ -int +long matchflag(long flags, char *ts) { - char inc,outg,leas,prep,dial,ini,aft; + char inc,outg,leas,perm,dial,mdial,ini,aft; ini = (strchr(ts,'u') != NULL); aft = (strchr(ts,'a') != NULL); inc = (strchr(ts,'i') != NULL); outg= (strchr(ts,'o') != NULL); leas= (strchr(ts,'f') != NULL); - prep= (strchr(ts,'p') != NULL); + perm= (strchr(ts,'p') != NULL); dial= (strchr(ts,'d') != NULL); + mdial=(strchr(ts,'m') != NULL); if(flags & F_SETINITIAL) { if (aft && !ini) return 0; } if(flags & F_SETLATER) { if (!aft && ini) return 0; } @@ -29,12 +30,23 @@ matchflag(long flags, char *ts) if(flags & F_OUTGOING) { if (inc && !outg) return 0; } if(flags & F_INCOMING) { if (!inc && outg) return 0; } - if(!(flags & (F_LEASED|F_PERMANENT|F_DIALUP))) return 1; - if(!(leas || dial || prep)) return 1; - if((flags & F_LEASED) && leas) return 1; - if((flags & F_PERMANENT)&& prep) return 1; - if((flags & F_DIALUP) && dial) return 1; + if(!(leas || dial || perm)) goto set; + if(!(flags & (F_LEASED|F_PERMANENT|F_MULTIDIALUP|F_DIALUP))) goto set; + if((flags & F_LEASED) && leas) goto set; + if((flags & F_PERMANENT) && perm) goto set; + if((flags & F_DIALUP) && dial) goto set; + if((flags & F_MULTIDIALUP) && mdial) goto set; return 0; + set: + if(ini) flags |= F_SETINITIAL; + if(aft) flags |= F_SETLATER; + if(inc) flags |= F_INCOMING; + if(outg) flags |= F_OUTGOING; + if(leas) flags |= F_LEASED; + if(perm) flags |= F_PERMANENT; + if(dial) flags |= F_DIALUP; + if(mdial)flags |= F_MULTIDIALUP; + return flags | F_FOOBAR; } /* Check if this P-line matches a connection request */ @@ -42,6 +54,7 @@ char * pmatch1 (cf prot, conngrab *cgm) { char *sit, *pro, *cla, *car; + long flg; ulong_t sub; char first = 1; conngrab cg = *cgm; @@ -71,7 +84,7 @@ pmatch1 (cf prot, conngrab *cgm) mblk_t *cand = NULL; streamchar *mbs_in = NULL, *mbs_out = NULL; - if(!matchflag(cg->flags,prot->type)) { if(first) { dropgrab(cg); return "5ERR BadFlag"; } else continue;} + if((flg = matchflag(cg->flags,prot->type)) == 0) { if(first) { dropgrab(cg); return "5ERR BadFlag"; } else continue;} if (first) { if (strchr (prot->type, 'M')) { /* First Match not allowed. */ dropgrab(cg); @@ -96,7 +109,7 @@ pmatch1 (cf prot, conngrab *cgm) } if(!first) { cgc->site = sit; cgc->protocol = pro; cgc->card = car; cgc->cclass = cla; - cgc->mask = sub; + cgc->mask = sub; cgc->flags = flg; } if(cgc->par_out == NULL) { /* No outgoing parameter list? Yet! */ if ((cgc->par_out = allocb(256,BPRI_LO)) == NULL) { @@ -286,8 +299,8 @@ pmatch1 (cf prot, conngrab *cgm) break; if ((nrt & ARG_IN) && (cgc->flags & F_INCOMING)) { if (cgc->nrsuf != NULL) { - if(1)printf("MatchSuffix %s and %s\n",cgc->nrsuf,yy); - if(match_suffix(cgc->nrsuf,yy) <= 0) DG("2WrongNrSuffix 2"); + if(0)printf("MatchSuffix %s and %s\n",cgc->nrsuf,yy); + if(match_suffix(cgc->nrsuf,yy) <= 0) DG("3WrongNrSuffix 2"); } else cgc->nrsuf = str_enter(yy); } @@ -322,7 +335,7 @@ pmatch1 (cf prot, conngrab *cgm) if(cgc->lnrsuf != NULL) { if(1)printf("MatchLSuffix %s and %s\n",cgc->lnrsuf,yy); if((suf = match_suffix(cgc->lnrsuf,yy)) <= 0) - DG(suf ? "3LNrIncompSuffix 2" : "3WrongLNrSuffix 2"); + DG(suf ? "1LNrIncompSuffix 2" : "2WrongLNrSuffix 2"); } else DG("4LNrIncompSuffix 3"); } @@ -342,9 +355,9 @@ pmatch1 (cf prot, conngrab *cgm) cgc->flags |= F_LNRCOMPLETE; } else { if((cgc->lnrsuf != 0) && (match_suffix(cgc->lnrsuf,yy) < 0)) - DG("3LNrIncompSuffix 4"); + DG("2LNrIncompSuffix 4"); else - DG("3WrongLNrSuffix 4"); + DG("2WrongLNrSuffix 4"); } } } @@ -489,6 +502,7 @@ if(0)printf("%s.%s.!.",cg->site,cg->card); /* I hate debugging. */ char *matcar; char *matpro; ulong_t matsub; + long matflg; if(d == NULL) { /* Restart at the beginning */ numwrap = 0; @@ -500,20 +514,23 @@ if(0)printf("%s.%s.!.",cg->site,cg->card); /* I hate debugging. */ continue; /* scan and skip */ else if(numwrap == 0) numwrap = -1; - if(!(cg->flags & F_INCOMING)) - numidx++; /* Check this; check the next number next time. */ + if(!(cg->flags & F_INCOMING)) { + numidx++; + if((strchr(d->type,'B') != NULL) && (numwrap > 0)) + continue; /* THIS DOES NOT WORK YET */ + } /* Yes, we did increment the refcount, above. */ dropgrab(cg); cg = *foo; cg->refs++; + if((matflg = matchflag(cg->flags,d->type)) == 0) continue; if((matsit = wildmatch(cg->site,d->site)) == NULL) continue; if((matpro = wildmatch(cg->protocol,d->protocol)) == NULL) continue; if((matcar = wildmatch(matcrd,d->card)) == NULL) continue; if((matcla = classmatch(matclass,d->cclass)) == NULL) continue; if((matsub = maskmatch(cg->mask,d->mask)) == 0) continue; - if(!matchflag(cg->flags,d->type)) continue; /* Preliminary match OK, remember the data so far. */ dropgrab(cg); @@ -522,7 +539,7 @@ if(0)printf("%s.%s.!.",cg->site,cg->card); /* I hate debugging. */ cg->site = matsit; cg->cclass = matcla; cg->card = matcar; cg->protocol = matpro; - cg->mask = matsub; + cg->mask = matsub; cg->flags = matflg; if(!(cg->flags & F_LEASED)) { /* Now figure out the numbers... */ diff --git a/isdn_4/nr.c b/isdn_4/nr.c index d2fba41..6e6478f 100644 --- a/isdn_4/nr.c +++ b/isdn_4/nr.c @@ -99,8 +99,12 @@ char *match_nr (char *extnr, char *locnr, char *locpref) return NULL; extpos++; locpos++; } - if(*locpos != '\0') + if(*locpos != '\0') { + if(*locpos == '/' || *locpos == '.') + if(wildmat("",locpos+1)) + return str_enter(locpos); return NULL; + } return ""; } diff --git a/isdn_4/texts.c b/isdn_4/texts.c index 331583f..ae0a767 100644 --- a/isdn_4/texts.c +++ b/isdn_4/texts.c @@ -57,6 +57,12 @@ char *FlagInfo(int flag) static char fbuf[30]; fbuf[0]='\0'; + if (flag & F_INCOMING) strcat(fbuf, ":in"); + if (flag & F_OUTGOING) strcat(fbuf, ":ou"); + if (flag & F_PERMANENT) strcat(fbuf, ":dP"); + if (flag & F_LEASED) strcat(fbuf, ":dL"); + if (flag & F_MULTIDIALUP) strcat(fbuf, ":dM"); + if (flag & F_DIALUP) strcat(fbuf, ":dD"); if (flag & F_INTERRUPT) strcat(fbuf, ":is"); if (flag & F_PREFOUT) strcat(fbuf, ":xi"); if (flag & F_FORCEOUT) strcat(fbuf, ":yi"); @@ -64,15 +70,9 @@ char *FlagInfo(int flag) if (flag & F_IGNORELIMIT) strcat(fbuf, ":il"); if (flag & F_FASTDROP) strcat(fbuf, ":fX"); if (flag & F_FASTREDIAL) strcat(fbuf, ":fr"); - if (flag & F_PERMANENT) strcat(fbuf, ":dP"); - if (flag & F_LEASED) strcat(fbuf, ":dL"); if (flag & F_CHANBUSY) strcat(fbuf, ":ib"); if (flag & F_NRCOMPLETE) strcat(fbuf, ":nc"); if (flag & F_LNRCOMPLETE) strcat(fbuf, ":lc"); - if (flag & F_INCOMING) strcat(fbuf, ":in"); - if (flag & F_OUTGOING) strcat(fbuf, ":ou"); - if (flag & F_DIALUP) strcat(fbuf, ":dD"); - if (flag & F_IGNORELIMIT2) strcat(fbuf, ":iL"); if (flag & F_OUTCOMPLETE) strcat(fbuf, ":oc"); if (flag & F_SETINITIAL) strcat(fbuf, ":si"); if (flag & F_SETLATER) strcat(fbuf, ":sl"); @@ -91,6 +91,7 @@ const char *CauseInfo(int cause, char *pri) case 0: return "OK"; case ID_priv_Busy: return "Local Busy"; case ID_priv_Print: if(isdigit(*pri)) return pri+1; else return pri; + case CHAR2('?','?'): return "-unknown-"; #ifdef _capi_ case ID_E_REGISTER: return "application registration"; diff --git a/isdn_4/work.c b/isdn_4/work.c index 4ad15d0..b525f31 100644 --- a/isdn_4/work.c +++ b/isdn_4/work.c @@ -16,7 +16,8 @@ deadkid (void) struct conninfo *conn; while((pid = wait4 (-1,&val,WNOHANG,NULL)) > 0) { - printf ("\n* PID %d died, %x\n", pid, val); + if(log_34 & 2) + printf ("\n* PID %d died, %x\n", pid, val); chkall(); for (conn = isdn4_conn; conn != NULL; conn = conn ? conn->next : NULL) { @@ -78,7 +79,7 @@ pushprot (conngrab cg, int minor, int connref, char update) char *mods = NULL; for (prot = cf_ML; prot != NULL; prot = prot->next) { - if(!matchflag(cg->flags,prot->type)) continue; + if (!matchflag (cg->flags,prot->type)) continue; if (!wildmatch (cg->site, prot->site)) continue; if (!wildmatch (cg->protocol, prot->protocol)) continue; if (!wildmatch (cg->card, prot->card)) continue; @@ -151,7 +152,7 @@ pushprot (conngrab cg, int minor, int connref, char update) streamchar *newlim = NULL; mblk_t *mz = NULL; - if(!matchflag(cg->flags,cm->type)) continue; + if (!matchflag (cg->flags,cm->type)) continue; if (!wildmatch (cg->site, cm->site)) continue; if (!wildmatch (cg->protocol, cm->protocol)) continue; if (!wildmatch (cg->card, cm->card)) continue; @@ -212,7 +213,8 @@ pushprot (conngrab cg, int minor, int connref, char update) io[1].iov_base = mi->b_rptr; io[1].iov_len = mi->b_wptr - mi->b_rptr; DUMPW (mj->b_rptr, io[0].iov_len); - printf ("+ "); + if(log_34 & 1) + printf ("+ "); DUMPW (mi->b_rptr, io[1].iov_len); (void) strwritev (xs_mon, io, 2, 1); freeb (mj); @@ -258,7 +260,7 @@ pushcardprot (conngrab cg, int minor, int connref) if(card == NULL) return -ENOENT; for (prot = cf_ML; prot != NULL; prot = prot->next) { - if(!matchflag(cg->flags,prot->type)) continue; + if (!matchflag (cg->flags,prot->type)) continue; if (!wildmatch (cg->site, prot->site)) continue; if (!wildmatch (cg->protocol, prot->protocol)) continue; if (!wildmatch (cg->card, prot->card)) continue; @@ -351,7 +353,7 @@ startconn(conngrab cg, int fminor, int connref, char **ret, conngrab *retcg) if(conn->cg == cg) break; } - if(conn == NULL) { + if(conn == NULL && (cg->flags & (F_PERMANENT|F_MULTIDIALUP|F_DIALUP))) { for(conn = isdn4_conn; conn != NULL; conn = conn->next) { char *sit,*pro,*car,*cla; ulong_t sub; @@ -360,7 +362,7 @@ startconn(conngrab cg, int fminor, int connref, char **ret, conngrab *retcg) continue; if(conn->pid == 0 || conn->minor == 0) continue; - if(!(conn->flags & F_PERMANENT)) + if(!(conn->flags & (F_PERMANENT|F_DIALUP))) continue; if(conn->cg == NULL) continue; @@ -374,7 +376,7 @@ startconn(conngrab cg, int fminor, int connref, char **ret, conngrab *retcg) break; } } - if(conn == NULL) { + if(conn == NULL && (cg->flags & (F_PERMANENT|F_MULTIDIALUP|F_DIALUP))) { for(conn = isdn4_conn; conn != NULL; conn = conn->next) { char *sit,*pro; @@ -382,7 +384,7 @@ startconn(conngrab cg, int fminor, int connref, char **ret, conngrab *retcg) continue; if(conn->pid == 0 || conn->minor == 0) continue; - if(!(conn->flags & F_PERMANENT)) + if(!(conn->flags & (F_PERMANENT|F_DIALUP))) continue; if(conn->cg == NULL) continue; @@ -399,6 +401,8 @@ startconn(conngrab cg, int fminor, int connref, char **ret, conngrab *retcg) } /* Returning "+" in the first position means keep the new connection. */ + /* Return "-" to keep the old connection. */ + /* Return "=" to call back. */ if(conn->state == c_forceoff) { dropgrab(cg); @@ -407,15 +411,15 @@ startconn(conngrab cg, int fminor, int connref, char **ret, conngrab *retcg) } if(conn->state == c_going_down) { dropgrab(cg); - *ret = "-COLLISION 1b"; + *ret = "+COLLISION 1b"; return conn; } if(conn->state > c_going_down) { - *ret = "+COLLISION 1b"; + *ret = "-COLLISION 1b"; if((conn->state == c_going_up) && (cg->flags & F_PREFOUT)) - **ret = '-'; + **ret = '+'; if((conn->state == c_up) && (cg->flags & (F_PREFOUT | F_FORCEOUT))) - **ret = '-'; + **ret = '+'; dropgrab(cg); return conn; } @@ -425,7 +429,8 @@ startconn(conngrab cg, int fminor, int connref, char **ret, conngrab *retcg) return conn; } -printf("Start: %s:%s #%s...",cg->site,cg->protocol,cg->nr); + if(log_34 & 2) + printf("Start: %s:%s #%s...",cg->site,cg->protocol,cg->nr); if(((*ret) = findit (&cg,0)) != NULL) { *retcg = cg; dropgrab(rcg); @@ -452,8 +457,8 @@ printf("Start: %s:%s #%s...",cg->site,cg->protocol,cg->nr); m_puti (&yy, cg->delay); if(cg->flags & F_OUTGOING) { m_putsx(&yy,ARG_NOCONN); - setconnref(conn,connrefs); - connrefs += 2; + setconnref(conn,isdn4_connref); + isdn4_connref += 2; } else if(connref != 0) { if(conn->connref != 0 && conn->state == c_up) { *ret = "COLLISION 2"; @@ -483,10 +488,12 @@ printf("Start: %s:%s #%s...",cg->site,cg->protocol,cg->nr); if (cg->lnr != NULL) { char *s = strip_nr(cg->lnr,1); - printf("Strip3 %s -> %s\n",cg->lnr,s); + if(log_34 & 2) + printf("Strip3 %s -> %s\n",cg->lnr,s); if(s == NULL && cg->lnrsuf != NULL) { s = append_nr(cg->lnr,cg->lnrsuf); - printf("Append3 %s,%s -> %s\n",cg->lnr,cg->lnrsuf,s); + if(log_34 & 2) + printf("Append3 %s,%s -> %s\n",cg->lnr,cg->lnrsuf,s); } if(s != NULL) { m_putsx (&yy, ARG_LNUMBER); @@ -495,10 +502,12 @@ printf("Start: %s:%s #%s...",cg->site,cg->protocol,cg->nr); } if (cg->nr != NULL) { char *s = strip_nr(cg->nr,0); - printf("Strip3 %s -> %s\n",cg->nr,s); + if(log_34 & 2) + printf("Strip3 %s -> %s\n",cg->nr,s); if(s == NULL && cg->nrsuf != NULL) { s = append_nr(cg->nr,cg->nrsuf); - printf("Append3 %s,%s -> %s\n",cg->nr,cg->nrsuf,s); + if(log_34 & 2) + printf("Append3 %s,%s -> %s\n",cg->nr,cg->nrsuf,s); } if(s != NULL) { m_putsx (&yy, ARG_NUMBER); @@ -541,10 +550,12 @@ printf("Start: %s:%s #%s...",cg->site,cg->protocol,cg->nr); #endif DUMPW (yy.b_rptr, io[0].iov_len); if (iovlen > 1) { - printf ("+ "); + if(log_34 & 1) + printf ("+ "); DUMPW (xx->b_rptr, io[1].iov_len); if(iovlen > 2) { - printf ("+ "); + if(log_34 & 1) + printf ("+ "); DUMPW (cg->par_out->b_rptr, io[2].iov_len); } } @@ -658,6 +669,18 @@ runprog (cf cfr, struct conninfo **rconn, conngrab *foo) conn->pid = (pid_t)~0; ReportConn(conn); } + { + int flags = 0; + if (strchr(cfr->type,'m') != NULL) + flags |= F_MULTIDIALUP; + if (strchr(cfr->type,'d') != NULL) + flags |= F_DIALUP; + if (strchr(cfr->type,'p') != NULL) + flags |= F_PERMANENT; + if (strchr(cfr->type,'f') != NULL) + flags |= F_LEASED; + cg->flags = (cg->flags &~ (F_MULTIDIALUP|F_DIALUP|F_PERMANENT|F_LEASED)) | flags; + } } else { if(conn != NULL) { int id = 0; char *ids = strchr(cfr->type,'/'); @@ -982,8 +1005,8 @@ runprog (cf cfr, struct conninfo **rconn, conngrab *foo) #endif close (pip[0]); } - syslog (LOG_INFO, "exec %x:%x %d %s/%s %s", dev, dev2, pid, cfr->site,cfr->protocol, cfr->args); - printf ("* PID %d\n", pid); + syslog (LOG_INFO, "exec %d:%d %d %s/%s %s", dev, dev2, pid, cfr->site,cfr->protocol, cfr->args); + if(0)printf ("* PID %d\n", pid); if(prog != NULL) { prog->next = conn->run; diff --git a/ksupport/count.c b/ksupport/count.c index 820febb..108f378 100644 --- a/ksupport/count.c +++ b/ksupport/count.c @@ -8,7 +8,7 @@ #include "f_malloc.h" #include #include -#include +#include "stropts.h" #ifdef DONT_ADDERROR #include "f_user.h" #endif diff --git a/ksupport/log.c b/ksupport/log.c index ff28a7a..01d548a 100644 --- a/ksupport/log.c +++ b/ksupport/log.c @@ -7,7 +7,7 @@ #include "f_signal.h" #include "f_malloc.h" #include -#include +#include "stropts.h" #ifdef DO_ADDUSER #include "f_user.h" #endif diff --git a/ksupport/logh.c b/ksupport/logh.c index a59959a..0ad5115 100644 --- a/ksupport/logh.c +++ b/ksupport/logh.c @@ -8,7 +8,7 @@ #include "f_malloc.h" #include #include "streams.h" -#include +#include "stropts.h" #include "streamlib.h" #include "isdn_23.h" #include "kernel.h" diff --git a/ksupport/proto.c b/ksupport/proto.c index 0e5edf0..b89271b 100644 --- a/ksupport/proto.c +++ b/ksupport/proto.c @@ -8,7 +8,7 @@ #include "f_signal.h" #include #include -#include +#include "stropts.h" #include "f_user.h" #include #include @@ -902,7 +902,6 @@ if(!realq)printf("%sFromDel %p\n",KERN_DEBUG, &proto->write_delay); if(0)printf("%sProto IOC %x\n",KERN_DEBUG,iocb->ioc_cmd); switch (iocb->ioc_cmd) { -#if 1 /* ndef linux */ #ifdef TCGETA case TCGETA: { @@ -926,18 +925,15 @@ if(!realq)printf("%sFromDel %p\n",KERN_DEBUG, &proto->write_delay); #else memcpy(tty->c_cc,proto->tty.c_cc,NCCS); #endif - - goto iocack; + goto iocackn; } #endif -#endif #ifdef TCFLSH case TCFLSH: { - goto iocack; /* We don't flush */ + goto iocackn; /* We don't flush */ } #endif -#if 1 /* ndef linux */ #ifdef TCGETS case TCGETS: { @@ -951,10 +947,9 @@ if(!realq)printf("%sFromDel %p\n",KERN_DEBUG, &proto->write_delay); mp->b_cont = m0; *((struct termios *) m0->b_wptr)++ = proto->tty; - goto iocack; + goto iocackn; } #endif -#endif #ifdef UIOCTTSTAT case UIOCTTSTAT: { @@ -973,7 +968,6 @@ if(!realq)printf("%sFromDel %p\n",KERN_DEBUG, &proto->write_delay); goto iocack; } #endif -#if 1 /* ndef linux */ #ifdef TCSETA case TCSETA: case TCSETAW: @@ -1027,12 +1021,10 @@ if(!realq)printf("%sFromDel %p\n",KERN_DEBUG, &proto->write_delay); /* bzero(proto->tty.c_cc,NCC); */ #endif splx (ms); - goto iocack; + goto iocackn; } #endif -#endif -#if 1 /* ndef linux */ #ifdef TCSETS case TCSETS: case TCSETSW: @@ -1078,11 +1070,10 @@ if(!realq)printf("%sFromDel %p\n",KERN_DEBUG, &proto->write_delay); /* bzero(proto->tty.c_cc,NCC); */ #endif splx (ms); - goto iocack; + goto iocackn; } #endif -#endif #ifdef TCSBRK case TCSBRK: #endif @@ -1174,6 +1165,7 @@ if(!realq)printf("%sFromDel %p\n",KERN_DEBUG, &proto->write_delay); #ifdef UIOCNOFLOW case UIOCNOFLOW: #endif + iocack: DATA_TYPE(mp) = M_IOCACK; qreply (q, mp); @@ -1181,11 +1173,13 @@ if(!realq)printf("%sFromDel %p\n",KERN_DEBUG, &proto->write_delay); default: putnext (q, mp); break; +#ifdef linux /* This is handled by the line discipline. */ + iocackn: + error = -ENOIOCTLCMD; /* special code */ +#endif iocnak: DATA_TYPE(mp) = M_IOCNAK; - if(error < 0) - error = -error; - iocb->ioc_error = error; + iocb->ioc_error = (error < 0) ? -error : error; qreply (q, mp); } break; diff --git a/ksupport/qinfo.c b/ksupport/qinfo.c index 7366011..ce0f673 100644 --- a/ksupport/qinfo.c +++ b/ksupport/qinfo.c @@ -8,7 +8,7 @@ #include "f_malloc.h" #include #include "streams.h" -#include +#include "stropts.h" #include "f_user.h" #include #include "streamlib.h" diff --git a/pr_on/pr_on.c b/pr_on/pr_on.c index 2191196..541636b 100644 --- a/pr_on/pr_on.c +++ b/pr_on/pr_on.c @@ -8,7 +8,7 @@ #include #include #include "streams.h" -#include +#include "stropts.h" #include "f_user.h" #include "f_malloc.h" #include diff --git a/rate/rate.c b/rate/rate.c index d96d48d..f98185d 100644 --- a/rate/rate.c +++ b/rate/rate.c @@ -11,7 +11,7 @@ #include #include #include "streams.h" -#include +#include "stropts.h" #ifdef DONT_ADDERROR #include "f_user.h" #endif diff --git a/reconnect/reconnect.c b/reconnect/reconnect.c index 79db731..3fbecab 100644 --- a/reconnect/reconnect.c +++ b/reconnect/reconnect.c @@ -11,7 +11,7 @@ #include #include #include "streams.h" -#include +#include "stropts.h" #ifdef DONT_ADDERROR #include "f_user.h" #endif diff --git a/str_if/str_in.c b/str_if/str_in.c index dfd0dd3..b2c061c 100644 --- a/str_if/str_in.c +++ b/str_if/str_in.c @@ -20,7 +20,7 @@ #define NSTR 8 #include "streams.h" -#include +#include "stropts.h" #ifdef M_UNIX #include #endif diff --git a/str_if/str_in2.c b/str_if/str_in2.c index 9a65d26..35c5456 100644 --- a/str_if/str_in2.c +++ b/str_if/str_in2.c @@ -25,7 +25,7 @@ #include "primitives.h" #include "streams.h" -#include +#include "stropts.h" #ifdef M_UNIX #include #endif diff --git a/str_if/str_linux.c b/str_if/str_linux.c index 583e9aa..439987c 100644 --- a/str_if/str_linux.c +++ b/str_if/str_linux.c @@ -32,7 +32,7 @@ #include "primitives.h" #include "streams.h" -#include +#include "stropts.h" #include #if LINUX_VERSION_CODE >= 66324 /* 1.3.20 ??? */ #include @@ -42,7 +42,6 @@ #ifdef DONT_ADDERROR #include "f_user.h" #endif -#include #include #include #include "f_ioctl.h" diff --git a/str_if/str_none.c b/str_if/str_none.c index bc4329d..e173c1b 100644 --- a/str_if/str_none.c +++ b/str_if/str_none.c @@ -5,7 +5,7 @@ #include #include "f_signal.h" #include -#include +#include "stropts.h" #ifdef DO_ADDUSER #include "f_user.h" #endif diff --git a/str_if/str_str.c b/str_if/str_str.c index 48d14c5..ef29f19 100644 --- a/str_if/str_str.c +++ b/str_if/str_str.c @@ -5,7 +5,7 @@ #include #include "f_signal.h" #include -#include +#include "stropts.h" #ifdef DO_ADDUSER #include "f_user.h" #endif diff --git a/str_if/tools/slipto.c b/str_if/tools/slipto.c index fbde35d..1743596 100644 --- a/str_if/tools/slipto.c +++ b/str_if/tools/slipto.c @@ -18,7 +18,7 @@ #include "f_ioctl.h" #include "f_ip.h" #include -#include +#include "stropts.h" #include "f_termio.h" #include #include diff --git a/streams/Makefile b/streams/Makefile index 2d8199c..4d3e513 100644 --- a/streams/Makefile +++ b/streams/Makefile @@ -1,16 +1,9 @@ all:: -depend:: - rm -f sys linux - ln -s . linux - ln -s . sys - KERNEL=1 OBJ = streams.o TOPDIR=.. include $(TOPDIR)/Make.rules -clean:: - rm -f sys linux diff --git a/streams/stream.h b/streams/stream.h index 8819576..c52fd97 100644 --- a/streams/stream.h +++ b/streams/stream.h @@ -3,8 +3,8 @@ #include #include -#include -#include +#include "compat.h" +#include "stropts.h" #ifdef __KERNEL__ #include #include diff --git a/streams/streams_io.c b/streams/streams_io.c index 420ffdb..553c306 100644 --- a/streams/streams_io.c +++ b/streams/streams_io.c @@ -11,8 +11,9 @@ #include "f_module.h" #undef F_NOCODE #endif +#include "kernel.h" #include -#include +#include "stream.h" #include #include #include @@ -27,8 +28,6 @@ #include -#include - #define WAIT_READ 1 #define WAIT_WRITE 2 #define WAIT_NOINTR 4 @@ -982,7 +981,11 @@ static int xstream_write(struct stream_header *p_stream, int fromuser, const cha } static int -streams_write (struct inode *inode, struct file *file, const char *buf, int count) +streams_write (struct inode *inode, struct file *file, +#if LINUX_VERSION_CODE > 66304 /* 1.3.0 ?? */ + const +#endif + char *buf, int count) { struct stream_header *p_stream; unsigned long s; @@ -1286,7 +1289,7 @@ xstreams_ioctl (struct stream_header *p_stream, unsigned int cmd, unsigned long case TCSETSF: strioc.ic_len = sizeof(struct termios); cmd |= IOC_IN; - goto doit; + goto do_strioctl; #endif #ifdef TCSETA case TCSETA: @@ -1294,30 +1297,28 @@ xstreams_ioctl (struct stream_header *p_stream, unsigned int cmd, unsigned long case TCSETAF: strioc.ic_len = sizeof(struct termio); cmd |= IOC_IN; - goto doit; + goto do_strioctl; #endif #ifdef TCGETS case TCGETS: strioc.ic_len = sizeof(struct termios); cmd |= IOC_OUT; - goto doit; + goto do_strioctl; #endif #ifdef TCGETA case TCGETA: strioc.ic_len = sizeof(struct termio); cmd |= IOC_OUT; - goto doit; + goto do_strioctl; #endif #ifdef UIOCTTSTAT case UIOCTTSTAT: strioc.ic_len = 3; cmd |= IOC_OUT; - goto doit; + goto do_strioctl; #endif default: strioc.ic_len = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT; - doit: - goto do_strioctl; case I_STR: @@ -1667,7 +1668,10 @@ static void tstreams_close(struct tty_struct * tty, struct file * file) } static int tstreams_write(struct tty_struct * tty, int fromuser, - const unsigned char *buf, int count) +#if LINUX_VERSION_CODE >= 66304 /* 1.3.0 ?? */ + const +#endif + unsigned char *buf, int count) { struct stream_header *p_stream = (struct stream_header *)tty->driver_data; @@ -1749,12 +1753,10 @@ static int tstreams_ioctl(struct tty_struct *tty, struct file * file, int err; struct stream_header *p_stream = (struct stream_header *)tty->driver_data; - if(p_stream == NULL) + if(p_stream == NULL) return 0; err = xstreams_ioctl(p_stream,cmd,arg); - if(err == -EINVAL) - err = -ENOIOCTLCMD; return err; } diff --git a/streams/streams_sys.c b/streams/streams_sys.c index e6d0131..50716b2 100644 --- a/streams/streams_sys.c +++ b/streams/streams_sys.c @@ -13,9 +13,10 @@ #ifdef MODULE #include "f_module.h" #endif +#include "kernel.h" #include -#include +#include "stream.h" #include #ifdef __KERNEL__ #include @@ -28,13 +29,11 @@ #else unsigned long bh_mask; #endif -#include "kernel.h" #ifdef linux #ifdef __KERNEL__ #include #endif -#include #ifdef SK_STREAM #include #endif @@ -439,7 +438,7 @@ freemsg(mblk_t *p_msg) if(p_msg == NULL) { #ifdef CONFIG_DEBUG_STREAMS - printf("%sFreeing NULL msg at %s:%d\n",KERN_ERR ,deb_file,deb_line); + printf("%sFreeing NULL msg at %s:%d\n",KERN_ERR , deb_file,deb_line); #endif return; } diff --git a/strslip/strslip.c b/strslip/strslip.c index e6b53d0..6ffe253 100644 --- a/strslip/strslip.c +++ b/strslip/strslip.c @@ -10,7 +10,7 @@ #include #include #include "streams.h" -#include +#include "stropts.h" /* #include */ #include #include "streamlib.h" diff --git a/support/sioctl.c b/support/sioctl.c index 200bf4c..b4d1d6d 100644 --- a/support/sioctl.c +++ b/support/sioctl.c @@ -1,6 +1,6 @@ #include "primitives.h" #include "f_ioctl.h" -#include +#include "stropts.h" #include #ifdef linux #include diff --git a/support/streams.c b/support/streams.c index 9535693..0ca4c8c 100644 --- a/support/streams.c +++ b/support/streams.c @@ -3,7 +3,7 @@ #include #include #include "f_signal.h" -#include +#include "stropts.h" #include "f_termio.h" #include "f_user.h" #include diff --git a/t70/t70.c b/t70/t70.c index b59d5d4..f8f39b2 100644 --- a/t70/t70.c +++ b/t70/t70.c @@ -11,7 +11,7 @@ #include #include #include "streams.h" -#include +#include "stropts.h" #ifdef DONT_ADDERROR #include "f_user.h" #endif diff --git a/timer/timer.c b/timer/timer.c index a0b7a61..ff68f5a 100644 --- a/timer/timer.c +++ b/timer/timer.c @@ -11,7 +11,7 @@ #include #include #include "streams.h" -#include +#include "stropts.h" #ifdef DONT_ADDERROR #include "f_user.h" #endif diff --git a/tools/isdn.conf b/tools/isdn.conf index 4298352..f616eb8 100644 --- a/tools/isdn.conf +++ b/tools/isdn.conf @@ -7,7 +7,7 @@ # Sample answering machine. # It answers on EAZ 2 (1TR6) bzw. MSN ...2 (Euro). -R phone * * * RM.3 catfone +R phone * * * mRM.3 catfone ## This number ---^ is the delay before the answerer answers. ## Warning: You have to adapt the catfone script to your requirements. @@ -20,7 +20,7 @@ ML phone * * * - transalaw alaw # Sample remote login. # Logins from "somebody" are only accepted if their number ends in 8. -R login * * * root TSRUDi /bin/login +R login * * * root mTSRUDi /bin/login P login somebody * * R :nr .8 P login * * * MFX :lr /1 :vB 8890 :sv 0700 diff --git a/tools/rc.isdn b/tools/rc.isdn index 78dd1ef..ffd934e 100755 --- a/tools/rc.isdn +++ b/tools/rc.isdn @@ -20,9 +20,6 @@ cd bin-$(uname -r) || cd bin set +e while : ; do - master -wdi /etc/isdn.conf >>/tmp/isdn.log 2>>/var/log/isdn + master -wdi /etc/isdn.conf 2>>/tmp/isdn.log >>/var/log/isdn sleep 15 done & -if test -x /etc/isdn.route ; then - /etc/isdn.route -fi diff --git a/v110/v110.c b/v110/v110.c index 3f52ede..eb0a688 100644 --- a/v110/v110.c +++ b/v110/v110.c @@ -15,7 +15,7 @@ #include #include #include "streams.h" -#include +#include "stropts.h" #ifdef DONT_ADDERROR #include "f_user.h" #endif diff --git a/van_j/van_j.c b/van_j/van_j.c index b8dcd9c..753d294 100644 --- a/van_j/van_j.c +++ b/van_j/van_j.c @@ -11,7 +11,7 @@ #include #include #include "streams.h" -#include +#include "stropts.h" #ifdef DONT_ADDERROR #include "f_user.h" #endif diff --git a/x75/x75.c b/x75/x75.c index de29703..d285183 100644 --- a/x75/x75.c +++ b/x75/x75.c @@ -18,7 +18,6 @@ #include #include "streams.h" #include -/* #include */ #ifdef DONT_ADDERROR #include "f_user.h" #endif