1
0
mirror of https://github.com/osmarks/ngircd.git synced 2025-10-20 17:17:37 +00:00

Compare commits

..

15 Commits

Author SHA1 Message Date
Alexander Barton
a0318e8d0b - Version 0.4.3 2002-06-11 20:29:44 +00:00
Alexander Barton
d0084cfae2 - IRC_PRIVMSG() und IRC_NOTICE() haben nicht ueberprueft, ob der Ziel-Client
ein User ist; wenn nicht, so hat sich der Server mit einem assert() beendet.
2002-06-11 17:52:23 +00:00
Alexander Barton
880d35f82b - Dokumentation aktualisiert. 2002-05-08 15:47:06 +00:00
Alexander Barton
83e49bf74b - Backports aus CVS HEAD-Tree. 2002-04-29 14:44:24 +00:00
Alexander Barton
b6f53b6f82 - Backports aus CVS HEAD-Tree. 2002-04-29 14:11:23 +00:00
Alexander Barton
ab52d2b818 - Version 0.4.2. 2002-04-29 14:11:09 +00:00
Alexander Barton
aaf42ae77b - Dokumentation aktualisiert. 2002-04-29 14:10:59 +00:00
Alexander Barton
fa30f2a0d2 - Version auf 0.4.1 angehoben. 2002-04-08 18:26:16 +00:00
Alexander Barton
1fa46bedbe - Dokumentation aktualisiert. 2002-04-08 18:25:43 +00:00
Alexander Barton
d772acf9d6 - Backports aus CVS HEAD-Tree. 2002-04-08 18:07:42 +00:00
Alexander Barton
15f380592d - Version 0.4.0 2002-04-01 17:18:03 +00:00
Alexander Barton
54b9381dd0 - URL der Homepage zu Info-Text bei --version hinzugefuegt. 2002-04-01 17:05:00 +00:00
Alexander Barton
889b7ef48f - Dokumentation aktualisiert. 2002-03-31 23:31:27 +00:00
Alexander Barton
31c8078706 - Dokumentation aktualisiert. 2002-03-31 17:22:28 +00:00
Alexander Barton
34eb2528d0 - Versionsnummer auf 0.4.0-pre1 angehoben. 2002-03-31 17:22:15 +00:00
84 changed files with 1369 additions and 7014 deletions

126
ChangeLog
View File

@@ -10,128 +10,6 @@
-- ChangeLog / Aenderungen -- -- ChangeLog / Aenderungen --
ngIRCd 0.5.x-CVS
- Prefix-Fehler werden besser protokolliert (mit verursachendem Befehl).
- SQUIT wird nicht mehr doppelt an andere Server weitergeleitet.
- Der Server versucht nun vor dem Schliessen einer Verbindung Daten, die
noch im Schreibpuffer stehen, zu senden.
ngIRCd 0.5.4, 24.11.2002
- Fehler-Handling von connect() gefixed: der Server kann sich nun auch
unter A/UX wieder zu anderen verbinden.
- in den Konfigurationsvariablen ServerUID und ServerGID kann nun nicht
nur die numerische ID, sondern auch der Name des Users bzw. der Gruppe
verwendet werden. Beim Start des Daemons wird nun beides angezeigt.
- Besseres Logging von Prefix-Fehlern.
- angenommene Sockets werden nun korrekt auf "non-blocking" konfiguriert,
beim Senden und Empfangen werden Blockierungen besser abgefangen.
- RPL_UMODEIS hat Code 221, nicht 211 ... *argl*
- select() in Try_Write() hat falschen (keinen!) Timeout verwendet;
die "Zeit-Aufloesung" des Servers sind zudem nun 2 Sekunden (TIME_RES).
Insgesamt sollte die Reaktionszeit des Server nun besser sein.
ngIRCd 0.5.3, 08.11.2002
- NOTICE liefert nun wirklich nie mehr einen Fehler, auch dann nicht,
wenn der sendende Client noch gar nicht registriert ist.
- ein "schneller Server-Reconnect" wird nur noch dann versucht, wenn die
Verbindung zuvor ordentlich (="lange genug") in Ordnung war; somit also
nicht meht, wenn der Peer-Server gleich beim Connect ein ERROR liefert.
Das vermeidet "Connect-Orgien".
- einige Datentypen aufgeraumt: z.B. sind viele INT32s nun LONGs. Das ist
auf Platformen mit 8-Byte-Integern kompatibler.
- RPL_YOURHOST_MSG ist nun ircII- und RFC-kompatibel ;-)
- Segfault unter hoher Netzaktivitaet behoben: in Conn_Close() wird die
Connection-Struktur nun frueher als "ungueltig" markiert.
ngIRCd 0.5.2, 04.10.2002
- Buffer Overflow in Read_Resolver_Result() behoben.
- Format-String-Bugs, die zum Abbruch des Servers fuehrten, behoben.
- Maximale Laenge eines IRC-Prefix wurde falsch berechnet.
ngIRCd 0.5.1, 03.10.2002
- in RPL_YOURHOST_MSG wurde ein fehlerhafter Versionsstring geliefert.
- Test-Suite: start-server.sh, stop-server.sh und stress-server.sh koennen
nun "manuell" von der Kommandozeile gestartet werden, stress-server.sh
startet per Default nur noch 5 Sessions, eine andere Zahl kann auf der
Kommandozeile uebergeben werden (Syntax: "stress-server.sh <count>").
- In bestimmten Faellen hat der Server versucht auf einen bereits wieder
geschlossenen Socket Daten zu schreiben; das fuehrte zu einem Abbruch des
Servers durch ein assert(). Nun wird geprueft, ob der Socket noch ok ist.
- im "contrib"-Verzeichnis befindet sich nun eine RPM-Spec-Datei, aus den
.tar.gz's koennen nun mit "rpm -ta <archiv>" RPM's erzeugt werden. Danke
an Sean Reifschneider <jafo@tummy.com>!
- Syntax von RPL_MYINFO_MSG korrigiert: liefert nun vier Parameter.
ngIRCd 0.5.0, 20.09.2002
- Dokumentation aktualisiert.
- Fehler bei Validierung von "AdminInfo2" behoben.
- Test der Flags fuer "ps" in der Testsuite verbessert, ist nun zu mehr
Plattformen kompatibler.
ngIRCd 0.5.0-pre2, 17.09.2002
- Fix in IRC_WriteStrServersPrefix() war "badly broken" -- behoben.
ngIRCd 0.5.0-pre1, 16.09.2002
- Manual-Pages ngircd.8 und ngircd.conf.5 begonnen.
- Wird der Netzwerk-Sniffer aktiviert (--sniffer), so schaltet der
ngIRCd nun automatisch in den Debug-Modus.
- auf Systemen, die inet_aton() nicht kennen (wie z.B. A/UX), kann der
ngIRCd nun dennoch auch aktiv Server-Links aufbauen.
- h_errno wird auf Systemen, die das nicht kennen (wie z.B. HP-UX 10.20)
nicht mehr verwendet. Somit compiliert der ngIRCd nun auch dort :-)
- um auf dem Ziel-System nicht vorhandene Funktionen nachzubilden wird nun
die "libngportab" erzeugt; genutzt wird dies bisher fuer vsnprintf().
Nun compiliert der ngIRCd auch unter Solaris 2.5.1.
- "persistente Channels" (Mode 'P') implementiert: diese koennen in der
Konfigurationsdatei definiert werden (Sektion "Channel", vgl. Beispiel-
Konfiguration "sample-ngircd.conf") und bleiben auch dann bestehen,
wenn kein User mehr im Channel ist. Zu Channel-Operatoren werden bisher
nur IRC-Operatoren, die den Channel betreten. Die persistenten Channels
werden durch das Flag "P" gelennzeichnet, welches normal durch Channel-
Op's gesetzt und geloescht werden kann.
- bei "--configtest" werden keine leere Abschnitte mehr ausgegeben.
- Source in weitere Module aufgespalten: lists, irc-op und resolve.
- #include's aufgeraeumt: Header includieren keine anderen mehr.
- KICK implementiert (bisher kann nur ein User aus einem Channel geckicked
werden, Listen, wir im RFC vorgesehen, werden bisher nicht unterstuetzt).
- INVITE, den Channel-Mode "i" sowie Invite-Lists ueber den MODE-Befehl
(setzen, erfragen und loeschen) implementiert.
- Source an ansi2knr fuer pre-ANSI-Compiler angepasst; ansi2knr in Source-
Tree aufgenommen und in Build-System integriert; der ngIRCd compiliert
nun z.B. unter A/UX mit dem nativen Compiler von Apple.
- TOPIC lieferte bei unbekanntem Channel einen falschen Fehlercode.
- LIST versteht nun Wildcards und kann an andere Server geforwarded werden.
- wurde ein KILL fuer nicht-lokale Clients empfangen, so wurden die
Verwaltungs-Strukturen nicht korrekt freigegeben.
- empfangene NJOIN's wurden "zerhackt" an andere Server weitergegeben.
- neue Konfigurationsoption "OperCanUseMode" (Sektion "Global"):
ist sie aktiv, koennen IRC-Operatoren immer Channel-Modes setzen.
- Dokumentation des neuen IRC+-Protokolls begonnen: doc/Protocol.txt
- Protokoll- und Server-ID bei PASS-Befehlen auf neues Format umgestellt;
bei empfangenen PASS-Befehlen werden diese zudem nun auch ausgewertet.
Die unterstuetzten Flags sind in doc/Protocol.txt beschrieben.
- mit dem neuen Befehl CHANINFO syncronisieren Server, die das IRC+-
Protokoll unterstuetzen, Channel-Modes und Topics.
- neue Option "--disable-ircplus" fuer das configure-Script, um das
IRC+-Protokoll abzuschalten (per Default ist es aktiviert).
- Ban-Lists (setzen, erfragen und loeschen) implementiert.
- wird der Server mit "-n"/"--nodaemon" gestartet, so werden keine Mel-
dungen mehr ueber Syslog ausgegeben, sondern nur noch auf der Konsole.
- "Test-Suite" begonnen (in "make check" integriert): Dabei wird ein
speziell konfigurierter Server auf Port 6789 gestartet, mit dem dann
einige Tests durchgefuehrt werden (u.a. "Stress-Test" mit 50 Clients).
- zu lange Operator-Namen in der Konfiguration wurden falsch gekuerzt.
- kleine Anpassung an AIX 3.2.5: nun laeuft der ngIRCd auch dort :-)
- ADMIN-Befehl implementiert. Die Daten hierzu werden in der Konfig-Datei
im [Global]-Abschnitt mit den Variablen "AdminInfo1", "AdminInfo2" und
"AdminEMail" konfiguriert.
ngIRCd 0.4.3, 11.06.2002 ngIRCd 0.4.3, 11.06.2002
- Bei PRIVMSG und NOTICE hat der ngIRCd nicht ueberpruft, ob das Ziel - Bei PRIVMSG und NOTICE hat der ngIRCd nicht ueberpruft, ob das Ziel
@@ -143,7 +21,7 @@ ngIRCd 0.4.2, 29.04.2002
- LUSERS verzaehlt sich bei eigenen Server-Links nicht mehr. - LUSERS verzaehlt sich bei eigenen Server-Links nicht mehr.
- QUIT wird nun auch von noch nicht registrierten Clients akzeptiert. - QUIT wird nun auch von noch nicht registrierten Clients akzeptiert.
- IRC-Funktion LIST implementiert; bisher werden allerdings noch keine - IRC-Funktion LIST implementiert; bisher werden allerdings noch keine
Wildcards (bis auf "*") unterstuetzt. Regular Expressions (bis auf "*") unterstuetzt.
ngIRCd 0.4.1, 08.04.2002 ngIRCd 0.4.1, 08.04.2002
@@ -320,4 +198,4 @@ ngIRCd 0.0.1, 31.12.2001
-- --
$Id: ChangeLog,v 1.87.2.18 2002/11/29 11:42:24 alex Exp $ $Id: ChangeLog,v 1.54.2.6 2002/06/11 20:29:44 alex Exp $

22
INSTALL
View File

@@ -12,12 +12,6 @@
Ilja Osthoff, <ilja@glide.ath.cx> Ilja Osthoff, <ilja@glide.ath.cx>
+-----------------------------------------------------------------------+
| Please note: English translations of some of the german documentation |
| files can be found in the directory "doc/en" -- please have a look! |
+-----------------------------------------------------------------------+
I. Standard-Installation I. Standard-Installation
~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~
@@ -40,7 +34,7 @@ zu 3): "autogen.sh"
Der erste Schritt, autogen.sh, ist nur notwendig, wenn das configure-Script Der erste Schritt, autogen.sh, ist nur notwendig, wenn das configure-Script
noch nicht vorhanden ist. Dies ist nie bei offiziellen ("stabilen") Versionen noch nicht vorhanden ist. Dies ist nie bei offiziellen ("stabilen") Versionen
in tar.gz-Archiven der Fall, jedoch immer, wenn der Source-Code ueber CVS in tar.gz-Archiven der Fall, jedoch nie, wenn der Source-Code ueber CVS
bezogen wurde. bezogen wurde.
Dieser Absatz ist also eigentlich ausschliesslich fuer Entwickler interessant. Dieser Absatz ist also eigentlich ausschliesslich fuer Entwickler interessant.
@@ -81,8 +75,8 @@ Folgende Dateien werden installiert:
- /usr/local/etc/ngircd.conf: Beispiel-Konfiguration, wenn nicht vorhanden - /usr/local/etc/ngircd.conf: Beispiel-Konfiguration, wenn nicht vorhanden
II. Nuetzliche make-Targets III. Nuetzliche make-Targets
~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Die vom configure-Script erzeugten Makefile's enthalten immer die folgenden Die vom configure-Script erzeugten Makefile's enthalten immer die folgenden
nuetzlichen Targets: nuetzlichen Targets:
@@ -98,8 +92,8 @@ nuetzlichen Targets:
III. Konfigurationsdatei ngircd.conf IV. Konfigurationsdatei ngircd.conf
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In der Konfigurationsdatei werden Kommentare durch "#" oder durch ";" In der Konfigurationsdatei werden Kommentare durch "#" oder durch ";"
eingeleitet. Dieses dient nur der besseren Lesbarkeit. eingeleitet. Dieses dient nur der besseren Lesbarkeit.
@@ -117,8 +111,8 @@ Die Bedeutung der einzelnen Variablen ist in der Beispiel-Konfiguration
Konfigurationsdatei vorhanden ist. Konfigurationsdatei vorhanden ist.
IV. Kommandozeilen-Optionen V. Kommandozeilen-Optionen
~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~
Folgende Parameter koennen dem ngIRCd u.a. uebergeben werden: Folgende Parameter koennen dem ngIRCd u.a. uebergeben werden:
@@ -145,4 +139,4 @@ Server nach der Ausgabe wieder.
-- --
$Id: INSTALL,v 1.8 2002/09/16 11:03:05 alex Exp $ $Id: INSTALL,v 1.6.2.1 2002/05/08 15:47:06 alex Exp $

View File

@@ -3,7 +3,7 @@
archiveVersion = 1; archiveVersion = 1;
classes = { classes = {
}; };
objectVersion = 38; objectVersion = 34;
objects = { objects = {
014CEA520018CE5811CA2923 = { 014CEA520018CE5811CA2923 = {
buildRules = ( buildRules = (
@@ -60,25 +60,23 @@
targets = ( targets = (
08FB779FFE84155DC02AAC07, 08FB779FFE84155DC02AAC07,
F538241E024F89BC01A85B04, F538241E024F89BC01A85B04,
F5BEF13002A129DC01A85B03,
); );
}; };
08FB7794FE84155DC02AAC07 = { 08FB7794FE84155DC02AAC07 = {
children = ( children = (
1AB674ADFE9D54B511CA2CBB, 1AB674ADFE9D54B511CA2CBB,
F51F791401DFD0DE01D13771, F51F791401DFD0DE01D13771,
F520AF150335F1B801A85B04,
F56D8B9E01E0BFA00155ADA7, F56D8B9E01E0BFA00155ADA7,
F52162B301C7B904012300F4, F52162B301C7B904012300F4,
F52162C301C7B904012300F4, F52162C301C7B904012300F4,
F52162C401C7B904012300F4, F52162C401C7B904012300F4,
F52162C501C7B904012300F4, F52162C501C7B904012300F4,
F52162CB01C7B904012300F4,
F52162C601C7B904012300F4, F52162C601C7B904012300F4,
F52162C701C7B904012300F4, F52162C701C7B904012300F4,
F52162C801C7B904012300F4,
F52162C901C7B904012300F4, F52162C901C7B904012300F4,
F52162CA01C7B904012300F4, F52162CA01C7B904012300F4,
F52162C801C7B904012300F4, F52162CB01C7B904012300F4,
); );
isa = PBXGroup; isa = PBXGroup;
name = ngircd; name = ngircd;
@@ -138,14 +136,9 @@
F5F18139023EC63701A85B04, F5F18139023EC63701A85B04,
F5F1813A023EC63701A85B04, F5F1813A023EC63701A85B04,
F55047BC0240F6E501A85B04, F55047BC0240F6E501A85B04,
F51044550297AC170173DE11,
F5BEF12A02A0EFE201A85B03,
F5BEF12E02A1169C01A85B03,
F5BEF13302A12AFE01A85B03,
F5E9448502C9F49D01A85B04,
); );
isa = PBXHeadersBuildPhase; isa = PBXHeadersBuildPhase;
runOnlyForDeploymentPostprocessing = 0; name = Headers;
}; };
08FB77A1FE84155DC02AAC07 = { 08FB77A1FE84155DC02AAC07 = {
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -166,28 +159,23 @@
F57C888C0232884501A85B04, F57C888C0232884501A85B04,
F57C889002328D7201A85B04, F57C889002328D7201A85B04,
F55047BD0240F6E501A85B04, F55047BD0240F6E501A85B04,
F51044560297B5D40173DE11,
F5BEF12B02A0EFE201A85B03,
F5BEF12F02A1169C01A85B03,
F5BEF13502A24F1001A85B03,
F5E9448602C9F49D01A85B04,
); );
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
runOnlyForDeploymentPostprocessing = 0; name = Sources;
}; };
08FB77A3FE84155DC02AAC07 = { 08FB77A3FE84155DC02AAC07 = {
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
runOnlyForDeploymentPostprocessing = 0; name = "Frameworks & Libraries";
}; };
08FB77A5FE84155DC02AAC07 = { 08FB77A5FE84155DC02AAC07 = {
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
isa = PBXRezBuildPhase; isa = PBXRezBuildPhase;
runOnlyForDeploymentPostprocessing = 0; name = "ResourceManager Resources";
}; };
//080 //080
//081 //081
@@ -218,30 +206,6 @@
//F52 //F52
//F53 //F53
//F54 //F54
F51044520297ABF80173DE11 = {
isa = PBXFileReference;
name = vsnprintf.c;
path = /Users/alex/Develop/ngircd/src/portab/vsnprintf.c;
refType = 0;
};
F51044540297AC170173DE11 = {
isa = PBXFileReference;
name = splint.h;
path = portab/splint.h;
refType = 4;
};
F51044550297AC170173DE11 = {
fileRef = F51044540297AC170173DE11;
isa = PBXBuildFile;
settings = {
};
};
F51044560297B5D40173DE11 = {
fileRef = F51044520297ABF80173DE11;
isa = PBXBuildFile;
settings = {
};
};
F51D17FC01C8F5B701E11C2E = { F51D17FC01C8F5B701E11C2E = {
isa = PBXFileReference; isa = PBXFileReference;
name = client.c; name = client.c;
@@ -388,13 +352,8 @@
}; };
F51F791401DFD0DE01D13771 = { F51F791401DFD0DE01D13771 = {
children = ( children = (
F5E9447B02C9EE0E01A85B04,
F5263AEF01E2A9B801CE8F8F, F5263AEF01E2A9B801CE8F8F,
F51F791501DFD0DE01D13771, F51F791501DFD0DE01D13771,
F5E9447D02C9EE2801A85B04,
F5B565290325412B01A85B04,
F5E9447E02C9EE2801A85B04,
F5E9447F02C9EE2801A85B04,
F51F791601DFD0DE01D13771, F51F791601DFD0DE01D13771,
F51F791701DFD0DE01D13771, F51F791701DFD0DE01D13771,
); );
@@ -418,137 +377,12 @@
path = "sample-ngircd.conf"; path = "sample-ngircd.conf";
refType = 4; refType = 4;
}; };
F520AEA80335E29001A85B04 = {
children = (
F520AEA90335E29001A85B04,
F520AEAA0335E29001A85B04,
F520AEAC0335E29001A85B04,
F520AEAD0335E29001A85B04,
F520AEAE0335E29001A85B04,
F520AECA0335E29001A85B04,
F520AECC0335E29001A85B04,
F520AECD0335E29001A85B04,
F520AED00335E29001A85B04,
F520AED40335E29001A85B04,
F520AED50335E29001A85B04,
F520AED60335E29001A85B04,
F520AED70335E29001A85B04,
F520AED80335E29001A85B04,
F520AF0C0335E29001A85B04,
);
isa = PBXGroup;
name = testsuite;
path = /Users/alex/Develop/ngircd/src/testsuite;
refType = 0;
};
F520AEA90335E29001A85B04 = {
isa = PBXExecutableFileReference;
path = "channel-test";
refType = 4;
};
F520AEAA0335E29001A85B04 = {
isa = PBXFileReference;
path = "channel-test.e";
refType = 4;
};
F520AEAC0335E29001A85B04 = {
isa = PBXFileReference;
path = "check-idle.e";
refType = 4;
};
F520AEAD0335E29001A85B04 = {
isa = PBXExecutableFileReference;
path = "connect-test";
refType = 4;
};
F520AEAE0335E29001A85B04 = {
isa = PBXFileReference;
path = "connect-test.e";
refType = 4;
};
F520AECA0335E29001A85B04 = {
isa = PBXFileReference;
path = Makefile.am;
refType = 4;
};
F520AECC0335E29001A85B04 = {
isa = PBXExecutableFileReference;
path = "mode-test";
refType = 4;
};
F520AECD0335E29001A85B04 = {
isa = PBXFileReference;
path = "mode-test.e";
refType = 4;
};
F520AED00335E29001A85B04 = {
isa = PBXFileReference;
path = "ngircd-test.conf";
refType = 4;
};
F520AED40335E29001A85B04 = {
isa = PBXExecutableFileReference;
path = "start-server.sh";
refType = 4;
};
F520AED50335E29001A85B04 = {
isa = PBXExecutableFileReference;
path = "stop-server.sh";
refType = 4;
};
F520AED60335E29001A85B04 = {
isa = PBXFileReference;
path = "stress-A.e";
refType = 4;
};
F520AED70335E29001A85B04 = {
isa = PBXFileReference;
path = "stress-B.e";
refType = 4;
};
F520AED80335E29001A85B04 = {
isa = PBXExecutableFileReference;
path = "stress-server.sh";
refType = 4;
};
F520AF0C0335E29001A85B04 = {
isa = PBXExecutableFileReference;
path = tests.sh;
refType = 4;
};
F520AF150335F1B801A85B04 = {
children = (
F520AF180335F1B801A85B04,
F520AF1A0335F1B801A85B04,
F520AF1B0335F1B801A85B04,
);
isa = PBXGroup;
name = man;
path = /Users/alex/Develop/ngircd/man;
refType = 0;
};
F520AF180335F1B801A85B04 = {
isa = PBXFileReference;
path = Makefile.am;
refType = 4;
};
F520AF1A0335F1B801A85B04 = {
isa = PBXFileReference;
path = ngircd.8;
refType = 4;
};
F520AF1B0335F1B801A85B04 = {
isa = PBXFileReference;
path = ngircd.conf.5;
refType = 4;
};
F52162B301C7B904012300F4 = { F52162B301C7B904012300F4 = {
children = ( children = (
F52162B801C7B904012300F4, F52162B801C7B904012300F4,
F52162D801C7BAAE012300F4, F52162D801C7BAAE012300F4,
F52162B901C7B904012300F4, F52162B901C7B904012300F4,
F5F18132023EC61E01A85B04, F5F18132023EC61E01A85B04,
F520AEA80335E29001A85B04,
); );
isa = PBXGroup; isa = PBXGroup;
name = src; name = src;
@@ -583,24 +417,16 @@
F51DBB1C022D9D8F01A85B04, F51DBB1C022D9D8F01A85B04,
F51DBB17022D995501A85B04, F51DBB17022D995501A85B04,
F51DBB18022D995501A85B04, F51DBB18022D995501A85B04,
F5BEF12C02A1169C01A85B03,
F5BEF12D02A1169C01A85B03,
F57C88850232853501A85B04, F57C88850232853501A85B04,
F57C88860232853501A85B04, F57C88860232853501A85B04,
F57C88890232884501A85B04, F57C88890232884501A85B04,
F57C888A0232884501A85B04, F57C888A0232884501A85B04,
F51DBB13022D95E801A85B04, F51DBB13022D95E801A85B04,
F51DBB14022D95E801A85B04, F51DBB14022D95E801A85B04,
F5BEF12802A0EFE201A85B03,
F5BEF12902A0EFE201A85B03,
F52162BB01C7B904012300F4, F52162BB01C7B904012300F4,
F52162BC01C7B904012300F4, F52162BC01C7B904012300F4,
F5E9448402C9F49D01A85B04,
F5E9448302C9F49D01A85B04,
F576ABFA01D5E77301A85B03, F576ABFA01D5E77301A85B03,
F576ABFB01D5E77301A85B03, F576ABFB01D5E77301A85B03,
F5BEF13102A12AFE01A85B03,
F5BEF13202A12AFE01A85B03,
F52162C001C7B904012300F4, F52162C001C7B904012300F4,
F52162C101C7B904012300F4, F52162C101C7B904012300F4,
F51F791201DFC95301D13771, F51F791201DFC95301D13771,
@@ -845,7 +671,7 @@
F5382422024F89BC01A85B04, F5382422024F89BC01A85B04,
); );
isa = PBXHeadersBuildPhase; isa = PBXHeadersBuildPhase;
runOnlyForDeploymentPostprocessing = 0; name = Headers;
}; };
F5382420024F89BC01A85B04 = { F5382420024F89BC01A85B04 = {
fileRef = F5F18134023EC63701A85B04; fileRef = F5F18134023EC63701A85B04;
@@ -871,7 +697,7 @@
F5382424024F89BC01A85B04, F5382424024F89BC01A85B04,
); );
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
runOnlyForDeploymentPostprocessing = 0; name = Sources;
}; };
F5382424024F89BC01A85B04 = { F5382424024F89BC01A85B04 = {
fileRef = F5F18137023EC63701A85B04; fileRef = F5F18137023EC63701A85B04;
@@ -884,14 +710,14 @@
files = ( files = (
); );
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
runOnlyForDeploymentPostprocessing = 0; name = "Frameworks & Libraries";
}; };
F5382426024F89BC01A85B04 = { F5382426024F89BC01A85B04 = {
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
isa = PBXRezBuildPhase; isa = PBXRezBuildPhase;
runOnlyForDeploymentPostprocessing = 0; name = "ResourceManager Resources";
}; };
F55047BA0240F6E501A85B04 = { F55047BA0240F6E501A85B04 = {
isa = PBXFileReference; isa = PBXFileReference;
@@ -1043,168 +869,6 @@
settings = { settings = {
}; };
}; };
F5B565290325412B01A85B04 = {
isa = PBXFileReference;
name = Protocol.txt;
path = ../doc/Protocol.txt;
refType = 2;
};
F5BEF12802A0EFE201A85B03 = {
isa = PBXFileReference;
name = lists.c;
path = /Users/alex/Develop/ngircd/src/ngircd/lists.c;
refType = 0;
};
F5BEF12902A0EFE201A85B03 = {
isa = PBXFileReference;
name = lists.h;
path = /Users/alex/Develop/ngircd/src/ngircd/lists.h;
refType = 0;
};
F5BEF12A02A0EFE201A85B03 = {
fileRef = F5BEF12902A0EFE201A85B03;
isa = PBXBuildFile;
settings = {
};
};
F5BEF12B02A0EFE201A85B03 = {
fileRef = F5BEF12802A0EFE201A85B03;
isa = PBXBuildFile;
settings = {
};
};
F5BEF12C02A1169C01A85B03 = {
isa = PBXFileReference;
path = "irc-op.c";
refType = 4;
};
F5BEF12D02A1169C01A85B03 = {
isa = PBXFileReference;
path = "irc-op.h";
refType = 4;
};
F5BEF12E02A1169C01A85B03 = {
fileRef = F5BEF12D02A1169C01A85B03;
isa = PBXBuildFile;
settings = {
};
};
F5BEF12F02A1169C01A85B03 = {
fileRef = F5BEF12C02A1169C01A85B03;
isa = PBXBuildFile;
settings = {
};
};
F5BEF13002A129DC01A85B03 = {
buildArgumentsString = $ACTION;
buildPhases = (
);
buildSettings = {
OTHER_CFLAGS = "";
OTHER_LDFLAGS = "";
OTHER_REZFLAGS = "";
PRODUCT_NAME = "ngIRCd Makefile";
SECTORDER_FLAGS = "";
WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
};
buildToolPath = /usr/bin/gnumake;
dependencies = (
);
isa = PBXLegacyTarget;
name = "ngIRCd Makefile";
productName = "ngIRCd Makefile";
settingsToExpand = 6;
settingsToPassInEnvironment = 287;
settingsToPassOnCommandLine = 280;
shouldUseHeadermap = 0;
};
F5BEF13102A12AFE01A85B03 = {
isa = PBXFileReference;
path = resolve.c;
refType = 4;
};
F5BEF13202A12AFE01A85B03 = {
isa = PBXFileReference;
path = resolve.h;
refType = 4;
};
F5BEF13302A12AFE01A85B03 = {
fileRef = F5BEF13202A12AFE01A85B03;
isa = PBXBuildFile;
settings = {
};
};
F5BEF13502A24F1001A85B03 = {
fileRef = F5BEF13102A12AFE01A85B03;
isa = PBXBuildFile;
settings = {
};
};
F5E9447B02C9EE0E01A85B04 = {
children = (
F5E9448002C9EE4901A85B04,
F5E9448202C9EE4901A85B04,
F5E9448102C9EE4901A85B04,
);
isa = PBXGroup;
name = en;
refType = 4;
};
F5E9447D02C9EE2801A85B04 = {
isa = PBXFileReference;
path = FAQ.txt;
refType = 4;
};
F5E9447E02C9EE2801A85B04 = {
isa = PBXFileReference;
path = "README-AUX.txt";
refType = 4;
};
F5E9447F02C9EE2801A85B04 = {
isa = PBXFileReference;
path = "README-BeOS.txt";
refType = 4;
};
F5E9448002C9EE4901A85B04 = {
isa = PBXFileReference;
name = Makefile.am;
path = en/Makefile.am;
refType = 4;
};
F5E9448102C9EE4901A85B04 = {
isa = PBXFileReference;
name = INSTALL;
path = en/INSTALL;
refType = 4;
};
F5E9448202C9EE4901A85B04 = {
isa = PBXFileReference;
name = README;
path = en/README;
refType = 4;
};
F5E9448302C9F49D01A85B04 = {
isa = PBXFileReference;
path = match.h;
refType = 4;
};
F5E9448402C9F49D01A85B04 = {
isa = PBXFileReference;
path = match.c;
refType = 4;
};
F5E9448502C9F49D01A85B04 = {
fileRef = F5E9448302C9F49D01A85B04;
isa = PBXBuildFile;
settings = {
};
};
F5E9448602C9F49D01A85B04 = {
fileRef = F5E9448402C9F49D01A85B04;
isa = PBXBuildFile;
settings = {
};
};
F5F18132023EC61E01A85B04 = { F5F18132023EC61E01A85B04 = {
children = ( children = (
F5F18133023EC63701A85B04, F5F18133023EC63701A85B04,
@@ -1212,8 +876,6 @@
F5F18135023EC63701A85B04, F5F18135023EC63701A85B04,
F5F18136023EC63701A85B04, F5F18136023EC63701A85B04,
F5F18137023EC63701A85B04, F5F18137023EC63701A85B04,
F51044540297AC170173DE11,
F51044520297ABF80173DE11,
); );
isa = PBXGroup; isa = PBXGroup;
name = portab; name = portab;

View File

@@ -9,12 +9,12 @@
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
# #
# $Id: Makefile.am,v 1.9.2.1 2002/10/03 16:13:38 alex Exp $ # $Id: Makefile.am,v 1.8 2002/03/25 19:39:48 alex Exp $
# #
AUTOMAKE_OPTIONS = gnu AUTOMAKE_OPTIONS = gnu
SUBDIRS = doc MacOSX src man contrib SUBDIRS = doc MacOSX src
maintainer-clean-local: maintainer-clean-local:
rm -rf autom4te.cache rm -rf autom4te.cache
@@ -25,7 +25,4 @@ maintainer-clean-local:
lint: lint:
make -C src/ngircd lint make -C src/ngircd lint
rpm: distcheck
rpm -ta ngircd-*.tar.gz
# -eof- # -eof-

27
NEWS
View File

@@ -10,31 +10,6 @@
-- NEWS / Neuigkeiten -- -- NEWS / Neuigkeiten --
ngIRCd 0.5.0, 20.09.2002
- AIX (3.2.5), HP-UX (10.20), IRIX (6.5), NetBSD (1.5.3/m68k) und Solaris
(2.5.1, 2.6) gehoeren nun auch zu den unterstuetzten Platformen.
- Unter A/UX (und evtl. weiteren Systemen) kompiliert der ngIRCd nun mit
dem "nativen" (ggf. pre-ANSI) Compiler.
- "persistente Channels" (Mode 'P') implementiert: diese koennen in der
Konfigurationsdatei definiert werden (Sektion "Channel", vgl. Beispiel-
Konfiguration "sample-ngircd.conf") und bleiben auch dann bestehen,
wenn kein User mehr im Channel ist.
- neue IRC-Befehle: KICK, INVITE, ADMIN, CHANINFO; LIST wurde erweitert.
Mit dem neuen Befehl CHANINFO syncronisieren Server, die das IRC+-
Protokoll unterstuetzen, Channel-Modes und Topics. Fuer den ADMIN-Befehl
gibt es neue Konfigurationsoptionen (Sektion "Global"): "AdminInfo1",
"AdminInfo2" und "AdminEMail".
- Invite- und Ban-Lists implementiert.
- neue Konfigurationsoption "OperCanUseMode" (Sektion "Global"):
ist sie aktiv, koennen IRC-Operatoren immer Channel-Modes setzen.
- "Test-Suite" begonnen: mit "make check" wird sie durchlaufen.
ngIRCd 0.4.2, 29.04.2002
- IRC-Funktion LIST implementiert; bisher werden allerdings noch keine
Regular Expressions (bis auf "*") unterstuetzt.
ngIRCd 0.4.0, 01.04.2002 ngIRCd 0.4.0, 01.04.2002
- WHO implementiert (bisher ohne komplette Unterstuetzung von Masks). - WHO implementiert (bisher ohne komplette Unterstuetzung von Masks).
@@ -110,4 +85,4 @@ ngIRCd 0.0.1, 31.12.2001
-- --
$Id: NEWS,v 1.38.2.4 2002/10/03 16:09:50 alex Exp $ $Id: NEWS,v 1.25.2.3 2002/04/01 17:18:03 alex Exp $

111
README
View File

@@ -8,98 +8,61 @@
der GNU General Public License. der GNU General Public License.
-- README / Liesmich -- -- README / Liesmich --
Ilja Osthoff, <ilja@glide.ath.cx>
+-----------------------------------------------------------------------+
| Please note: English translations of some of the german documentation |
| files can be found in the directory "doc/en" -- please have a look! |
+-----------------------------------------------------------------------+
I. Einfuehrung I. Einfuehrung
~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~
ngIRCd ist ein Open-Source-Server fuer den Internet Relay Chat (IRC), der ngIRCd ist ein Server fuer den Internet Relay Chat (IRC). Er ist von Grund
unter der GNU General Public License (http://www.gnu.org/licenses/gpl.html) auf neu geschrieben, also nicht wie die meisten anderen IRCd's vom Urvater,
entwickelt wird. ngIRCd steht fuer "next generation IRC daemon", er ist von dem Daemon des IRCNet abgeleitet.
Grund auf neu geschrieben, also nicht wie die meisten anderen IRCd's vom
Urvater, dem Daemon des IRCNet abgeleitet.
Zur Zeit befindet sich der ngIRCd noch in Entwicklung, teilweise fehlen noch
Features oder sind noch nicht "final" implementiert.
II. Status Channels sind inzwischen implementiert (seit Version 0.1.0), privates Chatten
~~~~~~~~~~~ mit /msg und /query funktioniert ebenso. Server-Links werden dabei unter-
stuetzt. Einige User- und Channel-Modes sind implementiert, hier kennt der
Zur Zeit befindet sich der ngIRCd noch in Entwicklung, manche Features sind Server jedoch noch nicht alles.
noch nicht implementiert, andere nur teilweise.
Bisher (mehr oder wenig vollstaendig) implementierte IRC-Befehle: Bisher (mehr oder wenig vollstaendig) implementierte IRC-Befehle:
ADMIN, AWAY, CHANINFO, CONNECT, DIE, ERROR, INVITE, ISON, JOIN, KICK, KILL, AWAY, DIE, ERROR, ISON, JOIN, KILL, LINKS, LUSERS, MODE, MOTD, NAMES, NICK,
LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, NOTICE, OPER, PART, NOTICE, NJOIN, OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, RESTART, SERVER,
PASS, PING, PONG, PRIVMSG, QUIT, RESTART, SERVER, SQUIT, TOPIC, USERHOST, SQUIT, TOPIC, USER, USERHOST, VERSION, WHO, WHOIS.
USER, VERSION, WHO, WHOIS.
Ueber Rueckmeldungen, Bug-Reports und Patches freue ich mich! Also los, haut
in die Tasten! :-))
Via E-Mail erreichst du mich als <alex@arthur.ath.cx> bzw. <alex@barton.de>.
Die Homepage des ngIRCd findest du unter <http://arthur.ath.cx/~alex/ngircd/>.
III. Features (oder: warum gerade ngIRCd?) Hinweise zur Installation findest du in der Datei INSTALL.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Alle Autoren von ngIRCd sind in AUTHORS aufgefuehrt.
In der Datei COPYING steht die GNU General Public License.
- keine Probleme mit Servern, deren IP-Adresse dynamisch ist, Das README liest du gerade ,-)
- einfache, uebersichtliche Konfigurationsdatei,
- frei verfuegbarer C-Quellcode.
- ngIRCd wird aktiv weiterentwickelt.
- unterstuetzte Plattformen (getestete Version): AIX (3.2.5), A/UX (3.0.1),
FreeBSD/i386 (4.5), HP-UX (10.20), IRIX (6.5), Linux (2.x), Mac OS X (10.x),
NetBSD (1.5.2/i386, 1.5.3/m68k), Solaris (2.5.1, 2.6), Windows mit Cygwin.
IV. Dokumentation II. Vorteile
~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~
Im Paket enthalten ist u.a.: - keine Probleme mit Servern, deren IP-Adressen nicht statisch sind,
- uebersichtliche ("schlanke") Konfigurationsdatei,
- README: das Dokument, das Du gerade liest :-) - frei verfuegbarer, moderner und "aufgeraeumter" C-Quellcode.
- INSTALL: Hinweise zur Installation des ngIRCd - ngIRCd wird aktiv weiter entwickelt.
- NEWS: sagt der Name schon :-)
- ChangeLog: die komplette History des ngIRCd
- doc/FAQ.txt: haeufige Fragen und Antworten zum ngIRCd
- doc/CVS.txt: Hinweise zum CVS-System
- doc/RFC.txt: Infos ueber die RFC's
- doc/sample-ngircd.conf: Beispiel-Konfigurationsdatei
- doc/README-AUX.txt: Installationshinweise fuer A/UX
- doc/README-BeOS.txt: dito fuer BeOS
- doc/en/: englischsprachige Dokumentation
V. Bezugsquellen III. Unterstuetzte Plattformen
~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Die Homepage des ngIRCd ist: <http://arthur.ath.cx/~alex/ngircd>; dort - A/UX
findest du immer die neusten Informationen ueber den ngIRCd und die aktuellen - FreeBSD
freigegebenen ("stabilen") Releases. - Linux
- Mac OS X
Falls du dich fuer die aktuellen Entwicklungs-Versionen (die jedoch nicht - NetBSD
immer "stabil" sind) interessierst, dann lese bitte den Punkt "CVS" auf der - Windows mit Cygwin
Homepage und die Datei "doc/CVS.txt", die die Verwendung des "Concurrent
Versioning System" (CVS) beschreibt.
VI. Bugs
~~~~~~~~
Wenn du im ngIRCd Bugs finden solltest (so was soll ja auch vorkommen :-),
dann lege bitte einen Bug-Report ueber diese URL an:
<http://arthur.ath.cx/~alex/ngircd/#bugs>
Dort kannst du dich auch ueber bekannte Fehler informieren.
Falls du noch Anregungen, Kritik, Patches etc. pp. zum ngIRCd hast, dann
bitte einfach eine Mail an <alex@barton.de> oder <alex@arthur.ath.cx>
schreiben.
-- --
$Id: README,v 1.13 2002/09/16 11:03:05 alex Exp $ $Id: README,v 1.8 2002/03/21 23:25:15 alex Exp $

View File

@@ -9,16 +9,15 @@
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
# #
# $Id: configure.in,v 1.58.2.11 2002/11/29 10:53:44 alex Exp $ # $Id: configure.in,v 1.39.2.5 2002/06/11 20:29:44 alex Exp $
# #
# -- Initialisierung -- # -- Initialisierung --
AC_INIT AC_INIT
AC_PREREQ(2.50)
AC_CANONICAL_TARGET AC_CANONICAL_TARGET
AC_CONFIG_SRCDIR(src/config.h.in) AC_CONFIG_SRCDIR(src/config.h.in)
AM_INIT_AUTOMAKE(ngircd,0.5.x-CVS) AM_INIT_AUTOMAKE(ngircd,0.4.3)
AM_CONFIG_HEADER(src/config.h) AM_CONFIG_HEADER(src/config.h)
# -- Templates fuer config.h -- # -- Templates fuer config.h --
@@ -28,7 +27,6 @@ AH_TEMPLATE([HAVE_socklen_t], [Define if socklen_t exists])
AH_TEMPLATE([SNIFFER], [Define if IRC sniffer should be enabled]) AH_TEMPLATE([SNIFFER], [Define if IRC sniffer should be enabled])
AH_TEMPLATE([STRICT_RFC], [Define if ngIRCd should behave strict RFC compliant]) AH_TEMPLATE([STRICT_RFC], [Define if ngIRCd should behave strict RFC compliant])
AH_TEMPLATE([USE_SYSLOG], [Define if syslog should be used for logging]) AH_TEMPLATE([USE_SYSLOG], [Define if syslog should be used for logging])
AH_TEMPLATE([IRCPLUS], [Define if IRC+ protocol should be used])
AH_TEMPLATE([TARGET_OS], [Target operating system name]) AH_TEMPLATE([TARGET_OS], [Target operating system name])
AH_TEMPLATE([TARGET_VENDOR], [Target system vendor]) AH_TEMPLATE([TARGET_VENDOR], [Target system vendor])
@@ -37,6 +35,7 @@ AH_TEMPLATE([TARGET_CPU], [Target CPU name])
# -- C Compiler -- # -- C Compiler --
AC_PROG_CC AC_PROG_CC
AC_LANG_C
# -- Hilfsprogramme -- # -- Hilfsprogramme --
@@ -46,28 +45,19 @@ AC_PROG_LN_S
AC_PROG_MAKE_SET AC_PROG_MAKE_SET
AC_PROG_RANLIB AC_PROG_RANLIB
# -- Compiler Features --
AC_LANG_C
AM_C_PROTOTYPES
AC_C_CONST
# -- Header -- # -- Header --
AC_HEADER_STDC AC_HEADER_STDC
AC_HEADER_TIME AC_HEADER_TIME
AC_HEADER_SYS_WAIT AC_CHECK_HEADERS(arpa/inet.h)
AC_CHECK_HEADERS([ \ AC_CHECK_HEADERS([ \
ctype.h errno.h fcntl.h netdb.h netinet/in.h stdlib.h string.h \ errno.h fcntl.h netdb.h netinet/in.h stdlib.h string.h \
strings.h sys/socket.h sys/time.h unistd.h \ sys/socket.h sys/time.h sys/wait.h unistd.h \
],,AC_MSG_ERROR([required C header missing!])) ],,AC_MSG_ERROR([required C header missing!]))
AC_CHECK_HEADERS(arpa/inet.h malloc.h stdint.h sys/select.h varargs.h)
# -- Datentypen -- # -- Datentypen --
AC_MSG_CHECKING(whether socklen_t exists) AC_MSG_CHECKING(whether socklen_t exists)
@@ -83,64 +73,61 @@ AC_TRY_COMPILE([
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
]) ])
AC_TYPE_SIGNAL
AC_TYPE_SIZE_T
# -- Libraries -- # -- Libraries --
AC_CHECK_LIB(UTIL,memmove) AC_CHECK_LIB(UTIL,memmove)
AC_CHECK_LIB(socket,bind)
AC_CHECK_LIB(nsl,gethostent)
# -- Funktionen -- # -- Funktionen --
AC_FUNC_MALLOC AC_FUNC_MALLOC
AC_FUNC_FORK
AC_FUNC_STRFTIME
AC_CHECK_FUNCS([ \ AC_CHECK_FUNCS([ \
bind gethostbyaddr gethostbyname gethostname inet_ntoa memmove \ bind gethostbyaddr gethostbyname gethostname inet_ntoa memmove \
memset select setsockopt socket strcasecmp strchr strerror \ memset select setsockopt socket strcasecmp strchr strerror strftime \
strstr waitpid \ strstr vsnprintf waitpid \
],,AC_MSG_ERROR([required function missing!])) ],,AC_MSG_ERROR([required function missing!]))
AC_CHECK_FUNCS(inet_aton sigaction snprintf vsnprintf) AC_CHECK_FUNCS(inet_aton)
AC_CHECK_FUNCS(sigaction)
# -- Konfigurationsoptionen -- # -- Konfigurationsoptionen --
x_syslog_on=no
AC_ARG_ENABLE(syslog, AC_ARG_ENABLE(syslog,
[ --disable-syslog disable syslog (autodetected by default)], [ --disable-syslog disable syslog (autodetected by default)],
[ if test "$enableval" = "yes"; then [ if test "$enableval" = "yes"; then
AC_CHECK_HEADER(syslog.h, x_syslog_on=yes, AC_CHECK_HEADER(syslog.h,
[ AC_DEFINE(USE_SYSLOG, 1)
AC_CHECK_LIB(be,syslog)
],
AC_MSG_ERROR([Can't enable syslog: syslog.h not found!]) AC_MSG_ERROR([Can't enable syslog: syslog.h not found!])
) )
else
AC_MSG_RESULT([disabling syslog])
fi fi
], ],
[ AC_CHECK_HEADER(syslog.h, x_syslog_on=yes) ] [ AC_CHECK_HEADER(syslog.h,
[ AC_DEFINE(USE_SYSLOG, 1)
AC_CHECK_LIB(be,syslog)
]
)
]
) )
if test "$x_syslog_on" = "yes"; then
AC_DEFINE(USE_SYSLOG, 1)
AC_CHECK_LIB(be,syslog)
fi
x_ircplus_on=yes AC_ARG_ENABLE(strict-rfc,
AC_ARG_ENABLE(ircplus, [ --enable-strict-rfc strict RFC conformance, may break clients],
[ --disable-ircplus disable IRC+ protocol], if test "$enableval" = "yes"; then
if test "$enableval" = "no"; then x_ircplus_on=no; fi AC_DEFINE(STRICT_RFC, 1)
AC_MSG_RESULT([enabling strict RFC conformance])
fi
) )
if test "$x_ircplus_on" = "yes"; then
AC_DEFINE(IRCPLUS, 1)
fi
AC_ARG_ENABLE(sniffer, AC_ARG_ENABLE(sniffer,
[ --enable-sniffer enable IRC traffic sniffer (enables debug mode)], [ --enable-sniffer enable network traffic monitor (enables debug mode!)],
if test "$enableval" = "yes"; then if test "$enableval" = "yes"; then
AC_DEFINE(SNIFFER, 1) AC_DEFINE(SNIFFER, 1)
x_sniffer_on=yes; x_debug_on=yes AC_MSG_RESULT([enabling network traffic monitor])
x_debug_on=yes
fi fi
) )
@@ -150,29 +137,15 @@ AC_ARG_ENABLE(debug,
) )
if test "$x_debug_on" = "yes"; then if test "$x_debug_on" = "yes"; then
AC_DEFINE(DEBUG, 1) AC_DEFINE(DEBUG, 1)
AC_MSG_RESULT([enabling additional debug output])
fi fi
AC_ARG_ENABLE(strict-rfc,
[ --enable-strict-rfc strict RFC conformance -- may break clients!],
if test "$enableval" = "yes"; then
AC_DEFINE(STRICT_RFC, 1)
x_strict_rfc_on=yes
fi
)
# -- Definitionen -- # -- Definitionen --
AC_DEFINE_UNQUOTED(TARGET_CPU, "$target_cpu" ) AC_DEFINE_UNQUOTED(TARGET_CPU, "$target_cpu" )
AC_DEFINE_UNQUOTED(TARGET_VENDOR, "$target_vendor" ) AC_DEFINE_UNQUOTED(TARGET_VENDOR, "$target_vendor" )
AC_DEFINE_UNQUOTED(TARGET_OS, "$target_os" ) AC_DEFINE_UNQUOTED(TARGET_OS, "$target_os" )
if test `uname` = "A/UX"; then
# unter A/UX sollte _POSIX_SOURCE definiert sein.
AC_MSG_RESULT([detected A/UX, defining _POSIX_SOURCE])
CFLAGS="$CFLAGS -D_POSIX_SOURCE"
fi
# -- Variablen -- # -- Variablen --
if test "$GCC" = "yes"; then if test "$GCC" = "yes"; then
@@ -181,51 +154,22 @@ fi
CFLAGS="$CFLAGS -DSYSCONFDIR='\"\$(sysconfdir)\"'" CFLAGS="$CFLAGS -DSYSCONFDIR='\"\$(sysconfdir)\"'"
# -- Ausgabe der Dateien -- if test `uname` = "A/UX"; then
# unter A/UX sollte _POSIX_SOURCE definiert sein.
AC_MSG_RESULT([detected A/UX, defining _POSIX_SOURCE])
CFLAGS="$CFLAGS -D_POSIX_SOURCE"
fi
# -- Ausgabe --
AC_OUTPUT([ \ AC_OUTPUT([ \
Makefile \ Makefile \
doc/Makefile \ doc/Makefile \
doc/en/Makefile \
MacOSX/Makefile \ MacOSX/Makefile \
MacOSX/ngircd.pbproj/Makefile \ MacOSX/ngircd.pbproj/Makefile \
src/Makefile \ src/Makefile \
src/portab/Makefile \ src/portab/Makefile \
src/ngircd/Makefile \ src/ngircd/Makefile \
src/testsuite/Makefile \
man/Makefile \
contrib/Makefile \
]) ])
# -- Ergebnis --
echo
# Someone please show me a better way :) [borrowed by OpenSSH]
B=`eval echo ${bindir}` ; B=`eval echo ${B}`
S=`eval echo ${sbindir}` ; S=`eval echo ${S}`
C=`eval echo ${sysconfdir}` ; C=`eval echo ${C}`
M=`eval echo ${mandir}` ; M=`eval echo ${M}`
echo " host: ${host}"
echo " compiler: ${CC}"
echo " compiler flags: ${CFLAGS}"
echo " preprocessor flags: ${CPPFLAGS}"
echo " linker flags: ${LDFLAGS}"
echo " libraries: ${LIBS}"
echo
echo " 'ngircd' binary: $S"
echo " configuration file: $C"
echo " manual pages: $M"
echo
echo $ECHO_N " active options: $ECHO_C"
test "$x_syslog_on" = "yes" && echo $ECHO_N "Syslog $ECHO_C"
test "$x_debug_on" = "yes" && echo $ECHO_N "Debug $ECHO_C"
test "$x_sniffer_on" = "yes" && echo $ECHO_N "Sniffer $ECHO_C"
test "$x_strict_rfc_on" = "yes" && echo $ECHO_N "Strict-RFC $ECHO_C"
test "$x_ircplus_on" = "yes" && echo $ECHO_N "IRC+ $ECHO_C"
echo; echo
# -eof- # -eof-

View File

@@ -1,20 +0,0 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
#
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
# der GNU General Public License (GPL), wie von der Free Software Foundation
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
#
# $Id: Makefile.am,v 1.1.2.1 2002/10/03 16:13:38 alex Exp $
#
EXTRA_DIST = ngircd.spec
maintainer-clean-local:
rm -f Makefile Makefile.in
# -eof-

View File

@@ -1,54 +0,0 @@
%define name ngircd
%define version 0.5.x-CVS
%define release 1
%define prefix %{_prefix}
Summary: Next Generation Internet Relay Chat Daemon
Name: %{name}
Version: %{version}
Release: %{release}
Copyright: GPL
Group: Networking/Daemons
URL: http://arthur.ath.cx/~alex/ngircd/
Source: %{name}-%{version}.tar.gz
Packager: Sean Reifschneider <jafo-rpms@tummy.com>
BuildRoot: /var/tmp/%{name}-root
%description
ngIRCd is a free open source daemon for Internet Relay Chat (IRC),
developed under the GNU General Public License (GPL). It's written from
scratch and is not based upon the original IRCd like many others.
Why should you use ngIRCd? Because ...
* ... there are no problems with servers on changing or non-static IP
addresses.
* ... there is a small and lean configuration file.
* ... there is a free, modern and open source C source code.
* ... it is still under active development.
%prep
%setup
%build
%configure
make
%install
[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"
%makeinstall
(
cd "$RPM_BUILD_ROOT"
( cd usr/sbin; mv *-ngircd ngircd )
( cd usr/share/man/man5; mv *-ngircd.conf.5 ngircd.conf.5 )
( cd usr/share/man/man8; mv *-ngircd.8 ngircd.8 )
)
%clean
[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"
%files
%defattr(755,root,root)
%doc AUTHORS COPYING ChangeLog INSTALL NEWS README
%config(noreplace) /etc
%{_prefix}/sbin
%{_prefix}/share/man/

27
doc/CC-Speed.txt Normal file
View File

@@ -0,0 +1,27 @@
ngIRCd - Next Generation IRC Server
(c)2001,2002 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd ist freie Software und steht unter
der GNU General Public License.
-- CC-Speed.txt --
ngIRCd-0.2.1-pre (2002-02-25):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[nach make-Zeiten sortiert]
Intel PIII, 1 GHz, 256 MB Ram, FreeBSD 4.4: configure: 00:10, make: 00:05
Intel PIII, 1 GHz, 256 MB Ram, Linux 2.4.10: configure: 00:06, make: 00:06
Intel PIII, 1 GHz, 256 MB Ram, BeOS R5: configure: 00:19, make: 00:07
Intel PIII, 1 GHz, 256 MB Ram, Win2k+CygWin: configure: 00:27, make: 00:08
AMD K6/2, 400 Mhz, 256 MB Ram, Linux 2.4.12: configure: 00:14, make: 00:12
PowerMac G4, 400 Mhz, 768 MB Ram, Mac OS X 10.1.2: configure: 00:32, make: 00:19
Macintosh SE/30, 68030 16 MHz, 32 MB, A/UX 3.0.1: configure: 07:33, make: 12:02
--
$Id: CC-Speed.txt,v 1.1 2002/02/25 14:02:32 alex Exp $

View File

@@ -9,13 +9,11 @@
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
# #
# $Id: Makefile.am,v 1.10 2002/09/16 10:35:06 alex Exp $ # $Id: Makefile.am,v 1.7 2002/03/30 15:33:14 alex Exp $
# #
SUBDIRS = en EXTRA_DIST = CC-Speed.txt CVS.txt FAQ.txt README-AUX.txt README-BeOS.txt \
RFC.txt sample-ngircd.conf
EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt README-AUX.txt \
README-BeOS.txt RFC.txt sample-ngircd.conf
maintainer-clean-local: maintainer-clean-local:
rm -f Makefile Makefile.in rm -f Makefile Makefile.in

View File

@@ -1,109 +0,0 @@
ngIRCd - Next Generation IRC Server
(c)2001,2002 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd ist freie Software und steht unter
der GNU General Public License.
-- Protocol.txt --
I. Kompatibilitaet
~~~~~~~~~~~~~~~~~~
Der ngIRCd haelt sich an das IRC-Protokoll Version 2.10, wie es in den RFCs
1459 und 2810-2813 beschrieben ist. Diese (und ggf. weitere fuer den ngIRCd
relevante) RFCs sind in RFC.txt aufgefuehrt.
Leider verhaelt sich aber schon der "Originalserver" nicht immer genau so,
wie es in den RFCs beschrieben ist. Da der ngIRCd aber ein Ersatz fuer
eben diesen Server sein soll, werden diese Abweichungen in der Regel vom
ngIRCd emuliert um die Kompatibilitaet zu wahren.
Sollte dieses Verhalten nicht erwuenscht sein, so kann mit der configure-
Option "--enable-strict-rfc" der ngIRCd so compiliert werden, dass er sich
strikt an die entsprechenden RFCs haelt.
ACHTUNG: an einem so compilierten Server koennen sich andere Server und
Clients, die sich nicht genau an das Protokoll halten, u.U. nicht mehr
anmelden oder alle Funktionen nutzen! In der Regel ist diese Option daher
nicht erwuenscht.
II. Das IRC+-Protokoll
~~~~~~~~~~~~~~~~~~~~~~
Der ngIRCd unterstuetzt als Erweiterung zum IRC-Protokoll wie es in den RFCs
2810-2813 beschrieben ist, das IRC+-Protokoll. Dieses Protokoll ist dabei
kompatibel zum IRC-Protokoll und wird nur verwendet, wenn der ngIRCd fest-
stellt, dass ein connectierter Server ebenfalls dieses erweiterte Protokoll
unterstuetzt.
Die Protokoll- und Server-Erkennung wird mit dem "PASS"-Befehl durchgefuehrt
(vgl. RFC 2813, Sektion 4.1.1):
II.1 neuen Server-Link registrieren
Befehl: PASS
Parameter: <password> <version> <flags> [<options>]
Fuer: mit dieser Syntax nur Server
<password> enthaelt das Passwort fur den neu aufzubauenden Server-Link,
so wie es in der Konfigurationsdatei definiert wurde.
<version> setzt sich aus zwei Teilen zusammen und ist mindestens 4, maximal
14 Zeichen lang: die ersten vier Bytes enthalten die Versionsnummer des
unterstuetzten IRC-Protokolls, wobei die ersten zwei Bytes die Major-, die
letzten beiden die Minor-Revision angeben. Der String "0210" steht also
fuer Protokollversion 2.10.
Die folgenden (optionalen!) 10 Bytes enthalten eine von der jeweiligen
Implementation abhaengige Versionsnummer. Server, die das IRC+-Protokoll
unterstuetzen, liefern hier "-IRC+".
<flags> setzt sich ebenfalls aus zwei Bestandteilen zusammen und ist
maximal 100 Bytes lang. Getrennt werden die beiden Teile mit dem Zeichen
"|". Der erste Teil enthaelt den Namen der Implementation, der ngIRCd
liefert hier z.B. "ngIRCd", der Originalserver "IRC". Anhand dieser "ID"
kann zwischen Serverimplementationen unterschieden werden. Der zweite Teil
(nach dem "|") ist implementationsabhaengig und wird nur ausgewertet,
wenn die Gegenseite das IRC+-Protokoll unterstuetzt. In diesem Fall wird
folgende Syntax erwartet: "<serverversion>[:<serverflags>]".
<serverversion> ist hier eine ASCII-Klartext-Darstellung der Versionsnummer,
<serverflags> zeigt die vom Server unterstuetzten Erweiterungen an (und
kann die leere Menge sein).
Mit dem optionalen Parameter <options> werden Server-Optionen uebermittelt,
wie sie in RFC 2813, Sektion 4.1.1 definiert sind.
Folgende <serverflags> sind zur Zeit definiert:
- o: IRC-Operatoren duerfen auch dann Channel- und Channel-User-Modes
aendern, wenn sie kein Channel-Operator im betroffenen Channel sind.
- C: der Server unterstuetzt den CHANINFO-Befehl.
II.2 Channel-Modes, persistente Channel und Topic austauschen
Befehl: CHANINFO
Parameter: <channel> +<mode> [<topic>]
Fuer: Server
Mit CHANINFO Informiert ein Server den anderen ueber einen Channel: dessen
Modes und dessen Topic. <topic> ist optional.
Existiert auf dem Server, der das CHANINFO empfaengt, der Channel bereits,
so uebernimmt er die Werte jeweils nur dann, wenn er selber noch keine
Modes bzw. kein Topic definiert hat. Ansonsten wird der jeweilige Parameter
ignoriert.
Existiert der Channel noch nicht, so wird er mit den entsprechenden Angaben
erzeugt.
--
$Id: Protocol.txt,v 1.5 2002/09/04 00:06:19 alex Exp $

View File

@@ -68,4 +68,4 @@ configure: 7:33, make: 12:02
-- --
$Id: README-AUX.txt,v 1.3 2002/04/29 14:19:48 alex Exp $ $Id: README-AUX.txt,v 1.1.2.2 2002/04/29 14:44:24 alex Exp $

View File

@@ -22,7 +22,7 @@ von Pipes verschiedener Prozesse umgehen kann: sobald der Resolver asyncron
gestartet wird, also Pipe-Handles im select() vorhanden sind, fuehrt das zu gestartet wird, also Pipe-Handles im select() vorhanden sind, fuehrt das zu
obiger Meldung. obiger Meldung.
Theoretische "Loesung"/Workaround: Theoretische "L<EFBFBD>sung"/Workaround:
Den Resolver unter BeOS nicht verwenden, sondern mit IP-Adressen arbeiten. Den Resolver unter BeOS nicht verwenden, sondern mit IP-Adressen arbeiten.
Nachteil: der ngIRCd koennte sich nicht zu Servern verbinden, die dynamische Nachteil: der ngIRCd koennte sich nicht zu Servern verbinden, die dynamische
Adressen benutzen -- dazu muesste er den Namen aufloesen. Ansonsten sollte Adressen benutzen -- dazu muesste er den Namen aufloesen. Ansonsten sollte
@@ -32,16 +32,5 @@ Also: wenn es jemand implementieren will ... ;-))
Vielleicht mache ich es auch irgendwann mal selber. Mal sehen. Vielleicht mache ich es auch irgendwann mal selber. Mal sehen.
2002-05-19:
Ich habe gerade damit ein wenig gespielt und den Source hier so geaendert,
dass unter BeOS keine Resolver-Subprozesse mehr erzeugt werden, sondern mit
den "rohen" IP-Adressen gearbeitet wird. Das funktioniert so weit auch,
allerdings verschluckt sich BeOS nun bei anderen Funktionen, so zum Beispiel
bei close(), wenn ein Socket eines Clients geschlossen werden soll!?
Sehr komisch.
Wer Interesse daran hat, das weiter zu verfolgen, der moege sich bitte mit
mir in Verbindung setzen (alex@barton.de), ich maile gerne meine Patches zu.
Fuer eine Aenderung im CVS ist es aber meiner Meinung nach noch zu frueh ...
-- --
$Id: README-BeOS.txt,v 1.3 2002/05/19 13:10:26 alex Exp $ $Id: README-BeOS.txt,v 1.1 2002/02/25 14:02:32 alex Exp $

View File

@@ -1,126 +0,0 @@
ngIRCd - Next Generation IRC Server
(c)2001,2002 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd ist freie Software und steht unter
der GNU General Public License.
-- INSTALL --
I. Standard-Installation
~~~~~~~~~~~~~~~~~~~~~~~~
ngIRCd is developed for UNIX-like systems, which means, that the installation
on a modern UNIX-like system should be no problem. The only thing is, that
the system should be supported by GNU automake and GNU autoconf ("configure").
The normal installation is like that:
1) tar xzf ngircd-<Version>.tar.gz
2) cd ngircd-<Version>
3) ./autogen.sh [only necessary when using CVS]
4) ./configure
5) make
6) make install
3): "autogen.sh"
The first step, autogen.sh, is only necessary if the configure-script isn't
already generated. This never happens in official ("stable") releases in
tar.gz-archieves, but when using the CVS system.
The next is therefore only interesting for developpers.
autogen.sh produces the makefile.in's, which are necessary for the configure
script it self, and some more files for make. For this step, there must be
GNU automake and GNU autoconf (in recent versions).
(again: "end users" do not need this step!)
to 4): "./configure"
The configure-script is used to detect local system dependancies.
In the perfect case, configure should recognize all needed libraries, header
and so on. If this shouldn't work, "./configure --help" shows more options.
to 5): "make"
The make command uses the Makefiles produced by configure and compiles the
ngIRCd daemon.
to 6): "make install"
Use "make install" to install the server and a sample configuration file on
the local system. For this step, root privileges are necessary. If there is
already an older configuration file present, it won't be overwritten.
This are the files that are installed:
- /usr/local/sbin/ngircd: exectable server
- /usr/local/etc/ngircd.conf: sample configuration, if not there
II. Useful make-targets
~~~~~~~~~~~~~~~~~~~~~~~
The Makefile produced by the configure-script contain always these useful
targets:
- clean: delete every product from the compiler/linker
next step: -> make
- distclean: plus erase all generated Makefiles
next step: -> ./configure
- maintainer-clean: erease all automatic generated files
next step: -> ./autogen.sh
III. Sample configuration file ngircd.conf
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In the sample configuration file, there are comments beginning with "#" OR
";" -- this is only for the better understanding of the code.
The file is seperated in three blocks: [Global], [Operator], [Server]. In
the [Gobal] part, there is the main configuration, like the server-name
and the ports, on which the server should be listening. In the [Operator]
section, the server-operators are defined and [Server] is the section,
where the server-links are configured.
The meaning of the variables in the configuration file is explained in the
"doc/sample-ngircd.conf", which is also the sample configuration file in
/usr/local/etc after running "make install" (if you don't already have one).
IV. Command line options
~~~~~~~~~~~~~~~~~~~~~~~~
These parameters could be passed to the ngIRCd:
-f, --config <file>
The daemon uses the file <file> as configuration file rather than
the standard configuration /usr/local/etc/ngircd.conf.
-n, --nodaemon
ngIRCd should be running as a foreground process.
-p, --passive
Server-links won't be automatically established.
--configtest
Reads, validates and dumps the configuration file as interpreted
by the server. Then exits.
Use "--help" to see a short help text describing all available parameters
the server understands, with "--version" the ngIRCd shows its version
number. In both cases the server exits after the output.
--
$Id: INSTALL,v 1.2 2002/05/20 12:02:58 alex Exp $

View File

@@ -1,20 +0,0 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
#
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
# der GNU General Public License (GPL), wie von der Free Software Foundation
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
#
# $Id: Makefile.am,v 1.1 2002/05/09 10:17:05 alex Exp $
#
EXTRA_DIST = INSTALL README
maintainer-clean-local:
rm -f Makefile Makefile.in
# -eof-

View File

@@ -1,101 +0,0 @@
ngIRCd - Next Generation IRC Server
(c)2001,2002 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- README --
Ilja Osthoff, <ilja@glide.ath.cx>
I. Introduction
~~~~~~~~~~~~~~~
ngIRCd is an Open-Source server for the Internet Realy Chat (IRC), which
is developped and published under the terms of the GNU General Public
Licence (URL: http://www.gnu.org/licenses/gpl.html). ngIRCd means "next
generation IRC daemon", it's written from scratch and not deduced from the
"grandfather of IRC daemons", the daemon of the IRCNet.
II. Status
~~~~~~~~~~~
At present, the ngIRCd is under active development, some features are not
implemented, some only partly.
Till today (more or less complete) implemented IRC-commands:
ADMIN, AWAY, CHANINFO, CONNECT, DIE, ERROR, INVITE, ISON, JOIN, KICK, KILL,
LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, NOTICE, OPER, PART,
PASS, PING, PONG, PRIVMSG, QUIT, RESTART, SERVER, SQUIT, TOPIC, USERHOST,
USER, VERSION, WHO, WHOIS.
III. Features (or: why use ngIRCd?)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- no problems with servers which have dynamic ip-adresses
- simple, easy understandable configuration file,
- freely published C-Sourcecode,
- ngIRCd will be developed on in the future.
- supported platforms (tested versions): AIX (3.2.5), A/UX (3.0.1), FreeBSD
(4.5), HP-UX (10.20), IRIX (6.5), Linux (2.x), Mac OS X (10.x), NetBSD
(1.5.2/i386, 1.5.3/m68k), Solaris (2.5.1, 2.6), and Windows with Cygwin.
IV. Documentation
~~~~~~~~~~~~~~~~~
English documentation:
- doc/en/README: the file that you are reading :-)
- doc/en/INSTALL: hints for the installation of the ngIRCd
German documentation:
- README: readme text in german
- INSTALL: german installation instructions
- NEWS: what do you think? :-)
- Changelog: the complete history of the ngIRCd
- doc/FAQ.txt: frequently asked questions and answers
- doc/CVS.txt: hints for the CVS-system
- doc/RFC.txt: information about the RFC's
- doc/sample-ngircd.conf: sample configuration file
- doc/README-AUX.txt: installation hints for A/UX
- doc/README-BeOS.txt: the same for BeOS
V. Download
~~~~~~~~~~~
The homepage of the ngIRCd is: <http://arthur.ath.cx/~alex/ngircd>; you
will find the newest information about the ngIRCd and the most recent
("stable") releases there.
If you are interested in the newest developper-versions (which are not
always stable), then please read the section "CVS" on the homepage and
the file "doc/CVS.txt" which describes the use of CVS, the "Concurrent
Versioning System".
VI. Bugs
~~~~~~~~
If you find bugs in the ngIRCd (which might be there :-), please report
them at the following URL:
<http://arthur.ath.cx/~alex/ngircd/#bugs>
There you can read about kown bugs, too.
If you have critics, patches or something else, please feel yourself free
to post a mail to: <alex@barton.de> or <alex@arthur.ath.cx>
--
$Id: README,v 1.6 2002/09/16 11:03:05 alex Exp $

View File

@@ -1,4 +1,4 @@
# $Id: sample-ngircd.conf,v 1.11 2002/09/16 10:33:09 alex Exp $ # $Id: sample-ngircd.conf,v 1.8 2002/03/30 13:03:12 alex Exp $
# #
# Das ist eine Beispiel-Konfiguration fuer den ngIRCd, die an die # Das ist eine Beispiel-Konfiguration fuer den ngIRCd, die an die
@@ -6,9 +6,6 @@
# #
# Kommentare werden mit "#" oder ";" eingeleitet. # Kommentare werden mit "#" oder ";" eingeleitet.
# #
# Autor: Alexander Barton, <alex@barton.de>
# Erweiterungen von Ilja Osthoff, <ilja@glide.ath.cx>
#
[Global] [Global]
@@ -16,29 +13,20 @@
# Im [Global]-Abschnitt der Konfigurationsdatei wird der Server # Im [Global]-Abschnitt der Konfigurationsdatei wird der Server
# "an sich" konfiguriert. Notwendig ist nur die Variable "Name", # "an sich" konfiguriert. Notwendig ist nur die Variable "Name",
# Info ist in der Regel ebengalls anzupassen. Fuer alle uebrigen # Info ist in der Regel ebengalls anzupassen. Fuer alle uebrigen
# Variablen koennen oft die Defaults benutzt werden, d.h. hier # Variablen koennen oft die Defaults benutzt werden.
# muss die Variable nicht angegeben werden.
# #
# Servername im IRC-Netz # Servername im IRC-Netz
Name = irc.the.net Name = irc.the.net
# Info-Text des Servers. Dieser wird z.B. bei WHOIS- oder LINKS- # Info-Text des Servers
# Abfragen entsprechend mit ausgegeben.
Info = Server Info Text Info = Server Info Text
# Informationen ueber den Server und Administrator fuer den
# ADMIN-Befehl:
;AdminInfo1 = Beschreibung
;AdminInfo2 = Standort
;AdminEMail = admin@irc.server
# Ports, auf denen Verbindungen angenommen werden sollen. Es koennen # Ports, auf denen Verbindungen angenommen werden sollen. Es koennen
# mehrere Ports mit "," getrennt angegeben werden. (Default: 6667) # mehrere Ports mit "," getrennt angegeben werden. (Default: 6667)
;Ports = 6667, 6668, 6669 ;Ports = 6667, 6668, 6669
# Textdatei mit der "Message of the Day" (MOTD). Diese wird aus- # Textdatei mit der "Message of the Day" (MOTD)
# gegeben, wenn sich ein User mit dem Server verbindet.
;MotdFile = /usr/local/etc/ngircd.motd ;MotdFile = /usr/local/etc/ngircd.motd
# User-ID, unter der der Daemon laufen soll (dazu muss der Server # User-ID, unter der der Daemon laufen soll (dazu muss der Server
@@ -62,10 +50,7 @@
# Der Server versucht alle <ConnectRetry> Sekunden, noch nicht bzw. # Der Server versucht alle <ConnectRetry> Sekunden, noch nicht bzw.
# nicht mehr connectierte Server-Links aufzubauen. # nicht mehr connectierte Server-Links aufzubauen.
;ConnectRetry = 60 ;ConnectRetry = 60
# Sollen IRC-Operatoren immer den MODE-Befehl in Channel benutzen
# koennen, auch wenn sie kein(!) Channel-Operator sind?
;OperCanUseMode = no
[Operator] [Operator]
@@ -81,27 +66,26 @@
# Passwort des IRC-Operators # Passwort des IRC-Operators
;Password = ThePwd ;Password = ThePwd
[Server] [Server]
# #
# In [Server]-Bloecken werden Server konfiguriert, zu denen sich # In [Server]-Bloecken werden Server konfiguriert, zu denen dieser
# dieser ngIRCd verbinden soll bzw. von denen Verbindungen angekommen # Server sich verbinden soll bzw. von denen Verbindungen angekommen
# werden duerfen. # werden duerfen.
# Es koennen mehrere Server konfiguriert werden, d.h. [Server]- # Es koennen mehrere Server konfiguriert werden, d.h. [Server]-
# Bloecke koennen mehrfach vorkommen. # Bloecke koennen mehrfach vorkommen.
# Wenn man fuer einen Server einen Port angegeben hat, dann versucht # Ist fuer einen Server ein Port konfiguriert, so versucht dieser
# sich der ngIRCd mit der Gegenseite zu verbinden. Hat man keinen # Server die Gegenseite zu connectieren. Ist kein Port vorgegeben,
# Port konfiguriert, dann wartet der ngIRCd darauf, dass sich die # so wartet dieser Server auf eine Verbindung der Gegenseite.
# Gegenseite mit ihm verbindet.
# #
# Server-Gruppen: # Server-Gruppen:
# Der ngIRCd unterstuetzt "Server-Gruppen": das bedeutet, man kann # Fuer jeden Server kann (optinal!) eine Gruppe konfiguriert werden,
# jedem Server, mit dem man sich verbinden will, einer Gruppe zu- # zu der er gehoert (wird nur beachtet, wenn ein Port konfiguriert
# ordnen. Wenn der ngIRCd sich dann mit einem Server aus der Gruppe # ist!): eine solche Server-Gruppe wird quasi als ein Server ange-
# verbinden will und keine Antwort erhaelt, dann wird der naechste # sehen, der ngIRCd baut also nur eine Verbindung auf. Schlaegt die
# Server aus der Gruppe versucht. # Verbindung zu einem Server in einer Gruppe fehl, so wird der
# Achtung: Gruppen werden nur beachtet, wenn man einen Port fur # naechste Server in der Gruppe probiert.
# die Gegenseite angegeben hat!
# #
# Hostname des Servers # Hostname des Servers
@@ -121,24 +105,4 @@
# Gruppe, zu der dieser Server gehoert (optional). # Gruppe, zu der dieser Server gehoert (optional).
;Group = 123 ;Group = 123
[Channel]
#
# Mit [Channel]-Bloecken werden "persistente Channels" definiert,
# die nach dem Start des Servers automatisch erzeugt werden und auch
# dann erhalten bleiben, wenn keine User mehr im Channel sind. Es
# koennen mehrere solcher Bloecke hier konfiguriert werden.
# Gekennzeichnet werden solche Channels mit dem Mode "P", der ganz
# normal gesetzt und geloescht werden kann.
#
# Name des Channels
;Name = #TheName
# Topic, das gesetzt werden soll
;Topic = Ein tolles Topic
# Channel-Modes
;Modes = tn
# -eof- # -eof-

View File

@@ -1,22 +0,0 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
#
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
# der GNU General Public License (GPL), wie von der Free Software Foundation
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
#
# $Id: Makefile.am,v 1.5 2002/04/04 13:02:41 alex Exp $
#
man_MANS = ngircd.conf.5 ngircd.8
EXTRA_DIST = $(man_MANS)
maintainer-clean-local:
rm -f Makefile Makefile.in
# -eof-

View File

@@ -1,52 +0,0 @@
.\"
.\" $Id: ngircd.8,v 1.4 2002/09/16 11:11:21 alex Exp $
.\"
.TH ngircd 8 "September 2002" ngircd "ngIRCd Manual"
.SH NAME
ngircd \- the next generation IRC daemon
.SH SYNOPSIS
.B ngircd [
.I Options
.B ]
.SH DESCRIPTION
.B ngircd
is a portable IRC daemon written from scratch. It is easy to configure,
supports server links (even with original ircds) and runs on hosts with
changing IP addresses (such as dial-in networks). Currently supported
platforms (tested versions) are: AIX (3.2.5), A/UX (3.0.1), FreeBSD
(4.5), HP-UX (10.20), IRIX (6.5), Linux (2.x), Mac OS X (10.x), NetBSD
(1.5.2/i386, 1.5.3/m68k), Solaris (2.5.1, 2.6), and Windows with Cygwin.
.SH OPTIONS
.IP --configtest
read, validate and display configuration; then exit.
.IP "-f file, --config file"
use
.I file
as configuration file.
.IP "-n, --nodaemon"
don't fork and don't detatch from controlling terminal.
.IP "-p, --passive"
disable automatic connections to other servers.
.IP --version
output version information and exit.
.IP --help
display brief help text and exit.
.SH FILES
.I /usr/local/etc/ngircd.conf
.RS
The system wide default configuration file.
.SH AUTHOR
Alexander Barton,
.UR mailto:alex@barton.de
alex@barton.de
.UE
.br
Homepage:
.UR http://arthur.ath.cx/~alex/ngircd/
http://arthur.ath.cx/~alex/ngircd/
.UE
.SH "SEE ALSO"
.BR ngircd.conf (5),
.BR ircd (8)
.\"
.\" -eof-

View File

@@ -1,26 +0,0 @@
.\"
.\" $Id: ngircd.conf.5,v 1.6 2002/09/16 11:11:21 alex Exp $
.\"
.TH ngircd.conf 5 "September 2002" ngircd "ngIRCd Manual"
.SH NAME
ngircd.conf \- configuration file of ngircd
.SH SYNOPSIS
.B /usr/local/etc/ngircd.conf
.SH DESCRIPTION
(coming soon, please have a look at the sample configuration
file "doc/sample-ngircd.conf" -- Thank you!)
.SH AUTHOR
Alexander Barton,
.UR mailto:alex@barton.de
alex@barton.de
.UE
.br
Homepage:
.UR http://arthur.ath.cx/~alex/ngircd/
http://arthur.ath.cx/~alex/ngircd/
.UE
.SH "SEE ALSO"
.BR ngircd (8)
.BR ircd (8)
.\"
.\" -eof-

View File

@@ -9,10 +9,10 @@
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
# #
# $Id: Makefile.am,v 1.4 2002/09/09 10:00:15 alex Exp $ # $Id: Makefile.am,v 1.3 2002/03/12 14:37:51 alex Exp $
# #
SUBDIRS = portab ngircd testsuite SUBDIRS = portab ngircd
maintainer-clean-local: maintainer-clean-local:
rm -f Makefile Makefile.in config.h config.h.in stamp-h.in rm -f Makefile Makefile.in config.h config.h.in stamp-h.in

View File

@@ -9,28 +9,22 @@
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
# #
# $Id: Makefile.am,v 1.27 2002/09/07 18:06:29 alex Exp $ # $Id: Makefile.am,v 1.19 2002/03/29 22:52:12 alex Exp $
# #
AUTOMAKE_OPTIONS = ../portab/ansi2knr AM_CFLAGS = -I$(srcdir)/../portab
INCLUDES = -I$(srcdir)/../portab
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN
sbin_PROGRAMS = ngircd sbin_PROGRAMS = ngircd
ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c hash.c irc.c \ ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c hash.c irc.c \
irc-channel.c irc-login.c irc-mode.c irc-op.c irc-oper.c irc-server.c \ irc-channel.c irc-login.c irc-mode.c irc-oper.c irc-server.c \
irc-write.c lists.c log.c match.c parse.c resolve.c tool.c irc-write.c log.c parse.c tool.c
ngircd_LDFLAGS = -L../portab
ngircd_LDADD = -lngportab
noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h hash.h irc.h \ noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h hash.h irc.h \
irc-channel.h irc-login.h irc-mode.h irc-op.h irc-oper.h irc-server.h \ irc-channel.h irc-login.h irc-mode.h irc-oper.h irc-server.h \
irc-write.h lists.h log.h match.h parse.h resolve.h tool.h \ irc-write.h log.h parse.h tool.h \
messages.h defines.h messages.h defines.h
clean-local: clean-local:
@@ -41,7 +35,7 @@ maintainer-clean-local:
check-version: Makefile check-version: Makefile
echo "#!/bin/sh" > check-version echo "#!/bin/sh" > check-version
echo "./ngircd --version | grep ngircd > /dev/null 2>&1" >> check-version echo "./ngircd --version | grep version > /dev/null 2>&1" >> check-version
chmod 755 check-version chmod 755 check-version
check-help: Makefile check-help: Makefile
@@ -53,7 +47,7 @@ lint:
rm -f lint.out rm -f lint.out
for f in *.c; do \ for f in *.c; do \
echo "checking $$f ..."; \ echo "checking $$f ..."; \
splint $$f $(LINTARGS) -I./.. -I./../portab $(AM_CFLAGS) > lint.out 2>&1; \ splint $$f $(LINTARGS) -I./.. $(AM_CFLAGS) > lint.out 2>&1; \
grep "no warnings" lint.out > /dev/null 2>&1; \ grep "no warnings" lint.out > /dev/null 2>&1; \
if [ $$? -ne 0 ]; then \ if [ $$? -ne 0 ]; then \
echo; cat lint.out; echo; \ echo; cat lint.out; echo; \

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: channel.c,v 1.32.2.1 2002/11/04 19:18:39 alex Exp $ * $Id: channel.c,v 1.20.2.1 2002/04/29 14:11:23 alex Exp $
* *
* channel.c: Management der Channels * channel.c: Management der Channels
*/ */
@@ -25,87 +25,37 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "conn.h"
#include "client.h" #include "client.h"
#include "exp.h"
#include "channel.h"
#include "imp.h"
#include "irc-write.h"
#include "resolve.h"
#include "conf.h"
#include "hash.h" #include "hash.h"
#include "lists.h" #include "irc-write.h"
#include "log.h" #include "log.h"
#include "messages.h" #include "messages.h"
#include "exp.h" #include "exp.h"
#include "channel.h"
#define REMOVE_PART 0
#define REMOVE_QUIT 1
#define REMOVE_KICK 2
LOCAL CHANNEL *My_Channels; LOCAL CHANNEL *My_Channels;
LOCAL CL2CHAN *My_Cl2Chan; LOCAL CL2CHAN *My_Cl2Chan;
LOCAL CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client )); LOCAL CHANNEL *New_Chan( CHAR *Name );
LOCAL CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client )); LOCAL CL2CHAN *Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client );
LOCAL BOOLEAN Remove_Client PARAMS(( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN InformServer )); LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client );
LOCAL CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan )); LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN ServerPART );
LOCAL CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan )); LOCAL CL2CHAN *Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan );
LOCAL BOOLEAN Delete_Channel PARAMS(( CHANNEL *Chan )); LOCAL CL2CHAN *Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan );
LOCAL BOOLEAN Delete_Channel( CHANNEL *Chan );
GLOBAL VOID GLOBAL VOID Channel_Init( VOID )
Channel_Init( VOID )
{ {
My_Channels = NULL; My_Channels = NULL;
My_Cl2Chan = NULL; My_Cl2Chan = NULL;
} /* Channel_Init */ } /* Channel_Init */
GLOBAL VOID GLOBAL VOID Channel_Exit( VOID )
Channel_InitPredefined( VOID )
{
/* Vordefinierte persistente Channels erzeugen */
CHANNEL *chan;
CHAR *c;
INT i;
for( i = 0; i < Conf_Channel_Count; i++ )
{
/* Ist ein Name konfiguriert? */
if( ! Conf_Channel[i].name[0] ) continue;
/* Gueltiger Channel-Name? */
if( ! Channel_IsValidName( Conf_Channel[i].name ))
{
Log( LOG_ERR, "Can't create pre-defined channel: invalid name: \"%s\"!", Conf_Channel[i].name );
continue;
}
/* Channel anlegen */
chan = Channel_Create( Conf_Channel[i].name );
if( chan )
{
Channel_ModeAdd( chan, 'P' );
Channel_SetTopic( chan, Conf_Channel[i].topic );
c = Conf_Channel[i].modes;
while( *c ) Channel_ModeAdd( chan, *c++ );
Log( LOG_INFO, "Created pre-defined channel \"%s\".", Conf_Channel[i].name );
}
else Log( LOG_ERR, "Can't create pre-defined channel \"%s\"!", Conf_Channel[i].name );
}
} /* Channel_InitPredefined */
GLOBAL VOID
Channel_Exit( VOID )
{ {
CHANNEL *c, *c_next; CHANNEL *c, *c_next;
CL2CHAN *cl2chan, *cl2chan_next; CL2CHAN *cl2chan, *cl2chan_next;
@@ -130,8 +80,7 @@ Channel_Exit( VOID )
} /* Channel_Exit */ } /* Channel_Exit */
GLOBAL BOOLEAN GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name )
Channel_Join( CLIENT *Client, CHAR *Name )
{ {
CHANNEL *chan; CHANNEL *chan;
@@ -155,8 +104,12 @@ Channel_Join( CLIENT *Client, CHAR *Name )
else else
{ {
/* Gibt es noch nicht? Dann neu anlegen: */ /* Gibt es noch nicht? Dann neu anlegen: */
chan = Channel_Create( Name ); chan = New_Chan( Name );
if( ! chan ) return FALSE; if( ! chan ) return FALSE;
/* Verketten */
chan->next = My_Channels;
My_Channels = chan;
} }
/* User dem Channel hinzufuegen */ /* User dem Channel hinzufuegen */
@@ -165,14 +118,12 @@ Channel_Join( CLIENT *Client, CHAR *Name )
} /* Channel_Join */ } /* Channel_Join */
GLOBAL BOOLEAN GLOBAL BOOLEAN Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
{ {
CHANNEL *chan; CHANNEL *chan;
assert( Client != NULL ); assert( Client != NULL );
assert( Name != NULL ); assert( Name != NULL );
assert( Reason != NULL );
/* Channel suchen */ /* Channel suchen */
chan = Channel_Search( Name ); chan = Channel_Search( Name );
@@ -183,77 +134,31 @@ Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
} }
/* User aus Channel entfernen */ /* User aus Channel entfernen */
if( ! Remove_Client( REMOVE_PART, chan, Client, Origin, Reason, TRUE )) return FALSE; if( ! Remove_Client( chan, Client, Origin, Reason, TRUE )) return FALSE;
else return TRUE; else return TRUE;
} /* Channel_Part */ } /* Channel_Part */
GLOBAL VOID GLOBAL VOID Channel_RemoveClient( CLIENT *Client, CHAR *Reason )
Channel_Kick( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
{
CHANNEL *chan;
assert( Client != NULL );
assert( Origin != NULL );
assert( Name != NULL );
assert( Reason != NULL );
/* Channel suchen */
chan = Channel_Search( Name );
if( ! chan )
{
IRC_WriteStrClient( Origin, ERR_NOSUCHCHANNEL_MSG, Client_ID( Origin ), Name );
return;
}
/* Ist der User Mitglied in dem Channel? */
if( ! Channel_IsMemberOf( chan, Origin ))
{
IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG, Client_ID( Origin ), Name );
return;
}
/* Ist der User Channel-Operator? */
if( ! strchr( Channel_UserModes( chan, Origin ), 'o' ))
{
IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Name);
return;
}
/* Ist der Ziel-User Mitglied im Channel? */
if( ! Channel_IsMemberOf( chan, Client ))
{
IRC_WriteStrClient( Origin, ERR_USERNOTINCHANNEL_MSG, Client_ID( Origin ), Client_ID( Client ), Name );
return;
}
Remove_Client( REMOVE_KICK, chan, Client, Origin, Reason, TRUE );
} /* Channel_Kick */
GLOBAL VOID
Channel_Quit( CLIENT *Client, CHAR *Reason )
{ {
CHANNEL *c, *next_c; CHANNEL *c, *next_c;
assert( Client != NULL ); assert( Client != NULL );
assert( Reason != NULL );
c = My_Channels; c = My_Channels;
while( c ) while( c )
{ {
next_c = c->next; next_c = c->next;
Remove_Client( REMOVE_QUIT, c, Client, Client, Reason, FALSE ); Remove_Client( c, Client, Client_ThisServer( ), Reason, FALSE );
c = next_c; c = next_c;
} }
} /* Channel_Quit */ } /* Channel_RemoveClient */
GLOBAL LONG GLOBAL INT Channel_Count( VOID )
Channel_Count( VOID )
{ {
CHANNEL *c; CHANNEL *c;
LONG count; INT count;
count = 0; count = 0;
c = My_Channels; c = My_Channels;
@@ -266,11 +171,10 @@ Channel_Count( VOID )
} /* Channel_Count */ } /* Channel_Count */
GLOBAL LONG GLOBAL INT Channel_MemberCount( CHANNEL *Chan )
Channel_MemberCount( CHANNEL *Chan )
{ {
CL2CHAN *cl2chan; CL2CHAN *cl2chan;
LONG count; INT count;
assert( Chan != NULL ); assert( Chan != NULL );
@@ -285,39 +189,34 @@ Channel_MemberCount( CHANNEL *Chan )
} /* Channel_MemberCount */ } /* Channel_MemberCount */
GLOBAL CHAR * GLOBAL CHAR *Channel_Name( CHANNEL *Chan )
Channel_Name( CHANNEL *Chan )
{ {
assert( Chan != NULL ); assert( Chan != NULL );
return Chan->name; return Chan->name;
} /* Channel_Name */ } /* Channel_Name */
GLOBAL CHAR * GLOBAL CHAR *Channel_Modes( CHANNEL *Chan )
Channel_Modes( CHANNEL *Chan )
{ {
assert( Chan != NULL ); assert( Chan != NULL );
return Chan->modes; return Chan->modes;
} /* Channel_Modes */ } /* Channel_Modes */
GLOBAL CHANNEL * GLOBAL CHANNEL *Channel_First( VOID )
Channel_First( VOID )
{ {
return My_Channels; return My_Channels;
} /* Channel_First */ } /* Channel_First */
GLOBAL CHANNEL * GLOBAL CHANNEL *Channel_Next( CHANNEL *Chan )
Channel_Next( CHANNEL *Chan )
{ {
assert( Chan != NULL ); assert( Chan != NULL );
return Chan->next; return Chan->next;
} /* Channel_Next */ } /* Channel_Next */
GLOBAL CHANNEL * GLOBAL CHANNEL *Channel_Search( CHAR *Name )
Channel_Search( CHAR *Name )
{ {
/* Channel-Struktur suchen */ /* Channel-Struktur suchen */
@@ -341,16 +240,14 @@ Channel_Search( CHAR *Name )
} /* Channel_Search */ } /* Channel_Search */
GLOBAL CL2CHAN * GLOBAL CL2CHAN *Channel_FirstMember( CHANNEL *Chan )
Channel_FirstMember( CHANNEL *Chan )
{ {
assert( Chan != NULL ); assert( Chan != NULL );
return Get_First_Cl2Chan( NULL, Chan ); return Get_First_Cl2Chan( NULL, Chan );
} /* Channel_FirstMember */ } /* Channel_FirstMember */
GLOBAL CL2CHAN * GLOBAL CL2CHAN *Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan )
Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan )
{ {
assert( Chan != NULL ); assert( Chan != NULL );
assert( Cl2Chan != NULL ); assert( Cl2Chan != NULL );
@@ -358,16 +255,14 @@ Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan )
} /* Channel_NextMember */ } /* Channel_NextMember */
GLOBAL CL2CHAN * GLOBAL CL2CHAN *Channel_FirstChannelOf( CLIENT *Client )
Channel_FirstChannelOf( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
return Get_First_Cl2Chan( Client, NULL ); return Get_First_Cl2Chan( Client, NULL );
} /* Channel_FirstChannelOf */ } /* Channel_FirstChannelOf */
GLOBAL CL2CHAN * GLOBAL CL2CHAN *Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan )
Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan )
{ {
assert( Client != NULL ); assert( Client != NULL );
assert( Cl2Chan != NULL ); assert( Cl2Chan != NULL );
@@ -375,35 +270,31 @@ Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan )
} /* Channel_NextChannelOf */ } /* Channel_NextChannelOf */
GLOBAL CLIENT * GLOBAL CLIENT *Channel_GetClient( CL2CHAN *Cl2Chan )
Channel_GetClient( CL2CHAN *Cl2Chan )
{ {
assert( Cl2Chan != NULL ); assert( Cl2Chan != NULL );
return Cl2Chan->client; return Cl2Chan->client;
} /* Channel_GetClient */ } /* Channel_GetClient */
GLOBAL CHANNEL * GLOBAL CHANNEL *Channel_GetChannel( CL2CHAN *Cl2Chan )
Channel_GetChannel( CL2CHAN *Cl2Chan )
{ {
assert( Cl2Chan != NULL ); assert( Cl2Chan != NULL );
return Cl2Chan->channel; return Cl2Chan->channel;
} /* Channel_GetChannel */ } /* Channel_GetChannel */
GLOBAL BOOLEAN GLOBAL BOOLEAN Channel_IsValidName( CHAR *Name )
Channel_IsValidName( CHAR *Name )
{ {
/* Pruefen, ob Name als Channelname gueltig */ /* Pr<EFBFBD>fen, ob Name als Channelname gueltig */
CHAR *ptr, badchars[10]; CHAR *ptr, badchars[] = " ,:\x07";
assert( Name != NULL ); assert( Name != NULL );
if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return FALSE; if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return FALSE;
ptr = Name; ptr = Name;
strcpy( badchars, " ,:\x07" );
while( *ptr ) while( *ptr )
{ {
if( strchr( badchars, *ptr )) return FALSE; if( strchr( badchars, *ptr )) return FALSE;
@@ -414,8 +305,7 @@ Channel_IsValidName( CHAR *Name )
} /* Channel_IsValidName */ } /* Channel_IsValidName */
GLOBAL BOOLEAN GLOBAL BOOLEAN Channel_ModeAdd( CHANNEL *Chan, CHAR Mode )
Channel_ModeAdd( CHANNEL *Chan, CHAR Mode )
{ {
/* Mode soll gesetzt werden. TRUE wird geliefert, wenn der /* Mode soll gesetzt werden. TRUE wird geliefert, wenn der
* Mode neu gesetzt wurde, FALSE, wenn der Channel den Mode * Mode neu gesetzt wurde, FALSE, wenn der Channel den Mode
@@ -436,8 +326,7 @@ Channel_ModeAdd( CHANNEL *Chan, CHAR Mode )
} /* Channel_ModeAdd */ } /* Channel_ModeAdd */
GLOBAL BOOLEAN GLOBAL BOOLEAN Channel_ModeDel( CHANNEL *Chan, CHAR Mode )
Channel_ModeDel( CHANNEL *Chan, CHAR Mode )
{ {
/* Mode soll geloescht werden. TRUE wird geliefert, wenn der /* Mode soll geloescht werden. TRUE wird geliefert, wenn der
* Mode entfernt wurde, FALSE, wenn der Channel den Mode * Mode entfernt wurde, FALSE, wenn der Channel den Mode
@@ -462,8 +351,7 @@ Channel_ModeDel( CHANNEL *Chan, CHAR Mode )
} /* Channel_ModeDel */ } /* Channel_ModeDel */
GLOBAL BOOLEAN GLOBAL BOOLEAN Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
{ {
/* Channel-User-Mode soll gesetzt werden. TRUE wird geliefert, /* Channel-User-Mode soll gesetzt werden. TRUE wird geliefert,
* wenn der Mode neu gesetzt wurde, FALSE, wenn der User den * wenn der Mode neu gesetzt wurde, FALSE, wenn der User den
@@ -489,8 +377,7 @@ Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
} /* Channel_UserModeAdd */ } /* Channel_UserModeAdd */
GLOBAL BOOLEAN GLOBAL BOOLEAN Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
{ {
/* Channel-User-Mode soll geloescht werden. TRUE wird geliefert, /* Channel-User-Mode soll geloescht werden. TRUE wird geliefert,
* wenn der Mode entfernt wurde, FALSE, wenn der User den Channel-Mode * wenn der Mode entfernt wurde, FALSE, wenn der User den Channel-Mode
@@ -520,8 +407,7 @@ Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
} /* Channel_UserModeDel */ } /* Channel_UserModeDel */
GLOBAL CHAR * GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
{ {
/* Channel-Modes eines Users liefern */ /* Channel-Modes eines Users liefern */
@@ -537,8 +423,7 @@ Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
} /* Channel_UserModes */ } /* Channel_UserModes */
GLOBAL BOOLEAN GLOBAL BOOLEAN Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
{ {
/* Pruefen, ob Client Mitglied in Channel ist */ /* Pruefen, ob Client Mitglied in Channel ist */
@@ -550,16 +435,14 @@ Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
} /* Channel_IsMemberOf */ } /* Channel_IsMemberOf */
GLOBAL CHAR * GLOBAL CHAR *Channel_Topic( CHANNEL *Chan )
Channel_Topic( CHANNEL *Chan )
{ {
assert( Chan != NULL ); assert( Chan != NULL );
return Chan->topic; return Chan->topic;
} /* Channel_Topic */ } /* Channel_Topic */
GLOBAL VOID GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic )
Channel_SetTopic( CHANNEL *Chan, CHAR *Topic )
{ {
assert( Chan != NULL ); assert( Chan != NULL );
assert( Topic != NULL ); assert( Topic != NULL );
@@ -569,20 +452,7 @@ Channel_SetTopic( CHANNEL *Chan, CHAR *Topic )
} /* Channel_SetTopic */ } /* Channel_SetTopic */
GLOBAL VOID GLOBAL BOOLEAN Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text )
Channel_SetModes( CHANNEL *Chan, CHAR *Modes )
{
assert( Chan != NULL );
assert( Modes != NULL );
strncpy( Chan->modes, Modes, CHANNEL_MODE_LEN - 1 );
Chan->topic[CHANNEL_MODE_LEN - 1] = '\0';
} /* Channel_SetModes */
GLOBAL BOOLEAN
Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text )
{ {
BOOLEAN is_member, has_voice, is_op, ok; BOOLEAN is_member, has_voice, is_op, ok;
@@ -608,8 +478,8 @@ Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text )
} /* Channel_Write */ } /* Channel_Write */
GLOBAL CHANNEL *
Channel_Create( CHAR *Name ) LOCAL CHANNEL *New_Chan( CHAR *Name )
{ {
/* Neue Channel-Struktur anlegen */ /* Neue Channel-Struktur anlegen */
@@ -620,7 +490,7 @@ Channel_Create( CHAR *Name )
c = malloc( sizeof( CHANNEL )); c = malloc( sizeof( CHANNEL ));
if( ! c ) if( ! c )
{ {
Log( LOG_EMERG, "Can't allocate memory! [New_Chan]" ); Log( LOG_EMERG, "Can't allocate memory!" );
return NULL; return NULL;
} }
c->next = NULL; c->next = NULL;
@@ -630,18 +500,13 @@ Channel_Create( CHAR *Name )
strcpy( c->topic, "" ); strcpy( c->topic, "" );
c->hash = Hash( c->name ); c->hash = Hash( c->name );
/* Verketten */
c->next = My_Channels;
My_Channels = c;
Log( LOG_DEBUG, "Created new channel structure for \"%s\".", Name ); Log( LOG_DEBUG, "Created new channel structure for \"%s\".", Name );
return c; return c;
} /* Channel_Create */ } /* New_Chan */
LOCAL CL2CHAN * LOCAL CL2CHAN *Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
{ {
CL2CHAN *cl2chan; CL2CHAN *cl2chan;
@@ -658,8 +523,7 @@ Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
} /* Get_Cl2Chan */ } /* Get_Cl2Chan */
LOCAL CL2CHAN * LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client )
Add_Client( CHANNEL *Chan, CLIENT *Client )
{ {
CL2CHAN *cl2chan; CL2CHAN *cl2chan;
@@ -670,7 +534,7 @@ Add_Client( CHANNEL *Chan, CLIENT *Client )
cl2chan = malloc( sizeof( CL2CHAN )); cl2chan = malloc( sizeof( CL2CHAN ));
if( ! cl2chan ) if( ! cl2chan )
{ {
Log( LOG_EMERG, "Can't allocate memory! [Add_Client]" ); Log( LOG_EMERG, "Can't allocate memory!" );
return NULL; return NULL;
} }
cl2chan->channel = Chan; cl2chan->channel = Chan;
@@ -687,8 +551,7 @@ Add_Client( CHANNEL *Chan, CLIENT *Client )
} /* Add_Client */ } /* Add_Client */
LOCAL BOOLEAN LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN ServerPART )
Remove_Client( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN InformServer )
{ {
CL2CHAN *cl2chan, *last_cl2chan; CL2CHAN *cl2chan, *last_cl2chan;
CHANNEL *c; CHANNEL *c;
@@ -716,50 +579,26 @@ Remove_Client( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Re
else My_Cl2Chan = cl2chan->next; else My_Cl2Chan = cl2chan->next;
free( cl2chan ); free( cl2chan );
switch( Type ) if( ServerPART ) IRC_WriteStrServersPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
{ IRC_WriteStrChannelPrefix( Origin, c, Client, FALSE, "PART %s :%s", c->name, Reason );
case REMOVE_QUIT: if(( Client_Conn( Origin ) > NONE ) && ( Client_Type( Origin ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
/* QUIT: andere Server wurden bereits informiert, vgl. Client_Destroy();
* hier also "nur" noch alle User in betroffenen Channeln infomieren */
assert( InformServer == FALSE );
IRC_WriteStrChannelPrefix( Origin, c, Origin, FALSE, "QUIT :%s", Reason );
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
break;
case REMOVE_KICK:
/* User wurde geKICKed: ggf. andere Server sowie alle betroffenen User
* im entsprechenden Channel informieren */
if( InformServer ) IRC_WriteStrServersPrefix( Client_NextHop( Origin ), Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
IRC_WriteStrChannelPrefix( Client, c, Origin, FALSE, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
if(( Client_Conn( Client ) > NONE ) && ( Client_Type( Client ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Client, Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
Log( LOG_DEBUG, "User \"%s\" has been kicked of \"%s\" by \"%s\": %s.", Client_Mask( Client ), c->name, Client_ID( Origin ), Reason );
break;
default:
/* PART */
if( InformServer ) IRC_WriteStrServersPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
IRC_WriteStrChannelPrefix( Origin, c, Client, FALSE, "PART %s :%s", c->name, Reason );
if(( Client_Conn( Origin ) > NONE ) && ( Client_Type( Origin ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
}
/* Wenn Channel nun leer und nicht pre-defined: loeschen */ Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
if( ! strchr( Channel_Modes( Chan ), 'P' ))
{ /* Wenn Channel nun leer: loeschen */
if( ! Get_First_Cl2Chan( NULL, Chan )) Delete_Channel( Chan ); if( ! Get_First_Cl2Chan( NULL, Chan )) Delete_Channel( Chan );
}
return TRUE; return TRUE;
} /* Remove_Client */ } /* Remove_Client */
LOCAL CL2CHAN * LOCAL CL2CHAN *Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
{ {
return Get_Next_Cl2Chan( My_Cl2Chan, Client, Chan ); return Get_Next_Cl2Chan( My_Cl2Chan, Client, Chan );
} /* Get_First_Cl2Chan */ } /* Get_First_Cl2Chan */
LOCAL CL2CHAN * LOCAL CL2CHAN *Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
{ {
CL2CHAN *cl2chan; CL2CHAN *cl2chan;
@@ -776,8 +615,7 @@ Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
} /* Get_Next_Cl2Chan */ } /* Get_Next_Cl2Chan */
LOCAL BOOLEAN LOCAL BOOLEAN Delete_Channel( CHANNEL *Chan )
Delete_Channel( CHANNEL *Chan )
{ {
/* Channel-Struktur loeschen */ /* Channel-Struktur loeschen */
@@ -795,9 +633,6 @@ Delete_Channel( CHANNEL *Chan )
Log( LOG_DEBUG, "Freed channel structure for \"%s\".", Chan->name ); Log( LOG_DEBUG, "Freed channel structure for \"%s\".", Chan->name );
/* Invite- und Ban-Lists aufraeumen */
Lists_DeleteChannel( chan );
/* Neu verketten und freigeben */ /* Neu verketten und freigeben */
if( last_chan ) last_chan->next = chan->next; if( last_chan ) last_chan->next = chan->next;
else My_Channels = chan->next; else My_Channels = chan->next;

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: channel.h,v 1.21.2.1 2002/11/04 19:18:39 alex Exp $ * $Id: channel.h,v 1.16.2.1 2002/04/29 14:11:23 alex Exp $
* *
* channel.h: Management der Channels (Header) * channel.h: Management der Channels (Header)
*/ */
@@ -18,6 +18,8 @@
#ifndef __channel_h__ #ifndef __channel_h__
#define __channel_h__ #define __channel_h__
#include "client.h"
#if defined(__channel_c__) | defined(S_SPLINT_S) #if defined(__channel_c__) | defined(S_SPLINT_S)
@@ -48,54 +50,48 @@ typedef POINTER CL2CHAN;
#endif #endif
GLOBAL VOID Channel_Init PARAMS((VOID )); GLOBAL VOID Channel_Init( VOID );
GLOBAL VOID Channel_InitPredefined PARAMS(( VOID )); GLOBAL VOID Channel_Exit( VOID );
GLOBAL VOID Channel_Exit PARAMS((VOID ));
GLOBAL BOOLEAN Channel_Join PARAMS((CLIENT *Client, CHAR *Name )); GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name );
GLOBAL BOOLEAN Channel_Part PARAMS((CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )); GLOBAL BOOLEAN Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason );
GLOBAL VOID Channel_Quit PARAMS((CLIENT *Client, CHAR *Reason )); GLOBAL VOID Channel_RemoveClient( CLIENT *Client, CHAR *Reason );
GLOBAL VOID Channel_Kick PARAMS(( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )); GLOBAL INT Channel_Count( VOID );
GLOBAL INT Channel_MemberCount( CHANNEL *Chan );
GLOBAL LONG Channel_Count PARAMS((VOID )); GLOBAL CHAR *Channel_Name( CHANNEL *Chan );
GLOBAL LONG Channel_MemberCount PARAMS((CHANNEL *Chan )); GLOBAL CHAR *Channel_Modes( CHANNEL *Chan );
GLOBAL CHAR *Channel_Topic( CHANNEL *Chan );
GLOBAL CHAR *Channel_Name PARAMS((CHANNEL *Chan )); GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic );
GLOBAL CHAR *Channel_Modes PARAMS((CHANNEL *Chan ));
GLOBAL CHAR *Channel_Topic PARAMS((CHANNEL *Chan ));
GLOBAL VOID Channel_SetTopic PARAMS((CHANNEL *Chan, CHAR *Topic )); GLOBAL CHANNEL *Channel_Search( CHAR *Name );
GLOBAL VOID Channel_SetModes PARAMS((CHANNEL *Chan, CHAR *Modes ));
GLOBAL CHANNEL *Channel_Search PARAMS((CHAR *Name )); GLOBAL CHANNEL *Channel_First( VOID );
GLOBAL CHANNEL *Channel_Next( CHANNEL *Chan );
GLOBAL CHANNEL *Channel_First PARAMS((VOID )); GLOBAL CL2CHAN *Channel_FirstMember( CHANNEL *Chan );
GLOBAL CHANNEL *Channel_Next PARAMS((CHANNEL *Chan )); GLOBAL CL2CHAN *Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan );
GLOBAL CL2CHAN *Channel_FirstChannelOf( CLIENT *Client );
GLOBAL CL2CHAN *Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan );
GLOBAL CL2CHAN *Channel_FirstMember PARAMS((CHANNEL *Chan )); GLOBAL CLIENT *Channel_GetClient( CL2CHAN *Cl2Chan );
GLOBAL CL2CHAN *Channel_NextMember PARAMS((CHANNEL *Chan, CL2CHAN *Cl2Chan )); GLOBAL CHANNEL *Channel_GetChannel( CL2CHAN *Cl2Chan );
GLOBAL CL2CHAN *Channel_FirstChannelOf PARAMS((CLIENT *Client ));
GLOBAL CL2CHAN *Channel_NextChannelOf PARAMS((CLIENT *Client, CL2CHAN *Cl2Chan ));
GLOBAL CLIENT *Channel_GetClient PARAMS((CL2CHAN *Cl2Chan )); GLOBAL BOOLEAN Channel_IsValidName( CHAR *Name );
GLOBAL CHANNEL *Channel_GetChannel PARAMS((CL2CHAN *Cl2Chan ));
GLOBAL BOOLEAN Channel_IsValidName PARAMS((CHAR *Name )); GLOBAL BOOLEAN Channel_ModeAdd( CHANNEL *Chan, CHAR Mode );
GLOBAL BOOLEAN Channel_ModeDel( CHANNEL *Chan, CHAR Mode );
GLOBAL BOOLEAN Channel_ModeAdd PARAMS((CHANNEL *Chan, CHAR Mode )); GLOBAL BOOLEAN Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode );
GLOBAL BOOLEAN Channel_ModeDel PARAMS((CHANNEL *Chan, CHAR Mode )); GLOBAL BOOLEAN Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode );
GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client );
GLOBAL BOOLEAN Channel_UserModeAdd PARAMS((CHANNEL *Chan, CLIENT *Client, CHAR Mode )); GLOBAL BOOLEAN Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client );
GLOBAL BOOLEAN Channel_UserModeDel PARAMS((CHANNEL *Chan, CLIENT *Client, CHAR Mode ));
GLOBAL CHAR *Channel_UserModes PARAMS((CHANNEL *Chan, CLIENT *Client ));
GLOBAL BOOLEAN Channel_IsMemberOf PARAMS((CHANNEL *Chan, CLIENT *Client )); GLOBAL BOOLEAN Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text );
GLOBAL BOOLEAN Channel_Write PARAMS((CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text ));
GLOBAL CHANNEL *Channel_Create PARAMS((CHAR *Name ));
#endif #endif

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: client.c,v 1.60.2.2 2002/11/04 19:18:39 alex Exp $ * $Id: client.c,v 1.53.2.1 2002/04/29 14:11:23 alex Exp $
* *
* client.c: Management aller Clients * client.c: Management aller Clients
* *
@@ -35,16 +35,14 @@
#include <string.h> #include <string.h>
#include <netdb.h> #include <netdb.h>
#include "conn.h"
#include "exp.h" #include "exp.h"
#include "client.h" #include "client.h"
#include <imp.h> #include <imp.h>
#include "ngircd.h" #include "ngircd.h"
#include "channel.h" #include "channel.h"
#include "resolve.h"
#include "conf.h" #include "conf.h"
#include "conn.h"
#include "hash.h" #include "hash.h"
#include "irc-write.h" #include "irc-write.h"
#include "log.h" #include "log.h"
@@ -53,22 +51,18 @@
#include <exp.h> #include <exp.h>
#define GETID_LEN (CLIENT_NICK_LEN-1) + 1 + (CLIENT_USER_LEN-1) + 1 + (CLIENT_HOST_LEN-1) + 1
LOCAL CLIENT *This_Server, *My_Clients; LOCAL CLIENT *This_Server, *My_Clients;
LOCAL CHAR GetID_Buffer[GETID_LEN]; LOCAL CHAR GetID_Buffer[CLIENT_ID_LEN];
LOCAL LONG Count PARAMS(( CLIENT_TYPE Type )); LOCAL INT Count( CLIENT_TYPE Type );
LOCAL LONG MyCount PARAMS(( CLIENT_TYPE Type )); LOCAL INT MyCount( CLIENT_TYPE Type );
LOCAL CLIENT *New_Client_Struct PARAMS(( VOID )); LOCAL CLIENT *New_Client_Struct( VOID );
LOCAL VOID Generate_MyToken PARAMS(( CLIENT *Client )); LOCAL VOID Generate_MyToken( CLIENT *Client );
GLOBAL VOID GLOBAL VOID Client_Init( VOID )
Client_Init( VOID )
{ {
struct hostent *h; struct hostent *h;
@@ -76,7 +70,7 @@ Client_Init( VOID )
if( ! This_Server ) if( ! This_Server )
{ {
Log( LOG_EMERG, "Can't allocate client structure for server! Going down." ); Log( LOG_EMERG, "Can't allocate client structure for server! Going down." );
Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE ); Log( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
exit( 1 ); exit( 1 );
} }
@@ -99,14 +93,12 @@ Client_Init( VOID )
} /* Client_Init */ } /* Client_Init */
GLOBAL VOID GLOBAL VOID Client_Exit( VOID )
Client_Exit( VOID )
{ {
CLIENT *c, *next; CLIENT *c, *next;
INT cnt; INT cnt;
if( NGIRCd_Restart ) Client_Destroy( This_Server, "Server going down (restarting).", NULL, FALSE ); Client_Destroy( This_Server, "Server going down.", NULL, FALSE );
else Client_Destroy( This_Server, "Server going down.", NULL, FALSE );
cnt = 0; cnt = 0;
c = My_Clients; c = My_Clients;
@@ -121,39 +113,34 @@ Client_Exit( VOID )
} /* Client_Exit */ } /* Client_Exit */
GLOBAL CLIENT * GLOBAL CLIENT *Client_ThisServer( VOID )
Client_ThisServer( VOID )
{ {
return This_Server; return This_Server;
} /* Client_ThisServer */ } /* Client_ThisServer */
GLOBAL CLIENT * GLOBAL CLIENT *Client_NewLocal( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented )
Client_NewLocal( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented )
{ {
/* Neuen lokalen Client erzeugen: Wrapper-Funktion fuer Client_New(). */ /* Neuen lokalen Client erzeugen: Wrapper-Funktion fuer Client_New(). */
return Client_New( Idx, This_Server, NULL, Type, NULL, NULL, Hostname, NULL, 0, 0, NULL, Idented ); return Client_New( Idx, This_Server, NULL, Type, NULL, NULL, Hostname, NULL, 0, 0, NULL, Idented );
} /* Client_NewLocal */ } /* Client_NewLocal */
GLOBAL CLIENT * GLOBAL CLIENT *Client_NewRemoteServer( CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented )
Client_NewRemoteServer( CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented )
{ {
/* Neuen Remote-Client erzeugen: Wrapper-Funktion fuer Client_New (). */ /* Neuen Remote-Client erzeugen: Wrapper-Funktion fuer Client_New (). */
return Client_New( NONE, Introducer, TopServer, CLIENT_SERVER, Hostname, NULL, Hostname, Info, Hops, Token, NULL, Idented ); return Client_New( NONE, Introducer, TopServer, CLIENT_SERVER, Hostname, NULL, Hostname, Info, Hops, Token, NULL, Idented );
} /* Client_NewRemoteServer */ } /* Client_NewRemoteServer */
GLOBAL CLIENT * GLOBAL CLIENT *Client_NewRemoteUser( CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR *Hostname, INT Token, CHAR *Modes, CHAR *Info, BOOLEAN Idented )
Client_NewRemoteUser( CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR *Hostname, INT Token, CHAR *Modes, CHAR *Info, BOOLEAN Idented )
{ {
/* Neuen Remote-Client erzeugen: Wrapper-Funktion fuer Client_New (). */ /* Neuen Remote-Client erzeugen: Wrapper-Funktion fuer Client_New (). */
return Client_New( NONE, Introducer, NULL, CLIENT_USER, Nick, User, Hostname, Info, Hops, Token, Modes, Idented ); return Client_New( NONE, Introducer, NULL, CLIENT_USER, Nick, User, Hostname, Info, Hops, Token, Modes, Idented );
} /* Client_NewRemoteUser */ } /* Client_NewRemoteUser */
GLOBAL CLIENT * GLOBAL CLIENT *Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented )
Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented )
{ {
CLIENT *client; CLIENT *client;
@@ -189,8 +176,7 @@ Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *
} /* Client_New */ } /* Client_New */
GLOBAL VOID GLOBAL VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )
Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )
{ {
/* Client entfernen. */ /* Client entfernen. */
@@ -253,7 +239,7 @@ Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )
else IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "QUIT :" ); else IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "QUIT :" );
} }
} }
Channel_Quit( c, FwdMsg ? FwdMsg : c->id ); Channel_RemoveClient( c, FwdMsg ? FwdMsg : c->id );
} }
else if( c->type == CLIENT_SERVER ) else if( c->type == CLIENT_SERVER )
{ {
@@ -293,8 +279,7 @@ Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )
} /* Client_Destroy */ } /* Client_Destroy */
GLOBAL VOID GLOBAL VOID Client_SetHostname( CLIENT *Client, CHAR *Hostname )
Client_SetHostname( CLIENT *Client, CHAR *Hostname )
{ {
/* Hostname eines Clients setzen */ /* Hostname eines Clients setzen */
@@ -306,8 +291,7 @@ Client_SetHostname( CLIENT *Client, CHAR *Hostname )
} /* Client_SetHostname */ } /* Client_SetHostname */
GLOBAL VOID GLOBAL VOID Client_SetID( CLIENT *Client, CHAR *ID )
Client_SetID( CLIENT *Client, CHAR *ID )
{ {
/* Hostname eines Clients setzen, Hash-Wert berechnen */ /* Hostname eines Clients setzen, Hash-Wert berechnen */
@@ -322,8 +306,7 @@ Client_SetID( CLIENT *Client, CHAR *ID )
} /* Client_SetID */ } /* Client_SetID */
GLOBAL VOID GLOBAL VOID Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented )
Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented )
{ {
/* Username eines Clients setzen */ /* Username eines Clients setzen */
@@ -340,8 +323,7 @@ Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented )
} /* Client_SetUser */ } /* Client_SetUser */
GLOBAL VOID GLOBAL VOID Client_SetInfo( CLIENT *Client, CHAR *Info )
Client_SetInfo( CLIENT *Client, CHAR *Info )
{ {
/* Hostname eines Clients setzen */ /* Hostname eines Clients setzen */
@@ -353,10 +335,9 @@ Client_SetInfo( CLIENT *Client, CHAR *Info )
} /* Client_SetInfo */ } /* Client_SetInfo */
GLOBAL VOID GLOBAL VOID Client_SetModes( CLIENT *Client, CHAR *Modes )
Client_SetModes( CLIENT *Client, CHAR *Modes )
{ {
/* Modes eines Clients setzen */ /* Hostname eines Clients setzen */
assert( Client != NULL ); assert( Client != NULL );
assert( Modes != NULL ); assert( Modes != NULL );
@@ -366,21 +347,7 @@ Client_SetModes( CLIENT *Client, CHAR *Modes )
} /* Client_SetModes */ } /* Client_SetModes */
GLOBAL VOID GLOBAL VOID Client_SetPassword( CLIENT *Client, CHAR *Pwd )
Client_SetFlags( CLIENT *Client, CHAR *Flags )
{
/* Flags eines Clients setzen */
assert( Client != NULL );
assert( Flags != NULL );
strncpy( Client->flags, Flags, CLIENT_FLAGS_LEN - 1 );
Client->modes[CLIENT_FLAGS_LEN - 1] = '\0';
} /* Client_SetFlags */
GLOBAL VOID
Client_SetPassword( CLIENT *Client, CHAR *Pwd )
{ {
/* Von einem Client geliefertes Passwort */ /* Von einem Client geliefertes Passwort */
@@ -392,8 +359,7 @@ Client_SetPassword( CLIENT *Client, CHAR *Pwd )
} /* Client_SetPassword */ } /* Client_SetPassword */
GLOBAL VOID GLOBAL VOID Client_SetAway( CLIENT *Client, CHAR *Txt )
Client_SetAway( CLIENT *Client, CHAR *Txt )
{ {
/* Von einem Client gelieferte AWAY-Nachricht */ /* Von einem Client gelieferte AWAY-Nachricht */
@@ -416,8 +382,7 @@ Client_SetAway( CLIENT *Client, CHAR *Txt )
} /* Client_SetAway */ } /* Client_SetAway */
GLOBAL VOID GLOBAL VOID Client_SetType( CLIENT *Client, INT Type )
Client_SetType( CLIENT *Client, INT Type )
{ {
assert( Client != NULL ); assert( Client != NULL );
Client->type = Type; Client->type = Type;
@@ -425,24 +390,21 @@ Client_SetType( CLIENT *Client, INT Type )
} /* Client_SetType */ } /* Client_SetType */
GLOBAL VOID GLOBAL VOID Client_SetHops( CLIENT *Client, INT Hops )
Client_SetHops( CLIENT *Client, INT Hops )
{ {
assert( Client != NULL ); assert( Client != NULL );
Client->hops = Hops; Client->hops = Hops;
} /* Client_SetHops */ } /* Client_SetHops */
GLOBAL VOID GLOBAL VOID Client_SetToken( CLIENT *Client, INT Token )
Client_SetToken( CLIENT *Client, INT Token )
{ {
assert( Client != NULL ); assert( Client != NULL );
Client->token = Token; Client->token = Token;
} /* Client_SetToken */ } /* Client_SetToken */
GLOBAL VOID GLOBAL VOID Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer )
Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer )
{ {
assert( Client != NULL ); assert( Client != NULL );
assert( Introducer != NULL ); assert( Introducer != NULL );
@@ -450,16 +412,14 @@ Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer )
} /* Client_SetIntroducer */ } /* Client_SetIntroducer */
GLOBAL VOID GLOBAL VOID Client_SetOperByMe( CLIENT *Client, BOOLEAN OperByMe )
Client_SetOperByMe( CLIENT *Client, BOOLEAN OperByMe )
{ {
assert( Client != NULL ); assert( Client != NULL );
Client->oper_by_me = OperByMe; Client->oper_by_me = OperByMe;
} /* Client_SetOperByMe */ } /* Client_SetOperByMe */
GLOBAL BOOLEAN GLOBAL BOOLEAN Client_ModeAdd( CLIENT *Client, CHAR Mode )
Client_ModeAdd( CLIENT *Client, CHAR Mode )
{ {
/* Mode soll gesetzt werden. TRUE wird geliefert, wenn der /* Mode soll gesetzt werden. TRUE wird geliefert, wenn der
* Mode neu gesetzt wurde, FALSE, wenn der Client den Mode * Mode neu gesetzt wurde, FALSE, wenn der Client den Mode
@@ -480,8 +440,7 @@ Client_ModeAdd( CLIENT *Client, CHAR Mode )
} /* Client_ModeAdd */ } /* Client_ModeAdd */
GLOBAL BOOLEAN GLOBAL BOOLEAN Client_ModeDel( CLIENT *Client, CHAR Mode )
Client_ModeDel( CLIENT *Client, CHAR Mode )
{ {
/* Mode soll geloescht werden. TRUE wird geliefert, wenn der /* Mode soll geloescht werden. TRUE wird geliefert, wenn der
* Mode entfernt wurde, FALSE, wenn der Client den Mode * Mode entfernt wurde, FALSE, wenn der Client den Mode
@@ -506,8 +465,7 @@ Client_ModeDel( CLIENT *Client, CHAR Mode )
} /* Client_ModeDel */ } /* Client_ModeDel */
GLOBAL CLIENT * GLOBAL CLIENT *Client_GetFromConn( CONN_ID Idx )
Client_GetFromConn( CONN_ID Idx )
{ {
/* Client-Struktur, die zur lokalen Verbindung Idx gehoert, /* Client-Struktur, die zur lokalen Verbindung Idx gehoert,
* liefern. Wird keine gefunden, so wird NULL geliefert. */ * liefern. Wird keine gefunden, so wird NULL geliefert. */
@@ -526,8 +484,7 @@ Client_GetFromConn( CONN_ID Idx )
} /* Client_GetFromConn */ } /* Client_GetFromConn */
GLOBAL CLIENT * GLOBAL CLIENT *Client_Search( CHAR *Nick )
Client_Search( CHAR *Nick )
{ {
/* Client-Struktur, die den entsprechenden Nick hat, liefern. /* Client-Struktur, die den entsprechenden Nick hat, liefern.
* Wird keine gefunden, so wird NULL geliefert. */ * Wird keine gefunden, so wird NULL geliefert. */
@@ -560,8 +517,7 @@ Client_Search( CHAR *Nick )
} /* Client_Search */ } /* Client_Search */
GLOBAL CLIENT * GLOBAL CLIENT *Client_GetFromToken( CLIENT *Client, INT Token )
Client_GetFromToken( CLIENT *Client, INT Token )
{ {
/* Client-Struktur, die den entsprechenden Introducer (=Client) /* Client-Struktur, die den entsprechenden Introducer (=Client)
* und das gegebene Token hat, liefern. Wird keine gefunden, * und das gegebene Token hat, liefern. Wird keine gefunden,
@@ -582,24 +538,21 @@ Client_GetFromToken( CLIENT *Client, INT Token )
} /* Client_GetFromToken */ } /* Client_GetFromToken */
GLOBAL INT GLOBAL INT Client_Type( CLIENT *Client )
Client_Type( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
return Client->type; return Client->type;
} /* Client_Type */ } /* Client_Type */
GLOBAL CONN_ID GLOBAL CONN_ID Client_Conn( CLIENT *Client )
Client_Conn( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
return Client->conn_id; return Client->conn_id;
} /* Client_Conn */ } /* Client_Conn */
GLOBAL CHAR * GLOBAL CHAR *Client_ID( CLIENT *Client )
Client_ID( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
@@ -612,16 +565,14 @@ Client_ID( CLIENT *Client )
} /* Client_ID */ } /* Client_ID */
GLOBAL CHAR * GLOBAL CHAR *Client_Info( CLIENT *Client )
Client_Info( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
return Client->info; return Client->info;
} /* Client_Info */ } /* Client_Info */
GLOBAL CHAR * GLOBAL CHAR *Client_User( CLIENT *Client )
Client_User( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
if( Client->user[0] ) return Client->user; if( Client->user[0] ) return Client->user;
@@ -629,72 +580,56 @@ Client_User( CLIENT *Client )
} /* Client_User */ } /* Client_User */
GLOBAL CHAR * GLOBAL CHAR *Client_Hostname( CLIENT *Client )
Client_Hostname( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
return Client->host; return Client->host;
} /* Client_Hostname */ } /* Client_Hostname */
GLOBAL CHAR * GLOBAL CHAR *Client_Password( CLIENT *Client )
Client_Password( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
return Client->pwd; return Client->pwd;
} /* Client_Password */ } /* Client_Password */
GLOBAL CHAR * GLOBAL CHAR *Client_Modes( CLIENT *Client )
Client_Modes( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
return Client->modes; return Client->modes;
} /* Client_Modes */ } /* Client_Modes */
GLOBAL CHAR * GLOBAL BOOLEAN Client_OperByMe( CLIENT *Client )
Client_Flags( CLIENT *Client )
{
assert( Client != NULL );
return Client->flags;
} /* Client_Flags */
GLOBAL BOOLEAN
Client_OperByMe( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
return Client->oper_by_me; return Client->oper_by_me;
} /* Client_OperByMe */ } /* Client_OperByMe */
GLOBAL INT GLOBAL INT Client_Hops( CLIENT *Client )
Client_Hops( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
return Client->hops; return Client->hops;
} /* Client_Hops */ } /* Client_Hops */
GLOBAL INT GLOBAL INT Client_Token( CLIENT *Client )
Client_Token( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
return Client->token; return Client->token;
} /* Client_Token */ } /* Client_Token */
GLOBAL INT GLOBAL INT Client_MyToken( CLIENT *Client )
Client_MyToken( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
return Client->mytoken; return Client->mytoken;
} /* Client_MyToken */ } /* Client_MyToken */
GLOBAL CLIENT * GLOBAL CLIENT *Client_NextHop( CLIENT *Client )
Client_NextHop( CLIENT *Client )
{ {
CLIENT *c; CLIENT *c;
@@ -706,8 +641,7 @@ Client_NextHop( CLIENT *Client )
} /* Client_NextHop */ } /* Client_NextHop */
GLOBAL CHAR * GLOBAL CHAR *Client_Mask( CLIENT *Client )
Client_Mask( CLIENT *Client )
{ {
/* Client-"ID" liefern, wie sie z.B. fuer /* Client-"ID" liefern, wie sie z.B. fuer
* Prefixe benoetigt wird. */ * Prefixe benoetigt wird. */
@@ -716,37 +650,33 @@ Client_Mask( CLIENT *Client )
if( Client->type == CLIENT_SERVER ) return Client->id; if( Client->type == CLIENT_SERVER ) return Client->id;
snprintf( GetID_Buffer, GETID_LEN, "%s!%s@%s", Client->id, Client->user, Client->host ); sprintf( GetID_Buffer, "%s!%s@%s", Client->id, Client->user, Client->host );
return GetID_Buffer; return GetID_Buffer;
} /* Client_Mask */ } /* Client_Mask */
GLOBAL CLIENT * GLOBAL CLIENT *Client_Introducer( CLIENT *Client )
Client_Introducer( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
return Client->introducer; return Client->introducer;
} /* Client_Introducer */ } /* Client_Introducer */
GLOBAL CLIENT * GLOBAL CLIENT *Client_TopServer( CLIENT *Client )
Client_TopServer( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
return Client->topserver; return Client->topserver;
} /* Client_TopServer */ } /* Client_TopServer */
GLOBAL BOOLEAN GLOBAL BOOLEAN Client_HasMode( CLIENT *Client, CHAR Mode )
Client_HasMode( CLIENT *Client, CHAR Mode )
{ {
assert( Client != NULL ); assert( Client != NULL );
return strchr( Client->modes, Mode ) != NULL; return strchr( Client->modes, Mode ) != NULL;
} /* Client_HasMode */ } /* Client_HasMode */
GLOBAL CHAR * GLOBAL CHAR *Client_Away( CLIENT *Client )
Client_Away( CLIENT *Client )
{ {
/* AWAY-Text liefern */ /* AWAY-Text liefern */
@@ -755,8 +685,7 @@ Client_Away( CLIENT *Client )
} /* Client_Away */ } /* Client_Away */
GLOBAL BOOLEAN GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick )
Client_CheckNick( CLIENT *Client, CHAR *Nick )
{ {
/* Nick ueberpruefen */ /* Nick ueberpruefen */
@@ -782,8 +711,7 @@ Client_CheckNick( CLIENT *Client, CHAR *Nick )
} /* Client_CheckNick */ } /* Client_CheckNick */
GLOBAL BOOLEAN GLOBAL BOOLEAN Client_CheckID( CLIENT *Client, CHAR *ID )
Client_CheckID( CLIENT *Client, CHAR *ID )
{ {
/* Nick ueberpruefen */ /* Nick ueberpruefen */
@@ -820,8 +748,7 @@ Client_CheckID( CLIENT *Client, CHAR *ID )
} /* Client_CheckID */ } /* Client_CheckID */
GLOBAL CLIENT * GLOBAL CLIENT *Client_First( VOID )
Client_First( VOID )
{ {
/* Ersten Client liefern. */ /* Ersten Client liefern. */
@@ -829,8 +756,7 @@ Client_First( VOID )
} /* Client_First */ } /* Client_First */
GLOBAL CLIENT * GLOBAL CLIENT *Client_Next( CLIENT *c )
Client_Next( CLIENT *c )
{ {
/* Naechsten Client liefern. Existiert keiner, /* Naechsten Client liefern. Existiert keiner,
* so wird NULL geliefert. */ * so wird NULL geliefert. */
@@ -840,46 +766,40 @@ Client_Next( CLIENT *c )
} /* Client_Next */ } /* Client_Next */
GLOBAL LONG GLOBAL INT Client_UserCount( VOID )
Client_UserCount( VOID )
{ {
return Count( CLIENT_USER ); return Count( CLIENT_USER );
} /* Client_UserCount */ } /* Client_UserCount */
GLOBAL LONG GLOBAL INT Client_ServiceCount( VOID )
Client_ServiceCount( VOID )
{ {
return Count( CLIENT_SERVICE );; return Count( CLIENT_SERVICE );;
} /* Client_ServiceCount */ } /* Client_ServiceCount */
GLOBAL LONG GLOBAL INT Client_ServerCount( VOID )
Client_ServerCount( VOID )
{ {
return Count( CLIENT_SERVER ); return Count( CLIENT_SERVER );
} /* Client_ServerCount */ } /* Client_ServerCount */
GLOBAL LONG GLOBAL INT Client_MyUserCount( VOID )
Client_MyUserCount( VOID )
{ {
return MyCount( CLIENT_USER ); return MyCount( CLIENT_USER );
} /* Client_MyUserCount */ } /* Client_MyUserCount */
GLOBAL LONG GLOBAL INT Client_MyServiceCount( VOID )
Client_MyServiceCount( VOID )
{ {
return MyCount( CLIENT_SERVICE ); return MyCount( CLIENT_SERVICE );
} /* Client_MyServiceCount */ } /* Client_MyServiceCount */
GLOBAL LONG GLOBAL INT Client_MyServerCount( VOID )
Client_MyServerCount( VOID )
{ {
CLIENT *c; CLIENT *c;
LONG cnt; INT cnt;
cnt = 0; cnt = 0;
c = My_Clients; c = My_Clients;
@@ -892,11 +812,10 @@ Client_MyServerCount( VOID )
} /* Client_MyServerCount */ } /* Client_MyServerCount */
GLOBAL LONG GLOBAL INT Client_OperCount( VOID )
Client_OperCount( VOID )
{ {
CLIENT *c; CLIENT *c;
LONG cnt; INT cnt;
cnt = 0; cnt = 0;
c = My_Clients; c = My_Clients;
@@ -909,11 +828,10 @@ Client_OperCount( VOID )
} /* Client_OperCount */ } /* Client_OperCount */
GLOBAL LONG GLOBAL INT Client_UnknownCount( VOID )
Client_UnknownCount( VOID )
{ {
CLIENT *c; CLIENT *c;
LONG cnt; INT cnt;
cnt = 0; cnt = 0;
c = My_Clients; c = My_Clients;
@@ -926,17 +844,14 @@ Client_UnknownCount( VOID )
} /* Client_UnknownCount */ } /* Client_UnknownCount */
GLOBAL BOOLEAN GLOBAL BOOLEAN Client_IsValidNick( CHAR *Nick )
Client_IsValidNick( CHAR *Nick )
{ {
/* Ist der Nick gueltig? */ /* Ist der Nick gueltig? */
CHAR *ptr, goodchars[20]; CHAR *ptr, goodchars[] = ";0123456789-";
assert( Nick != NULL ); assert( Nick != NULL );
strcpy( goodchars, ";0123456789-" );
if( Nick[0] == '#' ) return FALSE; if( Nick[0] == '#' ) return FALSE;
if( strchr( goodchars, Nick[0] )) return FALSE; if( strchr( goodchars, Nick[0] )) return FALSE;
if( strlen( Nick ) >= CLIENT_NICK_LEN ) return FALSE; if( strlen( Nick ) >= CLIENT_NICK_LEN ) return FALSE;
@@ -953,11 +868,10 @@ Client_IsValidNick( CHAR *Nick )
} /* Client_IsValidNick */ } /* Client_IsValidNick */
LOCAL LONG LOCAL INT Count( CLIENT_TYPE Type )
Count( CLIENT_TYPE Type )
{ {
CLIENT *c; CLIENT *c;
LONG cnt; INT cnt;
cnt = 0; cnt = 0;
c = My_Clients; c = My_Clients;
@@ -970,11 +884,10 @@ Count( CLIENT_TYPE Type )
} /* Count */ } /* Count */
LOCAL LONG LOCAL INT MyCount( CLIENT_TYPE Type )
MyCount( CLIENT_TYPE Type )
{ {
CLIENT *c; CLIENT *c;
LONG cnt; INT cnt;
cnt = 0; cnt = 0;
c = My_Clients; c = My_Clients;
@@ -987,8 +900,7 @@ MyCount( CLIENT_TYPE Type )
} /* MyCount */ } /* MyCount */
LOCAL CLIENT * LOCAL CLIENT *New_Client_Struct( VOID )
New_Client_Struct( VOID )
{ {
/* Neue CLIENT-Struktur pre-initialisieren */ /* Neue CLIENT-Struktur pre-initialisieren */
@@ -997,7 +909,7 @@ New_Client_Struct( VOID )
c = malloc( sizeof( CLIENT )); c = malloc( sizeof( CLIENT ));
if( ! c ) if( ! c )
{ {
Log( LOG_EMERG, "Can't allocate memory! [New_Client_Struct]" ); Log( LOG_EMERG, "Can't allocate memory!" );
return NULL; return NULL;
} }
@@ -1018,14 +930,12 @@ New_Client_Struct( VOID )
c->token = -1; c->token = -1;
c->mytoken = -1; c->mytoken = -1;
strcpy( c->away, "" ); strcpy( c->away, "" );
strcpy( c->flags, "" );
return c; return c;
} /* New_Client */ } /* New_Client */
LOCAL VOID LOCAL VOID Generate_MyToken( CLIENT *Client )
Generate_MyToken( CLIENT *Client )
{ {
CLIENT *c; CLIENT *c;
INT token; INT token;

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: client.h,v 1.29.2.1 2002/11/04 19:18:39 alex Exp $ * $Id: client.h,v 1.27 2002/03/25 19:11:01 alex Exp $
* *
* client.h: Konfiguration des ngircd (Header) * client.h: Konfiguration des ngircd (Header)
*/ */
@@ -18,6 +18,8 @@
#ifndef __client_h__ #ifndef __client_h__
#define __client_h__ #define __client_h__
#include "conn.h"
typedef enum typedef enum
{ {
@@ -54,7 +56,6 @@ typedef struct _CLIENT
INT hops, token, mytoken; /* "Hops" und "Token" (-> SERVER-Befehl) */ INT hops, token, mytoken; /* "Hops" und "Token" (-> SERVER-Befehl) */
BOOLEAN oper_by_me; /* IRC-Operator-Status durch diesen Server? */ BOOLEAN oper_by_me; /* IRC-Operator-Status durch diesen Server? */
CHAR away[CLIENT_AWAY_LEN]; /* AWAY-Text, wenn Mode 'a' gesetzt */ CHAR away[CLIENT_AWAY_LEN]; /* AWAY-Text, wenn Mode 'a' gesetzt */
CHAR flags[CLIENT_FLAGS_LEN]; /* Flags des Client (aktuell nur bei Servern) */
} CLIENT; } CLIENT;
#else #else
@@ -64,76 +65,74 @@ typedef POINTER CLIENT;
#endif #endif
GLOBAL VOID Client_Init PARAMS((VOID )); GLOBAL VOID Client_Init( VOID );
GLOBAL VOID Client_Exit PARAMS((VOID )); GLOBAL VOID Client_Exit( VOID );
GLOBAL CLIENT *Client_NewLocal PARAMS((CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented )); GLOBAL CLIENT *Client_NewLocal( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented );
GLOBAL CLIENT *Client_NewRemoteServer PARAMS((CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented )); GLOBAL CLIENT *Client_NewRemoteServer( CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented );
GLOBAL CLIENT *Client_NewRemoteUser PARAMS((CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR *Hostname, INT Token, CHAR *Modes, CHAR *Info, BOOLEAN Idented )); GLOBAL CLIENT *Client_NewRemoteUser( CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR *Hostname, INT Token, CHAR *Modes, CHAR *Info, BOOLEAN Idented );
GLOBAL CLIENT *Client_New PARAMS((CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented )); GLOBAL CLIENT *Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented );
GLOBAL VOID Client_Destroy PARAMS((CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )); GLOBAL VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit );
GLOBAL CLIENT *Client_ThisServer PARAMS((VOID )); GLOBAL CLIENT *Client_ThisServer( VOID );
GLOBAL CLIENT *Client_GetFromConn PARAMS((CONN_ID Idx )); GLOBAL CLIENT *Client_GetFromConn( CONN_ID Idx );
GLOBAL CLIENT *Client_GetFromToken PARAMS((CLIENT *Client, INT Token )); GLOBAL CLIENT *Client_GetFromToken( CLIENT *Client, INT Token );
GLOBAL CLIENT *Client_Search PARAMS((CHAR *ID )); GLOBAL CLIENT *Client_Search( CHAR *ID );
GLOBAL CLIENT *Client_First PARAMS((VOID )); GLOBAL CLIENT *Client_First( VOID );
GLOBAL CLIENT *Client_Next PARAMS((CLIENT *c )); GLOBAL CLIENT *Client_Next( CLIENT *c );
GLOBAL INT Client_Type PARAMS((CLIENT *Client )); GLOBAL INT Client_Type( CLIENT *Client );
GLOBAL CONN_ID Client_Conn PARAMS((CLIENT *Client )); GLOBAL CONN_ID Client_Conn( CLIENT *Client );
GLOBAL CHAR *Client_ID PARAMS((CLIENT *Client )); GLOBAL CHAR *Client_ID( CLIENT *Client );
GLOBAL CHAR *Client_Mask PARAMS((CLIENT *Client )); GLOBAL CHAR *Client_Mask( CLIENT *Client );
GLOBAL CHAR *Client_Info PARAMS((CLIENT *Client )); GLOBAL CHAR *Client_Info( CLIENT *Client );
GLOBAL CHAR *Client_User PARAMS((CLIENT *Client )); GLOBAL CHAR *Client_User( CLIENT *Client );
GLOBAL CHAR *Client_Hostname PARAMS((CLIENT *Client )); GLOBAL CHAR *Client_Hostname( CLIENT *Client );
GLOBAL CHAR *Client_Password PARAMS((CLIENT *Client )); GLOBAL CHAR *Client_Password( CLIENT *Client );
GLOBAL CHAR *Client_Modes PARAMS((CLIENT *Client )); GLOBAL CHAR *Client_Modes( CLIENT *Client );
GLOBAL CHAR *Client_Flags PARAMS((CLIENT *Client )); GLOBAL CLIENT *Client_Introducer( CLIENT *Client );
GLOBAL CLIENT *Client_Introducer PARAMS((CLIENT *Client )); GLOBAL BOOLEAN Client_OperByMe( CLIENT *Client );
GLOBAL BOOLEAN Client_OperByMe PARAMS((CLIENT *Client )); GLOBAL INT Client_Hops( CLIENT *Client );
GLOBAL INT Client_Hops PARAMS((CLIENT *Client )); GLOBAL INT Client_Token( CLIENT *Client );
GLOBAL INT Client_Token PARAMS((CLIENT *Client )); GLOBAL INT Client_MyToken( CLIENT *Client );
GLOBAL INT Client_MyToken PARAMS((CLIENT *Client )); GLOBAL CLIENT *Client_TopServer( CLIENT *Client );
GLOBAL CLIENT *Client_TopServer PARAMS((CLIENT *Client )); GLOBAL CLIENT *Client_NextHop( CLIENT *Client );
GLOBAL CLIENT *Client_NextHop PARAMS((CLIENT *Client )); GLOBAL CHAR *Client_Away( CLIENT *Client );
GLOBAL CHAR *Client_Away PARAMS((CLIENT *Client ));
GLOBAL BOOLEAN Client_HasMode PARAMS((CLIENT *Client, CHAR Mode )); GLOBAL BOOLEAN Client_HasMode( CLIENT *Client, CHAR Mode );
GLOBAL VOID Client_SetHostname PARAMS((CLIENT *Client, CHAR *Hostname )); GLOBAL VOID Client_SetHostname( CLIENT *Client, CHAR *Hostname );
GLOBAL VOID Client_SetID PARAMS((CLIENT *Client, CHAR *Nick )); GLOBAL VOID Client_SetID( CLIENT *Client, CHAR *Nick );
GLOBAL VOID Client_SetUser PARAMS((CLIENT *Client, CHAR *User, BOOLEAN Idented )); GLOBAL VOID Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented );
GLOBAL VOID Client_SetInfo PARAMS((CLIENT *Client, CHAR *Info )); GLOBAL VOID Client_SetInfo( CLIENT *Client, CHAR *Info );
GLOBAL VOID Client_SetPassword PARAMS((CLIENT *Client, CHAR *Pwd )); GLOBAL VOID Client_SetPassword( CLIENT *Client, CHAR *Pwd );
GLOBAL VOID Client_SetType PARAMS((CLIENT *Client, INT Type )); GLOBAL VOID Client_SetType( CLIENT *Client, INT Type );
GLOBAL VOID Client_SetHops PARAMS((CLIENT *Client, INT Hops )); GLOBAL VOID Client_SetHops( CLIENT *Client, INT Hops );
GLOBAL VOID Client_SetToken PARAMS((CLIENT *Client, INT Token )); GLOBAL VOID Client_SetToken( CLIENT *Client, INT Token );
GLOBAL VOID Client_SetOperByMe PARAMS((CLIENT *Client, BOOLEAN OperByMe )); GLOBAL VOID Client_SetOperByMe( CLIENT *Client, BOOLEAN OperByMe );
GLOBAL VOID Client_SetModes PARAMS((CLIENT *Client, CHAR *Modes )); GLOBAL VOID Client_SetModes( CLIENT *Client, CHAR *Modes );
GLOBAL VOID Client_SetFlags PARAMS((CLIENT *Client, CHAR *Flags )); GLOBAL VOID Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer );
GLOBAL VOID Client_SetIntroducer PARAMS((CLIENT *Client, CLIENT *Introducer )); GLOBAL VOID Client_SetAway( CLIENT *Client, CHAR *Txt );
GLOBAL VOID Client_SetAway PARAMS((CLIENT *Client, CHAR *Txt ));
GLOBAL BOOLEAN Client_ModeAdd PARAMS((CLIENT *Client, CHAR Mode )); GLOBAL BOOLEAN Client_ModeAdd( CLIENT *Client, CHAR Mode );
GLOBAL BOOLEAN Client_ModeDel PARAMS((CLIENT *Client, CHAR Mode )); GLOBAL BOOLEAN Client_ModeDel( CLIENT *Client, CHAR Mode );
GLOBAL BOOLEAN Client_CheckNick PARAMS((CLIENT *Client, CHAR *Nick )); GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick );
GLOBAL BOOLEAN Client_CheckID PARAMS((CLIENT *Client, CHAR *ID )); GLOBAL BOOLEAN Client_CheckID( CLIENT *Client, CHAR *ID );
GLOBAL LONG Client_UserCount PARAMS((VOID )); GLOBAL INT Client_UserCount( VOID );
GLOBAL LONG Client_ServiceCount PARAMS((VOID )); GLOBAL INT Client_ServiceCount( VOID );
GLOBAL LONG Client_ServerCount PARAMS((VOID )); GLOBAL INT Client_ServerCount( VOID );
GLOBAL LONG Client_OperCount PARAMS((VOID )); GLOBAL INT Client_OperCount( VOID );
GLOBAL LONG Client_UnknownCount PARAMS((VOID )); GLOBAL INT Client_UnknownCount( VOID );
GLOBAL LONG Client_MyUserCount PARAMS((VOID )); GLOBAL INT Client_MyUserCount( VOID );
GLOBAL LONG Client_MyServiceCount PARAMS((VOID )); GLOBAL INT Client_MyServiceCount( VOID );
GLOBAL LONG Client_MyServerCount PARAMS((VOID )); GLOBAL INT Client_MyServerCount( VOID );
GLOBAL BOOLEAN Client_IsValidNick PARAMS((CHAR *Nick )); GLOBAL BOOLEAN Client_IsValidNick( CHAR *Nick );
#endif #endif

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: conf.c,v 1.29.2.5 2002/11/24 15:25:25 alex Exp $ * $Id: conf.c,v 1.23 2002/03/30 13:08:10 alex Exp $
* *
* conf.h: Konfiguration des ngircd * conf.h: Konfiguration des ngircd
*/ */
@@ -25,16 +25,11 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <sys/types.h>
#include "ngircd.h" #include "ngircd.h"
#include "conn.h"
#include "client.h" #include "client.h"
#include "defines.h" #include "defines.h"
#include "log.h" #include "log.h"
#include "resolve.h"
#include "tool.h" #include "tool.h"
#include "exp.h" #include "exp.h"
@@ -44,20 +39,18 @@
LOCAL BOOLEAN Use_Log = TRUE; LOCAL BOOLEAN Use_Log = TRUE;
LOCAL VOID Set_Defaults PARAMS(( VOID )); LOCAL VOID Set_Defaults( VOID );
LOCAL VOID Read_Config PARAMS(( VOID )); LOCAL VOID Read_Config( VOID );
LOCAL VOID Validate_Config PARAMS(( VOID )); LOCAL VOID Validate_Config( VOID );
LOCAL VOID Handle_GLOBAL PARAMS(( INT Line, CHAR *Var, CHAR *Arg )); GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg );
LOCAL VOID Handle_OPERATOR PARAMS(( INT Line, CHAR *Var, CHAR *Arg )); GLOBAL VOID Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg );
LOCAL VOID Handle_SERVER PARAMS(( INT Line, CHAR *Var, CHAR *Arg )); GLOBAL VOID Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg );
LOCAL VOID Handle_CHANNEL PARAMS(( INT Line, CHAR *Var, CHAR *Arg ));
LOCAL VOID Config_Error PARAMS(( CONST INT Level, CONST CHAR *Format, ... )); LOCAL VOID Config_Error( CONST INT Level, CONST CHAR *Format, ... );
GLOBAL VOID GLOBAL VOID Conf_Init( VOID )
Conf_Init( VOID )
{ {
Set_Defaults( ); Set_Defaults( );
Read_Config( ); Read_Config( );
@@ -65,14 +58,11 @@ Conf_Init( VOID )
} /* Config_Init */ } /* Config_Init */
GLOBAL INT GLOBAL INT Conf_Test( VOID )
Conf_Test( VOID )
{ {
/* Konfiguration einlesen, ueberpruefen und ausgeben. */ /* Konfiguration einlesen, ueberpruefen und ausgeben. */
struct passwd *pwd; UINT i;
struct group *grp;
INT i;
Use_Log = FALSE; Use_Log = FALSE;
Set_Defaults( ); Set_Defaults( );
@@ -92,34 +82,23 @@ Conf_Test( VOID )
printf( " ServerName = %s\n", Conf_ServerName ); printf( " ServerName = %s\n", Conf_ServerName );
printf( " ServerInfo = %s\n", Conf_ServerInfo ); printf( " ServerInfo = %s\n", Conf_ServerInfo );
printf( " ServerPwd = %s\n", Conf_ServerPwd ); printf( " ServerPwd = %s\n", Conf_ServerPwd );
printf( " AdminInfo1 = %s\n", Conf_ServerAdmin1 );
printf( " AdminInfo2 = %s\n", Conf_ServerAdmin2 );
printf( " AdminEMail = %s\n", Conf_ServerAdminMail );
printf( " MotdFile = %s\n", Conf_MotdFile ); printf( " MotdFile = %s\n", Conf_MotdFile );
printf( " Ports = " ); printf( " ListenPorts = " );
for( i = 0; i < Conf_ListenPorts_Count; i++ ) for( i = 0; i < Conf_ListenPorts_Count; i++ )
{ {
if( i != 0 ) printf( ", " ); if( i != 0 ) printf( ", " );
printf( "%u", Conf_ListenPorts[i] ); printf( "%u", Conf_ListenPorts[i] );
} }
puts( "" ); puts( "" );
pwd = getpwuid( Conf_UID ); printf( " ServerUID = %ld\n", (INT32)Conf_UID );
if( pwd ) printf( " ServerUID = %s\n", pwd->pw_name ); printf( " ServerGID = %ld\n", (INT32)Conf_GID );
else printf( " ServerUID = %ld\n", (LONG)Conf_UID );
grp = getgrgid( Conf_GID );
if( grp ) printf( " ServerGID = %s\n", grp->gr_name );
else printf( " ServerGID = %ld\n", (LONG)Conf_GID );
printf( " PingTimeout = %d\n", Conf_PingTimeout ); printf( " PingTimeout = %d\n", Conf_PingTimeout );
printf( " PongTimeout = %d\n", Conf_PongTimeout ); printf( " PongTimeout = %d\n", Conf_PongTimeout );
printf( " ConnectRetry = %d\n", Conf_ConnectRetry ); printf( " ConnectRetry = %d\n", Conf_ConnectRetry );
printf( " OperCanUseMode = %s\n", Conf_OperCanMode == TRUE ? "yes" : "no" );
puts( "" ); puts( "" );
for( i = 0; i < Conf_Oper_Count; i++ ) for( i = 0; i < Conf_Oper_Count; i++ )
{ {
if( ! Conf_Oper[i].name[0] ) continue;
/* gueltiger Operator-Block: ausgeben */
puts( "[OPERATOR]" ); puts( "[OPERATOR]" );
printf( " Name = %s\n", Conf_Oper[i].name ); printf( " Name = %s\n", Conf_Oper[i].name );
printf( " Password = %s\n", Conf_Oper[i].pwd ); printf( " Password = %s\n", Conf_Oper[i].pwd );
@@ -128,10 +107,6 @@ Conf_Test( VOID )
for( i = 0; i < Conf_Server_Count; i++ ) for( i = 0; i < Conf_Server_Count; i++ )
{ {
if( ! Conf_Server[i].name[0] ) continue;
if( ! Conf_Server[i].host[0] ) continue;
/* gueltiger Server-Block: ausgeben */
puts( "[SERVER]" ); puts( "[SERVER]" );
printf( " Name = %s\n", Conf_Server[i].name ); printf( " Name = %s\n", Conf_Server[i].name );
printf( " Host = %s\n", Conf_Server[i].host ); printf( " Host = %s\n", Conf_Server[i].host );
@@ -140,36 +115,25 @@ Conf_Test( VOID )
printf( " Group = %d\n", Conf_Server[i].group ); printf( " Group = %d\n", Conf_Server[i].group );
puts( "" ); puts( "" );
} }
for( i = 0; i < Conf_Channel_Count; i++ )
{
if( ! Conf_Channel[i].name[0] ) continue;
/* gueltiger Channel-Block: ausgeben */
puts( "[CHANNEL]" );
printf( " Name = %s\n", Conf_Channel[i].name );
printf( " Modes = %s\n", Conf_Channel[i].modes );
printf( " Topic = %s\n", Conf_Channel[i].topic );
puts( "" );
}
return 0; return 0;
} /* Conf_Test */ } /* Conf_Test */
LOCAL VOID GLOBAL VOID Conf_Exit( VOID )
Set_Defaults( VOID ) {
/* ... */
} /* Config_Exit */
LOCAL VOID Set_Defaults( VOID )
{ {
/* Konfigurationsvariablen initialisieren, d.h. auf Default-Werte setzen. */ /* Konfigurationsvariablen initialisieren, d.h. auf Default-Werte setzen. */
strcpy( Conf_ServerName, "" ); strcpy( Conf_ServerName, "" );
sprintf( Conf_ServerInfo, "%s %s", PACKAGE, VERSION ); strcpy( Conf_ServerInfo, PACKAGE" "VERSION );
strcpy( Conf_ServerPwd, "" ); strcpy( Conf_ServerPwd, "" );
strcpy( Conf_ServerAdmin1, "" );
strcpy( Conf_ServerAdmin2, "" );
strcpy( Conf_ServerAdminMail, "" );
strcpy( Conf_MotdFile, MOTD_FILE ); strcpy( Conf_MotdFile, MOTD_FILE );
Conf_ListenPorts_Count = 0; Conf_ListenPorts_Count = 0;
@@ -182,15 +146,12 @@ Set_Defaults( VOID )
Conf_ConnectRetry = 60; Conf_ConnectRetry = 60;
Conf_Oper_Count = 0; Conf_Oper_Count = 0;
Conf_Server_Count = 0;
Conf_Channel_Count = 0;
Conf_OperCanMode = FALSE; Conf_Server_Count = 0;
} /* Set_Defaults */ } /* Set_Defaults */
LOCAL VOID LOCAL VOID Read_Config( VOID )
Read_Config( VOID )
{ {
/* Konfigurationsdatei einlesen. */ /* Konfigurationsdatei einlesen. */
@@ -203,7 +164,7 @@ Read_Config( VOID )
{ {
/* Keine Konfigurationsdatei gefunden */ /* Keine Konfigurationsdatei gefunden */
Config_Error( LOG_ALERT, "Can't read configuration \"%s\": %s", NGIRCd_ConfFile, strerror( errno )); Config_Error( LOG_ALERT, "Can't read configuration \"%s\": %s", NGIRCd_ConfFile, strerror( errno ));
Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE ); Config_Error( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
exit( 1 ); exit( 1 );
} }
@@ -253,19 +214,6 @@ Read_Config( VOID )
} }
continue; continue;
} }
if( strcasecmp( section, "[CHANNEL]" ) == 0 )
{
if( Conf_Channel_Count + 1 > MAX_DEFCHANNELS ) Config_Error( LOG_ERR, "Too many pre-defined channels configured." );
else
{
/* neuen vordefinierten Channel initialisieren */
strcpy( Conf_Channel[Conf_Channel_Count].name, "" );
strcpy( Conf_Channel[Conf_Channel_Count].modes, "" );
strcpy( Conf_Channel[Conf_Channel_Count].topic, "" );
Conf_Channel_Count++;
}
continue;
}
Config_Error( LOG_ERR, "%s, line %d: Unknown section \"%s\"!", NGIRCd_ConfFile, line, section ); Config_Error( LOG_ERR, "%s, line %d: Unknown section \"%s\"!", NGIRCd_ConfFile, line, section );
section[0] = 0x1; section[0] = 0x1;
} }
@@ -285,7 +233,6 @@ Read_Config( VOID )
if( strcasecmp( section, "[GLOBAL]" ) == 0 ) Handle_GLOBAL( line, var, arg ); if( strcasecmp( section, "[GLOBAL]" ) == 0 ) Handle_GLOBAL( line, var, arg );
else if( strcasecmp( section, "[OPERATOR]" ) == 0 ) Handle_OPERATOR( line, var, arg ); else if( strcasecmp( section, "[OPERATOR]" ) == 0 ) Handle_OPERATOR( line, var, arg );
else if( strcasecmp( section, "[SERVER]" ) == 0 ) Handle_SERVER( line, var, arg ); else if( strcasecmp( section, "[SERVER]" ) == 0 ) Handle_SERVER( line, var, arg );
else if( strcasecmp( section, "[CHANNEL]" ) == 0 ) Handle_CHANNEL( line, var, arg );
else Config_Error( LOG_ERR, "%s, line %d: Variable \"%s\" outside section!", NGIRCd_ConfFile, line, var ); else Config_Error( LOG_ERR, "%s, line %d: Variable \"%s\" outside section!", NGIRCd_ConfFile, line, var );
} }
@@ -300,13 +247,10 @@ Read_Config( VOID )
} /* Read_Config */ } /* Read_Config */
LOCAL VOID GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
{ {
struct passwd *pwd;
struct group *grp;
CHAR *ptr; CHAR *ptr;
LONG port; INT32 port;
assert( Line > 0 ); assert( Line > 0 );
assert( Var != NULL ); assert( Var != NULL );
@@ -333,27 +277,6 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
Conf_ServerPwd[CLIENT_PASS_LEN - 1] = '\0'; Conf_ServerPwd[CLIENT_PASS_LEN - 1] = '\0';
return; return;
} }
if( strcasecmp( Var, "AdminInfo1" ) == 0 )
{
/* Server-Info-Text */
strncpy( Conf_ServerAdmin1, Arg, CLIENT_INFO_LEN - 1 );
Conf_ServerAdmin1[CLIENT_INFO_LEN - 1] = '\0';
return;
}
if( strcasecmp( Var, "AdminInfo2" ) == 0 )
{
/* Server-Info-Text */
strncpy( Conf_ServerAdmin2, Arg, CLIENT_INFO_LEN - 1 );
Conf_ServerAdmin2[CLIENT_INFO_LEN - 1] = '\0';
return;
}
if( strcasecmp( Var, "AdminEMail" ) == 0 )
{
/* Server-Info-Text */
strncpy( Conf_ServerAdminMail, Arg, CLIENT_INFO_LEN - 1 );
Conf_ServerAdminMail[CLIENT_INFO_LEN - 1] = '\0';
return;
}
if( strcasecmp( Var, "Ports" ) == 0 ) if( strcasecmp( Var, "Ports" ) == 0 )
{ {
/* Ports, durch "," getrennt, auf denen der Server /* Ports, durch "," getrennt, auf denen der Server
@@ -383,17 +306,13 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
if( strcasecmp( Var, "ServerUID" ) == 0 ) if( strcasecmp( Var, "ServerUID" ) == 0 )
{ {
/* UID, mit der der Daemon laufen soll */ /* UID, mit der der Daemon laufen soll */
pwd = getpwnam( Arg ); Conf_UID = (UINT)atoi( Arg );
if( pwd ) Conf_UID = pwd->pw_uid;
else Conf_UID = (UINT)atoi( Arg );
return; return;
} }
if( strcasecmp( Var, "ServerGID" ) == 0 ) if( strcasecmp( Var, "ServerGID" ) == 0 )
{ {
/* GID, mit der der Daemon laufen soll */ /* GID, mit der der Daemon laufen soll */
grp = getgrnam( Arg ); Conf_GID = (UINT)atoi( Arg );
if( grp ) Conf_GID = grp->gr_gid;
else Conf_GID = (UINT)atoi( Arg );
return; return;
} }
if( strcasecmp( Var, "PingTimeout" ) == 0 ) if( strcasecmp( Var, "PingTimeout" ) == 0 )
@@ -417,22 +336,12 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
if(( Conf_ConnectRetry ) < 5 ) Conf_ConnectRetry = 5; if(( Conf_ConnectRetry ) < 5 ) Conf_ConnectRetry = 5;
return; return;
} }
if( strcasecmp( Var, "OperCanUseMode" ) == 0 )
{
/* Koennen IRC-Operatoren immer MODE benutzen? */
if( strcasecmp( Arg, "yes" ) == 0 ) Conf_OperCanMode = TRUE;
else if( strcasecmp( Arg, "true" ) == 0 ) Conf_OperCanMode = TRUE;
else if( atoi( Arg ) != 0 ) Conf_OperCanMode = TRUE;
else Conf_OperCanMode = FALSE;
return;
}
Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var ); Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var );
} /* Handle_GLOBAL */ } /* Handle_GLOBAL */
LOCAL VOID GLOBAL VOID Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg )
Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg )
{ {
assert( Line > 0 ); assert( Line > 0 );
assert( Var != NULL ); assert( Var != NULL );
@@ -442,8 +351,8 @@ Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg )
if( strcasecmp( Var, "Name" ) == 0 ) if( strcasecmp( Var, "Name" ) == 0 )
{ {
/* Name des IRC Operator */ /* Name des IRC Operator */
strncpy( Conf_Oper[Conf_Oper_Count - 1].name, Arg, CLIENT_PASS_LEN - 1 ); strncpy( Conf_Oper[Conf_Oper_Count - 1].name, Arg, CLIENT_ID_LEN - 1 );
Conf_Oper[Conf_Oper_Count - 1].name[CLIENT_PASS_LEN - 1] = '\0'; Conf_Oper[Conf_Oper_Count - 1].name[CLIENT_ID_LEN - 1] = '\0';
return; return;
} }
if( strcasecmp( Var, "Password" ) == 0 ) if( strcasecmp( Var, "Password" ) == 0 )
@@ -458,10 +367,9 @@ Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg )
} /* Handle_OPERATOR */ } /* Handle_OPERATOR */
LOCAL VOID GLOBAL VOID Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg )
Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg )
{ {
LONG port; INT32 port;
assert( Line > 0 ); assert( Line > 0 );
assert( Var != NULL ); assert( Var != NULL );
@@ -507,78 +415,21 @@ Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg )
} /* Handle_SERVER */ } /* Handle_SERVER */
LOCAL VOID LOCAL VOID Validate_Config( VOID )
Handle_CHANNEL( INT Line, CHAR *Var, CHAR *Arg )
{
assert( Line > 0 );
assert( Var != NULL );
assert( Arg != NULL );
if( strcasecmp( Var, "Name" ) == 0 )
{
/* Hostname des Servers */
strncpy( Conf_Channel[Conf_Channel_Count - 1].name, Arg, CHANNEL_NAME_LEN - 1 );
Conf_Channel[Conf_Channel_Count - 1].name[CHANNEL_NAME_LEN - 1] = '\0';
return;
}
if( strcasecmp( Var, "Modes" ) == 0 )
{
/* Name des Servers ("Nick") */
strncpy( Conf_Channel[Conf_Channel_Count - 1].modes, Arg, CHANNEL_MODE_LEN - 1 );
Conf_Channel[Conf_Channel_Count - 1].modes[CHANNEL_MODE_LEN - 1] = '\0';
return;
}
if( strcasecmp( Var, "Topic" ) == 0 )
{
/* Passwort des Servers */
strncpy( Conf_Channel[Conf_Channel_Count - 1].topic, Arg, CHANNEL_TOPIC_LEN - 1 );
Conf_Channel[Conf_Channel_Count - 1].topic[CHANNEL_TOPIC_LEN - 1] = '\0';
return;
}
Config_Error( LOG_ERR, "%s, line %d (section \"Channel\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var );
} /* Handle_CHANNEL */
LOCAL VOID
Validate_Config( VOID )
{ {
/* Konfiguration ueberpruefen */ /* Konfiguration ueberpruefen */
if( ! Conf_ServerName[0] ) if( ! Conf_ServerName[0] )
{ {
/* Kein Servername konfiguriert */ /* Kein Servername konfiguriert */
Config_Error( LOG_ALERT, "No server name configured in \"%s\" ('ServerName')!", NGIRCd_ConfFile ); Config_Error( LOG_ALERT, "No server name configured in \"%s\"!", NGIRCd_ConfFile );
Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE ); Config_Error( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
exit( 1 ); exit( 1 );
} }
#ifdef STRICT_RFC
if( ! Conf_ServerAdminMail[0] )
{
/* Keine Server-Information konfiguriert */
Config_Error( LOG_ALERT, "No administrator email address configured in \"%s\" ('AdminEMail')!", NGIRCd_ConfFile );
Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE );
exit( 1 );
}
#endif
if( ! Conf_ServerAdmin1[0] && ! Conf_ServerAdmin2[0] && ! Conf_ServerAdminMail[0] )
{
/* Keine Server-Information konfiguriert */
Log( LOG_WARNING, "No server information configured but required by RFC!" );
}
} /* Validate_Config */ } /* Validate_Config */
#ifdef PROTOTYPES
LOCAL VOID Config_Error( CONST INT Level, CONST CHAR *Format, ... ) LOCAL VOID Config_Error( CONST INT Level, CONST CHAR *Format, ... )
#else
LOCAL VOID Config_Error( Level, Format, va_alist )
CONST INT Level;
CONST CHAR *Format;
va_dcl
#endif
{ {
/* Fehler! Auf Console und/oder ins Log schreiben */ /* Fehler! Auf Console und/oder ins Log schreiben */
@@ -588,18 +439,14 @@ va_dcl
assert( Format != NULL ); assert( Format != NULL );
/* String mit variablen Argumenten zusammenbauen ... */ /* String mit variablen Argumenten zusammenbauen ... */
#ifdef PROTOTYPES
va_start( ap, Format ); va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap ); vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
va_end( ap ); va_end( ap );
/* Im "normalen Betrieb" soll der Log-Mechanismus des ngIRCd verwendet /* Im "normalen Betrieb" soll der Log-Mechanismus des ngIRCd verwendet
* werden, beim Testen der Konfiguration jedoch nicht, hier sollen alle * werden, beim Testen der Konfiguration jedoch nicht, hier sollen alle
* Meldungen direkt auf die Konsole ausgegeben werden: */ * Meldungen direkt auf die Konsole ausgegeben werden: */
if( Use_Log ) Log( Level, "%s", msg ); if( Use_Log ) Log( Level, msg );
else puts( msg ); else puts( msg );
} /* Config_Error */ } /* Config_Error */

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: conf.h,v 1.19 2002/09/16 09:13:40 alex Exp $ * $Id: conf.h,v 1.15 2002/03/29 22:53:59 alex Exp $
* *
* conf.h: Konfiguration des ngircd (Header) * conf.h: Konfiguration des ngircd (Header)
*/ */
@@ -20,6 +20,7 @@
#include <time.h> #include <time.h>
#include "conn.h"
#include "defines.h" #include "defines.h"
@@ -41,28 +42,16 @@ typedef struct _Conf_Server
RES_STAT *res_stat; /* Status des Resolver */ RES_STAT *res_stat; /* Status des Resolver */
} CONF_SERVER; } CONF_SERVER;
typedef struct _Conf_Channel
{
CHAR name[CHANNEL_NAME_LEN]; /* Name des Channel */
CHAR modes[CHANNEL_MODE_LEN]; /* Channel-Modes */
CHAR topic[CHANNEL_TOPIC_LEN]; /* Topic des Channels */
} CONF_CHANNEL;
/* Name ("Nick") des Servers */ /* Name ("Nick") des Servers */
GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN]; GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN];
/* Server-Info-Text */ /* Servers-Info-Text */
GLOBAL CHAR Conf_ServerInfo[CLIENT_INFO_LEN]; GLOBAL CHAR Conf_ServerInfo[CLIENT_INFO_LEN];
/* Server-Passwort */ /* Server-Passwort */
GLOBAL CHAR Conf_ServerPwd[CLIENT_PASS_LEN]; GLOBAL CHAR Conf_ServerPwd[CLIENT_PASS_LEN];
/* Admin-Info-Texte */
GLOBAL CHAR Conf_ServerAdmin1[CLIENT_INFO_LEN];
GLOBAL CHAR Conf_ServerAdmin2[CLIENT_INFO_LEN];
GLOBAL CHAR Conf_ServerAdminMail[CLIENT_INFO_LEN];
/* Datei mit MOTD-Text */ /* Datei mit MOTD-Text */
GLOBAL CHAR Conf_MotdFile[FNAME_LEN]; GLOBAL CHAR Conf_MotdFile[FNAME_LEN];
@@ -89,15 +78,10 @@ GLOBAL INT Conf_Oper_Count;
GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS]; GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
GLOBAL INT Conf_Server_Count; GLOBAL INT Conf_Server_Count;
/* Vorkonfigurierte Channels */
GLOBAL CONF_CHANNEL Conf_Channel[MAX_DEFCHANNELS];
GLOBAL INT Conf_Channel_Count;
/* Koennen IRC OPs immer Modes setzen? */ GLOBAL VOID Conf_Init( VOID );
GLOBAL BOOLEAN Conf_OperCanMode; GLOBAL INT Conf_Test( VOID );
GLOBAL VOID Conf_Exit( VOID );
GLOBAL VOID Conf_Init PARAMS((VOID ));
GLOBAL INT Conf_Test PARAMS((VOID ));
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: conn.h,v 1.17 2002/08/26 00:03:15 alex Exp $ * $Id: conn.h,v 1.14 2002/03/29 22:54:35 alex Exp $
* *
* conn.h: Verwaltung aller Netz-Verbindungen ("connections") (Header) * conn.h: Verwaltung aller Netz-Verbindungen ("connections") (Header)
*/ */
@@ -24,27 +24,28 @@
typedef INT CONN_ID; typedef INT CONN_ID;
typedef struct _Res_Stat
GLOBAL VOID Conn_Init PARAMS((VOID )); {
GLOBAL VOID Conn_Exit PARAMS(( VOID )); INT pid; /* PID des Child-Prozess */
INT pipe[2]; /* Pipe fuer IPC */
GLOBAL BOOLEAN Conn_NewListener PARAMS(( CONST UINT Port )); } RES_STAT;
GLOBAL VOID Conn_Handler PARAMS(( VOID ));
GLOBAL BOOLEAN Conn_Write PARAMS(( CONN_ID Idx, CHAR *Data, INT Len ));
GLOBAL BOOLEAN Conn_WriteStr PARAMS(( CONN_ID Idx, CHAR *Format, ... ));
GLOBAL VOID Conn_Close PARAMS(( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient ));
GLOBAL VOID Conn_UpdateIdle PARAMS(( CONN_ID Idx ));
GLOBAL time_t Conn_GetIdle PARAMS(( CONN_ID Idx ));
GLOBAL time_t Conn_LastPing PARAMS(( CONN_ID Idx ));
GLOBAL VOID Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds ));
GLOBAL INT Conn_MaxFD; GLOBAL VOID Conn_Init( VOID );
GLOBAL VOID Conn_Exit( VOID );
GLOBAL BOOLEAN Conn_NewListener( CONST UINT Port );
GLOBAL VOID Conn_Handler( INT Timeout );
GLOBAL BOOLEAN Conn_Write( CONN_ID Idx, CHAR *Data, INT Len );
GLOBAL BOOLEAN Conn_WriteStr( CONN_ID Idx, CHAR *Format, ... );
GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient );
GLOBAL VOID Conn_UpdateIdle( CONN_ID Idx );
GLOBAL time_t Conn_GetIdle( CONN_ID Idx );
GLOBAL time_t Conn_LastPing( CONN_ID Idx );
#endif #endif

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: defines.h,v 1.33.2.1 2002/11/23 16:20:25 alex Exp $ * $Id: defines.h,v 1.21.2.1 2002/04/08 18:07:42 alex Exp $
* *
* defines.h: (globale) Konstanten * defines.h: (globale) Konstanten
*/ */
@@ -20,8 +20,6 @@
#define NONE -1 #define NONE -1
#define TIME_RES 2 /* Zeit-Aufloesung des Servers in Sekunden */
#define FNAME_LEN 256 /* max. Laenge eines Dateinamen */ #define FNAME_LEN 256 /* max. Laenge eines Dateinamen */
#define LINE_LEN 256 /* max. Laenge einer Konfigurationszeile */ #define LINE_LEN 256 /* max. Laenge einer Konfigurationszeile */
@@ -34,8 +32,6 @@
#define MAX_SERVERS 16 /* max. Anzahl konfigurierbarer Server ("Peers") */ #define MAX_SERVERS 16 /* max. Anzahl konfigurierbarer Server ("Peers") */
#define MAX_DEFCHANNELS 16 /* max. Anzahl vorkonfigurierbarerr Channels */
#define MAX_CONNECTIONS 100 /* max. Anzahl von Verbindungen an diesem Server */ #define MAX_CONNECTIONS 100 /* max. Anzahl von Verbindungen an diesem Server */
#define CLIENT_ID_LEN 64 /* max. ID-Laenge; vgl. RFC 2812, 1.1 und 1.2.1 */ #define CLIENT_ID_LEN 64 /* max. ID-Laenge; vgl. RFC 2812, 1.1 und 1.2.1 */
@@ -47,7 +43,6 @@
#define CLIENT_MODE_LEN 8 /* max. Laenge der Client-Modes */ #define CLIENT_MODE_LEN 8 /* max. Laenge der Client-Modes */
#define CLIENT_INFO_LEN 64 /* max. Infotext-Laenge (Server) */ #define CLIENT_INFO_LEN 64 /* max. Infotext-Laenge (Server) */
#define CLIENT_AWAY_LEN 128 /* max. Laenger der AWAY-Nachricht */ #define CLIENT_AWAY_LEN 128 /* max. Laenger der AWAY-Nachricht */
#define CLIENT_FLAGS_LEN 100 /* max. Laenger der Client-Flags */
#define CHANNEL_NAME_LEN 51 /* max. Laenge eines Channel-Namens, vgl. RFC 2812, 1.3 */ #define CHANNEL_NAME_LEN 51 /* max. Laenge eines Channel-Namens, vgl. RFC 2812, 1.3 */
#define CHANNEL_MODE_LEN 8 /* max. Laenge der Channel-Modes */ #define CHANNEL_MODE_LEN 8 /* max. Laenge der Channel-Modes */
@@ -59,31 +54,23 @@
#define WRITEBUFFER_LEN 4096 /* Laenge des Schreibpuffers je Verbindung (Bytes) */ #define WRITEBUFFER_LEN 4096 /* Laenge des Schreibpuffers je Verbindung (Bytes) */
#define PROTOVER "0210" /* implementierte Protokoll-Version (RFC 2813, 4.1.1) */ #define PROTOVER "0210" /* implementierte Protokoll-Version (RFC 2813, 4.1.1) */
#define PROTOIRC "-IRC" /* Protokoll-Suffix (RFC 2813, 4.1.1) */ #define PROTOSUFFIX "-ngIRCd" /* Protokoll-Suffix (RFC 2813, 4.1.1) */
#define PROTOIRCPLUS "-IRC+" /* Protokoll-Suffix f<>r IRC+-Protokoll */
#ifdef IRCPLUS #define PASSSERVERADD PROTOVER""PROTOSUFFIX" IRC|"PACKAGE"-"VERSION" P"
# define IRCPLUSFLAGS "C" /* IRC+-Flags, die immer zutreffen */
#endif
#define STARTUP_DELAY 1 /* Erst n Sek. nach Start zu anderen Servern verbinden */ #define STARTUP_DELAY 1 /* Erst n Sek. nach Start zu anderen Servern verbinden */
#define RECONNECT_DELAY 3 /* Server-Links erst nach 3 Sekunden versuchen, wieder aufzubauen */ #define RECONNECT_DELAY 3 /* Server-Links erst nach 3 Sekunden versuchen, wieder aufzubauen */
#define USERMODES "aios" /* unterstuetzte User-Modes */ #define USERMODES "aios" /* unterstuetzte User-Modes */
#define CHANMODES "biImnoPtv" /* unterstuetzte Channel-Modes */ #define CHANMODES "amnopqstv" /* unterstuetzte Channel-Modes */
#define CONNECTED TRUE /* fuer die irc-xxx-Module */ #define CONNECTED TRUE /* fuer die irc-xxx-Module */
#define DISCONNECTED FALSE #define DISCONNECTED FALSE
#define DEFAULT_AWAY_MSG "Away" /* Away-Meldung fuer User von anderen Servern */ #define DEFAULT_AWAY_MSG "Away" /* Away-Meldung fuer User von anderen Servern */
#ifdef PROTOTYPES #define CONFIG_FILE SYSCONFDIR"/ngircd.conf"
# define CONFIG_FILE SYSCONFDIR"/ngircd.conf" #define MOTD_FILE SYSCONFDIR"/ngircd.motd"
# define MOTD_FILE SYSCONFDIR"/ngircd.motd"
#else
# define CONFIG_FILE "ngircd.conf"
# define MOTD_FILE "ngircd.motd"
#endif
#define ERROR_DIR "/tmp" #define ERROR_DIR "/tmp"
#define MAX_LOG_MSG_LEN 256 /* max. Laenge einer Log-Meldung */ #define MAX_LOG_MSG_LEN 256 /* max. Laenge einer Log-Meldung */

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: hash.c,v 1.5 2002/05/27 12:54:07 alex Exp $ * $Id: hash.c,v 1.4 2002/03/25 19:11:01 alex Exp $
* *
* hash.c: Hash-Werte berechnen * hash.c: Hash-Werte berechnen
*/ */
@@ -29,11 +29,10 @@
#include "hash.h" #include "hash.h"
LOCAL UINT32 jenkins_hash PARAMS(( register UINT8 *k, register UINT32 length, register UINT32 initval )); LOCAL UINT32 jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval);
GLOBAL UINT32 GLOBAL UINT32 Hash( CHAR *String )
Hash( CHAR *String )
{ {
/* Hash-Wert ueber String berechnen */ /* Hash-Wert ueber String berechnen */
@@ -76,8 +75,7 @@ Hash( CHAR *String )
} /* mix */ } /* mix */
LOCAL UINT32 LOCAL UINT32 jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval)
jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval )
{ {
/* k: the key /* k: the key
* length: length of the key * length: length of the key

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: hash.h,v 1.3 2002/05/27 12:54:07 alex Exp $ * $Id: hash.h,v 1.2 2002/03/14 15:49:36 alex Exp $
* *
* hash.h: Hash-Werte berechnen (Header) * hash.h: Hash-Werte berechnen (Header)
*/ */
@@ -19,7 +19,7 @@
#define __hash_h__ #define __hash_h__
GLOBAL UINT32 Hash PARAMS((CHAR *String )); GLOBAL UINT32 Hash( CHAR *String );
#endif #endif

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: irc-channel.c,v 1.15 2002/09/16 09:16:17 alex Exp $ * $Id: irc-channel.c,v 1.3.2.1 2002/04/29 14:11:23 alex Exp $
* *
* irc-channel.c: IRC-Channel-Befehle * irc-channel.c: IRC-Channel-Befehle
*/ */
@@ -22,26 +22,19 @@
#include <string.h> #include <string.h>
#include "defines.h" #include "defines.h"
#include "conn.h"
#include "client.h"
#include "channel.h"
#include "lists.h"
#include "log.h"
#include "match.h"
#include "messages.h"
#include "parse.h"
#include "irc.h" #include "irc.h"
#include "irc-write.h" #include "irc-write.h"
#include "log.h"
#include "messages.h"
#include "exp.h" #include "exp.h"
#include "irc-channel.h" #include "irc-channel.h"
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req )
IRC_JOIN( CLIENT *Client, REQUEST *Req )
{ {
CHAR *channame, *flags, *topic, modes[8]; CHAR *channame, *flags, *topic, modes[8];
BOOLEAN is_new_chan, is_invited, is_banned; BOOLEAN is_new_chan;
CLIENT *target; CLIENT *target;
CHANNEL *chan; CHANNEL *chan;
@@ -59,13 +52,12 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
/* Channel-Namen durchgehen */ /* Channel-Namen durchgehen */
chan = NULL;
channame = strtok( Req->argv[0], "," ); channame = strtok( Req->argv[0], "," );
while( channame ) while( channame )
{ {
chan = flags = NULL;
/* wird der Channel neu angelegt? */ /* wird der Channel neu angelegt? */
flags = NULL;
if( Channel_Search( channame )) is_new_chan = FALSE; if( Channel_Search( channame )) is_new_chan = FALSE;
else is_new_chan = TRUE; else is_new_chan = TRUE;
@@ -74,53 +66,14 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
{ {
/* Channel-Flags extrahieren */ /* Channel-Flags extrahieren */
flags = strchr( channame, 0x7 ); flags = strchr( channame, 0x7 );
if( flags ) if( flags ) *flags++ = '\0';
{
*flags = '\0';
flags++;
}
} }
/* Lokaler Client? */ /* neuer Channel udn lokaler Client? */
if( Client_Type( Client ) == CLIENT_USER ) if( is_new_chan && ( Client_Type( Client ) == CLIENT_USER ))
{ {
/* Existiert der Channel bereits, oder wird er im Moment neu erzeugt? */ /* Dann soll der Client Channel-Operator werden! */
if( is_new_chan ) flags = "o";
{
/* Erster User im Channel: Operator-Flag setzen */
flags = "o";
}
else
{
/* Existierenden Channel suchen */
chan = Channel_Search( channame );
assert( chan != NULL );
is_banned = Lists_CheckBanned( target, chan );
is_invited = Lists_CheckInvited( target, chan );
/* Testen, ob Client gebanned ist */
if(( is_banned == TRUE ) && ( is_invited == FALSE ))
{
/* Client ist gebanned (und nicht invited): */
IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame );
/* naechsten Namen ermitteln */
channame = strtok( NULL, "," );
continue;
}
/* Ist der Channel "invite-only"? */
if(( strchr( Channel_Modes( chan ), 'i' ) != NULL ) && ( is_invited == FALSE ))
{
/* Channel ist "invite-only" und Client wurde nicht invited: */
IRC_WriteStrClient( Client, ERR_INVITEONLYCHAN_MSG, Client_ID( Client ), channame );
/* naechsten Namen ermitteln */
channame = strtok( NULL, "," );
continue;
}
}
} }
/* Channel joinen (und ggf. anlegen) */ /* Channel joinen (und ggf. anlegen) */
@@ -130,7 +83,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
channame = strtok( NULL, "," ); channame = strtok( NULL, "," );
continue; continue;
} }
if( ! chan ) chan = Channel_Search( channame ); chan = Channel_Search( channame );
assert( chan != NULL ); assert( chan != NULL );
/* Modes setzen (wenn vorhanden) */ /* Modes setzen (wenn vorhanden) */
@@ -140,9 +93,6 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
flags++; flags++;
} }
/* Wenn persistenter Channel und IRC-Operator: zum Channel-OP machen */
if(( strchr( Channel_Modes( chan ), 'P' )) && ( strchr( Client_Modes( target ), 'o' ))) Channel_UserModeAdd( chan, target, 'o' );
/* Muessen Modes an andere Server gemeldet werden? */ /* Muessen Modes an andere Server gemeldet werden? */
strcpy( &modes[1], Channel_UserModes( chan, target )); strcpy( &modes[1], Channel_UserModes( chan, target ));
if( modes[1] ) modes[0] = 0x7; if( modes[1] ) modes[0] = 0x7;
@@ -156,7 +106,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
if( modes[1] ) if( modes[1] )
{ {
/* Modes im Channel bekannt machen */ /* Modes im Channel bekannt machen */
IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "MODE %s +%s %s", channame, &modes[1], Client_ID( target )); IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "MODE %s %s :%s", channame, modes, Client_ID( target ));
} }
if( Client_Type( Client ) == CLIENT_USER ) if( Client_Type( Client ) == CLIENT_USER )
@@ -180,8 +130,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
} /* IRC_JOIN */ } /* IRC_JOIN */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_PART( CLIENT *Client, REQUEST *Req )
IRC_PART( CLIENT *Client, REQUEST *Req )
{ {
CLIENT *target; CLIENT *target;
CHAR *chan; CHAR *chan;
@@ -217,8 +166,7 @@ IRC_PART( CLIENT *Client, REQUEST *Req )
} /* IRC_PART */ } /* IRC_PART */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_TOPIC( CLIENT *Client, REQUEST *Req )
IRC_TOPIC( CLIENT *Client, REQUEST *Req )
{ {
CHANNEL *chan; CHANNEL *chan;
CLIENT *from; CLIENT *from;
@@ -238,7 +186,7 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
/* Welcher Channel? */ /* Welcher Channel? */
chan = Channel_Search( Req->argv[0] ); chan = Channel_Search( Req->argv[0] );
if( ! chan ) return IRC_WriteStrClient( from, ERR_NOSUCHCHANNEL_MSG, Client_ID( from ), Req->argv[0] ); if( ! chan ) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( from ), Req->argv[0] );
/* Ist der User Mitglied in dem Channel? */ /* Ist der User Mitglied in dem Channel? */
if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( from ), Req->argv[0] ); if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( from ), Req->argv[0] );
@@ -270,41 +218,21 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
} /* IRC_TOPIC */ } /* IRC_TOPIC */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_LIST( CLIENT *Client, REQUEST *Req )
IRC_LIST( CLIENT *Client, REQUEST *Req )
{ {
CHAR *pattern; CHAR *pattern;
CHANNEL *chan; CHANNEL *chan;
CLIENT *from, *target;
assert( Client != NULL ); assert( Client != NULL );
assert( Req != NULL ); assert( Req != NULL );
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client )); if( Client_Type( Client ) != CLIENT_USER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
/* Falsche Anzahl Parameter? */ /* Falsche Anzahl Parameter? */
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if( Req->argc > 0 ) pattern = strtok( Req->argv[0], "," ); if( Req->argc > 0 ) pattern = strtok( Req->argv[0], "," );
else pattern = "*"; else pattern = "*";
/* From aus Prefix ermitteln */
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
if( Req->argc == 2 )
{
/* an anderen Server forwarden */
target = Client_Search( Req->argv[1] );
if( ! target ) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
if( target != Client_ThisServer( ))
{
/* Ok, anderer Server ist das Ziel: forwarden */
return IRC_WriteStrClientPrefix( target, from, "LIST %s :%s", from, Req->argv[1] );
}
}
while( pattern ) while( pattern )
{ {
@@ -312,11 +240,12 @@ IRC_LIST( CLIENT *Client, REQUEST *Req )
chan = Channel_First( ); chan = Channel_First( );
while( chan ) while( chan )
{ {
/* Passt die Suchmaske auf diesen Channel? */ /* Passt die Suchmaske auf diesen Channel? Bisher werden hier
if( Match( pattern, Channel_Name( chan ))) * "regular expressions" aber noch nicht unterstuetzt ... */
if(( strcasecmp( pattern, Channel_Name( chan )) == 0 ) || ( strcmp( pattern, "*" ) == 0 ))
{ {
/* Treffer! */ /* Treffer! */
if( ! IRC_WriteStrClient( from, RPL_LIST_MSG, from, Channel_Name( chan ), Channel_MemberCount( chan ), Channel_Topic( chan ))) return DISCONNECTED; if( ! IRC_WriteStrClient( Client, RPL_LIST_MSG, Client_ID( Client), Channel_Name( chan ), Channel_MemberCount( chan ), Channel_Topic( chan ))) return DISCONNECTED;
} }
chan = Channel_Next( chan ); chan = Channel_Next( chan );
} }
@@ -326,62 +255,8 @@ IRC_LIST( CLIENT *Client, REQUEST *Req )
else pattern = NULL; else pattern = NULL;
} }
return IRC_WriteStrClient( from, RPL_LISTEND_MSG, from ); return IRC_WriteStrClient( Client, RPL_LISTEND_MSG, Client_ID( Client ));
} /* IRC_LIST */ } /* IRC_LIST */
GLOBAL BOOLEAN
IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
{
CLIENT *from;
CHANNEL *chan;
CHAR *ptr;
assert( Client != NULL );
assert( Req != NULL );
if( Client_Type( Client ) != CLIENT_SERVER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
/* Falsche Anzahl Parameter? */
if(( Req->argc < 1 ) || ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* From-Server suchen */
from = Client_Search( Req->prefix );
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
/* Channel suchen bzw. erzeugen */
chan = Channel_Search( Req->argv[0] );
if( ! chan ) chan = Channel_Create( Req->argv[0] );
if( ! chan ) return CONNECTED;
if( Req->argv[1][0] == '+' )
{
ptr = Channel_Modes( chan );
if( ! *ptr )
{
/* OK, es sind noch keine Modes gesetzt */
Channel_SetModes( chan, &Req->argv[1][1] );
IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "MODE %s +%s", Req->argv[0], &Req->argv[1][1] );
}
}
else Log( LOG_WARNING, "CHANNELINFO: invalid MODE format ignored!" );
if( Req->argc == 3 )
{
/* Es wurde auch ein Topic mit uebermittelt */
ptr = Channel_Topic( chan );
if( ! *ptr )
{
/* OK, es ist bisher kein Topic gesetzt */
Channel_SetTopic( chan, Req->argv[2] );
IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "TOPIC %s :%s", Req->argv[0], Req->argv[2] );
}
}
/* an andere Server forwarden */
IRC_WriteStrServersPrefixFlag( Client, from, 'C', "CHANINFO %s %s :%s", Req->argv[0], Req->argv[1], Req->argv[2] );
return CONNECTED;
} /* IRC_CHANINFO */
/* -eof- */ /* -eof- */

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: irc-channel.h,v 1.5 2002/09/03 23:56:55 alex Exp $ * $Id: irc-channel.h,v 1.2.2.1 2002/04/29 14:11:23 alex Exp $
* *
* irc-channel.h: IRC-Channel-Befehle (Header) * irc-channel.h: IRC-Channel-Befehle (Header)
*/ */
@@ -18,15 +18,15 @@
#ifndef __irc_channel_h__ #ifndef __irc_channel_h__
#define __irc_channel_h__ #define __irc_channel_h__
#include "parse.h"
#include "client.h"
GLOBAL BOOLEAN IRC_JOIN PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_PART PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_TOPIC PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_LIST PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_PART( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_CHANINFO PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_TOPIC( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_LIST( CLIENT *Client, REQUEST *Req );
#endif #endif

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: irc-login.c,v 1.21.2.1 2002/09/22 21:37:06 alex Exp $ * $Id: irc-login.c,v 1.11.2.1 2002/04/08 18:07:42 alex Exp $
* *
* irc-login.c: Anmeldung und Abmeldung im IRC * irc-login.c: Anmeldung und Abmeldung im IRC
*/ */
@@ -24,27 +24,21 @@
#include <string.h> #include <string.h>
#include "ngircd.h" #include "ngircd.h"
#include "resolve.h"
#include "conf.h" #include "conf.h"
#include "conn.h"
#include "client.h"
#include "channel.h"
#include "log.h"
#include "messages.h"
#include "parse.h"
#include "irc.h" #include "irc.h"
#include "irc-write.h" #include "irc-write.h"
#include "log.h"
#include "messages.h"
#include "exp.h" #include "exp.h"
#include "irc-login.h" #include "irc-login.h"
LOCAL BOOLEAN Hello_User PARAMS(( CLIENT *Client )); LOCAL BOOLEAN Hello_User( CLIENT *Client );
LOCAL VOID Kill_Nick PARAMS(( CHAR *Nick, CHAR *Reason )); LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason );
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req )
IRC_PASS( CLIENT *Client, REQUEST *Req )
{ {
assert( Client != NULL ); assert( Client != NULL );
assert( Req != NULL ); assert( Req != NULL );
@@ -65,63 +59,13 @@ IRC_PASS( CLIENT *Client, REQUEST *Req )
} }
else if((( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) && (( Req->argc == 3 ) || ( Req->argc == 4 ))) else if((( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) && (( Req->argc == 3 ) || ( Req->argc == 4 )))
{ {
CHAR c2, c4, *type, *impl, *serverver, *flags, *ptr;
INT protohigh, protolow;
/* noch nicht registrierte Server-Verbindung */ /* noch nicht registrierte Server-Verbindung */
Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client )); Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client ));
/* Passwort speichern */ /* Passwort speichern */
Client_SetPassword( Client, Req->argv[0] ); Client_SetPassword( Client, Req->argv[0] );
/* Protokollversion ermitteln */
if( strlen( Req->argv[1] ) >= 4 )
{
c2 = Req->argv[1][2];
c4 = Req->argv[1][4];
Req->argv[1][4] = '\0';
protolow = atoi( &Req->argv[1][2] );
Req->argv[1][2] = '\0';
protohigh = atoi( Req->argv[1] );
Req->argv[1][2] = c2;
Req->argv[1][4] = c4;
}
else protohigh = protolow = 0;
/* Protokoll-Typ */
if( strlen( Req->argv[1] ) > 4 ) type = &Req->argv[1][4];
else type = NULL;
/* Implementation, Version und ngIRCd-Flags */
impl = Req->argv[2];
ptr = strchr( impl, '|' );
if( ptr ) *ptr = '\0';
if( type && ( strcmp( type, PROTOIRCPLUS ) == 0 ))
{
/* auf der anderen Seite laeuft ein Server, der
* ebenfalls das IRC+-Protokoll versteht */
serverver = ptr + 1;
flags = strchr( serverver, ':' );
if( flags )
{
*flags = '\0';
flags++;
}
else flags = "";
Log( LOG_INFO, "Connection %d: Peer announces itself as %s-%s using protocol %d.%d/IRC+ (flags: \"%s\").", Client_Conn( Client ), impl, serverver, protohigh, protolow, flags );
}
else
{
serverver = flags = "";
Log( LOG_INFO, "Connection %d: Peer announces itself as \"%s\" using protocol %d.%d.", Client_Conn( Client ), impl, protohigh, protolow );
}
Client_SetType( Client, CLIENT_GOTPASSSERVER ); Client_SetType( Client, CLIENT_GOTPASSSERVER );
Client_SetFlags( Client, flags );
return CONNECTED; return CONNECTED;
} }
else if(( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) else if(( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER ))
@@ -133,8 +77,7 @@ IRC_PASS( CLIENT *Client, REQUEST *Req )
} /* IRC_PASS */ } /* IRC_PASS */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
IRC_NICK( CLIENT *Client, REQUEST *Req )
{ {
CLIENT *intr_c, *target, *c; CLIENT *intr_c, *target, *c;
CHAR *modes; CHAR *modes;
@@ -272,8 +215,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
} /* IRC_NICK */ } /* IRC_NICK */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req )
IRC_USER( CLIENT *Client, REQUEST *Req )
{ {
assert( Client != NULL ); assert( Client != NULL );
assert( Req != NULL ); assert( Req != NULL );
@@ -303,15 +245,26 @@ IRC_USER( CLIENT *Client, REQUEST *Req )
} /* IRC_USER */ } /* IRC_USER */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req )
IRC_QUIT( CLIENT *Client, REQUEST *Req )
{ {
CLIENT *target; CLIENT *target;
assert( Client != NULL ); assert( Client != NULL );
assert( Req != NULL ); assert( Req != NULL );
if ( Client_Type( Client ) == CLIENT_SERVER ) if(( Client_Type( Client ) == CLIENT_USER ) || ( Client_Type( Client ) == CLIENT_SERVICE ))
{
/* User / Service */
/* Falsche Anzahl Parameter? */
if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if( Req->argc == 0 ) Conn_Close( Client_Conn( Client ), "Got QUIT command.", NULL, TRUE );
else Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argv[0], TRUE );
return DISCONNECTED;
}
else if ( Client_Type( Client ) == CLIENT_SERVER )
{ {
/* Server */ /* Server */
@@ -331,23 +284,11 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req )
return CONNECTED; return CONNECTED;
} }
else else return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
{
/* User, Service, oder noch nicht registriert */
/* Falsche Anzahl Parameter? */
if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if( Req->argc == 0 ) Conn_Close( Client_Conn( Client ), "Got QUIT command.", NULL, TRUE );
else Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argv[0], TRUE );
return DISCONNECTED;
}
} /* IRC_QUIT */ } /* IRC_QUIT */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req )
IRC_PING( CLIENT *Client, REQUEST *Req )
{ {
CLIENT *target, *from; CLIENT *target, *from;
@@ -382,8 +323,7 @@ IRC_PING( CLIENT *Client, REQUEST *Req )
} /* IRC_PING */ } /* IRC_PING */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
IRC_PONG( CLIENT *Client, REQUEST *Req )
{ {
CLIENT *target, *from; CLIENT *target, *from;
@@ -421,8 +361,7 @@ IRC_PONG( CLIENT *Client, REQUEST *Req )
} /* IRC_PONG */ } /* IRC_PONG */
LOCAL BOOLEAN LOCAL BOOLEAN Hello_User( CLIENT *Client )
Hello_User( CLIENT *Client )
{ {
assert( Client != NULL ); assert( Client != NULL );
@@ -441,9 +380,9 @@ Hello_User( CLIENT *Client )
IRC_WriteStrServers( NULL, "NICK %s 1 %s %s 1 +%s :%s", Client_ID( Client ), Client_User( Client ), Client_Hostname( Client ), Client_Modes( Client ), Client_Info( Client )); IRC_WriteStrServers( NULL, "NICK %s 1 %s %s 1 +%s :%s", Client_ID( Client ), Client_User( Client ), Client_Hostname( Client ), Client_Modes( Client ), Client_Info( Client ));
if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return FALSE; if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return FALSE;
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), VERSION, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return FALSE; if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return FALSE;
if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return FALSE; if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return FALSE;
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), VERSION, USERMODES, CHANMODES )) return FALSE; if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return FALSE;
Client_SetType( Client, CLIENT_USER ); Client_SetType( Client, CLIENT_USER );
@@ -454,8 +393,7 @@ Hello_User( CLIENT *Client )
} /* Hello_User */ } /* Hello_User */
LOCAL VOID LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason )
Kill_Nick( CHAR *Nick, CHAR *Reason )
{ {
CLIENT *c; CLIENT *c;

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: irc-login.h,v 1.4 2002/05/27 13:09:27 alex Exp $ * $Id: irc-login.h,v 1.3 2002/03/12 14:37:52 alex Exp $
* *
* irc-login.h: Anmeldung und Abmeldung im IRC (Header) * irc-login.h: Anmeldung und Abmeldung im IRC (Header)
*/ */
@@ -18,13 +18,16 @@
#ifndef __irc_login_h__ #ifndef __irc_login_h__
#define __irc_login_h__ #define __irc_login_h__
#include "parse.h"
#include "client.h"
GLOBAL BOOLEAN IRC_PASS PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_USER PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_PING PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req );
#endif #endif

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: irc-mode.c,v 1.14 2002/09/08 17:07:14 alex Exp $ * $Id: irc-mode.c,v 1.4 2002/03/25 17:11:45 alex Exp $
* *
* irc-mode.c: IRC-Befehle zur Mode-Aenderung (MODE, AWAY, ...) * irc-mode.c: IRC-Befehle zur Mode-Aenderung (MODE, AWAY, ...)
*/ */
@@ -21,37 +21,21 @@
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
#include "conn.h"
#include "client.h"
#include "channel.h" #include "channel.h"
#include "defines.h" #include "defines.h"
#include "irc-write.h" #include "irc-write.h"
#include "lists.h"
#include "log.h" #include "log.h"
#include "parse.h"
#include "messages.h" #include "messages.h"
#include "resolve.h"
#include "conf.h"
#include "exp.h" #include "exp.h"
#include "irc-mode.h" #include "irc-mode.h"
LOCAL BOOLEAN Add_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )); GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
LOCAL BOOLEAN Add_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
LOCAL BOOLEAN Del_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
LOCAL BOOLEAN Del_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
LOCAL BOOLEAN Send_ListChange PARAMS(( CHAR *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Mask ));
GLOBAL BOOLEAN
IRC_MODE( CLIENT *Client, REQUEST *Req )
{ {
CHAR *mode_ptr, the_modes[CLIENT_MODE_LEN], x[2]; CHAR *mode_ptr, the_modes[CLIENT_MODE_LEN], x[2];
CLIENT *cl, *chan_cl, *prefix; CLIENT *cl, *chan_cl, *prefix;
BOOLEAN set, ok, modeok; BOOLEAN set, ok;
CHANNEL *chan; CHANNEL *chan;
assert( Client != NULL ); assert( Client != NULL );
@@ -79,63 +63,6 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
if(( cl ) && ( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); if(( cl ) && ( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if(( chan ) && ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); if(( chan ) && ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Prefix fuer Antworten etc. ermitteln */
if( Client_Type( Client ) == CLIENT_SERVER )
{
prefix = Client_Search( Req->prefix );
if( ! prefix ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
}
else prefix = Client;
if(( chan ) && (( Req->argc == 2 ) || ( Req->argc == 3 )))
{
/* pruefen, ob "Listen-Operation": Invite, Ban */
if(( Req->argv[1][0] == '-' ) || ( Req->argv[1][0] == '+' )) mode_ptr = &Req->argv[1][1];
else mode_ptr = &Req->argv[1][0];
if( Req->argc == 2 )
{
/* Liste anzeigen */
if( *mode_ptr == 'I' ) return Lists_ShowInvites( prefix, chan );
if( *mode_ptr == 'b' ) return Lists_ShowBans( prefix, chan );
}
else
{
/* Listen veraendern */
if( Client_Type( Client ) == CLIENT_USER )
{
/* Ist der User Channel-Operator? */
modeok = FALSE;
if( strchr( Channel_UserModes( chan, Client ), 'o' )) modeok = TRUE;
if( Conf_OperCanMode )
{
/* auch IRC-Operatoren duerfen MODE verwenden */
if( Client_OperByMe( Client )) modeok = TRUE;
}
if( ! modeok )
{
Log( LOG_DEBUG, "Can't change modes: \"%s\" is not operator on %s!", Client_ID( Client ), Channel_Name( chan ));
return IRC_WriteStrClient( Client, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Client ), Channel_Name( chan ));
}
}
if( Req->argv[1][0] == '+' )
{
/* Listen-Eintrag hinzufuegen */
if( *mode_ptr == 'I' ) return Add_Invite( prefix, Client, chan, Req->argv[2] );
if( *mode_ptr == 'b' ) return Add_Ban( prefix, Client, chan, Req->argv[2] );
}
else if( Req->argv[1][0] == '-' )
{
/* Listen-Eintrag loeschen */
if( *mode_ptr == 'I' ) return Del_Invite( prefix, Client, chan, Req->argv[2] );
if( *mode_ptr == 'b' ) return Del_Ban( prefix, Client, chan, Req->argv[2] );
}
}
}
/* Client ermitteln, wenn bei Channel-Modes mit 3 Parametern */ /* Client ermitteln, wenn bei Channel-Modes mit 3 Parametern */
if(( chan ) && (Req->argc == 3 )) if(( chan ) && (Req->argc == 3 ))
{ {
@@ -177,6 +104,14 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
else set = TRUE; else set = TRUE;
if(( *mode_ptr == '-' ) || ( *mode_ptr == '+' )) mode_ptr++; if(( *mode_ptr == '-' ) || ( *mode_ptr == '+' )) mode_ptr++;
} }
/* Prefix fuer Antworten etc. ermitteln */
if( Client_Type( Client ) == CLIENT_SERVER )
{
prefix = Client_Search( Req->prefix );
if( ! prefix ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
}
else prefix = Client;
/* Reply-String mit Aenderungen vorbereiten */ /* Reply-String mit Aenderungen vorbereiten */
if( set ) strcpy( the_modes, "+" ); if( set ) strcpy( the_modes, "+" );
@@ -205,6 +140,11 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
/* invisible */ /* invisible */
x[0] = 'i'; x[0] = 'i';
break; break;
case 'r':
/* restricted (kann nur gesetzt werden) */
if( set ) x[0] = 'r';
else ok = IRC_WriteStrClient( Client, ERR_RESTRICTED_MSG, Client_ID( Client ));
break;
case 'o': case 'o':
/* operator (kann nur geloescht werden) */ /* operator (kann nur geloescht werden) */
if( ! set ) if( ! set )
@@ -214,11 +154,6 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
} }
else ok = IRC_WriteStrClient( Client, ERR_UMODEUNKNOWNFLAG_MSG, Client_ID( Client )); else ok = IRC_WriteStrClient( Client, ERR_UMODEUNKNOWNFLAG_MSG, Client_ID( Client ));
break; break;
case 'r':
/* restricted (kann nur gesetzt werden) */
if( set ) x[0] = 'r';
else ok = IRC_WriteStrClient( Client, ERR_RESTRICTED_MSG, Client_ID( Client ));
break;
case 's': case 's':
/* server messages */ /* server messages */
x[0] = 's'; x[0] = 's';
@@ -232,15 +167,7 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
if( chan ) if( chan )
{ {
/* Ist der User ein Channel Operator? */ /* Ist der User ein Channel Operator? */
modeok = FALSE; if( ! strchr( Channel_UserModes( chan, Client ), 'o' ))
if( strchr( Channel_UserModes( chan, Client ), 'o' )) modeok = TRUE;
if( Conf_OperCanMode )
{
/* auch IRC-Operatoren duerfen MODE verwenden */
if( Client_OperByMe( Client )) modeok = TRUE;
}
if( ! modeok )
{ {
Log( LOG_DEBUG, "Can't change modes: \"%s\" is not operator on %s!", Client_ID( Client ), Channel_Name( chan )); Log( LOG_DEBUG, "Can't change modes: \"%s\" is not operator on %s!", Client_ID( Client ), Channel_Name( chan ));
ok = IRC_WriteStrClient( Client, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Client ), Channel_Name( chan )); ok = IRC_WriteStrClient( Client, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Client ), Channel_Name( chan ));
@@ -272,9 +199,9 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
/* Channel-Modes */ /* Channel-Modes */
switch( *mode_ptr ) switch( *mode_ptr )
{ {
case 'i': case 'a':
/* Invite-Only */ /* Anonymous */
x[0] = 'i'; x[0] = 'a';
break; break;
case 'm': case 'm':
/* Moderated */ /* Moderated */
@@ -284,14 +211,22 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
/* kein Schreiben in den Channel von aussen */ /* kein Schreiben in den Channel von aussen */
x[0] = 'n'; x[0] = 'n';
break; break;
case 'p':
/* Private */
x[0] = 'p';
break;
case 'q':
/* Quiet */
x[0] = 'q';
break;
case 's':
/* Secret */
x[0] = 's';
break;
case 't': case 't':
/* Topic Lock */ /* Topic Lock */
x[0] = 't'; x[0] = 't';
break; break;
case 'P':
/* Persistent */
x[0] = 'P';
break;
default: default:
Log( LOG_DEBUG, "Unknown channel-mode \"%c%c\" from \"%s\" at %s!?", set ? '+' : '-', *mode_ptr, Client_ID( Client ), Channel_Name( chan )); Log( LOG_DEBUG, "Unknown channel-mode \"%c%c\" from \"%s\" at %s!?", set ? '+' : '-', *mode_ptr, Client_ID( Client ), Channel_Name( chan ));
ok = IRC_WriteStrClient( Client, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Client ), set ? '+' : '-', *mode_ptr ); ok = IRC_WriteStrClient( Client, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Client ), set ? '+' : '-', *mode_ptr );
@@ -428,8 +363,7 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
} /* IRC_MODE */ } /* IRC_MODE */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_AWAY( CLIENT *Client, REQUEST *Req )
IRC_AWAY( CLIENT *Client, REQUEST *Req )
{ {
assert( Client != NULL ); assert( Client != NULL );
assert( Req != NULL ); assert( Req != NULL );
@@ -456,90 +390,4 @@ IRC_AWAY( CLIENT *Client, REQUEST *Req )
} /* IRC_AWAY */ } /* IRC_AWAY */
LOCAL BOOLEAN
Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
{
CHAR *mask;
assert( Client != NULL );
assert( Channel != NULL );
assert( Pattern != NULL );
mask = Lists_MakeMask( Pattern );
if( ! Lists_AddInvited( Prefix, mask, Channel, FALSE )) return CONNECTED;
return Send_ListChange( "+I", Prefix, Client, Channel, mask );
} /* Add_Invite */
LOCAL BOOLEAN
Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
{
CHAR *mask;
assert( Client != NULL );
assert( Channel != NULL );
assert( Pattern != NULL );
mask = Lists_MakeMask( Pattern );
if( ! Lists_AddBanned( Prefix, mask, Channel )) return CONNECTED;
return Send_ListChange( "+b", Prefix, Client, Channel, mask );
} /* Add_Ban */
LOCAL BOOLEAN
Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
{
CHAR *mask;
assert( Client != NULL );
assert( Channel != NULL );
assert( Pattern != NULL );
mask = Lists_MakeMask( Pattern );
Lists_DelInvited( mask, Channel );
return Send_ListChange( "-I", Prefix, Client, Channel, mask );
} /* Del_Invite */
LOCAL BOOLEAN
Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
{
CHAR *mask;
assert( Client != NULL );
assert( Channel != NULL );
assert( Pattern != NULL );
mask = Lists_MakeMask( Pattern );
Lists_DelBanned( mask, Channel );
return Send_ListChange( "-b", Prefix, Client, Channel, mask );
} /* Del_Ban */
LOCAL BOOLEAN
Send_ListChange( CHAR *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Mask )
{
/* Bestaetigung an Client schicken & andere Server sowie Channel-User informieren */
BOOLEAN ok;
if( Client_Type( Client ) == CLIENT_USER )
{
/* Bestaetigung an Client */
ok = IRC_WriteStrClientPrefix( Client, Prefix, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask );
}
else ok = TRUE;
/* an andere Server */
IRC_WriteStrServersPrefix( Client, Prefix, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask );
/* und lokale User im Channel */
IRC_WriteStrChannelPrefix( Client, Channel, Prefix, FALSE, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask );
return ok;
} /* Send_ListChange */
/* -eof- */ /* -eof- */

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: irc-mode.h,v 1.4 2002/05/27 13:09:27 alex Exp $ * $Id: irc-mode.h,v 1.2.2.1 2002/04/08 18:07:42 alex Exp $
* *
* irc-mode.h: IRC-Befehle zur Mode-Aenderung (MODE, AWAY, ...) (Header) * irc-mode.h: IRC-Befehle zur Mode-Aenderung (MODE, AWAY, ...) (Header)
*/ */
@@ -18,9 +18,12 @@
#ifndef __irc_mode_h__ #ifndef __irc_mode_h__
#define __irc_mode_h__ #define __irc_mode_h__
#include "parse.h"
#include "client.h"
GLOBAL BOOLEAN IRC_MODE PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_AWAY PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_AWAY( CLIENT *Client, REQUEST *Req );
#endif #endif

View File

@@ -1,131 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: irc-op.c,v 1.9 2002/09/08 17:06:54 alex Exp $
*
* irc-op.c: Befehle zur Channel-Verwaltung
*/
#include "portab.h"
#include "imp.h"
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include "conn.h"
#include "client.h"
#include "channel.h"
#include "defines.h"
#include "irc-write.h"
#include "lists.h"
#include "log.h"
#include "messages.h"
#include "parse.h"
#include "exp.h"
#include "irc-op.h"
GLOBAL BOOLEAN
IRC_KICK( CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *from;
assert( Client != NULL );
assert( Req != NULL );
/* Valider Client? */
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
/* Falsche Anzahl Parameter? */
if(( Req->argc < 2) || ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
/* Ziel-User suchen */
target = Client_Search( Req->argv[1] );
if( ! target ) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( from ), Req->argv[1] );
Channel_Kick( target, from, Req->argv[0], Req->argc == 3 ? Req->argv[2] : Client_ID( from ));
return CONNECTED;
} /* IRC_KICK */
GLOBAL BOOLEAN
IRC_INVITE( CLIENT *Client, REQUEST *Req )
{
CHANNEL *chan;
CLIENT *target, *from;
BOOLEAN remember = FALSE;
assert( Client != NULL );
assert( Req != NULL );
/* Valider Client? */
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
/* Falsche Anzahl Parameter? */
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
/* User suchen */
target = Client_Search( Req->argv[0] );
if(( ! target ) || ( Client_Type( target ) != CLIENT_USER )) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
chan = Channel_Search( Req->argv[1] );
if( chan )
{
/* Der Channel existiert bereits; ist der User Mitglied? */
if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( Client ), Req->argv[1] );
/* Ist der Channel "invite-only"? */
if( strchr( Channel_Modes( chan ), 'i' ))
{
/* Ja. Der User muss Channel-Operator sein! */
if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
remember = TRUE;
}
/* Ist der Ziel-User bereits Mitglied? */
if( Channel_IsMemberOf( chan, target )) return IRC_WriteStrClient( from, ERR_USERONCHANNEL_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] );
}
/* Wenn der User gebanned ist, so muss das Invite auch gespeichert werden */
if( Lists_CheckBanned( target, chan )) remember = TRUE;
Log( LOG_DEBUG, "User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask( from ), Req->argv[0], Req->argv[1] );
if( remember )
{
if( ! Lists_AddInvited( from, Client_Mask( target ), chan, TRUE )) return CONNECTED;
}
/* an Ziel-Client forwarden ... */
IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
if( Client_Conn( target ) > NONE )
{
/* lokaler Ziel-Client, Status-Code melden */
if( ! IRC_WriteStrClientPrefix( from, target, RPL_INVITING_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] )) return DISCONNECTED;
}
return CONNECTED;
} /* IRC_INVITE */
/* -eof- */

View File

@@ -1,29 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: irc-op.h,v 1.2 2002/09/08 00:52:55 alex Exp $
*
* irc-op.h: Befehle zur Channel-Verwaltung (Header)
*/
#ifndef __irc_op_h__
#define __irc_op_h__
GLOBAL BOOLEAN IRC_KICK PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_INVITE PARAMS(( CLIENT *Client, REQUEST *Req ));
#endif
/* -eof- */

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: irc-oper.c,v 1.8 2002/09/03 23:54:59 alex Exp $ * $Id: irc-oper.c,v 1.3.2.1 2002/04/08 18:07:42 alex Exp $
* *
* irc-oper.c: IRC-Operator-Befehle * irc-oper.c: IRC-Operator-Befehle
*/ */
@@ -22,22 +22,16 @@
#include <string.h> #include <string.h>
#include "ngircd.h" #include "ngircd.h"
#include "resolve.h"
#include "conf.h" #include "conf.h"
#include "conn.h"
#include "client.h"
#include "channel.h"
#include "irc-write.h" #include "irc-write.h"
#include "log.h" #include "log.h"
#include "messages.h" #include "messages.h"
#include "parse.h"
#include <exp.h> #include <exp.h>
#include "irc-oper.h" #include "irc-oper.h"
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_OPER( CLIENT *Client, REQUEST *Req )
IRC_OPER( CLIENT *Client, REQUEST *Req )
{ {
INT i; INT i;
@@ -82,8 +76,7 @@ IRC_OPER( CLIENT *Client, REQUEST *Req )
} /* IRC_OPER */ } /* IRC_OPER */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_DIE( CLIENT *Client, REQUEST *Req )
IRC_DIE( CLIENT *Client, REQUEST *Req )
{ {
assert( Client != NULL ); assert( Client != NULL );
assert( Req != NULL ); assert( Req != NULL );
@@ -101,8 +94,7 @@ IRC_DIE( CLIENT *Client, REQUEST *Req )
} /* IRC_DIE */ } /* IRC_DIE */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_RESTART( CLIENT *Client, REQUEST *Req )
IRC_RESTART( CLIENT *Client, REQUEST *Req )
{ {
assert( Client != NULL ); assert( Client != NULL );
assert( Req != NULL ); assert( Req != NULL );
@@ -120,25 +112,4 @@ IRC_RESTART( CLIENT *Client, REQUEST *Req )
} /* IRC_RESTART */ } /* IRC_RESTART */
GLOBAL BOOLEAN
IRC_CONNECT(CLIENT *Client, REQUEST *Req )
{
/* Vorlaeufige Version zu Debug-Zwecken: es wird einfach
* der "passive mode" aufgehoben, mehr passiert nicht ... */
assert( Client != NULL );
assert( Req != NULL );
if( Client_Type( Client ) != CLIENT_USER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
/* Falsche Anzahl Parameter? */
if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
Log( LOG_NOTICE|LOG_snotice, "Got CONNECT command from \"%s\".", Client_Mask( Client ));
NGIRCd_Passive = FALSE;
return CONNECTED;
} /* IRC_CONNECT */
/* -eof- */ /* -eof- */

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: irc-oper.h,v 1.6 2002/09/03 23:54:59 alex Exp $ * $Id: irc-oper.h,v 1.2 2002/03/12 14:37:52 alex Exp $
* *
* irc-oper.h: IRC-Operator-Befehle (Header) * irc-oper.h: IRC-Operator-Befehle (Header)
*/ */
@@ -18,11 +18,13 @@
#ifndef __irc_oper_h__ #ifndef __irc_oper_h__
#define __irc_oper_h__ #define __irc_oper_h__
#include "parse.h"
#include "client.h"
GLOBAL BOOLEAN IRC_OPER PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_DIE PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_OPER( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_RESTART PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_DIE( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_CONNECT PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_RESTART( CLIENT *Client, REQUEST *Req );
#endif #endif

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: irc-server.c,v 1.17.2.3 2002/11/29 10:58:49 alex Exp $ * $Id: irc-server.c,v 1.8.2.1 2002/04/08 18:07:42 alex Exp $
* *
* irc-server.c: IRC-Befehle fuer Server-Links * irc-server.c: IRC-Befehle fuer Server-Links
*/ */
@@ -23,23 +23,16 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "resolve.h"
#include "conf.h" #include "conf.h"
#include "conn.h"
#include "client.h"
#include "channel.h"
#include "irc-write.h" #include "irc-write.h"
#include "log.h" #include "log.h"
#include "messages.h" #include "messages.h"
#include "parse.h"
#include "ngircd.h"
#include "exp.h" #include "exp.h"
#include "irc-server.h" #include "irc-server.h"
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req )
IRC_SERVER( CLIENT *Client, REQUEST *Req )
{ {
CHAR str[LINE_LEN], *ptr; CHAR str[LINE_LEN], *ptr;
CLIENT *from, *c, *cl; CLIENT *from, *c, *cl;
@@ -93,7 +86,7 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
{ {
/* Eingehende Verbindung: Unseren SERVER- und PASS-Befehl senden */ /* Eingehende Verbindung: Unseren SERVER- und PASS-Befehl senden */
ok = TRUE; ok = TRUE;
if( ! IRC_WriteStrClient( Client, "PASS %s %s", Conf_Server[i].pwd, NGIRCd_ProtoID )) ok = FALSE; if( ! IRC_WriteStrClient( Client, "PASS %s "PASSSERVERADD, Conf_Server[i].pwd )) ok = FALSE;
else ok = IRC_WriteStrClient( Client, "SERVER %s 1 :%s", Conf_ServerName, Conf_ServerInfo ); else ok = IRC_WriteStrClient( Client, "SERVER %s 1 :%s", Conf_ServerName, Conf_ServerInfo );
if( ! ok ) if( ! ok )
{ {
@@ -162,15 +155,6 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
chan = Channel_First( ); chan = Channel_First( );
while( chan ) while( chan )
{ {
#ifdef IRCPLUS
/* Wenn unterstuetzt, CHANINFO senden */
if( strchr( Client_Flags( Client ), 'C' ))
{
/* CHANINFO senden */
if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s :%s", Channel_Name( chan ), Channel_Modes( chan ), Channel_Topic( chan ))) return DISCONNECTED;
}
#endif
/* alle Member suchen */ /* alle Member suchen */
cl2chan = Channel_FirstMember( chan ); cl2chan = Channel_FirstMember( chan );
sprintf( str, "NJOIN %s :", Channel_Name( chan )); sprintf( str, "NJOIN %s :", Channel_Name( chan ));
@@ -188,7 +172,7 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 8 )) if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 8 ))
{ {
/* Zeile senden */ /* Zeile senden */
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
sprintf( str, "NJOIN %s :", Channel_Name( chan )); sprintf( str, "NJOIN %s :", Channel_Name( chan ));
} }
@@ -199,7 +183,7 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
if( str[strlen( str ) - 1] != ':') if( str[strlen( str ) - 1] != ':')
{ {
/* Ja; Also senden ... */ /* Ja; Also senden ... */
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
} }
/* naechsten Channel suchen */ /* naechsten Channel suchen */
@@ -255,10 +239,9 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
} /* IRC_SERVER */ } /* IRC_SERVER */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req )
IRC_NJOIN( CLIENT *Client, REQUEST *Req )
{ {
CHAR str[COMMAND_LEN], *channame, *ptr, modes[8]; CHAR *channame, *ptr, modes[8];
BOOLEAN is_op, is_voiced; BOOLEAN is_op, is_voiced;
CHANNEL *chan; CHANNEL *chan;
CLIENT *c; CLIENT *c;
@@ -271,11 +254,8 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
/* Falsche Anzahl Parameter? */ /* Falsche Anzahl Parameter? */
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
strncpy( str, Req->argv[1], COMMAND_LEN - 1 );
str[COMMAND_LEN - 1] = '\0';
channame = Req->argv[0]; channame = Req->argv[0];
ptr = strtok( str, "," ); ptr = strtok( Req->argv[1], "," );
while( ptr ) while( ptr )
{ {
is_op = is_voiced = FALSE; is_op = is_voiced = FALSE;
@@ -322,8 +302,7 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
} /* IRC_NJOIN */ } /* IRC_NJOIN */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_SQUIT( CLIENT *Client, REQUEST *Req )
IRC_SQUIT( CLIENT *Client, REQUEST *Req )
{ {
CLIENT *target; CLIENT *target;
CHAR msg[LINE_LEN + 64]; CHAR msg[LINE_LEN + 64];
@@ -339,6 +318,9 @@ IRC_SQUIT( CLIENT *Client, REQUEST *Req )
Log( LOG_DEBUG, "Got SQUIT from %s for \"%s\": \"%s\" ...", Client_ID( Client ), Req->argv[0], Req->argv[1] ); Log( LOG_DEBUG, "Got SQUIT from %s for \"%s\": \"%s\" ...", Client_ID( Client ), Req->argv[0], Req->argv[1] );
/* SQUIT an alle Server weiterleiten */
IRC_WriteStrServers( Client, "SQUIT %s :%s", Req->argv[0], Req->argv[1] );
target = Client_Search( Req->argv[0] ); target = Client_Search( Req->argv[0] );
if( ! target ) if( ! target )
{ {

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: irc-server.h,v 1.3 2002/05/27 13:09:27 alex Exp $ * $Id: irc-server.h,v 1.2 2002/03/12 14:37:52 alex Exp $
* *
* irc-server.h: IRC-Befehle fuer Server-Links (Header) * irc-server.h: IRC-Befehle fuer Server-Links (Header)
*/ */
@@ -18,10 +18,13 @@
#ifndef __irc_server_h__ #ifndef __irc_server_h__
#define __irc_server_h__ #define __irc_server_h__
#include "parse.h"
#include "client.h"
GLOBAL BOOLEAN IRC_SERVER PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_NJOIN PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_SQUIT PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_SQUIT( CLIENT *Client, REQUEST *Req );
#endif #endif

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: irc-write.c,v 1.7.2.3 2002/10/04 13:12:46 alex Exp $ * $Id: irc-write.c,v 1.3 2002/03/25 17:13:07 alex Exp $
* *
* irc-write.c: IRC-Texte und Befehle ueber Netzwerk versenden * irc-write.c: IRC-Texte und Befehle ueber Netzwerk versenden
*/ */
@@ -21,30 +21,17 @@
#include <assert.h> #include <assert.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <string.h>
#include "conn.h"
#include "client.h"
#include "channel.h"
#include "defines.h" #include "defines.h"
#include "exp.h" #include "exp.h"
#include "irc-write.h" #include "irc-write.h"
LOCAL CHAR *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client )); LOCAL CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client );
#ifdef PROTOTYPES GLOBAL BOOLEAN IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... )
GLOBAL BOOLEAN
IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... )
#else
GLOBAL BOOLEAN
IRC_WriteStrClient( Client, Format, va_alist )
CLIENT *Client;
CHAR *Format;
va_dcl
#endif
{ {
CHAR buffer[1000]; CHAR buffer[1000];
BOOLEAN ok = CONNECTED; BOOLEAN ok = CONNECTED;
@@ -53,32 +40,18 @@ va_dcl
assert( Client != NULL ); assert( Client != NULL );
assert( Format != NULL ); assert( Format != NULL );
#ifdef PROTOTYPES
va_start( ap, Format ); va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap ); vsnprintf( buffer, 1000, Format, ap );
va_end( ap ); va_end( ap );
/* an den Client selber */ /* an den Client selber */
ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), "%s", buffer ); ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), buffer );
return ok; return ok;
} /* IRC_WriteStrClient */ } /* IRC_WriteStrClient */
#ifdef PROTOTYPES GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... )
GLOBAL BOOLEAN
IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... )
#else
GLOBAL BOOLEAN
IRC_WriteStrClientPrefix( Client, Prefix, Format, va_alist )
CLIENT *Client;
CLIENT *Prefix;
CHAR *Format;
va_dcl
#endif
{ {
/* Text an Clients, lokal bzw. remote, senden. */ /* Text an Clients, lokal bzw. remote, senden. */
@@ -89,11 +62,7 @@ va_dcl
assert( Format != NULL ); assert( Format != NULL );
assert( Prefix != NULL ); assert( Prefix != NULL );
#ifdef PROTOTYPES
va_start( ap, Format ); va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap ); vsnprintf( buffer, 1000, Format, ap );
va_end( ap ); va_end( ap );
@@ -101,18 +70,7 @@ va_dcl
} /* IRC_WriteStrClientPrefix */ } /* IRC_WriteStrClientPrefix */
#ifdef PROTOTYPES GLOBAL BOOLEAN IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... )
GLOBAL BOOLEAN
IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... )
#else
GLOBAL BOOLEAN
IRC_WriteStrChannel( Client, Chan, Remote, Format, va_alist )
CLIENT *Client;
CHANNEL *Chan;
BOOLEAN Remote;
CHAR *Format;
va_dcl
#endif
{ {
CHAR buffer[1000]; CHAR buffer[1000];
va_list ap; va_list ap;
@@ -120,31 +78,15 @@ va_dcl
assert( Client != NULL ); assert( Client != NULL );
assert( Format != NULL ); assert( Format != NULL );
#ifdef PROTOTYPES
va_start( ap, Format ); va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap ); vsnprintf( buffer, 1000, Format, ap );
va_end( ap ); va_end( ap );
return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, "%s", buffer ); return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, buffer );
} /* IRC_WriteStrChannel */ } /* IRC_WriteStrChannel */
#ifdef PROTOTYPES GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
GLOBAL BOOLEAN
IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
#else
GLOBAL BOOLEAN
IRC_WriteStrChannelPrefix( Client, Chan, Prefix, Remote, Format, va_alist )
CLIENT *Client;
CHANNEL *Chan;
CLIENT *Prefix;
BOOLEAN Remote;
CHAR *Format;
va_dcl
#endif
{ {
BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED; BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
CHAR buffer[1000]; CHAR buffer[1000];
@@ -158,11 +100,7 @@ va_dcl
assert( Prefix != NULL ); assert( Prefix != NULL );
assert( Format != NULL ); assert( Format != NULL );
#ifdef PROTOTYPES
va_start( ap, Format ); va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap ); vsnprintf( buffer, 1000, Format, ap );
va_end( ap ); va_end( ap );
@@ -208,77 +146,23 @@ va_dcl
} /* IRC_WriteStrChannelPrefix */ } /* IRC_WriteStrChannelPrefix */
#ifdef PROTOTYPES GLOBAL VOID IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... )
GLOBAL VOID
IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... )
#else
GLOBAL VOID
IRC_WriteStrServers( ExceptOf, Format, va_alist )
CLIENT *ExceptOf;
CHAR *Format;
va_dcl
#endif
{ {
CHAR buffer[1000]; CHAR buffer[1000];
va_list ap; va_list ap;
assert( Format != NULL ); assert( Format != NULL );
#ifdef PROTOTYPES
va_start( ap, Format ); va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap ); vsnprintf( buffer, 1000, Format, ap );
va_end( ap ); va_end( ap );
/* an den Client selber */ /* an den Client selber */
IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), "%s", buffer ); return IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), buffer );
} /* IRC_WriteStrServers */ } /* IRC_WriteStrServers */
#ifdef PROTOTYPES GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... )
GLOBAL VOID
IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... )
#else
GLOBAL VOID
IRC_WriteStrServersPrefix( ExceptOf, Prefix, Format, va_alist )
CLIENT *ExceptOf;
CLIENT *Prefix;
CHAR *Format;
va_dcl
#endif
{
CHAR buffer[1000];
va_list ap;
assert( Format != NULL );
assert( Prefix != NULL );
#ifdef PROTOTYPES
va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap );
va_end( ap );
IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, '\0', "%s", buffer );
} /* IRC_WriteStrServersPrefix */
#ifdef PROTOTYPES
GLOBAL VOID
IRC_WriteStrServersPrefixFlag( CLIENT *ExceptOf, CLIENT *Prefix, CHAR Flag, CHAR *Format, ... )
#else
GLOBAL VOID
IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, Flag, Format, va_alist )
CLIENT *ExceptOf;
CLIENT *Prefix;
CHAR Flag;
CHAR *Format;
va_dcl
#endif
{ {
CHAR buffer[1000]; CHAR buffer[1000];
CLIENT *c; CLIENT *c;
@@ -287,11 +171,7 @@ va_dcl
assert( Format != NULL ); assert( Format != NULL );
assert( Prefix != NULL ); assert( Prefix != NULL );
#ifdef PROTOTYPES
va_start( ap, Format ); va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap ); vsnprintf( buffer, 1000, Format, ap );
va_end( ap ); va_end( ap );
@@ -300,26 +180,15 @@ va_dcl
{ {
if(( Client_Type( c ) == CLIENT_SERVER ) && ( Client_Conn( c ) > NONE ) && ( c != Client_ThisServer( )) && ( c != ExceptOf )) if(( Client_Type( c ) == CLIENT_SERVER ) && ( Client_Conn( c ) > NONE ) && ( c != Client_ThisServer( )) && ( c != ExceptOf ))
{ {
/* Ziel-Server gefunden. Nun noch pruefen, ob Flags stimmen */ /* Ziel-Server gefunden */
if(( Flag == '\0' ) || ( strchr( Client_Flags( c ), Flag ) != NULL )) IRC_WriteStrClientPrefix( c, Prefix, "%s", buffer ); IRC_WriteStrClientPrefix( c, Prefix, buffer );
} }
c = Client_Next( c ); c = Client_Next( c );
} }
} /* IRC_WriteStrServersPrefixFlag */ } /* IRC_WriteStrServersPrefix */
#ifdef PROTOTYPES GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
GLOBAL BOOLEAN
IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
#else
GLOBAL BOOLEAN
IRC_WriteStrRelatedPrefix( Client, Prefix, Remote, Format, va_alist )
CLIENT *Client;
CLIENT *Prefix;
BOOLEAN Remote;
CHAR *Format;
va_dcl
#endif
{ {
BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED; BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
CL2CHAN *chan_cl2chan, *cl2chan; CL2CHAN *chan_cl2chan, *cl2chan;
@@ -333,11 +202,7 @@ va_dcl
assert( Prefix != NULL ); assert( Prefix != NULL );
assert( Format != NULL ); assert( Format != NULL );
#ifdef PROTOTYPES
va_start( ap, Format ); va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap ); vsnprintf( buffer, 1000, Format, ap );
va_end( ap ); va_end( ap );
@@ -393,8 +258,7 @@ va_dcl
} /* IRC_WriteStrRelatedPrefix */ } /* IRC_WriteStrRelatedPrefix */
LOCAL CHAR * LOCAL CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client )
Get_Prefix( CLIENT *Target, CLIENT *Client )
{ {
assert( Target != NULL ); assert( Target != NULL );
assert( Client != NULL ); assert( Client != NULL );

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: irc-write.h,v 1.4 2002/09/03 23:56:06 alex Exp $ * $Id: irc-write.h,v 1.2 2002/03/12 14:37:52 alex Exp $
* *
* irc-write.h: IRC-Texte und Befehle ueber Netzwerk versenden (Header) * irc-write.h: IRC-Texte und Befehle ueber Netzwerk versenden (Header)
*/ */
@@ -18,18 +18,19 @@
#ifndef __irc_write_h__ #ifndef __irc_write_h__
#define __irc_write_h__ #define __irc_write_h__
#include "channel.h"
GLOBAL BOOLEAN IRC_WriteStrClient PARAMS((CLIENT *Client, CHAR *Format, ... ));
GLOBAL BOOLEAN IRC_WriteStrClientPrefix PARAMS((CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... ));
GLOBAL BOOLEAN IRC_WriteStrChannel PARAMS((CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... )); GLOBAL BOOLEAN IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... );
GLOBAL BOOLEAN IRC_WriteStrChannelPrefix PARAMS((CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )); GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... );
GLOBAL VOID IRC_WriteStrServers PARAMS((CLIENT *ExceptOf, CHAR *Format, ... )); GLOBAL BOOLEAN IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... );
GLOBAL VOID IRC_WriteStrServersPrefix PARAMS((CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... )); GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... );
GLOBAL VOID IRC_WriteStrServersPrefixFlag PARAMS((CLIENT *ExceptOf, CLIENT *Prefix, CHAR Flag, CHAR *Format, ... ));
GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix PARAMS((CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )); GLOBAL VOID IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... );
GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... );
GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... );
#endif #endif

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: irc.c,v 1.95.2.3 2002/11/04 19:18:39 alex Exp $ * $Id: irc.c,v 1.89.2.1 2002/06/11 17:52:23 alex Exp $
* *
* irc.c: IRC-Befehle * irc.c: IRC-Befehle
*/ */
@@ -25,24 +25,20 @@
#include <string.h> #include <string.h>
#include "ngircd.h" #include "ngircd.h"
#include "conn.h"
#include "client.h"
#include "channel.h" #include "channel.h"
#include "resolve.h" #include "client.h"
#include "conf.h" #include "conf.h"
#include "conn.h" #include "conn.h"
#include "irc-write.h" #include "irc-write.h"
#include "log.h" #include "log.h"
#include "messages.h" #include "messages.h"
#include "parse.h"
#include "tool.h" #include "tool.h"
#include "exp.h" #include "exp.h"
#include "irc.h" #include "irc.h"
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_MOTD( CLIENT *Client, REQUEST *Req )
IRC_MOTD( CLIENT *Client, REQUEST *Req )
{ {
assert( Client != NULL ); assert( Client != NULL );
assert( Req != NULL ); assert( Req != NULL );
@@ -56,8 +52,7 @@ IRC_MOTD( CLIENT *Client, REQUEST *Req )
} /* IRC_MOTD */ } /* IRC_MOTD */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
{ {
CLIENT *cl, *from; CLIENT *cl, *from;
CHANNEL *chan; CHANNEL *chan;
@@ -101,15 +96,14 @@ IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
} /* IRC_PRIVMSG */ } /* IRC_PRIVMSG */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req )
IRC_NOTICE( CLIENT *Client, REQUEST *Req )
{ {
CLIENT *to, *from; CLIENT *to, *from;
assert( Client != NULL ); assert( Client != NULL );
assert( Req != NULL ); assert( Req != NULL );
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return CONNECTED; if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
/* Falsche Anzahl Parameter? */ /* Falsche Anzahl Parameter? */
if( Req->argc != 2 ) return CONNECTED; if( Req->argc != 2 ) return CONNECTED;
@@ -128,8 +122,7 @@ IRC_NOTICE( CLIENT *Client, REQUEST *Req )
} /* IRC_NOTICE */ } /* IRC_NOTICE */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req )
IRC_NAMES( CLIENT *Client, REQUEST *Req )
{ {
CHAR rpl[COMMAND_LEN], *ptr; CHAR rpl[COMMAND_LEN], *ptr;
CLIENT *target, *from, *c; CLIENT *target, *from, *c;
@@ -206,7 +199,7 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req )
if( strlen( rpl ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 )) if( strlen( rpl ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 ))
{ {
/* Zeile wird zu lang: senden! */ /* Zeile wird zu lang: senden! */
if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED; if( ! IRC_WriteStrClient( from, rpl )) return DISCONNECTED;
sprintf( rpl, RPL_NAMREPLY_MSG, Client_ID( from ), "*", "*" ); sprintf( rpl, RPL_NAMREPLY_MSG, Client_ID( from ), "*", "*" );
} }
} }
@@ -217,15 +210,14 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req )
if( rpl[strlen( rpl ) - 1] != ':') if( rpl[strlen( rpl ) - 1] != ':')
{ {
/* es wurden User gefunden */ /* es wurden User gefunden */
if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED; if( ! IRC_WriteStrClient( from, rpl )) return DISCONNECTED;
} }
return IRC_WriteStrClient( from, RPL_ENDOFNAMES_MSG, Client_ID( from ), "*" ); return IRC_WriteStrClient( from, RPL_ENDOFNAMES_MSG, Client_ID( from ), "*" );
} /* IRC_NAMES */ } /* IRC_NAMES */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_ISON( CLIENT *Client, REQUEST *Req )
IRC_ISON( CLIENT *Client, REQUEST *Req )
{ {
CHAR rpl[COMMAND_LEN]; CHAR rpl[COMMAND_LEN];
CLIENT *c; CLIENT *c;
@@ -259,12 +251,11 @@ IRC_ISON( CLIENT *Client, REQUEST *Req )
} }
if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0'; if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
return IRC_WriteStrClient( Client, "%s", rpl, Client_ID( Client ) ); return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) );
} /* IRC_ISON */ } /* IRC_ISON */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req )
IRC_WHOIS( CLIENT *Client, REQUEST *Req )
{ {
CLIENT *from, *target, *c; CLIENT *from, *target, *c;
CHAR str[LINE_LEN + 1], *ptr = NULL; CHAR str[LINE_LEN + 1], *ptr = NULL;
@@ -325,7 +316,7 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
if( strlen( str ) > ( LINE_LEN - CHANNEL_NAME_LEN - 4 )) if( strlen( str ) > ( LINE_LEN - CHANNEL_NAME_LEN - 4 ))
{ {
/* Zeile wird zu lang: senden! */ /* Zeile wird zu lang: senden! */
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
sprintf( str, RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c )); sprintf( str, RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c ));
} }
@@ -335,7 +326,7 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
if( str[strlen( str ) - 1] != ':') if( str[strlen( str ) - 1] != ':')
{ {
/* Es sind noch Daten da, die gesendet werden muessen */ /* Es sind noch Daten da, die gesendet werden muessen */
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
} }
/* IRC-Operator? */ /* IRC-Operator? */
@@ -361,8 +352,7 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
} /* IRC_WHOIS */ } /* IRC_WHOIS */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_WHO( CLIENT *Client, REQUEST *Req )
IRC_WHO( CLIENT *Client, REQUEST *Req )
{ {
BOOLEAN ok, only_ops; BOOLEAN ok, only_ops;
CHAR flags[8], *ptr; CHAR flags[8], *ptr;
@@ -439,8 +429,7 @@ IRC_WHO( CLIENT *Client, REQUEST *Req )
} /* IRC_WHO */ } /* IRC_WHO */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_USERHOST( CLIENT *Client, REQUEST *Req )
IRC_USERHOST( CLIENT *Client, REQUEST *Req )
{ {
CHAR rpl[COMMAND_LEN]; CHAR rpl[COMMAND_LEN];
CLIENT *c; CLIENT *c;
@@ -477,12 +466,11 @@ IRC_USERHOST( CLIENT *Client, REQUEST *Req )
} }
if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0'; if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
return IRC_WriteStrClient( Client, "%s", rpl, Client_ID( Client ) ); return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) );
} /* IRC_USERHOST */ } /* IRC_USERHOST */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_ERROR( CLIENT *Client, REQUEST *Req )
IRC_ERROR( CLIENT *Client, REQUEST *Req )
{ {
assert( Client != NULL ); assert( Client != NULL );
assert( Req != NULL ); assert( Req != NULL );
@@ -494,8 +482,7 @@ IRC_ERROR( CLIENT *Client, REQUEST *Req )
} /* IRC_ERROR */ } /* IRC_ERROR */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_LUSERS( CLIENT *Client, REQUEST *Req )
IRC_LUSERS( CLIENT *Client, REQUEST *Req )
{ {
CLIENT *target, *from; CLIENT *target, *from;
@@ -531,8 +518,7 @@ IRC_LUSERS( CLIENT *Client, REQUEST *Req )
} /* IRC_LUSERS */ } /* IRC_LUSERS */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_LINKS( CLIENT *Client, REQUEST *Req )
IRC_LINKS( CLIENT *Client, REQUEST *Req )
{ {
CLIENT *target, *from, *c; CLIENT *target, *from, *c;
CHAR *mask; CHAR *mask;
@@ -581,8 +567,7 @@ IRC_LINKS( CLIENT *Client, REQUEST *Req )
} /* IRC_LINKS */ } /* IRC_LINKS */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_VERSION( CLIENT *Client, REQUEST *Req )
IRC_VERSION( CLIENT *Client, REQUEST *Req )
{ {
CLIENT *target, *prefix; CLIENT *target, *prefix;
@@ -612,12 +597,11 @@ IRC_VERSION( CLIENT *Client, REQUEST *Req )
} }
/* mit Versionsinfo antworten */ /* mit Versionsinfo antworten */
return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE, VERSION, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( )); return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( ));
} /* IRC_VERSION */ } /* IRC_VERSION */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_KILL( CLIENT *Client, REQUEST *Req )
IRC_KILL( CLIENT *Client, REQUEST *Req )
{ {
CLIENT *prefix, *c; CLIENT *prefix, *c;
@@ -643,63 +627,13 @@ IRC_KILL( CLIENT *Client, REQUEST *Req )
/* haben wir selber einen solchen Client? */ /* haben wir selber einen solchen Client? */
c = Client_Search( Req->argv[0] ); c = Client_Search( Req->argv[0] );
if( c ) if( c && ( Client_Conn( c ) != NONE )) Conn_Close( Client_Conn( c ), NULL, Req->argv[1], TRUE );
{
/* Ja, wir haben einen solchen Client */
if( Client_Conn( c ) != NONE ) Conn_Close( Client_Conn( c ), NULL, Req->argv[1], TRUE );
else Client_Destroy( c, NULL, Req->argv[1], TRUE );
}
else Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] );
return CONNECTED; return CONNECTED;
} /* IRC_KILL */ } /* IRC_KILL */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_Show_MOTD( CLIENT *Client )
IRC_ADMIN(CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *prefix;
assert( Client != NULL );
assert( Req != NULL );
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
/* Falsche Anzahl Parameter? */
if(( Req->argc > 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Ziel suchen */
if( Req->argc == 1 ) target = Client_Search( Req->argv[0] );
else target = Client_ThisServer( );
/* Prefix ermitteln */
if( Client_Type( Client ) == CLIENT_SERVER ) prefix = Client_Search( Req->prefix );
else prefix = Client;
if( ! prefix ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
/* An anderen Server weiterleiten? */
if( target != Client_ThisServer( ))
{
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
/* forwarden */
IRC_WriteStrClientPrefix( target, prefix, "ADMIN %s", Req->argv[0] );
return CONNECTED;
}
/* mit Versionsinfo antworten */
if( ! IRC_WriteStrClient( Client, RPL_ADMINME_MSG, Client_ID( prefix ), Conf_ServerName )) return DISCONNECTED;
if( ! IRC_WriteStrClient( Client, RPL_ADMINLOC1_MSG, Client_ID( prefix ), Conf_ServerAdmin1 )) return DISCONNECTED;
if( ! IRC_WriteStrClient( Client, RPL_ADMINLOC2_MSG, Client_ID( prefix ), Conf_ServerAdmin2 )) return DISCONNECTED;
if( ! IRC_WriteStrClient( Client, RPL_ADMINEMAIL_MSG, Client_ID( prefix ), Conf_ServerAdminMail )) return DISCONNECTED;
return CONNECTED;
} /* IRC_ADMIN */
GLOBAL BOOLEAN
IRC_Show_MOTD( CLIENT *Client )
{ {
BOOLEAN ok; BOOLEAN ok;
CHAR line[127]; CHAR line[127];
@@ -733,8 +667,7 @@ IRC_Show_MOTD( CLIENT *Client )
} /* IRC_Show_MOTD */ } /* IRC_Show_MOTD */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
{ {
BOOLEAN is_visible, is_member; BOOLEAN is_visible, is_member;
CHAR str[LINE_LEN + 1]; CHAR str[LINE_LEN + 1];
@@ -768,7 +701,7 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 )) if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 ))
{ {
/* Zeile wird zu lang: senden! */ /* Zeile wird zu lang: senden! */
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
sprintf( str, RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan )); sprintf( str, RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan ));
} }
} }
@@ -779,15 +712,14 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
if( str[strlen( str ) - 1] != ':') if( str[strlen( str ) - 1] != ':')
{ {
/* Es sind noch Daten da, die gesendet werden muessen */ /* Es sind noch Daten da, die gesendet werden muessen */
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
} }
return CONNECTED; return CONNECTED;
} /* IRC_Send_NAMES */ } /* IRC_Send_NAMES */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )
IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )
{ {
BOOLEAN is_visible, is_member; BOOLEAN is_visible, is_member;
CL2CHAN *cl2chan; CL2CHAN *cl2chan;
@@ -831,10 +763,9 @@ IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )
} /* IRC_Send_WHO */ } /* IRC_Send_WHO */
GLOBAL BOOLEAN GLOBAL BOOLEAN IRC_Send_LUSERS( CLIENT *Client )
IRC_Send_LUSERS( CLIENT *Client )
{ {
LONG cnt; INT cnt;
assert( Client != NULL ); assert( Client != NULL );

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: irc.h,v 1.32 2002/09/16 09:14:45 alex Exp $ * $Id: irc.h,v 1.30 2002/03/12 14:37:52 alex Exp $
* *
* irc.h: IRC-Befehle (Header) * irc.h: IRC-Befehle (Header)
*/ */
@@ -18,29 +18,32 @@
#ifndef __irc_h__ #ifndef __irc_h__
#define __irc_h__ #define __irc_h__
#include "parse.h"
#include "client.h"
#include "channel.h"
GLOBAL BOOLEAN IRC_MOTD PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_LUSERS PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_LINKS PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_VERSION PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_ADMIN PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_PRIVMSG PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_MOTD( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_NOTICE PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_LUSERS( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_LINKS( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_VERSION( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_NAMES PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_ISON PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_WHOIS PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_USERHOST PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_WHO PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_ERROR PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_KILL PARAMS((CLIENT *Client, REQUEST *Req )); GLOBAL BOOLEAN IRC_ISON( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_USERHOST( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_WHO( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_Send_NAMES PARAMS((CLIENT *Client, CHANNEL *Chan )); GLOBAL BOOLEAN IRC_ERROR( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_Send_LUSERS PARAMS((CLIENT *Client )); GLOBAL BOOLEAN IRC_KILL( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_Show_MOTD PARAMS((CLIENT *Client ));
GLOBAL BOOLEAN IRC_Send_WHO PARAMS((CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )); GLOBAL BOOLEAN IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan );
GLOBAL BOOLEAN IRC_Send_LUSERS( CLIENT *Client );
GLOBAL BOOLEAN IRC_Show_MOTD( CLIENT *Client );
GLOBAL BOOLEAN IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps );
#endif #endif

View File

@@ -1,448 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: lists.c,v 1.8.2.2 2002/10/04 13:12:46 alex Exp $
*
* lists.c: Verwaltung der "IRC-Listen": Ban, Invite, ...
*/
#include "portab.h"
#include "imp.h"
#include <assert.h>
#include "defines.h"
#include "conn.h"
#include "client.h"
#include "channel.h"
#include "log.h"
#include "match.h"
#include "messages.h"
#include "irc-write.h"
#include <stdlib.h>
#include <string.h>
#include "exp.h"
#include "lists.h"
#define MASK_LEN 2*CLIENT_HOST_LEN
typedef struct _C2C
{
struct _C2C *next;
CHAR mask[MASK_LEN];
CHANNEL *channel;
BOOLEAN onlyonce;
} C2C;
LOCAL C2C *My_Invites, *My_Bans;
LOCAL C2C *New_C2C PARAMS(( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ));
LOCAL BOOLEAN Check_List PARAMS(( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan ));
LOCAL BOOLEAN Already_Registered PARAMS(( C2C *Cl2Chan, CHAR *Mask, CHANNEL *Chan ));
GLOBAL VOID
Lists_Init( VOID )
{
/* Modul initialisieren */
My_Invites = My_Bans = NULL;
} /* Lists_Init */
GLOBAL VOID
Lists_Exit( VOID )
{
/* Modul abmelden */
C2C *c2c, *next;
/* Invite-Lists freigeben */
c2c = My_Invites;
while( c2c )
{
next = c2c->next;
free( c2c );
c2c = next;
}
/* Ban-Lists freigeben */
c2c = My_Bans;
while( c2c )
{
next = c2c->next;
free( c2c );
c2c = next;
}
} /* Lists_Exit */
GLOBAL BOOLEAN
Lists_CheckInvited( CLIENT *Client, CHANNEL *Chan )
{
return Check_List( &My_Invites, Client, Chan );
} /* Lists_CheckInvited */
GLOBAL BOOLEAN
Lists_AddInvited( CLIENT *From, CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )
{
C2C *c2c;
assert( Mask != NULL );
assert( Chan != NULL );
if( Already_Registered( My_Invites, Mask, Chan ))
{
/* Eintrag ist bereits vorhanden */
IRC_WriteStrClient( From, RPL_INVITELIST_MSG, Client_ID( From ), Channel_Name( Chan ), Mask );
return FALSE;
}
c2c = New_C2C( Mask, Chan, OnlyOnce );
if( ! c2c )
{
Log( LOG_ERR, "Can't add new invite list entry!" );
return FALSE;
}
/* verketten */
c2c->next = My_Invites;
My_Invites = c2c;
Log( LOG_DEBUG, "Added \"%s\" to invite list for \"%s\".", Mask, Channel_Name( Chan ));
return TRUE;
} /* Lists_AddInvited */
GLOBAL VOID
Lists_DelInvited( CHAR *Mask, CHANNEL *Chan )
{
C2C *c2c, *last, *next;
assert( Mask != NULL );
assert( Chan != NULL );
last = NULL;
c2c = My_Invites;
while( c2c )
{
next = c2c->next;
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 ))
{
/* dieser Eintrag muss geloescht werden */
Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
if( last ) last->next = next;
else My_Invites = next;
free( c2c );
}
else last = c2c;
c2c = next;
}
} /* Lists_DelInvited */
GLOBAL BOOLEAN
Lists_ShowInvites( CLIENT *Client, CHANNEL *Channel )
{
C2C *c2c;
assert( Client != NULL );
assert( Channel != NULL );
c2c = My_Invites;
while( c2c )
{
if( c2c->channel == Channel )
{
/* Eintrag fuer Channel gefunden; ausgeben: */
if( ! IRC_WriteStrClient( Client, RPL_INVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED;
}
c2c = c2c->next;
}
return IRC_WriteStrClient( Client, RPL_ENDOFINVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel ));
} /* Lists_ShowInvites */
GLOBAL BOOLEAN
Lists_CheckBanned( CLIENT *Client, CHANNEL *Chan )
{
return Check_List( &My_Bans, Client, Chan );
} /* Lists_CheckBanned */
GLOBAL BOOLEAN
Lists_AddBanned( CLIENT *From, CHAR *Mask, CHANNEL *Chan )
{
C2C *c2c;
assert( Mask != NULL );
assert( Chan != NULL );
if( Already_Registered( My_Bans, Mask, Chan ))
{
/* Eintrag ist bereits vorhanden */
IRC_WriteStrClient( From, RPL_BANLIST_MSG, Client_ID( From ), Channel_Name( Chan ), Mask );
return FALSE;
}
c2c = New_C2C( Mask, Chan, FALSE );
if( ! c2c )
{
Log( LOG_ERR, "Can't add new ban list entry!" );
return FALSE;
}
/* verketten */
c2c->next = My_Bans;
My_Bans = c2c;
Log( LOG_DEBUG, "Added \"%s\" to ban list for \"%s\".", Mask, Channel_Name( Chan ));
return TRUE;
} /* Lists_AddBanned */
GLOBAL VOID
Lists_DelBanned( CHAR *Mask, CHANNEL *Chan )
{
C2C *c2c, *last, *next;
assert( Mask != NULL );
assert( Chan != NULL );
last = NULL;
c2c = My_Bans;
while( c2c )
{
next = c2c->next;
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 ))
{
/* dieser Eintrag muss geloescht werden */
Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
if( last ) last->next = next;
else My_Bans = next;
free( c2c );
}
else last = c2c;
c2c = next;
}
} /* Lists_DelBanned */
GLOBAL BOOLEAN
Lists_ShowBans( CLIENT *Client, CHANNEL *Channel )
{
C2C *c2c;
assert( Client != NULL );
assert( Channel != NULL );
c2c = My_Bans;
while( c2c )
{
if( c2c->channel == Channel )
{
/* Eintrag fuer Channel gefunden; ausgeben: */
if( ! IRC_WriteStrClient( Client, RPL_BANLIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED;
}
c2c = c2c->next;
}
return IRC_WriteStrClient( Client, RPL_ENDOFBANLIST_MSG, Client_ID( Client ), Channel_Name( Channel ));
} /* Lists_ShowBans */
GLOBAL VOID
Lists_DeleteChannel( CHANNEL *Chan )
{
/* Channel wurde geloescht, Invite- und Ban-Lists aufraeumen */
C2C *c2c, *last, *next;
/* Invite-List */
last = NULL;
c2c = My_Invites;
while( c2c )
{
next = c2c->next;
if( c2c->channel == Chan )
{
/* dieser Eintrag muss geloescht werden */
Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
if( last ) last->next = next;
else My_Invites = next;
free( c2c );
}
else last = c2c;
c2c = next;
}
/* Ban-List */
last = NULL;
c2c = My_Bans;
while( c2c )
{
next = c2c->next;
if( c2c->channel == Chan )
{
/* dieser Eintrag muss geloescht werden */
Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
if( last ) last->next = next;
else My_Bans = next;
free( c2c );
}
else last = c2c;
c2c = next;
}
} /* Lists_DeleteChannel */
GLOBAL CHAR *
Lists_MakeMask( CHAR *Pattern )
{
/* Hier wird aus einem "beliebigen" Pattern eine gueltige IRC-Mask erzeugt.
* Diese ist aber nur bis zum naechsten Aufruf von Lists_MakeMask() gueltig,
* da ein einziger globaler Puffer verwendet wird. ->Umkopieren!*/
STATIC CHAR TheMask[MASK_LEN];
CHAR *excl, *at;
assert( Pattern != NULL );
excl = strchr( Pattern, '!' );
at = strchr( Pattern, '@' );
if(( at ) && ( at < excl )) excl = NULL;
if(( ! at ) && ( ! excl ))
{
/* weder ! noch @<40>vorhanden: als Nick annehmen */
strncpy( TheMask, Pattern, MASK_LEN - 5 );
TheMask[MASK_LEN - 5] = '\0';
strcat( TheMask, "!*@*" );
return TheMask;
}
if(( ! at ) && ( excl ))
{
/* Domain fehlt */
strncpy( TheMask, Pattern, MASK_LEN - 3 );
TheMask[MASK_LEN - 3] = '\0';
strcat( TheMask, "@*" );
return TheMask;
}
if(( at ) && ( ! excl ))
{
/* User fehlt */
*at = '\0'; at++;
strncpy( TheMask, Pattern, MASK_LEN - 4 );
TheMask[MASK_LEN - 4] = '\0';
strcat( TheMask, "!*@" );
strncat( TheMask, at, strlen( TheMask ) - MASK_LEN - 1 );
TheMask[MASK_LEN - 1] = '\0';
return TheMask;
}
/* alle Teile vorhanden */
strncpy( TheMask, Pattern, MASK_LEN - 1 );
TheMask[MASK_LEN - 1] = '\0';
return TheMask;
} /* Lists_MakeMask */
LOCAL C2C *
New_C2C( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )
{
C2C *c2c;
assert( Mask != NULL );
assert( Chan != NULL );
/* Speicher fuer Eintrag anfordern */
c2c = malloc( sizeof( C2C ));
if( ! c2c )
{
Log( LOG_EMERG, "Can't allocate memory! [New_C2C]" );
return NULL;
}
strncpy( c2c->mask, Mask, MASK_LEN );
c2c->channel = Chan;
c2c->onlyonce = OnlyOnce;
return c2c;
} /* New_C2C */
LOCAL BOOLEAN
Check_List( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan )
{
C2C *c2c, *last;
assert( Cl2Chan != NULL );
assert( Client != NULL );
assert( Chan != NULL );
c2c = *Cl2Chan;
last = NULL;
while( c2c )
{
if( c2c->channel == Chan )
{
/* Ok, richtiger Channel. Passt die Maske? */
if( Match( c2c->mask, Client_Mask( Client )))
{
/* Treffer! */
if( c2c->onlyonce )
{
/* Eintrag loeschen */
Log( LOG_DEBUG, "Deleted \"%s\" from %s list for \"%s\".", c2c->mask, *Cl2Chan == My_Invites ? "invite" : "ban", Channel_Name( Chan ));
if( last ) last->next = c2c->next;
else *Cl2Chan = c2c->next;
free( c2c );
}
return TRUE;
}
}
last = c2c;
c2c = c2c->next;
}
return FALSE;
} /* Check_List */
LOCAL BOOLEAN
Already_Registered( C2C *List, CHAR *Mask, CHANNEL *Chan )
{
C2C *c2c;
c2c = List;
while( c2c )
{
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 )) return TRUE;
c2c = c2c->next;
}
return FALSE;
} /* Already_Registered */
/* -eof- */

View File

@@ -1,43 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: lists.h,v 1.8 2002/09/08 17:05:25 alex Exp $
*
* lists.h: Verwaltung der "IRC-Listen": Ban, Invite, ... (Header)
*/
#ifndef __lists_h__
#define __lists_h__
GLOBAL VOID Lists_Init PARAMS(( VOID ));
GLOBAL VOID Lists_Exit PARAMS(( VOID ));
GLOBAL BOOLEAN Lists_CheckInvited PARAMS(( CLIENT *Client, CHANNEL *Chan ));
GLOBAL BOOLEAN Lists_AddInvited PARAMS(( CLIENT *From, CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ));
GLOBAL VOID Lists_DelInvited PARAMS(( CHAR *Mask, CHANNEL *Chan ));
GLOBAL BOOLEAN Lists_ShowInvites PARAMS(( CLIENT *Client, CHANNEL *Channel ));
GLOBAL BOOLEAN Lists_CheckBanned PARAMS(( CLIENT *Client, CHANNEL *Chan ));
GLOBAL BOOLEAN Lists_AddBanned PARAMS(( CLIENT *From, CHAR *Mask, CHANNEL *Chan ));
GLOBAL VOID Lists_DelBanned PARAMS(( CHAR *Mask, CHANNEL *Chan ));
GLOBAL BOOLEAN Lists_ShowBans PARAMS(( CLIENT *Client, CHANNEL *Channel ));
GLOBAL VOID Lists_DeleteChannel PARAMS(( CHANNEL *Chan ));
GLOBAL CHAR *Lists_MakeMask PARAMS(( CHAR *Pattern ));
#endif
/* -eof- */

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: log.c,v 1.37.2.3 2002/11/04 19:18:39 alex Exp $ * $Id: log.c,v 1.32 2002/03/31 16:46:15 alex Exp $
* *
* log.c: Logging-Funktionen * log.c: Logging-Funktionen
*/ */
@@ -31,10 +31,8 @@
#endif #endif
#include "ngircd.h" #include "ngircd.h"
#include "defines.h"
#include "conn.h"
#include "client.h" #include "client.h"
#include "channel.h" #include "defines.h"
#include "irc-write.h" #include "irc-write.h"
#include "exp.h" #include "exp.h"
@@ -45,11 +43,10 @@ LOCAL CHAR Error_File[FNAME_LEN];
LOCAL CHAR Init_Txt[127]; LOCAL CHAR Init_Txt[127];
LOCAL VOID Wall_ServerNotice PARAMS(( CHAR *Msg )); LOCAL VOID Wall_ServerNotice( CHAR *Msg );
GLOBAL VOID GLOBAL VOID Log_Init( VOID )
Log_Init( VOID )
{ {
#ifdef USE_SYSLOG #ifdef USE_SYSLOG
/* Syslog initialisieren */ /* Syslog initialisieren */
@@ -89,14 +86,13 @@ Log_Init( VOID )
} /* Log_Init */ } /* Log_Init */
GLOBAL VOID GLOBAL VOID Log_InitErrorfile( VOID )
Log_InitErrorfile( VOID )
{ {
/* "Error-Log" initialisieren: stderr in Datei umlenken. Dort /* "Error-Log" initialisieren: stderr in Datei umlenken. Dort
* landen z.B. alle Ausgaben von assert()-Aufrufen. */ * landen z.B. alle Ausgaben von assert()-Aufrufen. */
/* Dateiname zusammen bauen */ /* Dateiname zusammen bauen */
sprintf( Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE, (LONG)getpid( )); sprintf( Error_File, ERROR_DIR"/"PACKAGE"-%ld.err", (INT32)getpid( ));
/* stderr umlenken */ /* stderr umlenken */
fflush( stderr ); fflush( stderr );
@@ -116,12 +112,10 @@ Log_InitErrorfile( VOID )
} /* Log_InitErrfile */ } /* Log_InitErrfile */
GLOBAL VOID GLOBAL VOID Log_Exit( VOID )
Log_Exit( VOID )
{ {
/* Good Bye! */ /* Good Bye! */
if( NGIRCd_Restart ) Log( LOG_NOTICE, "%s done (restarting).", PACKAGE ); Log( LOG_NOTICE, PACKAGE" done.");
else Log( LOG_NOTICE, "%s done.", PACKAGE );
/* Error-File (stderr) loeschen */ /* Error-File (stderr) loeschen */
if( unlink( Error_File ) != 0 ) Log( LOG_ERR, "Can't delete \"%s\": %s", Error_File, strerror( errno )); if( unlink( Error_File ) != 0 ) Log( LOG_ERR, "Can't delete \"%s\": %s", Error_File, strerror( errno ));
@@ -133,16 +127,7 @@ Log_Exit( VOID )
} /* Log_Exit */ } /* Log_Exit */
#ifdef PROTOTYPES GLOBAL VOID Log( INT Level, CONST CHAR *Format, ... )
GLOBAL VOID
Log( INT Level, CONST CHAR *Format, ... )
#else
GLOBAL VOID
Log( Level, Format, va_alist )
INT Level;
CONST CHAR *Format;
va_dcl
#endif
{ {
/* Eintrag in Logfile(s) schreiben */ /* Eintrag in Logfile(s) schreiben */
@@ -167,27 +152,15 @@ va_dcl
#endif #endif
/* String mit variablen Argumenten zusammenbauen ... */ /* String mit variablen Argumenten zusammenbauen ... */
#ifdef PROTOTYPES
va_start( ap, Format ); va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap ); vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
va_end( ap ); va_end( ap );
if( NGIRCd_NoDaemon ) if( NGIRCd_NoDaemon )
{ {
/* auf Konsole ausgeben */ /* auf Konsole ausgeben */
fprintf( stdout, "[%d] %s\n", Level, msg ); printf( "[%d] %s\n", Level, msg );
fflush( stdout );
} }
#ifdef USE_SYSLOG
else
{
/* Syslog */
syslog( Level, "%s", msg );
}
#endif
if( Level <= LOG_CRIT ) if( Level <= LOG_CRIT )
{ {
@@ -196,6 +169,11 @@ va_dcl
fflush( stderr ); fflush( stderr );
} }
#ifdef USE_SYSLOG
/* Syslog */
syslog( Level, msg );
#endif
if( snotice ) if( snotice )
{ {
/* NOTICE an lokale User mit "s"-Mode */ /* NOTICE an lokale User mit "s"-Mode */
@@ -204,8 +182,7 @@ va_dcl
} /* Log */ } /* Log */
GLOBAL VOID GLOBAL VOID Log_Init_Resolver( VOID )
Log_Init_Resolver( VOID )
{ {
#ifdef USE_SYSLOG #ifdef USE_SYSLOG
openlog( PACKAGE, LOG_CONS|LOG_PID, LOG_LOCAL5 ); openlog( PACKAGE, LOG_CONS|LOG_PID, LOG_LOCAL5 );
@@ -213,8 +190,7 @@ Log_Init_Resolver( VOID )
} /* Log_Init_Resolver */ } /* Log_Init_Resolver */
GLOBAL VOID GLOBAL VOID Log_Exit_Resolver( VOID )
Log_Exit_Resolver( VOID )
{ {
#ifdef USE_SYSLOG #ifdef USE_SYSLOG
closelog( ); closelog( );
@@ -222,16 +198,7 @@ Log_Exit_Resolver( VOID )
} /* Log_Exit_Resolver */ } /* Log_Exit_Resolver */
#ifdef PROTOTYPES GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... )
GLOBAL VOID
Log_Resolver( CONST INT Level, CONST CHAR *Format, ... )
#else
GLOBAL VOID
Log_Resolver( Level, Format, va_alist )
CONST INT Level;
CONST CHAR *Format;
va_dcl
#endif
{ {
/* Eintrag des Resolver in Logfile(s) schreiben */ /* Eintrag des Resolver in Logfile(s) schreiben */
@@ -244,8 +211,6 @@ va_dcl
assert( Format != NULL ); assert( Format != NULL );
if( NGIRCd_NoDaemon ) return;
#ifdef DEBUG #ifdef DEBUG
if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return; if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return;
#else #else
@@ -253,11 +218,7 @@ va_dcl
#endif #endif
/* String mit variablen Argumenten zusammenbauen ... */ /* String mit variablen Argumenten zusammenbauen ... */
#ifdef PROTOTYPES
va_start( ap, Format ); va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap ); vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
va_end( ap ); va_end( ap );
@@ -268,8 +229,7 @@ va_dcl
} /* Log_Resolver */ } /* Log_Resolver */
LOCAL VOID LOCAL VOID Wall_ServerNotice( CHAR *Msg )
Wall_ServerNotice( CHAR *Msg )
{ {
/* Server-Notice an entsprechende User verschicken */ /* Server-Notice an entsprechende User verschicken */

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: log.h,v 1.12 2002/05/27 13:09:27 alex Exp $ * $Id: log.h,v 1.11 2002/03/29 23:33:42 alex Exp $
* *
* log.h: Logging-Funktionen (Header) * log.h: Logging-Funktionen (Header)
*/ */
@@ -36,16 +36,16 @@
#define LOG_snotice 1024 #define LOG_snotice 1024
GLOBAL VOID Log_Init PARAMS((VOID )); GLOBAL VOID Log_Init( VOID );
GLOBAL VOID Log_Exit PARAMS((VOID )); GLOBAL VOID Log_Exit( VOID );
GLOBAL VOID Log_InitErrorfile PARAMS((VOID )); GLOBAL VOID Log_InitErrorfile( VOID );
GLOBAL VOID Log PARAMS((INT Level, CONST CHAR *Format, ... )); GLOBAL VOID Log( INT Level, CONST CHAR *Format, ... );
GLOBAL VOID Log_Init_Resolver PARAMS((VOID )); GLOBAL VOID Log_Init_Resolver( VOID );
GLOBAL VOID Log_Exit_Resolver PARAMS((VOID )); GLOBAL VOID Log_Exit_Resolver( VOID );
GLOBAL VOID Log_Resolver PARAMS((CONST INT Level, CONST CHAR *Format, ... )); GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... );
#endif #endif

View File

@@ -1,254 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: match.c,v 1.1 2002/06/26 15:42:58 alex Exp $
*
* match.c: Wildcard Pattern Matching
*/
#include "portab.h"
#include "imp.h"
#include <assert.h>
#include <string.h>
#include "exp.h"
#include "match.h"
/*
* Die Pattern-Matching-Funkionen [Matche(), Matche_After_Star()] basieren
* auf Versionen von J. Kercheval. Die Version 1.1 wurde am 12.03.1991 als
* "public domain" freigegeben:
* <http://www.snippets.org/snippets/portable/MATCH+C.php3>
*/
LOCAL INT Matche PARAMS(( REGISTER CHAR *p, REGISTER CHAR *t ));
LOCAL INT Matche_After_Star PARAMS(( REGISTER CHAR *p, REGISTER CHAR *t ));
#define MATCH_PATTERN 6 /* bad pattern */
#define MATCH_LITERAL 5 /* match failure on literal match */
#define MATCH_RANGE 4 /* match failure on [..] construct */
#define MATCH_ABORT 3 /* premature end of text string */
#define MATCH_END 2 /* premature end of pattern string */
#define MATCH_VALID 1 /* valid match */
GLOBAL BOOLEAN
Match( CHAR *Pattern, CHAR *String )
{
/* Pattern mit String vergleichen */
if( Matche( Pattern, String ) == MATCH_VALID ) return TRUE;
else return FALSE;
} /* Match */
LOCAL INT
Matche( REGISTER CHAR *p, REGISTER CHAR *t )
{
REGISTER CHAR range_start, range_end;
BOOLEAN invert;
BOOLEAN member_match;
BOOLEAN loop;
for( ; *p; p++, t++ )
{
/* if this is the end of the text then this is the end of the match */
if( ! *t )
{
return ( *p == '*' && *++p == '\0' ) ? MATCH_VALID : MATCH_ABORT;
}
/* determine and react to pattern type */
switch( *p )
{
case '?': /* single any character match */
break;
case '*': /* multiple any character match */
return Matche_After_Star( p, t );
case '[': /* [..] construct, single member/exclusion character match */
/* move to beginning of range */
p++;
/* check if this is a member match or exclusion match */
invert = FALSE;
if( *p == '!' || *p == '^' )
{
invert = TRUE;
p++;
}
/* if closing bracket here or at range start then we have a malformed pattern */
if ( *p == ']' ) return MATCH_PATTERN;
member_match = FALSE;
loop = TRUE;
while( loop )
{
/* if end of construct then loop is done */
if( *p == ']' )
{
loop = FALSE;
continue;
}
/* matching a '!', '^', '-', '\' or a ']' */
if( *p == '\\' ) range_start = range_end = *++p;
else range_start = range_end = *p;
/* if end of pattern then bad pattern (Missing ']') */
if( ! *p ) return MATCH_PATTERN;
/* check for range bar */
if( *++p == '-' )
{
/* get the range end */
range_end = *++p;
/* if end of pattern or construct then bad pattern */
if( range_end == '\0' || range_end == ']' ) return MATCH_PATTERN;
/* special character range end */
if( range_end == '\\' )
{
range_end = *++p;
/* if end of text then we have a bad pattern */
if ( ! range_end ) return MATCH_PATTERN;
}
/* move just beyond this range */
p++;
}
/* if the text character is in range then match found. make sure the range
* letters have the proper relationship to one another before comparison */
if( range_start < range_end )
{
if( *t >= range_start && *t <= range_end )
{
member_match = TRUE;
loop = FALSE;
}
}
else
{
if( *t >= range_end && *t <= range_start )
{
member_match = TRUE;
loop = FALSE;
}
}
}
/* if there was a match in an exclusion set then no match */
/* if there was no match in a member set then no match */
if(( invert && member_match ) || ! ( invert || member_match )) return MATCH_RANGE;
/* if this is not an exclusion then skip the rest of the [...]
* construct that already matched. */
if( member_match )
{
while( *p != ']' )
{
/* bad pattern (Missing ']') */
if( ! *p ) return MATCH_PATTERN;
/* skip exact match */
if( *p == '\\' )
{
p++;
/* if end of text then we have a bad pattern */
if( ! *p ) return MATCH_PATTERN;
}
/* move to next pattern char */
p++;
}
}
break;
case '\\': /* next character is quoted and must match exactly */
/* move pattern pointer to quoted char and fall through */
p++;
/* if end of text then we have a bad pattern */
if( ! *p ) return MATCH_PATTERN;
/* must match this character exactly */
default:
if( *p != *t ) return MATCH_LITERAL;
}
}
/* if end of text not reached then the pattern fails */
if( *t ) return MATCH_END;
else return MATCH_VALID;
} /* Matche */
LOCAL INT
Matche_After_Star( REGISTER CHAR *p, REGISTER CHAR *t )
{
REGISTER INT nextp, match = 0;
/* pass over existing ? and * in pattern */
while( *p == '?' || *p == '*' )
{
/* take one char for each ? and + */
if (*p == '?')
{
/* if end of text then no match */
if( ! *t++ ) return MATCH_ABORT;
}
/* move to next char in pattern */
p++;
}
/* if end of pattern we have matched regardless of text left */
if( ! *p ) return MATCH_VALID;
/* get the next character to match which must be a literal or '[' */
nextp = *p;
if( nextp == '\\' )
{
nextp = p[1];
/* if end of text then we have a bad pattern */
if( ! nextp ) return MATCH_PATTERN;
}
/* Continue until we run out of text or definite result seen */
do
{
/* a precondition for matching is that the next character
* in the pattern match the next character in the text or that
* the next pattern char is the beginning of a range. Increment
* text pointer as we go here */
if( nextp == *t || nextp == '[' ) match = Matche( p, t );
/* if the end of text is reached then no match */
if( ! *t++ ) match = MATCH_ABORT;
} while( match != MATCH_VALID && match != MATCH_ABORT && match != MATCH_PATTERN );
/* return result */
return match;
} /* Matche_After_Star */
/* -eof- */

View File

@@ -1,28 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: match.h,v 1.1 2002/06/26 15:42:58 alex Exp $
*
* match.h: Wildcard Pattern Matching (Header)
*/
#ifndef __match_h__
#define __match_h__
GLOBAL BOOLEAN Match PARAMS(( CHAR *Pattern, CHAR *String ));
#endif
/* -eof- */

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: messages.h,v 1.46.2.4 2002/11/22 22:55:05 alex Exp $ * $Id: messages.h,v 1.37.2.1 2002/04/29 14:11:23 alex Exp $
* *
* irc.h: IRC-Befehle (Header) * irc.h: IRC-Befehle (Header)
*/ */
@@ -19,84 +19,187 @@
#define __messages_h__ #define __messages_h__
#define RPL_WELCOME_MSG "001 %s :Welcome to the Internet Relay Network %s" #define RPL_WELCOME "001"
#define RPL_YOURHOST_MSG "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)" #define RPL_WELCOME_MSG RPL_WELCOME" %s :Welcome to the Internet Relay Network %s"
#define RPL_CREATED_MSG "003 %s :This server has been started %s"
#define RPL_MYINFO_MSG "004 %s %s ngircd-%s %s %s"
#define RPL_UMODEIS_MSG "221 %s +%s"
#define RPL_LUSERCLIENT_MSG "251 %s :There are %ld users and %ld services on %ld servers"
#define RPL_LUSEROP_MSG "252 %s %ld :operator(s) online"
#define RPL_LUSERUNKNOWN_MSG "253 %s %ld :unknown connection(s)"
#define RPL_LUSERCHANNELS_MSG "254 %s %ld :channels formed"
#define RPL_LUSERME_MSG "255 %s :I have %ld users, %ld services and %ld servers"
#define RPL_ADMINME_MSG "256 %s %s :Administrative info"
#define RPL_ADMINLOC1_MSG "257 %s :%s"
#define RPL_ADMINLOC2_MSG "258 %s :%s"
#define RPL_ADMINEMAIL_MSG "259 %s :%s"
#define RPL_AWAY_MSG "301 %s %s :%s" #define RPL_YOURHOST "002"
#define RPL_USERHOST_MSG "302 %s :" #define RPL_YOURHOST_MSG RPL_YOURHOST" %s :Your host is %s, running ngircd "VERSION"-"TARGET_CPU"/"TARGET_VENDOR"/"TARGET_OS
#define RPL_ISON_MSG "303 %s :"
#define RPL_UNAWAY_MSG "305 %s :You are no longer marked as being away"
#define RPL_NOWAWAY_MSG "306 %s :You have been marked as being away"
#define RPL_WHOISUSER_MSG "311 %s %s %s %s * :%s"
#define RPL_WHOISSERVER_MSG "312 %s %s %s :%s"
#define RPL_WHOISOPERATOR_MSG "313 %s %s :is an IRC operator"
#define RPL_ENDOFWHO_MSG "315 %s %s :End of WHO list"
#define RPL_WHOISIDLE_MSG "317 %s %s %ld :seconds idle"
#define RPL_ENDOFWHOIS_MSG "318 %s %s :End of WHOIS list"
#define RPL_WHOISCHANNELS_MSG "319 %s %s :"
#define RPL_LIST_MSG "322 %s %s %ld :%s"
#define RPL_LISTEND_MSG "323 %s :End of LIST"
#define RPL_CHANNELMODEIS_MSG "324 %s %s +%s"
#define RPL_NOTOPIC_MSG "331 %s %s :No topic is set"
#define RPL_TOPIC_MSG "332 %s %s :%s"
#define RPL_INVITING_MSG "341 %s %s %s"
#define RPL_INVITELIST_MSG "346 %s %s %s"
#define RPL_ENDOFINVITELIST_MSG "347 %s %s :End of channel invite list"
#define RPL_VERSION_MSG "351 %s %s-%s.%s %s :%s"
#define RPL_WHOREPLY_MSG "352 %s %s %s %s %s %s %s :%d %s"
#define RPL_NAMREPLY_MSG "353 %s %s %s :"
#define RPL_LINKS_MSG "364 %s %s %s :%d %s"
#define RPL_ENDOFLINKS_MSG "365 %s %s :End of LINKS list"
#define RPL_ENDOFNAMES_MSG "366 %s %s :End of NAMES list"
#define RPL_BANLIST_MSG "367 %s %s %s"
#define RPL_ENDOFBANLIST_MSG "368 %s %s :End of channel ban list"
#define RPL_MOTD_MSG "372 %s :- %s"
#define RPL_MOTDSTART_MSG "375 %s :- %s message of the day"
#define RPL_ENDOFMOTD_MSG "376 %s :End of MOTD command"
#define RPL_YOUREOPER_MSG "381 %s :You are now an IRC Operator"
#define ERR_NOSUCHNICK_MSG "401 %s %s :No such nick or channel name" #define RPL_CREATED "003"
#define ERR_NOSUCHSERVER_MSG "402 %s %s :No such server" #define RPL_CREATED_MSG RPL_CREATED" %s :This server was started %s"
#define ERR_NOSUCHCHANNEL_MSG "403 %s %s :No such channel"
#define ERR_CANNOTSENDTOCHAN_MSG "404 %s %s :Cannot send to channel"
#define ERR_NOORIGIN_MSG "409 %s :No origin specified"
#define ERR_NORECIPIENT_MSG "411 %s :No receipient given (%s)"
#define ERR_NOTEXTTOSEND_MSG "412 %s :No text to send"
#define ERR_UNKNOWNCOMMAND_MSG "421 %s %s :Unknown command"
#define ERR_NOMOTD_MSG "422 %s :MOTD file is missing"
#define ERR_ERRONEUSNICKNAME_MSG "432 %s %s :Erroneous nickname"
#define ERR_NICKNAMEINUSE_MSG "433 %s %s :Nickname already in use"
#define ERR_USERNOTINCHANNEL_MSG "441 %s %s %s :They aren't on that channel"
#define ERR_NOTONCHANNEL_MSG "442 %s %s :You are not on that channel"
#define ERR_USERONCHANNEL_MSG "443 %s %s %s :is already on channel"
#define ERR_NOTREGISTERED_MSG "451 %s :Connection not registered"
#define ERR_NOTREGISTEREDSERVER_MSG "451 %s :Connection not registered as server link"
#define ERR_NEEDMOREPARAMS_MSG "461 %s %s :Syntax error"
#define ERR_ALREADYREGISTRED_MSG "462 %s :Connection already registered"
#define ERR_PASSWDMISMATCH_MSG "464 %s: Invalid password"
#define ERR_UNKNOWNMODE_MSG "472 %s: %c :is unknown mode char for %s"
#define ERR_INVITEONLYCHAN_MSG "473 %s %s :Cannot join channel (+i)"
#define ERR_BANNEDFROMCHAN_MSG "474 %s %s :Cannot join channel (+b)"
#define ERR_NOPRIVILEGES_MSG "481 %s :Permission denied"
#define ERR_CHANOPRIVSNEEDED_MSG "482 %s %s :You are not channel operator"
#define ERR_RESTRICTED_MSG "484 %s :Your connection is restricted"
#define ERR_NOOPERHOST_MSG "491 %s :Not configured for your host"
#define ERR_UMODEUNKNOWNFLAG_MSG "501 %s :Unknown mode" #define RPL_MYINFO "004"
#define ERR_UMODEUNKNOWNFLAG2_MSG "501 %s :Unknown mode \"%c%c\"" #define RPL_MYINFO_MSG RPL_MYINFO" %s :%s ngircd-"VERSION" "USERMODES" "CHANMODES
#define ERR_USERSDONTMATCH_MSG "502 %s :Can't set/get mode for other users"
#define RPL_UMODEIS "211"
#define RPL_UMODEIS_MSG RPL_UMODEIS" %s +%s"
#define RPL_LUSERCLIENT "251"
#define RPL_LUSERCLIENT_MSG RPL_LUSERCLIENT" %s :There are %d users and %d services on %d servers"
#define RPL_LUSEROP "252"
#define RPL_LUSEROP_MSG RPL_LUSEROP" %s %d :operator(s) online"
#define RPL_LUSERUNKNOWN "253"
#define RPL_LUSERUNKNOWN_MSG RPL_LUSERUNKNOWN" %s %d :unknown connection(s)"
#define RPL_LUSERCHANNELS "254"
#define RPL_LUSERCHANNELS_MSG RPL_LUSERCHANNELS" %s %d :channels formed"
#define RPL_LUSERME "255"
#define RPL_LUSERME_MSG RPL_LUSERME" %s :I have %d users, %d services and %d servers"
#define RPL_UNAWAY "305"
#define RPL_UNAWAY_MSG RPL_UNAWAY" %s :You are no longer marked as being away"
#define RPL_NOWAWAY "306"
#define RPL_NOWAWAY_MSG RPL_NOWAWAY" %s :You have been marked as being away"
#define RPL_MOTD "372"
#define RPL_MOTD_MSG RPL_MOTD" %s :- %s"
#define RPL_MOTDSTART "375"
#define RPL_MOTDSTART_MSG RPL_MOTDSTART" %s :- %s message of the day"
#define RPL_ENDOFMOTD "376"
#define RPL_ENDOFMOTD_MSG RPL_ENDOFMOTD" %s :End of MOTD command"
#define RPL_AWAY "301"
#define RPL_AWAY_MSG RPL_AWAY" %s %s :%s"
#define RPL_USERHOST "302"
#define RPL_USERHOST_MSG RPL_USERHOST" %s :"
#define RPL_ISON "303"
#define RPL_ISON_MSG RPL_ISON" %s :"
#define RPL_WHOISUSER "311"
#define RPL_WHOISUSER_MSG RPL_WHOISUSER" %s %s %s %s * :%s"
#define RPL_WHOISSERVER "312"
#define RPL_WHOISSERVER_MSG RPL_WHOISSERVER" %s %s %s :%s"
#define RPL_WHOISOPERATOR "313"
#define RPL_WHOISOPERATOR_MSG RPL_WHOISOPERATOR" %s %s :is an IRC operator"
#define RPL_ENDOFWHO "315"
#define RPL_ENDOFWHO_MSG RPL_ENDOFWHO" %s %s :End of WHO list"
#define RPL_WHOISIDLE "317"
#define RPL_WHOISIDLE_MSG RPL_WHOISIDLE" %s %s %ld :seconds idle"
#define RPL_ENDOFWHOIS "318"
#define RPL_ENDOFWHOIS_MSG RPL_ENDOFWHOIS" %s %s :End of WHOIS list"
#define RPL_WHOISCHANNELS "319"
#define RPL_WHOISCHANNELS_MSG RPL_WHOISCHANNELS" %s %s :"
#define RPL_LIST "322"
#define RPL_LIST_MSG RPL_LIST" %s %s %d :%s"
#define RPL_LISTEND "323"
#define RPL_LISTEND_MSG RPL_LISTEND" %s :End of LIST"
#define RPL_CHANNELMODEIS "324"
#define RPL_CHANNELMODEIS_MSG RPL_CHANNELMODEIS" %s %s +%s"
#define RPL_NOTOPIC "331"
#define RPL_NOTOPIC_MSG RPL_NOTOPIC" %s %s :No topic is set"
#define RPL_TOPIC "332"
#define RPL_TOPIC_MSG RPL_TOPIC" %s %s :%s"
#define RPL_VERSION "351"
#define RPL_VERSION_MSG RPL_VERSION" %s "PACKAGE"-"VERSION".%s %s :%s"
#define RPL_WHOREPLY "352"
#define RPL_WHOREPLY_MSG RPL_WHOREPLY" %s %s %s %s %s %s %s :%d %s"
#define RPL_NAMREPLY "353"
#define RPL_NAMREPLY_MSG RPL_NAMREPLY" %s %s %s :"
#define RPL_LINKS "364"
#define RPL_LINKS_MSG RPL_LINKS" %s %s %s :%d %s"
#define RPL_ENDOFLINKS "365"
#define RPL_ENDOFLINKS_MSG RPL_ENDOFLINKS" %s %s :End of LINKS list"
#define RPL_ENDOFNAMES "366"
#define RPL_ENDOFNAMES_MSG RPL_ENDOFNAMES" %s %s :End of NAMES list"
#define RPL_YOUREOPER "381"
#define RPL_YOUREOPER_MSG RPL_YOUREOPER" %s :You are now an IRC Operator"
#define ERR_NOSUCHNICK "401"
#define ERR_NOSUCHNICK_MSG ERR_NOSUCHNICK" %s %s :No such nick or channel name"
#define ERR_NOSUCHSERVER "402"
#define ERR_NOSUCHSERVER_MSG ERR_NOSUCHSERVER" %s %s :No such server"
#define ERR_NOSUCHCHANNEL "403"
#define ERR_NOSUCHCHANNEL_MSG ERR_NOSUCHCHANNEL" %s %s :No such channel"
#define ERR_CANNOTSENDTOCHAN "404"
#define ERR_CANNOTSENDTOCHAN_MSG ERR_CANNOTSENDTOCHAN" %s %s :Cannot send to channel"
#define ERR_NOORIGIN "409"
#define ERR_NOORIGIN_MSG ERR_NOORIGIN" %s :No origin specified"
#define ERR_NORECIPIENT "411"
#define ERR_NORECIPIENT_MSG ERR_NORECIPIENT" %s :No receipient given (%s)"
#define ERR_NOTEXTTOSEND "412"
#define ERR_NOTEXTTOSEND_MSG ERR_NOTEXTTOSEND" %s :No text to send"
#define ERR_UNKNOWNCOMMAND "421"
#define ERR_UNKNOWNCOMMAND_MSG ERR_UNKNOWNCOMMAND" %s %s :Unknown command"
#define ERR_NOMOTD "422"
#define ERR_NOMOTD_MSG ERR_NOMOTD" %s :MOTD file is missing"
#define ERR_ERRONEUSNICKNAME "432"
#define ERR_ERRONEUSNICKNAME_MSG ERR_ERRONEUSNICKNAME" %s %s :Erroneous nickname"
#define ERR_NICKNAMEINUSE "433"
#define ERR_NICKNAMEINUSE_MSG ERR_NICKNAMEINUSE" %s %s :Nickname already in use"
#define ERR_NOTONCHANNEL "442"
#define ERR_NOTONCHANNEL_MSG ERR_NOTONCHANNEL" %s %s :You are not on that channel"
#define ERR_NOTREGISTERED "451"
#define ERR_NOTREGISTERED_MSG ERR_NOTREGISTERED" %s :Connection not registered"
#define ERR_NOTREGISTEREDSERVER_MSG ERR_NOTREGISTERED" %s :Connection not registered as server link"
#define ERR_NEEDMOREPARAMS "461"
#define ERR_NEEDMOREPARAMS_MSG ERR_NEEDMOREPARAMS" %s %s :Syntax error"
#define ERR_ALREADYREGISTRED "462"
#define ERR_ALREADYREGISTRED_MSG ERR_ALREADYREGISTRED" %s :Connection already registered"
#define ERR_PASSWDMISMATCH "464"
#define ERR_PASSWDMISMATCH_MSG ERR_PASSWDMISMATCH" %s: Invalid password"
#define ERR_NOPRIVILEGES "481"
#define ERR_NOPRIVILEGES_MSG ERR_NOPRIVILEGES" %s :Permission denied"
#define ERR_CHANOPRIVSNEEDED "482"
#define ERR_CHANOPRIVSNEEDED_MSG ERR_CHANOPRIVSNEEDED" %s %s :You are not channel operator"
#define ERR_RESTRICTED "484"
#define ERR_RESTRICTED_MSG ERR_RESTRICTED" %s :Your connection is restricted"
#define ERR_NOOPERHOST "491"
#define ERR_NOOPERHOST_MSG ERR_NOOPERHOST" %s :Not configured for your host"
#define ERR_UMODEUNKNOWNFLAG "501"
#define ERR_UMODEUNKNOWNFLAG_MSG ERR_UMODEUNKNOWNFLAG" %s :Unknown mode"
#define ERR_UMODEUNKNOWNFLAG2_MSG ERR_UMODEUNKNOWNFLAG" %s :Unknown mode \"%c%c\""
#define ERR_USERSDONTMATCH "502"
#define ERR_USERSDONTMATCH_MSG ERR_USERSDONTMATCH" %s :Can't set/get mode for other users"
#endif #endif

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: ngircd.c,v 1.54.2.4 2002/11/24 15:25:25 alex Exp $ * $Id: ngircd.c,v 1.41.2.2 2002/04/08 18:07:42 alex Exp $
* *
* ngircd.c: Hier beginnt alles ;-) * ngircd.c: Hier beginnt alles ;-)
*/ */
@@ -26,47 +26,37 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <time.h> #include <time.h>
#include <pwd.h>
#include <grp.h>
#include "resolve.h"
#include "conn.h"
#include "client.h"
#include "channel.h" #include "channel.h"
#include "client.h"
#include "conf.h" #include "conf.h"
#include "conn.h"
#include "defines.h" #include "defines.h"
#include "lists.h" #include "irc.h"
#include "log.h" #include "log.h"
#include "parse.h" #include "parse.h"
#include "irc.h"
#include "exp.h" #include "exp.h"
#include "ngircd.h" #include "ngircd.h"
LOCAL VOID Initialize_Signal_Handler PARAMS(( VOID )); LOCAL VOID Initialize_Signal_Handler( VOID );
LOCAL VOID Signal_Handler PARAMS(( INT Signal )); LOCAL VOID Signal_Handler( INT Signal );
LOCAL VOID Initialize_Listen_Ports PARAMS(( VOID )); LOCAL VOID Initialize_Listen_Ports( VOID );
LOCAL VOID Show_Version PARAMS(( VOID )); LOCAL VOID Show_Version( VOID );
LOCAL VOID Show_Help PARAMS(( VOID )); LOCAL VOID Show_Help( VOID );
GLOBAL int GLOBAL int main( int argc, const char *argv[] )
main( int argc, const char *argv[] )
{ {
struct passwd *pwd;
struct group *grp;
BOOLEAN ok, configtest = FALSE; BOOLEAN ok, configtest = FALSE;
LONG pid, n; INT32 pid, n;
INT i; INT i;
umask( 0077 );
NGIRCd_Restart = FALSE; NGIRCd_Restart = FALSE;
NGIRCd_Quit = FALSE; NGIRCd_Quit = FALSE;
NGIRCd_NoDaemon = FALSE; NGIRCd_NoDaemon = FALSE;
@@ -144,7 +134,7 @@ main( int argc, const char *argv[] )
{ {
/* Kurze Option */ /* Kurze Option */
for( n = 1; n < (LONG)strlen( argv[i] ); n++ ) for( n = 1; n < (INT32)strlen( argv[i] ); n++ )
{ {
ok = FALSE; ok = FALSE;
#ifdef DEBUG #ifdef DEBUG
@@ -163,7 +153,7 @@ main( int argc, const char *argv[] )
NGIRCd_ConfFile[FNAME_LEN - 1] = '\0'; NGIRCd_ConfFile[FNAME_LEN - 1] = '\0';
/* zum uebernaechsten Parameter */ /* zum uebernaechsten Parameter */
i++; n = (LONG)strlen( argv[i] ); i++; n = strlen( argv[i] );
ok = TRUE; ok = TRUE;
} }
} }
@@ -187,8 +177,8 @@ main( int argc, const char *argv[] )
if( ! ok ) if( ! ok )
{ {
printf( "%s: invalid option \"-%c\"!\n", PACKAGE, argv[i][n] ); printf( PACKAGE": invalid option \"-%c\"!\n", argv[i][n] );
printf( "Try \"%s --help\" for more information.\n", PACKAGE ); puts( "Try \""PACKAGE" --help\" for more information." );
exit( 1 ); exit( 1 );
} }
} }
@@ -196,8 +186,8 @@ main( int argc, const char *argv[] )
} }
if( ! ok ) if( ! ok )
{ {
printf( "%s: invalid option \"%s\"!\n", PACKAGE, argv[i] ); printf( PACKAGE": invalid option \"%s\"!\n", argv[i] );
printf( "Try \"%s --help\" for more information.\n", PACKAGE ); puts( "Try \""PACKAGE" --help\" for more information." );
exit( 1 ); exit( 1 );
} }
} }
@@ -208,11 +198,7 @@ main( int argc, const char *argv[] )
if( NGIRCd_Debug ) strcpy( NGIRCd_DebugLevel, "1" ); if( NGIRCd_Debug ) strcpy( NGIRCd_DebugLevel, "1" );
#endif #endif
#ifdef SNIFFER #ifdef SNIFFER
if( NGIRCd_Sniffer ) if( NGIRCd_Sniffer ) strcpy( NGIRCd_DebugLevel, "2" );
{
NGIRCd_Debug = TRUE;
strcpy( NGIRCd_DebugLevel, "2" );
}
#endif #endif
/* Soll nur die Konfigurations ueberprueft und ausgegeben werden? */ /* Soll nur die Konfigurations ueberprueft und ausgegeben werden? */
@@ -231,7 +217,7 @@ main( int argc, const char *argv[] )
if( ! NGIRCd_NoDaemon ) if( ! NGIRCd_NoDaemon )
{ {
/* Daemon im Hintergrund erzeugen */ /* Daemon im Hintergrund erzeugen */
pid = (LONG)fork( ); pid = (INT32)fork( );
if( pid > 0 ) if( pid > 0 )
{ {
/* "alter" Prozess */ /* "alter" Prozess */
@@ -240,7 +226,7 @@ main( int argc, const char *argv[] )
if( pid < 0 ) if( pid < 0 )
{ {
/* Fehler */ /* Fehler */
printf( "%s: Can't fork: %s!\nFatal error, exiting now ...\n", PACKAGE, strerror( errno )); printf( PACKAGE": Can't fork: %s!\nFatal error, exiting now ...", strerror( errno ));
exit( 1 ); exit( 1 );
} }
@@ -257,9 +243,7 @@ main( int argc, const char *argv[] )
/* Module initialisieren */ /* Module initialisieren */
Log_Init( ); Log_Init( );
Resolve_Init( );
Conf_Init( ); Conf_Init( );
Lists_Init( );
Channel_Init( ); Channel_Init( );
Client_Init( ); Client_Init( );
Conn_Init( ); Conn_Init( );
@@ -279,43 +263,28 @@ main( int argc, const char *argv[] )
if( setuid( Conf_UID ) != 0 ) Log( LOG_ERR, "Can't change User-ID to %u: %s", Conf_UID, strerror( errno )); if( setuid( Conf_UID ) != 0 ) Log( LOG_ERR, "Can't change User-ID to %u: %s", Conf_UID, strerror( errno ));
} }
} }
Log( LOG_INFO, "Running as user %ld, group %ld.", (INT32)getuid( ), (INT32)getgid( ));
/* User, Gruppe und Prozess-ID des Daemon ausgeben */
pwd = getpwuid( getuid( )); grp = getgrgid( getgid( ));
Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", pwd ? pwd->pw_name : "unknown", (LONG)getuid( ), grp ? grp->gr_name : "unknown", (LONG)getgid( ), (LONG)getpid( ));
/* stderr in "Error-File" umlenken */
Log_InitErrorfile( ); Log_InitErrorfile( );
/* Signal-Handler initialisieren */ /* Signal-Handler initialisieren */
Initialize_Signal_Handler( ); Initialize_Signal_Handler( );
/* Protokoll- und Server-Identifikation erzeugen. Die vom ngIRCd
* beim PASS-Befehl verwendete Syntax sowie die erweiterten Flags
* sind in doc/Protocol.txt beschrieben. */
#ifdef IRCPLUS
sprintf( NGIRCd_ProtoID, "%s%s %s|%s:%s", PROTOVER, PROTOIRCPLUS, PACKAGE, VERSION, IRCPLUSFLAGS );
if( Conf_OperCanMode ) strcat( NGIRCd_ProtoID, "o" );
#else
sprintf( NGIRCd_ProtoID, "%s%s %s|%s", PROTOVER, PROTOIRC, PACKAGE, VERSION );
#endif
strcat( NGIRCd_ProtoID, " P" );
Log( LOG_DEBUG, "Protocol and server ID is \"%s\".", NGIRCd_ProtoID );
/* Vordefinierte Channels anlegen */
Channel_InitPredefined( );
/* Listen-Ports initialisieren */ /* Listen-Ports initialisieren */
Initialize_Listen_Ports( ); Initialize_Listen_Ports( );
/* Hauptschleife */ /* Hauptschleife */
Conn_Handler( ); while( TRUE )
{
if( NGIRCd_Quit || NGIRCd_Restart ) break;
Conn_Handler( 5 );
}
/* Alles abmelden */ /* Alles abmelden */
Conn_Exit( ); Conn_Exit( );
Client_Exit( ); Client_Exit( );
Channel_Exit( ); Channel_Exit( );
Lists_Exit( ); Conf_Exit( );
Log_Exit( ); Log_Exit( );
} }
@@ -323,18 +292,16 @@ main( int argc, const char *argv[] )
} /* main */ } /* main */
GLOBAL CHAR * GLOBAL CHAR *NGIRCd_Version( VOID )
NGIRCd_Version( VOID )
{ {
STATIC CHAR version[126]; STATIC CHAR version[126];
sprintf( version, "%s %s-%s", PACKAGE, VERSION, NGIRCd_VersionAddition( )); sprintf( version, PACKAGE" version "VERSION"-%s", NGIRCd_VersionAddition( ));
return version; return version;
} /* NGIRCd_Version */ } /* NGIRCd_Version */
GLOBAL CHAR * GLOBAL CHAR *NGIRCd_VersionAddition( VOID )
NGIRCd_VersionAddition( VOID )
{ {
STATIC CHAR txt[64]; STATIC CHAR txt[64];
@@ -344,6 +311,10 @@ NGIRCd_VersionAddition( VOID )
if( txt[0] ) strcat( txt, "+" ); if( txt[0] ) strcat( txt, "+" );
strcat( txt, "SYSLOG" ); strcat( txt, "SYSLOG" );
#endif #endif
#ifdef STRICT_RFC
if( txt[0] ) strcat( txt, "+" );
strcat( txt, "RFC" );
#endif
#ifdef DEBUG #ifdef DEBUG
if( txt[0] ) strcat( txt, "+" ); if( txt[0] ) strcat( txt, "+" );
strcat( txt, "DEBUG" ); strcat( txt, "DEBUG" );
@@ -352,28 +323,15 @@ NGIRCd_VersionAddition( VOID )
if( txt[0] ) strcat( txt, "+" ); if( txt[0] ) strcat( txt, "+" );
strcat( txt, "SNIFFER" ); strcat( txt, "SNIFFER" );
#endif #endif
#ifdef STRICT_RFC
if( txt[0] ) strcat( txt, "+" );
strcat( txt, "RFC" );
#endif
#ifdef IRCPLUS
if( txt[0] ) strcat( txt, "+" );
strcat( txt, "IRCPLUS" );
#endif
if( txt[0] ) strcat( txt, "-" ); if( txt[0] ) strcat( txt, "-" );
strcat( txt, TARGET_CPU ); strcat( txt, TARGET_CPU"/"TARGET_VENDOR"/"TARGET_OS );
strcat( txt, "/" );
strcat( txt, TARGET_VENDOR );
strcat( txt, "/" );
strcat( txt, TARGET_OS );
return txt; return txt;
} /* NGIRCd_VersionAddition */ } /* NGIRCd_VersionAddition */
LOCAL VOID LOCAL VOID Initialize_Signal_Handler( VOID )
Initialize_Signal_Handler( VOID )
{ {
/* Signal-Handler initialisieren: einige Signale /* Signal-Handler initialisieren: einige Signale
* werden ignoriert, andere speziell behandelt. */ * werden ignoriert, andere speziell behandelt. */
@@ -419,8 +377,7 @@ Initialize_Signal_Handler( VOID )
} /* Initialize_Signal_Handler */ } /* Initialize_Signal_Handler */
LOCAL VOID LOCAL VOID Signal_Handler( INT Signal )
Signal_Handler( INT Signal )
{ {
/* Signal-Handler. Dieser wird aufgerufen, wenn eines der Signale eintrifft, /* Signal-Handler. Dieser wird aufgerufen, wenn eines der Signale eintrifft,
* fuer das wir uns registriert haben (vgl. Initialize_Signal_Handler). Die * fuer das wir uns registriert haben (vgl. Initialize_Signal_Handler). Die
@@ -453,13 +410,12 @@ Signal_Handler( INT Signal )
} /* Signal_Handler */ } /* Signal_Handler */
LOCAL VOID LOCAL VOID Initialize_Listen_Ports( VOID )
Initialize_Listen_Ports( VOID )
{ {
/* Ports, auf denen der Server Verbindungen entgegennehmen /* Ports, auf denen der Server Verbindungen entgegennehmen
* soll, initialisieren */ * soll, initialisieren */
INT created, i; UINT created, i;
created = 0; created = 0;
for( i = 0; i < Conf_ListenPorts_Count; i++ ) for( i = 0; i < Conf_ListenPorts_Count; i++ )
@@ -471,14 +427,13 @@ Initialize_Listen_Ports( VOID )
if( created < 1 ) if( created < 1 )
{ {
Log( LOG_ALERT, "Server isn't listening on a single port!" ); Log( LOG_ALERT, "Server isn't listening on a single port!" );
Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE ); Log( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
exit( 1 ); exit( 1 );
} }
} /* Initialize_Listen_Ports */ } /* Initialize_Listen_Ports */
LOCAL VOID LOCAL VOID Show_Version( VOID )
Show_Version( VOID )
{ {
puts( NGIRCd_Version( )); puts( NGIRCd_Version( ));
puts( "Copyright (c)2001,2002 by Alexander Barton (<alex@barton.de>)." ); puts( "Copyright (c)2001,2002 by Alexander Barton (<alex@barton.de>)." );
@@ -488,8 +443,7 @@ Show_Version( VOID )
} /* Show_Version */ } /* Show_Version */
LOCAL VOID LOCAL VOID Show_Help( VOID )
Show_Help( VOID )
{ {
#ifdef DEBUG #ifdef DEBUG
puts( " -d, --debug log extra debug messages" ); puts( " -d, --debug log extra debug messages" );

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: ngircd.h,v 1.14 2002/09/02 19:01:11 alex Exp $ * $Id: ngircd.h,v 1.12 2002/03/27 16:40:31 alex Exp $
* *
* ngircd.h: Prototypen aus dem "Haupt-Modul" * ngircd.h: Prototypen aus dem "Haupt-Modul"
*/ */
@@ -45,10 +45,8 @@ GLOBAL CHAR NGIRCd_DebugLevel[2]; /* Debug-Level fuer IRC_VERSION() */
GLOBAL CHAR NGIRCd_ConfFile[FNAME_LEN]; /* Konfigurationsdatei */ GLOBAL CHAR NGIRCd_ConfFile[FNAME_LEN]; /* Konfigurationsdatei */
GLOBAL CHAR NGIRCd_ProtoID[1024]; /* Protokoll- und Server-Identifikation */ GLOBAL CHAR *NGIRCd_Version( VOID );
GLOBAL CHAR *NGIRCd_VersionAddition( VOID );
GLOBAL CHAR *NGIRCd_Version PARAMS((VOID ));
GLOBAL CHAR *NGIRCd_VersionAddition PARAMS((VOID ));
#endif #endif

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: parse.c,v 1.41.2.4 2002/11/29 10:59:51 alex Exp $ * $Id: parse.c,v 1.31.2.1 2002/04/29 14:11:23 alex Exp $
* *
* parse.c: Parsen der Client-Anfragen * parse.c: Parsen der Client-Anfragen
*/ */
@@ -24,10 +24,16 @@
#include <string.h> #include <string.h>
#include "ngircd.h" #include "ngircd.h"
#include "defines.h"
#include "conn.h"
#include "client.h" #include "client.h"
#include "channel.h" #include "conn.h"
#include "defines.h"
#include "irc.h"
#include "irc-channel.h"
#include "irc-login.h"
#include "irc-mode.h"
#include "irc-oper.h"
#include "irc-server.h"
#include "irc-write.h"
#include "log.h" #include "log.h"
#include "messages.h" #include "messages.h"
#include "tool.h" #include "tool.h"
@@ -35,30 +41,19 @@
#include "exp.h" #include "exp.h"
#include "parse.h" #include "parse.h"
#include "imp.h"
#include "irc.h"
#include "irc-channel.h"
#include "irc-login.h"
#include "irc-mode.h"
#include "irc-op.h"
#include "irc-oper.h"
#include "irc-server.h"
#include "irc-write.h"
#include "exp.h" LOCAL VOID Init_Request( REQUEST *Req );
LOCAL BOOLEAN Parse_Error( CONN_ID Idx, CHAR *Error );
LOCAL BOOLEAN Validate_Prefix( REQUEST *Req );
LOCAL BOOLEAN Validate_Command( REQUEST *Req );
LOCAL BOOLEAN Validate_Args( REQUEST *Req );
LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req );
LOCAL VOID Init_Request PARAMS(( REQUEST *Req )); GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
LOCAL BOOLEAN Validate_Prefix PARAMS(( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ));
LOCAL BOOLEAN Validate_Command PARAMS(( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ));
LOCAL BOOLEAN Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ));
LOCAL BOOLEAN Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req ));
GLOBAL BOOLEAN
Parse_Request( CONN_ID Idx, CHAR *Request )
{ {
/* Client-Request parsen. Bei einem schwerwiegenden Fehler wird /* Client-Request parsen. Bei einem schwerwiegenden Fehler wird
* die Verbindung geschlossen und FALSE geliefert. * die Verbindung geschlossen und FALSE geliefert.
@@ -66,7 +61,6 @@ Parse_Request( CONN_ID Idx, CHAR *Request )
REQUEST req; REQUEST req;
CHAR *start, *ptr; CHAR *start, *ptr;
BOOLEAN closed;
assert( Idx >= 0 ); assert( Idx >= 0 );
assert( Request != NULL ); assert( Request != NULL );
@@ -74,7 +68,7 @@ Parse_Request( CONN_ID Idx, CHAR *Request )
#ifdef SNIFFER #ifdef SNIFFER
if( NGIRCd_Sniffer ) Log( LOG_DEBUG, " <- connection %d: '%s'.", Idx, Request ); if( NGIRCd_Sniffer ) Log( LOG_DEBUG, " <- connection %d: '%s'.", Idx, Request );
#endif #endif
Init_Request( &req ); Init_Request( &req );
/* Fuehrendes und folgendes "Geraffel" verwerfen */ /* Fuehrendes und folgendes "Geraffel" verwerfen */
@@ -86,11 +80,7 @@ Parse_Request( CONN_ID Idx, CHAR *Request )
/* Prefix vorhanden */ /* Prefix vorhanden */
req.prefix = Request + 1; req.prefix = Request + 1;
ptr = strchr( Request, ' ' ); ptr = strchr( Request, ' ' );
if( ! ptr ) if( ! ptr ) return Parse_Error( Idx, "Prefix without command!?" );
{
Log( LOG_DEBUG, "Connection %d: Parse error: prefix without command!?", Idx );
return Conn_WriteStr( Idx, "ERROR :Prefix without command!?" );
}
*ptr = '\0'; *ptr = '\0';
#ifndef STRICT_RFC #ifndef STRICT_RFC
/* multiple Leerzeichen als Trenner zwischen /* multiple Leerzeichen als Trenner zwischen
@@ -101,6 +91,8 @@ Parse_Request( CONN_ID Idx, CHAR *Request )
} }
else start = Request; else start = Request;
if( ! Validate_Prefix( &req )) return Parse_Error( Idx, "Invalid prefix");
/* Befehl */ /* Befehl */
ptr = strchr( start, ' ' ); ptr = strchr( start, ' ' );
if( ptr ) if( ptr )
@@ -114,6 +106,8 @@ Parse_Request( CONN_ID Idx, CHAR *Request )
} }
req.command = start; req.command = start;
if( ! Validate_Command( &req )) return Parse_Error( Idx, "Invalid command" );
/* Argumente, Parameter */ /* Argumente, Parameter */
if( ptr ) if( ptr )
{ {
@@ -141,33 +135,29 @@ Parse_Request( CONN_ID Idx, CHAR *Request )
#endif #endif
} }
} }
req.argc++; req.argc++;
if( start[0] == ':' ) break; if( start[0] == ':' ) break;
if( req.argc > 14 ) break; if( req.argc > 14 ) break;
if( ptr ) start = ptr + 1; if( ptr ) start = ptr + 1;
else start = NULL; else start = NULL;
} }
} }
/* Daten validieren */ if( ! Validate_Args( &req )) return Parse_Error( Idx, "Invalid argument(s)" );
if( ! Validate_Prefix( Idx, &req, &closed )) return ! closed;
if( ! Validate_Command( Idx, &req, &closed )) return ! closed;
if( ! Validate_Args( Idx, &req, &closed )) return ! closed;
return Handle_Request( Idx, &req ); return Handle_Request( Idx, &req );
} /* Parse_Request */ } /* Parse_Request */
LOCAL VOID LOCAL VOID Init_Request( REQUEST *Req )
Init_Request( REQUEST *Req )
{ {
/* Neue Request-Struktur initialisieren */ /* Neue Request-Struktur initialisieren */
INT i; INT i;
assert( Req != NULL ); assert( Req != NULL );
Req->prefix = NULL; Req->prefix = NULL;
@@ -177,83 +167,42 @@ Init_Request( REQUEST *Req )
} /* Init_Request */ } /* Init_Request */
LOCAL BOOLEAN LOCAL BOOLEAN Parse_Error( CONN_ID Idx, CHAR *Error )
Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
{ {
CLIENT *client, *c; /* Fehler beim Parsen. Fehlermeldung an den Client schicken.
* TRUE: Connection wurde durch diese Funktion nicht geschlossen,
* FALSE: Connection wurde terminiert. */
assert( Idx >= 0 ); assert( Idx >= 0 );
assert( Error != NULL );
Log( LOG_DEBUG, "Connection %d: Parse error: %s", Idx, Error );
return Conn_WriteStr( Idx, "ERROR :Parse error: %s", Error );
} /* Parse_Error */
LOCAL BOOLEAN Validate_Prefix( REQUEST *Req )
{
assert( Req != NULL ); assert( Req != NULL );
*Closed = FALSE;
/* ist ueberhaupt ein Prefix vorhanden? */
if( ! Req->prefix ) return TRUE;
/* Client-Struktur der Connection ermitteln */
client = Client_GetFromConn( Idx );
assert( client != NULL );
/* nur validieren, wenn bereits registrierte Verbindung */
if(( Client_Type( client ) != CLIENT_USER ) && ( Client_Type( client ) != CLIENT_SERVER ) && ( Client_Type( client ) != CLIENT_SERVICE ))
{
/* noch nicht registrierte Verbindung.
* Das Prefix wird ignoriert. */
Req->prefix = NULL;
return TRUE;
}
/* pruefen, ob der im Prefix angegebene Client bekannt ist */
c = Client_Search( Req->prefix );
if( ! c )
{
/* im Prefix angegebener Client ist nicht bekannt */
Log( LOG_ERR, "Invalid prefix \"%s\", client not known (connection %d, command %s)!?", Req->prefix, Idx, Req->command );
if( ! Conn_WriteStr( Idx, "ERROR :Invalid prefix \"%s\", client not known!?", Req->prefix )) *Closed = TRUE;
return FALSE;
}
/* pruefen, ob der Client mit dem angegebenen Prefix in Richtung
* des Senders liegt, d.h. sicherstellen, dass das Prefix nicht
* gefaelscht ist */
if( Client_NextHop( c ) != client )
{
/* das angegebene Prefix ist aus dieser Richtung, also
* aus der gegebenen Connection, ungueltig! */
Log( LOG_ERR, "Spoofed prefix \"%s\" from \"%s\" (connection %d, command %s)!", Req->prefix, Client_Mask( Client_GetFromConn( Idx )), Idx, Req->command );
Conn_Close( Idx, NULL, "Spoofed prefix", TRUE );
*Closed = TRUE;
return FALSE;
}
return TRUE; return TRUE;
} /* Validate_Prefix */ } /* Validate_Prefix */
LOCAL BOOLEAN LOCAL BOOLEAN Validate_Command( REQUEST *Req )
Validate_Command( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
{ {
assert( Idx >= 0 );
assert( Req != NULL ); assert( Req != NULL );
*Closed = FALSE;
return TRUE; return TRUE;
} /* Validate_Comman */ } /* Validate_Comman */
LOCAL BOOLEAN LOCAL BOOLEAN Validate_Args( REQUEST *Req )
Validate_Args( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
{ {
assert( Idx >= 0 );
assert( Req != NULL ); assert( Req != NULL );
*Closed = FALSE;
return TRUE; return TRUE;
} /* Validate_Args */ } /* Validate_Args */
LOCAL BOOLEAN LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req )
Handle_Request( CONN_ID Idx, REQUEST *Req )
{ {
/* Client-Request verarbeiten. Bei einem schwerwiegenden Fehler /* Client-Request verarbeiten. Bei einem schwerwiegenden Fehler
* wird die Verbindung geschlossen und FALSE geliefert. */ * wird die Verbindung geschlossen und FALSE geliefert. */
@@ -279,8 +228,8 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
else target = NULL; else target = NULL;
if( ! target ) if( ! target )
{ {
if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code %s: \"%s\"", Req->command, Req->argv[0] ); if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code: \"%s\"", Req->argv[0] );
else Log( LOG_WARNING, "Unknown target for status code %s!", Req->command ); else Log( LOG_WARNING, "Unknown target for status code!" );
return TRUE; return TRUE;
} }
if( target == Client_ThisServer( )) if( target == Client_ThisServer( ))
@@ -310,7 +259,7 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
else strcat( str, " :" ); else strcat( str, " :" );
strcat( str, Req->argv[i] ); strcat( str, Req->argv[i] );
} }
return IRC_WriteStrClientPrefix( target, prefix, "%s", str ); return IRC_WriteStrClientPrefix( target, prefix, str );
} }
if( strcasecmp( Req->command, "PASS" ) == 0 ) return IRC_PASS( client, Req ); if( strcasecmp( Req->command, "PASS" ) == 0 ) return IRC_PASS( client, Req );
@@ -344,13 +293,6 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
else if( strcasecmp( Req->command, "TOPIC" ) == 0 ) return IRC_TOPIC( client, Req ); else if( strcasecmp( Req->command, "TOPIC" ) == 0 ) return IRC_TOPIC( client, Req );
else if( strcasecmp( Req->command, "WHO" ) == 0 ) return IRC_WHO( client, Req ); else if( strcasecmp( Req->command, "WHO" ) == 0 ) return IRC_WHO( client, Req );
else if( strcasecmp( Req->command, "LIST" ) == 0 ) return IRC_LIST( client, Req ); else if( strcasecmp( Req->command, "LIST" ) == 0 ) return IRC_LIST( client, Req );
else if( strcasecmp( Req->command, "INVITE" ) == 0 ) return IRC_INVITE( client, Req );
else if( strcasecmp( Req->command, "KICK" ) == 0 ) return IRC_KICK( client, Req );
else if( strcasecmp( Req->command, "CONNECT" ) == 0 ) return IRC_CONNECT( client, Req );
else if( strcasecmp( Req->command, "ADMIN" ) == 0 ) return IRC_ADMIN( client, Req );
#ifdef IRCPLUS
else if( strcasecmp( Req->command, "CHANINFO" ) == 0 ) return IRC_CHANINFO( client, Req );
#endif
/* Unbekannter Befehl */ /* Unbekannter Befehl */
if( Client_Type( client ) != CLIENT_SERVER ) IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( client ), Req->command ); if( Client_Type( client ) != CLIENT_SERVER ) IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( client ), Req->command );

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: parse.h,v 1.7 2002/05/27 13:09:27 alex Exp $ * $Id: parse.h,v 1.6 2002/03/12 14:37:52 alex Exp $
* *
* parse.h: Parsen der Client-Anfragen (Header) * parse.h: Parsen der Client-Anfragen (Header)
*/ */
@@ -18,6 +18,8 @@
#ifndef __parse_h__ #ifndef __parse_h__
#define __parse_h__ #define __parse_h__
#include "conn.h"
typedef struct _REQUEST /* vgl. RFC 2812, 2.3 */ typedef struct _REQUEST /* vgl. RFC 2812, 2.3 */
{ {
@@ -28,7 +30,7 @@ typedef struct _REQUEST /* vgl. RFC 2812, 2.3 */
} REQUEST; } REQUEST;
GLOBAL BOOLEAN Parse_Request PARAMS((CONN_ID Idx, CHAR *Request )); GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request );
#endif #endif

View File

@@ -1,266 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: resolve.c,v 1.3 2002/06/09 13:19:08 alex Exp $
*
* resolve.c: asyncroner Resolver
*/
#include "portab.h"
#include "imp.h"
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include "conn.h"
#include "defines.h"
#include "log.h"
#include "exp.h"
#include "resolve.h"
LOCAL VOID Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, INT w_fd ));
LOCAL VOID Do_ResolveName PARAMS(( CHAR *Host, INT w_fd ));
#ifdef h_errno
LOCAL CHAR *Get_Error PARAMS(( INT H_Error ));
#endif
GLOBAL VOID
Resolve_Init( VOID )
{
/* Modul initialisieren */
FD_ZERO( &Resolver_FDs );
} /* Resolve_Init */
GLOBAL RES_STAT *
Resolve_Addr( struct sockaddr_in *Addr )
{
/* IP (asyncron!) aufloesen. Bei Fehler, z.B. wenn der
* Child-Prozess nicht erzeugt werden kann, wird NULL geliefert.
* Der Host kann dann nicht aufgeloest werden. */
RES_STAT *s;
INT pid;
/* Speicher anfordern */
s = malloc( sizeof( RES_STAT ));
if( ! s )
{
Log( LOG_EMERG, "Resolver: Can't allocate memory! [Resolve_Addr]" );
return NULL;
}
/* Pipe fuer Antwort initialisieren */
if( pipe( s->pipe ) != 0 )
{
free( s );
Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno ));
return NULL;
}
/* Sub-Prozess erzeugen */
pid = fork( );
if( pid > 0 )
{
/* Haupt-Prozess */
Log( LOG_DEBUG, "Resolver for %s created (PID %d).", inet_ntoa( Addr->sin_addr ), pid );
FD_SET( s->pipe[0], &Resolver_FDs );
if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
s->pid = pid;
return s;
}
else if( pid == 0 )
{
/* Sub-Prozess */
Log_Init_Resolver( );
Do_ResolveAddr( Addr, s->pipe[1] );
Log_Exit_Resolver( );
exit( 0 );
}
else
{
/* Fehler */
free( s );
Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
return NULL;
}
} /* Resolve_Addr */
GLOBAL RES_STAT *
Resolve_Name( CHAR *Host )
{
/* Hostnamen (asyncron!) aufloesen. Bei Fehler, z.B. wenn der
* Child-Prozess nicht erzeugt werden kann, wird NULL geliefert.
* Der Host kann dann nicht aufgeloest werden. */
RES_STAT *s;
INT pid;
/* Speicher anfordern */
s = malloc( sizeof( RES_STAT ));
if( ! s )
{
Log( LOG_EMERG, "Resolver: Can't allocate memory! [Resolve_Name]" );
return NULL;
}
/* Pipe fuer Antwort initialisieren */
if( pipe( s->pipe ) != 0 )
{
free( s );
Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno ));
return NULL;
}
/* Sub-Prozess erzeugen */
pid = fork( );
if( pid > 0 )
{
/* Haupt-Prozess */
Log( LOG_DEBUG, "Resolver for \"%s\" created (PID %d).", Host, pid );
FD_SET( s->pipe[0], &Resolver_FDs );
if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
s->pid = pid;
return s;
}
else if( pid == 0 )
{
/* Sub-Prozess */
Log_Init_Resolver( );
Do_ResolveName( Host, s->pipe[1] );
Log_Exit_Resolver( );
exit( 0 );
}
else
{
/* Fehler */
free( s );
Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
return NULL;
}
} /* Resolve_Name */
LOCAL VOID
Do_ResolveAddr( struct sockaddr_in *Addr, INT w_fd )
{
/* Resolver Sub-Prozess: IP aufloesen und Ergebnis in Pipe schreiben. */
CHAR hostname[HOST_LEN];
struct hostent *h;
Log_Resolver( LOG_DEBUG, "Now resolving %s ...", inet_ntoa( Addr->sin_addr ));
/* Namen aufloesen */
h = gethostbyaddr( (CHAR *)&Addr->sin_addr, sizeof( Addr->sin_addr ), AF_INET );
if( h ) strcpy( hostname, h->h_name );
else
{
#ifdef h_errno
Log_Resolver( LOG_WARNING, "Can't resolve address \"%s\": %s!", inet_ntoa( Addr->sin_addr ), Get_Error( h_errno ));
#else
Log_Resolver( LOG_WARNING, "Can't resolve address \"%s\"!", inet_ntoa( Addr->sin_addr ));
#endif
strcpy( hostname, inet_ntoa( Addr->sin_addr ));
}
/* Antwort an Parent schreiben */
if( write( w_fd, hostname, strlen( hostname ) + 1 ) != ( strlen( hostname ) + 1 ))
{
Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent: %s!", strerror( errno ));
close( w_fd );
return;
}
Log_Resolver( LOG_DEBUG, "Ok, translated %s to \"%s\".", inet_ntoa( Addr->sin_addr ), hostname );
} /* Do_ResolveAddr */
LOCAL VOID
Do_ResolveName( CHAR *Host, INT w_fd )
{
/* Resolver Sub-Prozess: Name aufloesen und Ergebnis in Pipe schreiben. */
CHAR ip[16];
struct hostent *h;
struct in_addr *addr;
Log_Resolver( LOG_DEBUG, "Now resolving \"%s\" ...", Host );
/* Namen aufloesen */
h = gethostbyname( Host );
if( h )
{
addr = (struct in_addr *)h->h_addr;
strcpy( ip, inet_ntoa( *addr ));
}
else
{
#ifdef h_errno
Log_Resolver( LOG_WARNING, "Can't resolve \"%s\": %s!", Host, Get_Error( h_errno ));
#else
Log_Resolver( LOG_WARNING, "Can't resolve \"%s\"!", Host );
#endif
strcpy( ip, "" );
}
/* Antwort an Parent schreiben */
if( write( w_fd, ip, strlen( ip ) + 1 ) != ( strlen( ip ) + 1 ))
{
Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent: %s!", strerror( errno ));
close( w_fd );
return;
}
if( ip[0] ) Log_Resolver( LOG_DEBUG, "Ok, translated \"%s\" to %s.", Host, ip );
} /* Do_ResolveName */
#ifdef h_errno
LOCAL CHAR *
Get_Error( INT H_Error )
{
/* Fehlerbeschreibung fuer H_Error liefern */
switch( H_Error )
{
case HOST_NOT_FOUND:
return "host not found";
case NO_DATA:
return "name valid but no IP address defined";
case NO_RECOVERY:
return "name server error";
case TRY_AGAIN:
return "name server temporary not available";
default:
return "unknown error";
}
} /* Get_Error */
#endif
/* -eof- */

View File

@@ -1,48 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: resolve.h,v 1.2 2002/09/16 09:22:41 alex Exp $
*
* resolve.h: asyncroner Resolver (Header)
*/
#ifndef __resolve_h__
#define __resolve_h__
#include <sys/types.h>
#include <netinet/in.h>
#ifdef HAVE_SYS_SELECT_H
# include <sys/select.h>
#endif
typedef struct _Res_Stat
{
INT pid; /* PID des Child-Prozess */
INT pipe[2]; /* Pipe fuer IPC */
} RES_STAT;
GLOBAL fd_set Resolver_FDs;
GLOBAL VOID Resolve_Init PARAMS(( VOID ));
GLOBAL RES_STAT *Resolve_Addr PARAMS(( struct sockaddr_in *Addr ));
GLOBAL RES_STAT *Resolve_Name PARAMS(( CHAR *Host ));
#endif
/* -eof- */

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: tool.c,v 1.9 2002/05/27 13:09:27 alex Exp $ * $Id: tool.c,v 1.8 2002/03/22 00:17:27 alex Exp $
* *
* tool.c: Hilfsfunktionen, ggf. Platformabhaengig * tool.c: Hilfsfunktionen, ggf. Platformabhaengig
*/ */
@@ -27,8 +27,7 @@
#include "tool.h" #include "tool.h"
GLOBAL VOID GLOBAL VOID ngt_TrimStr( CHAR *String )
ngt_TrimStr( CHAR *String )
{ {
/* Mit ngt_TrimStr() werden fuehrende und folgende Leerzeichen, /* Mit ngt_TrimStr() werden fuehrende und folgende Leerzeichen,
* Tabulatoren und Zeilenumbrueche (ASCII 10 und ASCII 13) aus * Tabulatoren und Zeilenumbrueche (ASCII 10 und ASCII 13) aus
@@ -52,8 +51,7 @@ ngt_TrimStr( CHAR *String )
} /* ngt_TrimStr */ } /* ngt_TrimStr */
GLOBAL CHAR * GLOBAL CHAR *ngt_LowerStr( CHAR *String )
ngt_LowerStr( CHAR *String )
{ {
/* String in Kleinbuchstaben konvertieren. Der uebergebene /* String in Kleinbuchstaben konvertieren. Der uebergebene
* Speicherbereich wird durch das Ergebnis ersetzt, zusaetzlich * Speicherbereich wird durch das Ergebnis ersetzt, zusaetzlich

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: tool.h,v 1.8 2002/05/27 13:09:27 alex Exp $ * $Id: tool.h,v 1.7 2002/03/22 00:17:27 alex Exp $
* *
* log.h: Hilfsfunktionen (Header) * log.h: Hilfsfunktionen (Header)
*/ */
@@ -19,9 +19,9 @@
#define __tool_h__ #define __tool_h__
GLOBAL VOID ngt_TrimStr PARAMS((CHAR *String )); GLOBAL VOID ngt_TrimStr( CHAR *String );
GLOBAL CHAR *ngt_LowerStr PARAMS((CHAR *String )); GLOBAL CHAR *ngt_LowerStr( CHAR *String );
#endif #endif

View File

@@ -9,15 +9,9 @@
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
# #
# $Id: Makefile.am,v 1.4 2002/05/22 09:09:43 alex Exp $ # $Id: Makefile.am,v 1.2 2002/03/15 15:41:55 alex Exp $
# #
AUTOMAKE_OPTIONS = ansi2knr
noinst_LIBRARIES = libngportab.a
libngportab_a_SOURCES = vsnprintf.c
check_PROGRAMS = portabtest check_PROGRAMS = portabtest
portabtest_SOURCES = portabtest.c portabtest_SOURCES = portabtest.c

View File

@@ -1,36 +0,0 @@
.TH ANSI2KNR 1 "19 Jan 1996"
.SH NAME
ansi2knr \- convert ANSI C to Kernighan & Ritchie C
.SH SYNOPSIS
.I ansi2knr
[--varargs] input_file [output_file]
.SH DESCRIPTION
If no output_file is supplied, output goes to stdout.
.br
There are no error messages.
.sp
.I ansi2knr
recognizes function definitions by seeing a non-keyword identifier at the left
margin, followed by a left parenthesis, with a right parenthesis as the last
character on the line, and with a left brace as the first token on the
following line (ignoring possible intervening comments). It will recognize a
multi-line header provided that no intervening line ends with a left or right
brace or a semicolon. These algorithms ignore whitespace and comments, except
that the function name must be the first thing on the line.
.sp
The following constructs will confuse it:
.br
- Any other construct that starts at the left margin and follows the
above syntax (such as a macro or function call).
.br
- Some macros that tinker with the syntax of the function header.
.sp
The --varargs switch is obsolete, and is recognized only for
backwards compatibility. The present version of
.I ansi2knr
will always attempt to convert a ... argument to va_alist and va_dcl.
.SH AUTHOR
L. Peter Deutsch <ghost@aladdin.com> wrote the original ansi2knr and
continues to maintain the current version; most of the code in the current
version is his work. ansi2knr also includes contributions by Francois
Pinard <pinard@iro.umontreal.ca> and Jim Avera <jima@netcom.com>.

View File

@@ -1,738 +0,0 @@
/* Copyright (C) 1989, 2000 Aladdin Enterprises. All rights reserved. */
/* Convert ANSI C function definitions to K&R ("traditional C") syntax */
/*
ansi2knr is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY. No author or distributor accepts responsibility to anyone for the
consequences of using it or for whether it serves any particular purpose or
works at all, unless he says so in writing. Refer to the GNU General Public
License (the "GPL") for full details.
Everyone is granted permission to copy, modify and redistribute ansi2knr,
but only under the conditions described in the GPL. A copy of this license
is supposed to have been given to you along with ansi2knr so you can know
your rights and responsibilities. It should be in a file named COPYLEFT,
or, if there is no file named COPYLEFT, a file named COPYING. Among other
things, the copyright notice and this notice must be preserved on all
copies.
We explicitly state here what we believe is already implied by the GPL: if
the ansi2knr program is distributed as a separate set of sources and a
separate executable file which are aggregated on a storage medium together
with another program, this in itself does not bring the other program under
the GPL, nor does the mere fact that such a program or the procedures for
constructing it invoke the ansi2knr executable bring any other part of the
program under the GPL.
*/
/*
* Usage:
ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]]
* --filename provides the file name for the #line directive in the output,
* overriding input_file (if present).
* If no input_file is supplied, input is read from stdin.
* If no output_file is supplied, output goes to stdout.
* There are no error messages.
*
* ansi2knr recognizes function definitions by seeing a non-keyword
* identifier at the left margin, followed by a left parenthesis, with a
* right parenthesis as the last character on the line, and with a left
* brace as the first token on the following line (ignoring possible
* intervening comments and/or preprocessor directives), except that a line
* consisting of only
* identifier1(identifier2)
* will not be considered a function definition unless identifier2 is
* the word "void", and a line consisting of
* identifier1(identifier2, <<arbitrary>>)
* will not be considered a function definition.
* ansi2knr will recognize a multi-line header provided that no intervening
* line ends with a left or right brace or a semicolon. These algorithms
* ignore whitespace, comments, and preprocessor directives, except that
* the function name must be the first thing on the line. The following
* constructs will confuse it:
* - Any other construct that starts at the left margin and
* follows the above syntax (such as a macro or function call).
* - Some macros that tinker with the syntax of function headers.
*/
/*
* The original and principal author of ansi2knr is L. Peter Deutsch
* <ghost@aladdin.com>. Other authors are noted in the change history
* that follows (in reverse chronological order):
lpd 2000-04-12 backs out Eggert's changes because of bugs:
- concatlits didn't declare the type of its bufend argument;
- concatlits didn't't recognize when it was inside a comment;
- scanstring could scan backward past the beginning of the string; when
- the check for \ + newline in scanstring was unnecessary.
2000-03-05 Paul Eggert <eggert@twinsun.com>
Add support for concatenated string literals.
* ansi2knr.c (concatlits): New decl.
(main): Invoke concatlits to concatenate string literals.
(scanstring): Handle backslash-newline correctly. Work with
character constants. Fix bug when scanning backwards through
backslash-quote. Check for unterminated strings.
(convert1): Parse character constants, too.
(appendline, concatlits): New functions.
* ansi2knr.1: Document this.
lpd 1999-08-17 added code to allow preprocessor directives
wherever comments are allowed
lpd 1999-04-12 added minor fixes from Pavel Roskin
<pavel_roskin@geocities.com> for clean compilation with
gcc -W -Wall
lpd 1999-03-22 added hack to recognize lines consisting of
identifier1(identifier2, xxx) as *not* being procedures
lpd 1999-02-03 made indentation of preprocessor commands consistent
lpd 1999-01-28 fixed two bugs: a '/' in an argument list caused an
endless loop; quoted strings within an argument list
confused the parser
lpd 1999-01-24 added a check for write errors on the output,
suggested by Jim Meyering <meyering@ascend.com>
lpd 1998-11-09 added further hack to recognize identifier(void)
as being a procedure
lpd 1998-10-23 added hack to recognize lines consisting of
identifier1(identifier2) as *not* being procedures
lpd 1997-12-08 made input_file optional; only closes input and/or
output file if not stdin or stdout respectively; prints
usage message on stderr rather than stdout; adds
--filename switch (changes suggested by
<ceder@lysator.liu.se>)
lpd 1996-01-21 added code to cope with not HAVE_CONFIG_H and with
compilers that don't understand void, as suggested by
Tom Lane
lpd 1996-01-15 changed to require that the first non-comment token
on the line following a function header be a left brace,
to reduce sensitivity to macros, as suggested by Tom Lane
<tgl@sss.pgh.pa.us>
lpd 1995-06-22 removed #ifndefs whose sole purpose was to define
undefined preprocessor symbols as 0; changed all #ifdefs
for configuration symbols to #ifs
lpd 1995-04-05 changed copyright notice to make it clear that
including ansi2knr in a program does not bring the entire
program under the GPL
lpd 1994-12-18 added conditionals for systems where ctype macros
don't handle 8-bit characters properly, suggested by
Francois Pinard <pinard@iro.umontreal.ca>;
removed --varargs switch (this is now the default)
lpd 1994-10-10 removed CONFIG_BROKETS conditional
lpd 1994-07-16 added some conditionals to help GNU `configure',
suggested by Francois Pinard <pinard@iro.umontreal.ca>;
properly erase prototype args in function parameters,
contributed by Jim Avera <jima@netcom.com>;
correct error in writeblanks (it shouldn't erase EOLs)
lpd 1989-xx-xx original version
*/
/* Most of the conditionals here are to make ansi2knr work with */
/* or without the GNU configure machinery. */
#if HAVE_CONFIG_H
# include <config.h>
#endif
#include <stdio.h>
#include <ctype.h>
#if HAVE_CONFIG_H
/*
For properly autoconfiguring ansi2knr, use AC_CONFIG_HEADER(config.h).
This will define HAVE_CONFIG_H and so, activate the following lines.
*/
# if STDC_HEADERS || HAVE_STRING_H
# include <string.h>
# else
# include <strings.h>
# endif
#else /* not HAVE_CONFIG_H */
/* Otherwise do it the hard way */
# ifdef BSD
# include <strings.h>
# else
# ifdef VMS
extern int strlen(), strncmp();
# else
# include <string.h>
# endif
# endif
#endif /* not HAVE_CONFIG_H */
#if STDC_HEADERS
# include <stdlib.h>
#else
/*
malloc and free should be declared in stdlib.h,
but if you've got a K&R compiler, they probably aren't.
*/
# ifdef MSDOS
# include <malloc.h>
# else
# ifdef VMS
extern char *malloc();
extern void free();
# else
extern char *malloc();
extern int free();
# endif
# endif
#endif
/* Define NULL (for *very* old compilers). */
#ifndef NULL
# define NULL (0)
#endif
/*
* The ctype macros don't always handle 8-bit characters correctly.
* Compensate for this here.
*/
#ifdef isascii
# undef HAVE_ISASCII /* just in case */
# define HAVE_ISASCII 1
#else
#endif
#if STDC_HEADERS || !HAVE_ISASCII
# define is_ascii(c) 1
#else
# define is_ascii(c) isascii(c)
#endif
#define is_space(c) (is_ascii(c) && isspace(c))
#define is_alpha(c) (is_ascii(c) && isalpha(c))
#define is_alnum(c) (is_ascii(c) && isalnum(c))
/* Scanning macros */
#define isidchar(ch) (is_alnum(ch) || (ch) == '_')
#define isidfirstchar(ch) (is_alpha(ch) || (ch) == '_')
/* Forward references */
char *ppdirforward();
char *ppdirbackward();
char *skipspace();
char *scanstring();
int writeblanks();
int test1();
int convert1();
/* The main program */
int
main(argc, argv)
int argc;
char *argv[];
{ FILE *in = stdin;
FILE *out = stdout;
char *filename = 0;
char *program_name = argv[0];
char *output_name = 0;
#define bufsize 5000 /* arbitrary size */
char *buf;
char *line;
char *more;
char *usage =
"Usage: ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]]\n";
/*
* In previous versions, ansi2knr recognized a --varargs switch.
* If this switch was supplied, ansi2knr would attempt to convert
* a ... argument to va_alist and va_dcl; if this switch was not
* supplied, ansi2knr would simply drop any such arguments.
* Now, ansi2knr always does this conversion, and we only
* check for this switch for backward compatibility.
*/
int convert_varargs = 1;
int output_error;
while ( argc > 1 && argv[1][0] == '-' ) {
if ( !strcmp(argv[1], "--varargs") ) {
convert_varargs = 1;
argc--;
argv++;
continue;
}
if ( !strcmp(argv[1], "--filename") && argc > 2 ) {
filename = argv[2];
argc -= 2;
argv += 2;
continue;
}
fprintf(stderr, "%s: Unrecognized switch: %s\n", program_name,
argv[1]);
fprintf(stderr, usage);
exit(1);
}
switch ( argc )
{
default:
fprintf(stderr, usage);
exit(0);
case 3:
output_name = argv[2];
out = fopen(output_name, "w");
if ( out == NULL ) {
fprintf(stderr, "%s: Cannot open output file %s\n",
program_name, output_name);
exit(1);
}
/* falls through */
case 2:
in = fopen(argv[1], "r");
if ( in == NULL ) {
fprintf(stderr, "%s: Cannot open input file %s\n",
program_name, argv[1]);
exit(1);
}
if ( filename == 0 )
filename = argv[1];
/* falls through */
case 1:
break;
}
if ( filename )
fprintf(out, "#line 1 \"%s\"\n", filename);
buf = malloc(bufsize);
if ( buf == NULL )
{
fprintf(stderr, "Unable to allocate read buffer!\n");
exit(1);
}
line = buf;
while ( fgets(line, (unsigned)(buf + bufsize - line), in) != NULL )
{
test: line += strlen(line);
switch ( test1(buf) )
{
case 2: /* a function header */
convert1(buf, out, 1, convert_varargs);
break;
case 1: /* a function */
/* Check for a { at the start of the next line. */
more = ++line;
f: if ( line >= buf + (bufsize - 1) ) /* overflow check */
goto wl;
if ( fgets(line, (unsigned)(buf + bufsize - line), in) == NULL )
goto wl;
switch ( *skipspace(ppdirforward(more), 1) )
{
case '{':
/* Definitely a function header. */
convert1(buf, out, 0, convert_varargs);
fputs(more, out);
break;
case 0:
/* The next line was blank or a comment: */
/* keep scanning for a non-comment. */
line += strlen(line);
goto f;
default:
/* buf isn't a function header, but */
/* more might be. */
fputs(buf, out);
strcpy(buf, more);
line = buf;
goto test;
}
break;
case -1: /* maybe the start of a function */
if ( line != buf + (bufsize - 1) ) /* overflow check */
continue;
/* falls through */
default: /* not a function */
wl: fputs(buf, out);
break;
}
line = buf;
}
if ( line != buf )
fputs(buf, out);
free(buf);
if ( output_name ) {
output_error = ferror(out);
output_error |= fclose(out);
} else { /* out == stdout */
fflush(out);
output_error = ferror(out);
}
if ( output_error ) {
fprintf(stderr, "%s: error writing to %s\n", program_name,
(output_name ? output_name : "stdout"));
exit(1);
}
if ( in != stdin )
fclose(in);
return 0;
}
/*
* Skip forward or backward over one or more preprocessor directives.
*/
char *
ppdirforward(p)
char *p;
{
for (; *p == '#'; ++p) {
for (; *p != '\r' && *p != '\n'; ++p)
if (*p == 0)
return p;
if (*p == '\r' && p[1] == '\n')
++p;
}
return p;
}
char *
ppdirbackward(p, limit)
char *p;
char *limit;
{
char *np = p;
for (;; p = --np) {
if (*np == '\n' && np[-1] == '\r')
--np;
for (; np > limit && np[-1] != '\r' && np[-1] != '\n'; --np)
if (np[-1] == 0)
return np;
if (*np != '#')
return p;
}
}
/*
* Skip over whitespace, comments, and preprocessor directives,
* in either direction.
*/
char *
skipspace(p, dir)
char *p;
int dir; /* 1 for forward, -1 for backward */
{
for ( ; ; ) {
while ( is_space(*p) )
p += dir;
if ( !(*p == '/' && p[dir] == '*') )
break;
p += dir; p += dir;
while ( !(*p == '*' && p[dir] == '/') ) {
if ( *p == 0 )
return p; /* multi-line comment?? */
p += dir;
}
p += dir; p += dir;
}
return p;
}
/* Scan over a quoted string, in either direction. */
char *
scanstring(p, dir)
char *p;
int dir;
{
for (p += dir; ; p += dir)
if (*p == '"' && p[-dir] != '\\')
return p + dir;
}
/*
* Write blanks over part of a string.
* Don't overwrite end-of-line characters.
*/
int
writeblanks(start, end)
char *start;
char *end;
{ char *p;
for ( p = start; p < end; p++ )
if ( *p != '\r' && *p != '\n' )
*p = ' ';
return 0;
}
/*
* Test whether the string in buf is a function definition.
* The string may contain and/or end with a newline.
* Return as follows:
* 0 - definitely not a function definition;
* 1 - definitely a function definition;
* 2 - definitely a function prototype (NOT USED);
* -1 - may be the beginning of a function definition,
* append another line and look again.
* The reason we don't attempt to convert function prototypes is that
* Ghostscript's declaration-generating macros look too much like
* prototypes, and confuse the algorithms.
*/
int
test1(buf)
char *buf;
{ char *p = buf;
char *bend;
char *endfn;
int contin;
if ( !isidfirstchar(*p) )
return 0; /* no name at left margin */
bend = skipspace(ppdirbackward(buf + strlen(buf) - 1, buf), -1);
switch ( *bend )
{
case ';': contin = 0 /*2*/; break;
case ')': contin = 1; break;
case '{': return 0; /* not a function */
case '}': return 0; /* not a function */
default: contin = -1;
}
while ( isidchar(*p) )
p++;
endfn = p;
p = skipspace(p, 1);
if ( *p++ != '(' )
return 0; /* not a function */
p = skipspace(p, 1);
if ( *p == ')' )
return 0; /* no parameters */
/* Check that the apparent function name isn't a keyword. */
/* We only need to check for keywords that could be followed */
/* by a left parenthesis (which, unfortunately, is most of them). */
{ static char *words[] =
{ "asm", "auto", "case", "char", "const", "double",
"extern", "float", "for", "if", "int", "long",
"register", "return", "short", "signed", "sizeof",
"static", "switch", "typedef", "unsigned",
"void", "volatile", "while", 0
};
char **key = words;
char *kp;
unsigned len = endfn - buf;
while ( (kp = *key) != 0 )
{ if ( strlen(kp) == len && !strncmp(kp, buf, len) )
return 0; /* name is a keyword */
key++;
}
}
{
char *id = p;
int len;
/*
* Check for identifier1(identifier2) and not
* identifier1(void), or identifier1(identifier2, xxxx).
*/
while ( isidchar(*p) )
p++;
len = p - id;
p = skipspace(p, 1);
if (*p == ',' ||
(*p == ')' && (len != 4 || strncmp(id, "void", 4)))
)
return 0; /* not a function */
}
/*
* If the last significant character was a ), we need to count
* parentheses, because it might be part of a formal parameter
* that is a procedure.
*/
if (contin > 0) {
int level = 0;
for (p = skipspace(buf, 1); *p; p = skipspace(p + 1, 1))
level += (*p == '(' ? 1 : *p == ')' ? -1 : 0);
if (level > 0)
contin = -1;
}
return contin;
}
/* Convert a recognized function definition or header to K&R syntax. */
int
convert1(buf, out, header, convert_varargs)
char *buf;
FILE *out;
int header; /* Boolean */
int convert_varargs; /* Boolean */
{ char *endfn;
char *p;
/*
* The breaks table contains pointers to the beginning and end
* of each argument.
*/
char **breaks;
unsigned num_breaks = 2; /* for testing */
char **btop;
char **bp;
char **ap;
char *vararg = 0;
/* Pre-ANSI implementations don't agree on whether strchr */
/* is called strchr or index, so we open-code it here. */
for ( endfn = buf; *(endfn++) != '('; )
;
top: p = endfn;
breaks = (char **)malloc(sizeof(char *) * num_breaks * 2);
if ( breaks == NULL )
{ /* Couldn't allocate break table, give up */
fprintf(stderr, "Unable to allocate break table!\n");
fputs(buf, out);
return -1;
}
btop = breaks + num_breaks * 2 - 2;
bp = breaks;
/* Parse the argument list */
do
{ int level = 0;
char *lp = NULL;
char *rp = NULL;
char *end = NULL;
if ( bp >= btop )
{ /* Filled up break table. */
/* Allocate a bigger one and start over. */
free((char *)breaks);
num_breaks <<= 1;
goto top;
}
*bp++ = p;
/* Find the end of the argument */
for ( ; end == NULL; p++ )
{ switch(*p)
{
case ',':
if ( !level ) end = p;
break;
case '(':
if ( !level ) lp = p;
level++;
break;
case ')':
if ( --level < 0 ) end = p;
else rp = p;
break;
case '/':
if (p[1] == '*')
p = skipspace(p, 1) - 1;
break;
case '"':
p = scanstring(p, 1) - 1;
break;
default:
;
}
}
/* Erase any embedded prototype parameters. */
if ( lp && rp )
writeblanks(lp + 1, rp);
p--; /* back up over terminator */
/* Find the name being declared. */
/* This is complicated because of procedure and */
/* array modifiers. */
for ( ; ; )
{ p = skipspace(p - 1, -1);
switch ( *p )
{
case ']': /* skip array dimension(s) */
case ')': /* skip procedure args OR name */
{ int level = 1;
while ( level )
switch ( *--p )
{
case ']': case ')':
level++;
break;
case '[': case '(':
level--;
break;
case '/':
if (p > buf && p[-1] == '*')
p = skipspace(p, -1) + 1;
break;
case '"':
p = scanstring(p, -1) + 1;
break;
default: ;
}
}
if ( *p == '(' && *skipspace(p + 1, 1) == '*' )
{ /* We found the name being declared */
while ( !isidfirstchar(*p) )
p = skipspace(p, 1) + 1;
goto found;
}
break;
default:
goto found;
}
}
found: if ( *p == '.' && p[-1] == '.' && p[-2] == '.' )
{ if ( convert_varargs )
{ *bp++ = "va_alist";
vararg = p-2;
}
else
{ p++;
if ( bp == breaks + 1 ) /* sole argument */
writeblanks(breaks[0], p);
else
writeblanks(bp[-1] - 1, p);
bp--;
}
}
else
{ while ( isidchar(*p) ) p--;
*bp++ = p+1;
}
p = end;
}
while ( *p++ == ',' );
*bp = p;
/* Make a special check for 'void' arglist */
if ( bp == breaks+2 )
{ p = skipspace(breaks[0], 1);
if ( !strncmp(p, "void", 4) )
{ p = skipspace(p+4, 1);
if ( p == breaks[2] - 1 )
{ bp = breaks; /* yup, pretend arglist is empty */
writeblanks(breaks[0], p + 1);
}
}
}
/* Put out the function name and left parenthesis. */
p = buf;
while ( p != endfn ) putc(*p, out), p++;
/* Put out the declaration. */
if ( header )
{ fputs(");", out);
for ( p = breaks[0]; *p; p++ )
if ( *p == '\r' || *p == '\n' )
putc(*p, out);
}
else
{ for ( ap = breaks+1; ap < bp; ap += 2 )
{ p = *ap;
while ( isidchar(*p) )
putc(*p, out), p++;
if ( ap < bp - 1 )
fputs(", ", out);
}
fputs(") ", out);
/* Put out the argument declarations */
for ( ap = breaks+2; ap <= bp; ap += 2 )
(*ap)[-1] = ';';
if ( vararg != 0 )
{ *vararg = 0;
fputs(breaks[0], out); /* any prior args */
fputs("va_dcl", out); /* the final arg */
fputs(bp[0], out);
}
else
fputs(breaks[0], out);
}
free((char *)breaks);
return 0;
}

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: portab.h,v 1.7.2.1 2002/11/04 19:18:39 alex Exp $ * $Id: portab.h,v 1.3 2002/03/25 19:13:19 alex Exp $
* *
* portab.h: "Portabilitaets-Definitionen" * portab.h: "Portabilitaets-Definitionen"
*/ */
@@ -22,43 +22,21 @@
#include "config.h" #include "config.h"
/* Compiler Features */
#ifndef PARAMS
# if PROTOTYPES
# define PARAMS(args) args
# else
# define PARAMS(args) ()
# endif
#endif
/* Keywords */ /* Keywords */
#define EXTERN extern #define EXTERN extern
#define STATIC static #define STATIC static
#define LOCAL static #define LOCAL static
#define CONST const #define CONST const
#define REGISTER register
/* Datatentypen */ /* Datatentypen */
#ifndef PROTOTYPES
# ifndef signed
# define signed
# endif
#endif
typedef void VOID; typedef void VOID;
typedef void POINTER; typedef void POINTER;
typedef signed int INT; typedef signed int INT;
typedef unsigned int UINT; typedef unsigned int UINT;
typedef signed long LONG;
typedef unsigned long ULONG;
typedef signed char INT8; typedef signed char INT8;
typedef unsigned char UINT8; typedef unsigned char UINT8;
typedef signed short INT16; typedef signed short INT16;
@@ -66,7 +44,6 @@ typedef unsigned short UINT16;
typedef signed long INT32; typedef signed long INT32;
typedef unsigned long UINT32; typedef unsigned long UINT32;
typedef double DOUBLE;
typedef float FLOAT; typedef float FLOAT;
typedef char CHAR; typedef char CHAR;
@@ -80,11 +57,7 @@ typedef UINT8 BOOLEAN;
#define FALSE (BOOLEAN)0 #define FALSE (BOOLEAN)0
#undef NULL #undef NULL
#ifdef PROTOTYPES #define NULL (VOID *)0
# define NULL (VOID *)0
#else
# define NULL 0L
#endif
#undef GLOBAL #undef GLOBAL
#define GLOBAL #define GLOBAL
@@ -104,6 +77,10 @@ typedef UINT8 BOOLEAN;
#define socklen_t int /* u.a. fuer Mac OS X */ #define socklen_t int /* u.a. fuer Mac OS X */
#endif #endif
#ifndef HAVE_INET_ATON
#define inet_aton( opt, bind ) 0 /* Dummy fuer inet_aton() */
#endif
#if OS_UNIX_AUX #if OS_UNIX_AUX
#define _POSIX_SOURCE /* muss unter A/UX definiert sein */ #define _POSIX_SOURCE /* muss unter A/UX definiert sein */
#endif #endif

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: portabtest.c,v 1.8 2002/09/09 10:05:10 alex Exp $ * $Id: portabtest.c,v 1.3 2002/03/12 21:47:40 alex Exp $
* *
* portabtest.c: Testprogramm fuer portab.h * portabtest.c: Testprogramm fuer portab.h
*/ */
@@ -23,21 +23,38 @@
#include "exp.h" #include "exp.h"
GLOBAL int LOCAL BOOLEAN portab_check_types( VOID );
main( VOID )
GLOBAL INT main( VOID )
{ {
/* Datentypen pruefen */ INT ret = 0;
if( FALSE != 0 ) return 1;
if( TRUE != 1 ) return 1; printf( "- datatypes: ");
if( sizeof( INT8 ) != 1 ) return 1; if( ! portab_check_types( ))
if( sizeof( UINT8 ) != 1 ) return 1; {
if( sizeof( INT16 ) != 2 ) return 1; puts( "FAILED!" );
if( sizeof( UINT16 ) != 2 ) return 1; ret = 1;
if( sizeof( INT32 ) != 4 ) return 1; }
if( sizeof( UINT32 ) != 4 ) return 1; else puts( "ok." );
/* kein Fehler */ puts( "- system type: "TARGET_CPU"/"TARGET_VENDOR"/"TARGET_OS );
return 0;
return ret;
} /* main */
LOCAL BOOLEAN portab_check_types( VOID )
{
if( FALSE != 0 ) return 0;
if( TRUE != 1 ) return 0;
if( sizeof( INT8 ) != 1 ) return 0;
if( sizeof( UINT8 ) != 1 ) return 0;
if( sizeof( INT16 ) != 2 ) return 0;
if( sizeof( UINT16 ) != 2 ) return 0;
if( sizeof( INT32 ) != 4 ) return 0;
if( sizeof( UINT32 ) != 4 ) return 0;
return 1;
} /* portab_check_types */ } /* portab_check_types */

View File

@@ -1,926 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: vsnprintf.c,v 1.3 2002/05/27 13:01:04 alex Exp $
*
* vsnprintf.c: u.a. Ersatz fuer vsnprintf()
*/
#include "portab.h"
#include "imp.h"
#include "exp.h"
/*
* snprintf.c: Copyright Patrick Powell 1995
* This code is based on code written by Patrick Powell (papowell@astart.com)
* It may be used for any purpose as long as this notice remains intact
* on all source code distributions
*
* Original: Patrick Powell Tue Apr 11 09:48:21 PDT 1995
* A bombproof version of doprnt (dopr) included.
* Sigh. This sort of thing is always nasty do deal with. Note that
* the version here does not include floating point...
*
* snprintf() is used instead of sprintf() as it does limit checks
* for string length. This covers a nasty loophole.
*
* The other functions are there to prevent NULL pointers from
* causing nast effects.
*
* More Recently:
* Brandon Long <blong@fiction.net> 9/15/96 for mutt 0.43
* This was ugly. It is still ugly. I opted out of floating point
* numbers, but the formatter understands just about everything
* from the normal C string format, at least as far as I can tell from
* the Solaris 2.5 printf(3S) man page.
*
* Brandon Long <blong@fiction.net> 10/22/97 for mutt 0.87.1
* Ok, added some minimal floating point support, which means this
* probably requires libm on most operating systems. Don't yet
* support the exponent (e,E) and sigfig (g,G). Also, fmtint()
* was pretty badly broken, it just wasn't being exercised in ways
* which showed it, so that's been fixed. Also, formated the code
* to mutt conventions, and removed dead code left over from the
* original. Also, there is now a builtin-test, just compile with:
* gcc -DTEST_SNPRINTF -o snprintf snprintf.c -lm
* and run snprintf for results.
*
* Thomas Roessler <roessler@guug.de> 01/27/98 for mutt 0.89i
* The PGP code was using unsigned hexadecimal formats.
* Unfortunately, unsigned formats simply didn't work.
*
* Michael Elkins <me@cs.hmc.edu> 03/05/98 for mutt 0.90.8
* The original code assumed that both snprintf() and vsnprintf() were
* missing. Some systems only have snprintf() but not vsnprintf(), so
* the code is now broken down under HAVE_SNPRINTF and HAVE_VSNPRINTF.
*
* Andrew Tridgell <tridge@samba.org>, October 1998
* fixed handling of %.0f
* added test for HAVE_LONG_DOUBLE
*
* tridge@samba.org, idra@samba.org, April 2001
* got rid of fcvt code (twas buggy and made testing harder)
* added C99 semantics
*
* Alexander Barton, <alex@barton.de>, 2002-05-19
* removed [v]asprintf() and C99 tests: not needed by ngIRCd.
*/
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#ifdef HAVE_STRINGS_H
#include <strings.h>
#endif
#ifdef HAVE_CTYPE_H
#include <ctype.h>
#endif
#include <sys/types.h>
#include <stdarg.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#if defined(HAVE_SNPRINTF) && defined(HAVE_VSNPRINTF)
/* only include stdio.h if we are not re-defining snprintf or vsnprintf */
#include <stdio.h>
/* make the compiler happy with an empty file */
void dummy_snprintf PARAMS(( void )) { }
#else
#ifdef HAVE_LONG_DOUBLE
#define LDOUBLE long double
#else
#define LDOUBLE double
#endif
#ifdef HAVE_LONG_LONG
#define LLONG long long
#else
#define LLONG long
#endif
static size_t dopr(char *buffer, size_t maxlen, const char *format,
va_list args);
static void fmtstr(char *buffer, size_t *currlen, size_t maxlen,
char *value, int flags, int min, int max);
static void fmtint(char *buffer, size_t *currlen, size_t maxlen,
long value, int base, int min, int max, int flags);
static void fmtfp(char *buffer, size_t *currlen, size_t maxlen,
LDOUBLE fvalue, int min, int max, int flags);
static void dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c);
/*
* dopr(): poor man's version of doprintf
*/
/* format read states */
#define DP_S_DEFAULT 0
#define DP_S_FLAGS 1
#define DP_S_MIN 2
#define DP_S_DOT 3
#define DP_S_MAX 4
#define DP_S_MOD 5
#define DP_S_CONV 6
#define DP_S_DONE 7
/* format flags - Bits */
#define DP_F_MINUS (1 << 0)
#define DP_F_PLUS (1 << 1)
#define DP_F_SPACE (1 << 2)
#define DP_F_NUM (1 << 3)
#define DP_F_ZERO (1 << 4)
#define DP_F_UP (1 << 5)
#define DP_F_UNSIGNED (1 << 6)
/* Conversion Flags */
#define DP_C_SHORT 1
#define DP_C_LONG 2
#define DP_C_LDOUBLE 3
#define DP_C_LLONG 4
#define char_to_int(p) ((p)- '0')
#ifndef MAX
#define MAX(p,q) (((p) >= (q)) ? (p) : (q))
#endif
static size_t dopr(char *buffer, size_t maxlen, const char *format, va_list args)
{
char ch;
LLONG value;
LDOUBLE fvalue;
char *strvalue;
int min;
int max;
int state;
int flags;
int cflags;
size_t currlen;
state = DP_S_DEFAULT;
currlen = flags = cflags = min = 0;
max = -1;
ch = *format++;
while (state != DP_S_DONE) {
if (ch == '\0')
state = DP_S_DONE;
switch(state) {
case DP_S_DEFAULT:
if (ch == '%')
state = DP_S_FLAGS;
else
dopr_outch (buffer, &currlen, maxlen, ch);
ch = *format++;
break;
case DP_S_FLAGS:
switch (ch) {
case '-':
flags |= DP_F_MINUS;
ch = *format++;
break;
case '+':
flags |= DP_F_PLUS;
ch = *format++;
break;
case ' ':
flags |= DP_F_SPACE;
ch = *format++;
break;
case '#':
flags |= DP_F_NUM;
ch = *format++;
break;
case '0':
flags |= DP_F_ZERO;
ch = *format++;
break;
default:
state = DP_S_MIN;
break;
}
break;
case DP_S_MIN:
if (isdigit((unsigned char)ch)) {
min = 10*min + char_to_int (ch);
ch = *format++;
} else if (ch == '*') {
min = va_arg (args, int);
ch = *format++;
state = DP_S_DOT;
} else {
state = DP_S_DOT;
}
break;
case DP_S_DOT:
if (ch == '.') {
state = DP_S_MAX;
ch = *format++;
} else {
state = DP_S_MOD;
}
break;
case DP_S_MAX:
if (isdigit((unsigned char)ch)) {
if (max < 0)
max = 0;
max = 10*max + char_to_int (ch);
ch = *format++;
} else if (ch == '*') {
max = va_arg (args, int);
ch = *format++;
state = DP_S_MOD;
} else {
state = DP_S_MOD;
}
break;
case DP_S_MOD:
switch (ch) {
case 'h':
cflags = DP_C_SHORT;
ch = *format++;
break;
case 'l':
cflags = DP_C_LONG;
ch = *format++;
if (ch == 'l') { /* It's a long long */
cflags = DP_C_LLONG;
ch = *format++;
}
break;
case 'L':
cflags = DP_C_LDOUBLE;
ch = *format++;
break;
default:
break;
}
state = DP_S_CONV;
break;
case DP_S_CONV:
switch (ch) {
case 'd':
case 'i':
if (cflags == DP_C_SHORT)
value = va_arg (args, int);
else if (cflags == DP_C_LONG)
value = va_arg (args, long int);
else if (cflags == DP_C_LLONG)
value = va_arg (args, LLONG);
else
value = va_arg (args, int);
fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
break;
case 'o':
flags |= DP_F_UNSIGNED;
if (cflags == DP_C_SHORT)
value = va_arg (args, unsigned int);
else if (cflags == DP_C_LONG)
value = (long)va_arg (args, unsigned long int);
else if (cflags == DP_C_LLONG)
value = (long)va_arg (args, unsigned LLONG);
else
value = (long)va_arg (args, unsigned int);
fmtint (buffer, &currlen, maxlen, value, 8, min, max, flags);
break;
case 'u':
flags |= DP_F_UNSIGNED;
if (cflags == DP_C_SHORT)
value = va_arg (args, unsigned int);
else if (cflags == DP_C_LONG)
value = (long)va_arg (args, unsigned long int);
else if (cflags == DP_C_LLONG)
value = (LLONG)va_arg (args, unsigned LLONG);
else
value = (long)va_arg (args, unsigned int);
fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
break;
case 'X':
flags |= DP_F_UP;
case 'x':
flags |= DP_F_UNSIGNED;
if (cflags == DP_C_SHORT)
value = va_arg (args, unsigned int);
else if (cflags == DP_C_LONG)
value = (long)va_arg (args, unsigned long int);
else if (cflags == DP_C_LLONG)
value = (LLONG)va_arg (args, unsigned LLONG);
else
value = (long)va_arg (args, unsigned int);
fmtint (buffer, &currlen, maxlen, value, 16, min, max, flags);
break;
case 'f':
if (cflags == DP_C_LDOUBLE)
fvalue = va_arg (args, LDOUBLE);
else
fvalue = va_arg (args, double);
/* um, floating point? */
fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
break;
case 'E':
flags |= DP_F_UP;
case 'e':
if (cflags == DP_C_LDOUBLE)
fvalue = va_arg (args, LDOUBLE);
else
fvalue = va_arg (args, double);
break;
case 'G':
flags |= DP_F_UP;
case 'g':
if (cflags == DP_C_LDOUBLE)
fvalue = va_arg (args, LDOUBLE);
else
fvalue = va_arg (args, double);
break;
case 'c':
dopr_outch (buffer, &currlen, maxlen, va_arg (args, int));
break;
case 's':
strvalue = va_arg (args, char *);
if (max == -1) {
max = strlen(strvalue);
}
if (min > 0 && max >= 0 && min > max) max = min;
fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max);
break;
case 'p':
strvalue = va_arg (args, void *);
fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min, max, flags);
break;
case 'n':
if (cflags == DP_C_SHORT) {
short int *num;
num = va_arg (args, short int *);
*num = currlen;
} else if (cflags == DP_C_LONG) {
long int *num;
num = va_arg (args, long int *);
*num = (long int)currlen;
} else if (cflags == DP_C_LLONG) {
LLONG *num;
num = va_arg (args, LLONG *);
*num = (LLONG)currlen;
} else {
int *num;
num = va_arg (args, int *);
*num = currlen;
}
break;
case '%':
dopr_outch (buffer, &currlen, maxlen, ch);
break;
case 'w':
/* not supported yet, treat as next char */
ch = *format++;
break;
default:
/* Unknown, skip */
break;
}
ch = *format++;
state = DP_S_DEFAULT;
flags = cflags = min = 0;
max = -1;
break;
case DP_S_DONE:
break;
default:
/* hmm? */
break; /* some picky compilers need this */
}
}
if (maxlen != 0) {
if (currlen < maxlen - 1)
buffer[currlen] = '\0';
else if (maxlen > 0)
buffer[maxlen - 1] = '\0';
}
return currlen;
}
static void fmtstr(char *buffer, size_t *currlen, size_t maxlen,
char *value, int flags, int min, int max)
{
int padlen, strln; /* amount to pad */
int cnt = 0;
#ifdef DEBUG_SNPRINTF
printf("fmtstr min=%d max=%d s=[%s]\n", min, max, value);
#endif
if (value == 0) {
value = "<NULL>";
}
for (strln = 0; value[strln]; ++strln); /* strlen */
padlen = min - strln;
if (padlen < 0)
padlen = 0;
if (flags & DP_F_MINUS)
padlen = -padlen; /* Left Justify */
while ((padlen > 0) && (cnt < max)) {
dopr_outch (buffer, currlen, maxlen, ' ');
--padlen;
++cnt;
}
while (*value && (cnt < max)) {
dopr_outch (buffer, currlen, maxlen, *value++);
++cnt;
}
while ((padlen < 0) && (cnt < max)) {
dopr_outch (buffer, currlen, maxlen, ' ');
++padlen;
++cnt;
}
}
/* Have to handle DP_F_NUM (ie 0x and 0 alternates) */
static void fmtint(char *buffer, size_t *currlen, size_t maxlen,
long value, int base, int min, int max, int flags)
{
int signvalue = 0;
unsigned long uvalue;
char convert[20];
int place = 0;
int spadlen = 0; /* amount to space pad */
int zpadlen = 0; /* amount to zero pad */
int caps = 0;
if (max < 0)
max = 0;
uvalue = value;
if(!(flags & DP_F_UNSIGNED)) {
if( value < 0 ) {
signvalue = '-';
uvalue = -value;
} else {
if (flags & DP_F_PLUS) /* Do a sign (+/i) */
signvalue = '+';
else if (flags & DP_F_SPACE)
signvalue = ' ';
}
}
if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
do {
convert[place++] =
(caps? "0123456789ABCDEF":"0123456789abcdef")
[uvalue % (unsigned)base ];
uvalue = (uvalue / (unsigned)base );
} while(uvalue && (place < 20));
if (place == 20) place--;
convert[place] = 0;
zpadlen = max - place;
spadlen = min - MAX (max, place) - (signvalue ? 1 : 0);
if (zpadlen < 0) zpadlen = 0;
if (spadlen < 0) spadlen = 0;
if (flags & DP_F_ZERO) {
zpadlen = MAX(zpadlen, spadlen);
spadlen = 0;
}
if (flags & DP_F_MINUS)
spadlen = -spadlen; /* Left Justifty */
#ifdef DEBUG_SNPRINTF
printf("zpad: %d, spad: %d, min: %d, max: %d, place: %d\n",
zpadlen, spadlen, min, max, place);
#endif
/* Spaces */
while (spadlen > 0) {
dopr_outch (buffer, currlen, maxlen, ' ');
--spadlen;
}
/* Sign */
if (signvalue)
dopr_outch (buffer, currlen, maxlen, signvalue);
/* Zeros */
if (zpadlen > 0) {
while (zpadlen > 0) {
dopr_outch (buffer, currlen, maxlen, '0');
--zpadlen;
}
}
/* Digits */
while (place > 0)
dopr_outch (buffer, currlen, maxlen, convert[--place]);
/* Left Justified spaces */
while (spadlen < 0) {
dopr_outch (buffer, currlen, maxlen, ' ');
++spadlen;
}
}
static LDOUBLE abs_val(LDOUBLE value)
{
LDOUBLE result = value;
if (value < 0)
result = -value;
return result;
}
static LDOUBLE POW10(int exp)
{
LDOUBLE result = 1;
while (exp) {
result *= 10;
exp--;
}
return result;
}
static LLONG ROUND(LDOUBLE value)
{
LLONG intpart;
intpart = (LLONG)value;
value = value - intpart;
if (value >= 0.5) intpart++;
return intpart;
}
/* a replacement for modf that doesn't need the math library. Should
be portable, but slow */
static double my_modf(double x0, double *iptr)
{
int i;
long l;
double x = x0;
double f = 1.0;
for (i=0;i<100;i++) {
l = (long)x;
if (l <= (x+1) && l >= (x-1)) break;
x *= 0.1;
f *= 10.0;
}
if (i == 100) {
/* yikes! the number is beyond what we can handle. What do we do? */
(*iptr) = 0;
return 0;
}
if (i != 0) {
double i2;
double ret;
ret = my_modf(x0-l*f, &i2);
(*iptr) = l*f + i2;
return ret;
}
(*iptr) = l;
return x - (*iptr);
}
static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
LDOUBLE fvalue, int min, int max, int flags)
{
int signvalue = 0;
double ufvalue;
char iconvert[311];
char fconvert[311];
int iplace = 0;
int fplace = 0;
int padlen = 0; /* amount to pad */
int zpadlen = 0;
int caps = 0;
int index;
double intpart;
double fracpart;
double temp;
/*
* AIX manpage says the default is 0, but Solaris says the default
* is 6, and sprintf on AIX defaults to 6
*/
if (max < 0)
max = 6;
ufvalue = abs_val (fvalue);
if (fvalue < 0) {
signvalue = '-';
} else {
if (flags & DP_F_PLUS) { /* Do a sign (+/i) */
signvalue = '+';
} else {
if (flags & DP_F_SPACE)
signvalue = ' ';
}
}
#if 0
if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
#endif
#if 0
if (max == 0) ufvalue += 0.5; /* if max = 0 we must round */
#endif
/*
* Sorry, we only support 16 digits past the decimal because of our
* conversion method
*/
if (max > 16)
max = 16;
/* We "cheat" by converting the fractional part to integer by
* multiplying by a factor of 10
*/
temp = ufvalue;
my_modf(temp, &intpart);
fracpart = ROUND((POW10(max)) * (ufvalue - intpart));
if (fracpart >= POW10(max)) {
intpart++;
fracpart -= POW10(max);
}
/* Convert integer part */
do {
temp = intpart;
my_modf(intpart*0.1, &intpart);
temp = temp*0.1;
index = (int) ((temp -intpart +0.05)* 10.0);
/* index = (int) (((double)(temp*0.1) -intpart +0.05) *10.0); */
/* printf ("%llf, %f, %x\n", temp, intpart, index); */
iconvert[iplace++] =
(caps? "0123456789ABCDEF":"0123456789abcdef")[index];
} while (intpart && (iplace < 311));
if (iplace == 311) iplace--;
iconvert[iplace] = 0;
/* Convert fractional part */
if (fracpart)
{
do {
temp = fracpart;
my_modf(fracpart*0.1, &fracpart);
temp = temp*0.1;
index = (int) ((temp -fracpart +0.05)* 10.0);
/* index = (int) ((((temp/10) -fracpart) +0.05) *10); */
/* printf ("%lf, %lf, %ld\n", temp, fracpart, index); */
fconvert[fplace++] =
(caps? "0123456789ABCDEF":"0123456789abcdef")[index];
} while(fracpart && (fplace < 311));
if (fplace == 311) fplace--;
}
fconvert[fplace] = 0;
/* -1 for decimal point, another -1 if we are printing a sign */
padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0);
zpadlen = max - fplace;
if (zpadlen < 0) zpadlen = 0;
if (padlen < 0)
padlen = 0;
if (flags & DP_F_MINUS)
padlen = -padlen; /* Left Justifty */
if ((flags & DP_F_ZERO) && (padlen > 0)) {
if (signvalue) {
dopr_outch (buffer, currlen, maxlen, signvalue);
--padlen;
signvalue = 0;
}
while (padlen > 0) {
dopr_outch (buffer, currlen, maxlen, '0');
--padlen;
}
}
while (padlen > 0) {
dopr_outch (buffer, currlen, maxlen, ' ');
--padlen;
}
if (signvalue)
dopr_outch (buffer, currlen, maxlen, signvalue);
while (iplace > 0)
dopr_outch (buffer, currlen, maxlen, iconvert[--iplace]);
#ifdef DEBUG_SNPRINTF
printf("fmtfp: fplace=%d zpadlen=%d\n", fplace, zpadlen);
#endif
/*
* Decimal point. This should probably use locale to find the correct
* char to print out.
*/
if (max > 0) {
dopr_outch (buffer, currlen, maxlen, '.');
while (fplace > 0)
dopr_outch (buffer, currlen, maxlen, fconvert[--fplace]);
}
while (zpadlen > 0) {
dopr_outch (buffer, currlen, maxlen, '0');
--zpadlen;
}
while (padlen < 0) {
dopr_outch (buffer, currlen, maxlen, ' ');
++padlen;
}
}
static void dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c)
{
if (*currlen < maxlen) {
buffer[(*currlen)] = c;
}
(*currlen)++;
}
#if !defined(HAVE_VSNPRINTF)
int vsnprintf (char *str, size_t count, const char *fmt, va_list args)
{
return dopr(str, count, fmt, args);
}
#endif
#if !defined(HAVE_SNPRINTF)
int snprintf(char *str,size_t count,const char *fmt,...)
{
size_t ret;
va_list ap;
va_start(ap, fmt);
ret = vsnprintf(str, count, fmt, ap);
va_end(ap);
return ret;
}
#endif
#endif
#ifdef TEST_SNPRINTF
int sprintf(char *str,const char *fmt,...);
int main (void)
{
char buf1[1024];
char buf2[1024];
char *fp_fmt[] = {
"%1.1f",
"%-1.5f",
"%1.5f",
"%123.9f",
"%10.5f",
"% 10.5f",
"%+22.9f",
"%+4.9f",
"%01.3f",
"%4f",
"%3.1f",
"%3.2f",
"%.0f",
"%f",
"-16.16f",
NULL
};
double fp_nums[] = { 6442452944.1234, -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996,
0.9996, 1.996, 4.136, 0};
char *int_fmt[] = {
"%-1.5d",
"%1.5d",
"%123.9d",
"%5.5d",
"%10.5d",
"% 10.5d",
"%+22.33d",
"%01.3d",
"%4d",
"%d",
NULL
};
long int_nums[] = { -1, 134, 91340, 341, 0203, 0};
char *str_fmt[] = {
"10.5s",
"5.10s",
"10.1s",
"0.10s",
"10.0s",
"1.10s",
"%s",
"%.1s",
"%.10s",
"%10s",
NULL
};
char *str_vals[] = {"hello", "a", "", "a longer string", NULL};
int x, y;
int fail = 0;
int num = 0;
printf ("Testing snprintf format codes against system sprintf...\n");
for (x = 0; fp_fmt[x] ; x++) {
for (y = 0; fp_nums[y] != 0 ; y++) {
int l1 = snprintf(NULL, 0, fp_fmt[x], fp_nums[y]);
int l2 = snprintf(buf1, sizeof(buf1), fp_fmt[x], fp_nums[y]);
sprintf (buf2, fp_fmt[x], fp_nums[y]);
if (strcmp (buf1, buf2)) {
printf("snprintf doesn't match Format: %s\n\tsnprintf = [%s]\n\t sprintf = [%s]\n",
fp_fmt[x], buf1, buf2);
fail++;
}
if (l1 != l2) {
printf("snprintf l1 != l2 (%d %d) %s\n", l1, l2, fp_fmt[x]);
fail++;
}
num++;
}
}
for (x = 0; int_fmt[x] ; x++) {
for (y = 0; int_nums[y] != 0 ; y++) {
int l1 = snprintf(NULL, 0, int_fmt[x], int_nums[y]);
int l2 = snprintf(buf1, sizeof(buf1), int_fmt[x], int_nums[y]);
sprintf (buf2, int_fmt[x], int_nums[y]);
if (strcmp (buf1, buf2)) {
printf("snprintf doesn't match Format: %s\n\tsnprintf = [%s]\n\t sprintf = [%s]\n",
int_fmt[x], buf1, buf2);
fail++;
}
if (l1 != l2) {
printf("snprintf l1 != l2 (%d %d) %s\n", l1, l2, int_fmt[x]);
fail++;
}
num++;
}
}
for (x = 0; str_fmt[x] ; x++) {
for (y = 0; str_vals[y] != 0 ; y++) {
int l1 = snprintf(NULL, 0, str_fmt[x], str_vals[y]);
int l2 = snprintf(buf1, sizeof(buf1), str_fmt[x], str_vals[y]);
sprintf (buf2, str_fmt[x], str_vals[y]);
if (strcmp (buf1, buf2)) {
printf("snprintf doesn't match Format: %s\n\tsnprintf = [%s]\n\t sprintf = [%s]\n",
str_fmt[x], buf1, buf2);
fail++;
}
if (l1 != l2) {
printf("snprintf l1 != l2 (%d %d) %s\n", l1, l2, str_fmt[x]);
fail++;
}
num++;
}
}
printf ("%d tests failed out of %d.\n", fail, num);
printf("seeing how many digits we support\n");
{
double v0 = 0.12345678901234567890123456789012345678901;
for (x=0; x<100; x++) {
snprintf(buf1, sizeof(buf1), "%1.1f", v0*pow(10, x));
sprintf(buf2, "%1.1f", v0*pow(10, x));
if (strcmp(buf1, buf2)) {
printf("we seem to support %d digits\n", x-1);
break;
}
}
}
return 0;
}
#endif /* SNPRINTF_TEST */
/* -eof- */

View File

@@ -1,55 +0,0 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
#
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
# der GNU General Public License (GPL), wie von der Free Software Foundation
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
#
# $Id: Makefile.am,v 1.3.2.2 2002/09/20 15:39:55 alex Exp $
#
AUTOMAKE_OPTIONS = ../portab/ansi2knr
INCLUDES = -I$(srcdir)/../portab
EXTRA_DIST = \
getpid.sh \
start-server.sh stop-server.sh tests.sh stress-server.sh \
connect-test.e channel-test.e mode-test.e \
stress-A.e stress-B.e check-idle.e \
ngircd-test.conf
clean-local:
rm -rf logs tests *-test ngircd-test.log ngircd-test.motd \
ngircd-TEST* procs.tmp
maintainer-clean-local:
rm -f Makefile Makefile.in
check_SCRIPTS = ngircd-TEST-Binary tests.sh
ngircd-TEST-Binary:
cp ../ngircd/ngircd ngircd-TEST
[ -f getpid.sh ] || ln -s $(srcdir)/getpid.sh .
connect-test: tests.sh
ln -s $(srcdir)/tests.sh connect-test
channel-test: tests.sh
ln -s $(srcdir)/tests.sh channel-test
mode-test: tests.sh
ln -s $(srcdir)/tests.sh mode-test
TESTS = start-server.sh \
connect-test \
channel-test \
mode-test \
stress-server.sh \
stop-server.sh
# -eof-

View File

@@ -1,74 +0,0 @@
# $Id: channel-test.e,v 1.2 2002/09/09 21:26:00 alex Exp $
spawn telnet localhost 6789
expect {
timeout { exit 1 }
"Connected"
}
send "nick nick\r"
send "user user . . :User\r"
expect {
timeout { exit 1 }
"376"
}
send "join #channel\r"
expect {
timeout { exit 1 }
":nick!~user@* JOIN :#channel"
}
expect {
timeout { exit 1 }
"366"
}
send "topic #channel :Test-Topic\r"
expect {
timeout { exit 1 }
":nick!~user@* TOPIC #channel :Test-Topic"
}
send "who #channel\r"
expect {
timeout { exit 1 }
"352 nick #channel ~user * nick H@ :0 User"
}
expect {
timeout { exit 1 }
"315 nick #channel"
}
send "names #channel\r"
expect {
timeout { exit 1 }
"353 nick = #channel :@nick"
}
expect {
timeout { exit 1 }
"366 nick #channel"
}
send "list\r"
expect {
timeout { exit 1 }
"322 nick #channel 1 :Test-Topic"
}
expect {
timeout { exit 1 }
"323 nick :End of LIST"
}
send "part #channel\r"
expect {
timeout { exit 1 }
":nick!~user@* PART #channel :nick"
}
send "quit\r"
expect {
timeout { exit 1 }
"Connection closed"
}
# -eof-

View File

@@ -1,31 +0,0 @@
# $Id: check-idle.e,v 1.1 2002/09/09 22:56:07 alex Exp $
spawn telnet localhost 6789
expect {
timeout { exit 1 }
"Connected"
}
send "nick IdleTest\r"
send "user idle . . :Idle-Test\r"
expect {
timeout { exit 1 }
"376"
}
send "lusers\r"
expect {
timeout { exit 1 }
"251 IdleTest :There are 1 users and 0 services on 1 servers" { set r 0 }
"251 IdleTest :There are" { set r 99 }
}
send "quit\r"
expect {
timeout { exit 1 }
"Connection closed"
}
exit $r
# -eof-

View File

@@ -1,21 +0,0 @@
# $Id: connect-test.e,v 1.1 2002/09/09 10:16:24 alex Exp $
spawn telnet localhost 6789
expect {
timeout { exit 1 }
"Connected"
}
send "oper\r"
expect {
timeout { exit 1 }
"451"
}
send "quit\r"
expect {
timeout { exit 1 }
"Connection closed"
}
# -eof-

View File

@@ -1,28 +0,0 @@
#!/bin/sh
# ngIRCd Test Suite
# $Id: getpid.sh,v 1.1.2.1 2002/09/20 15:19:55 alex Exp $
# wurde ein Name uebergeben?
[ $# -ne 1 ] && exit 1
# Flags fuer "ps" ermitteln
if [ `uname` = "FreeBSD" ]; then
PS_FLAGS=-a; PS_PIDCOL=1
else
PS_FLAGS=-f; PS_PIDCOL=2
ps $PS_FLAGS > /dev/null 2>&1
if [ $? -ne 0 ]; then PS_FLAGS=a; PS_PIDCOL=1; fi
fi
# PID ermitteln
ps $PS_FLAGS > procs.tmp
pid=`cat procs.tmp | grep "$1" | awk "{ print \\\$$PS_PIDCOL }" | sort -n | head -n 1`
# ermittelte PID validieren
[ "$pid" -gt 1 ] > /dev/null 2>&1
[ $? -ne 0 ] && exit 1
echo $pid
exit 0
# -eof-

View File

@@ -1,108 +0,0 @@
# $Id: mode-test.e,v 1.2.2.1 2002/11/22 23:46:09 alex Exp $
spawn telnet localhost 6789
expect {
timeout { exit 1 }
"Connected"
}
send "nick nick\r"
send "user user . . :User\r"
expect {
timeout { exit 1 }
"376"
}
send "mode nick +i\r"
expect {
timeout { exit 1 }
":nick!~user@* MODE nick +i"
}
send "mode nick\r"
expect {
timeout { exit 1 }
"221 nick +i"
}
send "mode nick -i\r"
expect {
timeout { exit 1 }
":nick!~user@* MODE nick -i"
}
send "oper TestOp 123\r"
expect {
timeout { exit 1 }
"MODE nick :+o"
}
expect {
timeout { exit 1 }
"381 nick"
}
send "mode nick\r"
expect {
timeout { exit 1 }
"221 nick +o"
}
send "join #channel\r"
expect {
timeout { exit 1 }
":nick!~user@* JOIN :#channel"
}
expect {
timeout { exit 1 }
"366"
}
send "mode #channel +tn\r"
expect {
timeout { exit 1 }
":nick!~user@* MODE #channel +tn"
}
send "mode #channel\r"
expect {
timeout { exit 1 }
"324 nick #channel +tn"
}
send "mode #channel +v nick\r"
expect {
timeout { exit 1 }
":nick!~user@* MODE #channel +v nick"
}
send "mode #channel +I nick1\r"
expect {
timeout { exit 1 }
":nick!~user@* MODE #channel +I nick1!*@*"
}
send "mode #channel +b nick2@domain\r"
expect {
timeout { exit 1 }
":nick!~user@* MODE #channel +b nick2!*@domain"
}
send "mode #channel +I nick3!user\r"
expect {
timeout { exit 1 }
":nick!~user@* MODE #channel +I nick3!user@*"
}
send "mode #channel -vo nick\r"
expect {
timeout { exit 1 }
":nick!~user@* MODE #channel -vo nick"
}
send "quit\r"
expect {
timeout { exit 1 }
"Connection closed"
}
# -eof-

View File

@@ -1,14 +0,0 @@
# $Id: ngircd-test.conf,v 1.2.2.1 2002/11/04 19:18:39 alex Exp $
[Global]
Name = ngircd.test.server
Info = ngIRCd Test-Server
Ports = 6789
MotdFile = ngircd-test.motd
AdminEMail = admin@irc.server
[Operator]
Name = TestOp
Password = 123
# -eof-

View File

@@ -1,32 +0,0 @@
#!/bin/sh
# ngIRCd Test Suite
# $Id: start-server.sh,v 1.5.2.4 2002/10/03 16:13:38 alex Exp $
[ -z "$srcdir" ] && srcdir=`dirname $0`
echo " starting server ..."
# alte Logfiles loeschen
rm -rf logs *.log
# pruefen, ob getpid.sh gueltige PID's liefert. Wenn dem nicht so ist,
# wird kein ngIRCd gestartet, da dieser ansonsten nicht mehr am Ende
# des Testlaufs beendet werden koennte!
./getpid.sh make > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo " error: getpid.sh FAILED!"
exit 1
fi
# MOTD fuer Test-Server erzeugen
echo "This is an ngIRCd Test Server" > ngircd-test.motd
# Test-Server starten ...
./ngircd-TEST -np -f ${srcdir}/ngircd-test.conf > ngircd-test.log 2>&1 &
sleep 1
# validieren, dass Server laeuft
pid=`./getpid.sh ngircd-TEST`
[ -n "$pid" ] && kill -0 $pid > /dev/null 2>&1 || exit 1
# -eof-

View File

@@ -1,17 +0,0 @@
#!/bin/sh
# ngIRCd Test Suite
# $Id: stop-server.sh,v 1.4.2.4 2002/10/03 16:13:38 alex Exp $
[ -z "$srcdir" ] && srcdir=`dirname $0`
echo " stopping server ..."
# Test-Server stoppen ...
pid=`./getpid.sh ngircd-TEST`
[ -n "$pid" ] && kill $pid > /dev/null 2>&1 || exit 1
sleep 1
# jetzt duerfte der Prozess nicht mehr laufen
kill -0 $pid > /dev/null 2>&1 && exit 1 || exit 0
# -eof-

View File

@@ -1,9 +0,0 @@
# $Id: stress-A.e,v 1.1 2002/09/09 22:56:07 alex Exp $
spawn telnet localhost 6789
expect {
timeout { exit 1 }
"Connected"
}
# -eof-

View File

@@ -1,69 +0,0 @@
# $Id: stress-B.e,v 1.1 2002/09/09 22:56:07 alex Exp $
send "user user . . :User\r"
expect {
timeout { exit 1 }
"376"
}
send "oper TestOp 123\r"
expect {
timeout { exit 1 }
"MODE test* :+o"
}
expect {
timeout { exit 1 }
"381 test*"
}
send "join #channel\r"
expect {
timeout { exit 1 }
":test*!~user@* JOIN :#channel"
}
expect {
timeout { exit 1 }
"366"
}
send "mode #channel\r"
expect {
timeout { exit 1 }
"324 test* #channel"
}
send "join #channel2\r"
expect {
timeout { exit 1 }
":test*!~user@* JOIN :#channel2"
}
expect {
timeout { exit 1 }
"366"
}
send "names\r"
expect {
timeout { exit 1 }
"366"
}
send "part #channel2\r"
expect {
timeout { exit 1 }
":test*!~user@* PART #channel2"
}
send "part #channel\r"
expect {
timeout { exit 1 }
":test*!~user@* PART #channel"
}
send "quit\r"
expect {
timeout { exit 1 }
"Connection closed"
}
# -eof-

View File

@@ -1,46 +0,0 @@
#!/bin/sh
# ngIRCd Test Suite
# $Id: stress-server.sh,v 1.4.2.2 2002/10/03 16:13:38 alex Exp $
[ -z "$srcdir" ] && srcdir=`dirname $0`
[ $1 -gt 0 ] 2> /dev/null && CLIENTS=$1 || CLIENTS=5
name=`basename $0`
test=`echo ${name} | cut -d '.' -f 1`
mkdir -p logs tests
type expect > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "SKIP: ${name} -- \"expect\" not found."; exit 77
fi
type telnet > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "SKIP: ${name} -- \"telnet\" not found."; exit 77
fi
echo " stressing server with $CLIENTS clients (be patient!) ..."
no=0
while [ ${no} -lt $CLIENTS ]; do
cat ${srcdir}/stress-A.e > tests/${no}.e
echo "send \"nick test${no}\\r\"" >> tests/${no}.e
cat ${srcdir}/stress-B.e >> tests/${no}.e
no=`expr ${no} + 1`
done
no=0
while [ ${no} -lt $CLIENTS ]; do
expect tests/${no}.e > logs/stress-${no}.log 2> /dev/null &
no=`expr ${no} + 1`
done
touch logs/check-idle.log
while true; do
expect ${srcdir}/check-idle.e >> logs/check-idle.log
res=$?
[ $res -eq 0 ] && exit 0
[ $res -eq 1 ] && exit 1
sleep 1
echo "====================" >> logs/check-idle.log
done
# -eof-

View File

@@ -1,21 +0,0 @@
#!/bin/sh
# ngIRCd Test Suite
# $Id: tests.sh,v 1.3 2002/09/12 02:29:03 alex Exp $
name=`basename $0`
test=`echo ${name} | cut -d '.' -f 1`
mkdir -p logs
type expect > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "SKIP: ${name} -- \"expect\" not found."; exit 77
fi
type telnet > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "SKIP: ${name} -- \"telnet\" not found."; exit 77
fi
echo " doing ${test} ..."
expect ${srcdir}/${test}.e > logs/${test}.log
# -eof-