mirror of
https://github.com/osmarks/ngircd.git
synced 2025-09-26 14:04:04 +00:00
Compare commits
301 Commits
rel-0-4-1
...
branch-0-5
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b74699b074 | ||
![]() |
35054b1f64 | ||
![]() |
f68369d821 | ||
![]() |
d53d18833d | ||
![]() |
a02c7a5f47 | ||
![]() |
14216308a0 | ||
![]() |
7a449bad3c | ||
![]() |
e0941f1a17 | ||
![]() |
6cdc8f7802 | ||
![]() |
266b68b873 | ||
![]() |
34d7f4162d | ||
![]() |
6eab6d9514 | ||
![]() |
2230a6c96a | ||
![]() |
b4afaf9c52 | ||
![]() |
8e9a84a902 | ||
![]() |
0a90f59030 | ||
![]() |
ad252b5c4c | ||
![]() |
b0eb4b0019 | ||
![]() |
92a9e0d34f | ||
![]() |
ed4417c1a0 | ||
![]() |
1e66da4e50 | ||
![]() |
6e55ea7298 | ||
![]() |
bb180adb49 | ||
![]() |
e2c896cb7e | ||
![]() |
2c7b276cc5 | ||
![]() |
4decf352fa | ||
![]() |
19c2e79b72 | ||
![]() |
49d9585242 | ||
![]() |
9487976620 | ||
![]() |
35d1c2fc06 | ||
![]() |
c557a2920e | ||
![]() |
845b295e7d | ||
![]() |
59b5b0e025 | ||
![]() |
bdd23ece63 | ||
![]() |
a119700c62 | ||
![]() |
b0e7f564c7 | ||
![]() |
d69410f28d | ||
![]() |
d5fa1f76bb | ||
![]() |
3dec467ebc | ||
![]() |
a5fe6d6783 | ||
![]() |
37b579f3cd | ||
![]() |
268d02b90d | ||
![]() |
037418e8c0 | ||
![]() |
45c3886800 | ||
![]() |
38f387146f | ||
![]() |
fcbd44caa9 | ||
![]() |
f027308798 | ||
![]() |
462540e079 | ||
![]() |
7721c79747 | ||
![]() |
678a4dfba0 | ||
![]() |
8c956d25b7 | ||
![]() |
9f9f676716 | ||
![]() |
cf20b16d2a | ||
![]() |
97d4e580ae | ||
![]() |
b072b7712c | ||
![]() |
fd6a7f67ce | ||
![]() |
6c04ba84cd | ||
![]() |
ef6b7c7c63 | ||
![]() |
2592e73da0 | ||
![]() |
7715e4de61 | ||
![]() |
982a08b80d | ||
![]() |
157718a7a3 | ||
![]() |
72b95c4a66 | ||
![]() |
4fe894cbe7 | ||
![]() |
0c9f22ac66 | ||
![]() |
bde8d2dd6b | ||
![]() |
6e27c52336 | ||
![]() |
efeba4a7f1 | ||
![]() |
a9d44b95bd | ||
![]() |
34bdaaa33f | ||
![]() |
508fa48aa6 | ||
![]() |
66b461a5ab | ||
![]() |
e3d70f2c43 | ||
![]() |
5502fb271d | ||
![]() |
e6f96a7a86 | ||
![]() |
005391ca5b | ||
![]() |
3a3d6d7b9a | ||
![]() |
4ded22b00b | ||
![]() |
b615d12897 | ||
![]() |
21244add31 | ||
![]() |
e7b09536bf | ||
![]() |
a0b06ecbd4 | ||
![]() |
3f873b0c39 | ||
![]() |
05bf66dff0 | ||
![]() |
069ca5df40 | ||
![]() |
eb817807bc | ||
![]() |
fc6f64742c | ||
![]() |
d040fa2a7d | ||
![]() |
4d46eac733 | ||
![]() |
85691130b1 | ||
![]() |
c4d78a3469 | ||
![]() |
dd4535b7f1 | ||
![]() |
1734e53410 | ||
![]() |
843fe45dee | ||
![]() |
51dabeafaa | ||
![]() |
05fc4a4cb7 | ||
![]() |
f3c0c7c0b3 | ||
![]() |
c2aefbb3e1 | ||
![]() |
296ddebed1 | ||
![]() |
922b7dbd46 | ||
![]() |
ffcf5ab999 | ||
![]() |
592565aef5 | ||
![]() |
53f76a1dad | ||
![]() |
ce4b719459 | ||
![]() |
19ac723e48 | ||
![]() |
a1ded68a49 | ||
![]() |
8a927a1b6a | ||
![]() |
eab10c91b7 | ||
![]() |
6c19b0e438 | ||
![]() |
6f15c062a3 | ||
![]() |
afe3b1918d | ||
![]() |
eaeda12c54 | ||
![]() |
60df88777e | ||
![]() |
3dc1621200 | ||
![]() |
14cbca87c8 | ||
![]() |
ce1087165d | ||
![]() |
aafd21c7d9 | ||
![]() |
9611833e33 | ||
![]() |
62d576880b | ||
![]() |
378e511e04 | ||
![]() |
1f9ba7b326 | ||
![]() |
3010f03414 | ||
![]() |
938abb0236 | ||
![]() |
1256f34736 | ||
![]() |
d1ac40391e | ||
![]() |
33a3550df4 | ||
![]() |
1c668252c9 | ||
![]() |
55ee4c9553 | ||
![]() |
ad1cbe34b4 | ||
![]() |
aa58390673 | ||
![]() |
5aa9c8f44c | ||
![]() |
e62ad97937 | ||
![]() |
6d81286b08 | ||
![]() |
40ebd4704a | ||
![]() |
241d033f37 | ||
![]() |
5e6c713d9c | ||
![]() |
c76e6769db | ||
![]() |
497b61f4ab | ||
![]() |
28c7f37204 | ||
![]() |
c0910498e8 | ||
![]() |
bfa5fd3add | ||
![]() |
f43e284b22 | ||
![]() |
c67bb2ac9f | ||
![]() |
d58431a097 | ||
![]() |
ff07226814 | ||
![]() |
65b31ffbb2 | ||
![]() |
adcd9289c2 | ||
![]() |
71ae473187 | ||
![]() |
7e1b3b9157 | ||
![]() |
f673fb960a | ||
![]() |
7d30c8cebc | ||
![]() |
d645ce86e9 | ||
![]() |
7b6cfc17c4 | ||
![]() |
5063de59b1 | ||
![]() |
e0ed3aa141 | ||
![]() |
3b6c3d6d64 | ||
![]() |
e07fab17b1 | ||
![]() |
3da161131a | ||
![]() |
b1f4200608 | ||
![]() |
2d4f7847d8 | ||
![]() |
81a26d988a | ||
![]() |
1d524784ff | ||
![]() |
a6b61df983 | ||
![]() |
72670833cb | ||
![]() |
1902c6bf94 | ||
![]() |
7a90d92aef | ||
![]() |
a5fb74f3f2 | ||
![]() |
adbb2e09df | ||
![]() |
39b9f65d0d | ||
![]() |
cf9629b9c7 | ||
![]() |
8907c8dd3d | ||
![]() |
c1a278b0eb | ||
![]() |
21ab8f4640 | ||
![]() |
e1ef0bd4fd | ||
![]() |
151babd168 | ||
![]() |
9fd8254ada | ||
![]() |
5329241831 | ||
![]() |
e876e210da | ||
![]() |
e6d1bcdf82 | ||
![]() |
c3d9c40a74 | ||
![]() |
4014a8ff0d | ||
![]() |
63c36773e4 | ||
![]() |
e2b827d8b1 | ||
![]() |
31a8dd2f2f | ||
![]() |
27a70171f1 | ||
![]() |
1fd7215def | ||
![]() |
acd91c0164 | ||
![]() |
9cb74e8135 | ||
![]() |
b788a3daa5 | ||
![]() |
04162c3944 | ||
![]() |
5cac54044b | ||
![]() |
ae958aa1a5 | ||
![]() |
b966b2108d | ||
![]() |
9ec32d15ab | ||
![]() |
adc1eedda3 | ||
![]() |
6d28127154 | ||
![]() |
646acbc0b2 | ||
![]() |
74b1205783 | ||
![]() |
f7567db01f | ||
![]() |
ef328ab392 | ||
![]() |
22365b2c55 | ||
![]() |
35507ce97e | ||
![]() |
d5b4c6dfd3 | ||
![]() |
234f9472c2 | ||
![]() |
a2119a660a | ||
![]() |
dadebb2196 | ||
![]() |
bec858c77f | ||
![]() |
cc1e8514f8 | ||
![]() |
b5d74751b1 | ||
![]() |
9cdf8772b3 | ||
![]() |
bd041df0cc | ||
![]() |
124e28b14e | ||
![]() |
a6f2f1afce | ||
![]() |
f7327524fc | ||
![]() |
e74ee37db5 | ||
![]() |
4bf5692888 | ||
![]() |
c2f60abe55 | ||
![]() |
be7683c79b | ||
![]() |
269a760f3d | ||
![]() |
6430410158 | ||
![]() |
ba258e65a0 | ||
![]() |
1934257636 | ||
![]() |
fba52c45e8 | ||
![]() |
2728c74b6c | ||
![]() |
46ec0f24f6 | ||
![]() |
9dc44d9bab | ||
![]() |
ea9b72ef79 | ||
![]() |
9212f8a709 | ||
![]() |
3862949a46 | ||
![]() |
c23535bc96 | ||
![]() |
e7c1b19161 | ||
![]() |
cc0a694c36 | ||
![]() |
af9b97b55f | ||
![]() |
f43b4e8cd8 | ||
![]() |
8430c55733 | ||
![]() |
ff043fa00f | ||
![]() |
040f5422f2 | ||
![]() |
c3aac8ddb4 | ||
![]() |
0b1635e371 | ||
![]() |
74f971284e | ||
![]() |
4f65cf8fb3 | ||
![]() |
b2d472fc50 | ||
![]() |
0fb57ecffc | ||
![]() |
237c761f67 | ||
![]() |
c5461c4596 | ||
![]() |
31a3bfed54 | ||
![]() |
4432a8164a | ||
![]() |
e9a9bdda13 | ||
![]() |
75f1c5ec33 | ||
![]() |
509a34f0fa | ||
![]() |
679565603a | ||
![]() |
cf029a81ac | ||
![]() |
2aeb0025cf | ||
![]() |
c11e5501aa | ||
![]() |
f0831174c3 | ||
![]() |
0c15d4977f | ||
![]() |
991da8ea2f | ||
![]() |
772de2596d | ||
![]() |
be54db83c9 | ||
![]() |
cfe1893d2c | ||
![]() |
1536ae30ee | ||
![]() |
81297e6c23 | ||
![]() |
f73e403ae5 | ||
![]() |
f2b35c3aab | ||
![]() |
f22f1cf4f4 | ||
![]() |
3c0c3c3c5f | ||
![]() |
9d2407dbc5 | ||
![]() |
28a58717be | ||
![]() |
f0ebf6c120 | ||
![]() |
7f79591522 | ||
![]() |
3be7b9ef59 | ||
![]() |
bd5de06c67 | ||
![]() |
49a57354f2 | ||
![]() |
5b4e9152ad | ||
![]() |
b8c153df54 | ||
![]() |
2310ac2c39 | ||
![]() |
89edc330f1 | ||
![]() |
1f975b6e05 | ||
![]() |
97d5e1b49b | ||
![]() |
75c0bd250e | ||
![]() |
7d4e9a019f | ||
![]() |
ddbf2626d7 | ||
![]() |
8e803116f1 | ||
![]() |
4b17e86c96 | ||
![]() |
265dc87da9 | ||
![]() |
bc87234fed | ||
![]() |
1c6dec3ffe | ||
![]() |
bee32fb05a | ||
![]() |
c98200aaa3 | ||
![]() |
ac5c8bea9c | ||
![]() |
b2cf9efc3a | ||
![]() |
a189b3a5c4 | ||
![]() |
60e76ed474 | ||
![]() |
5b27e491d4 | ||
![]() |
284a0afb1d | ||
![]() |
e8cd4d9b70 | ||
![]() |
ccf89512f6 | ||
![]() |
2ebc35e18b | ||
![]() |
69b05aca38 | ||
![]() |
c9a08ad178 | ||
![]() |
8e6ffa6a6f |
160
ChangeLog
160
ChangeLog
@@ -10,12 +10,158 @@
|
||||
-- ChangeLog / Aenderungen --
|
||||
|
||||
|
||||
ngIRCd 0.3.x, ??.??.2002
|
||||
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
|
||||
|
||||
- Bei PRIVMSG und NOTICE hat der ngIRCd nicht ueberpruft, ob das Ziel
|
||||
ueberhaupt ein User ist. War es keiner, so fuehrte dies zu einem
|
||||
Abbruch des Servers [es wurde assert() aufgerufen].
|
||||
|
||||
ngIRCd 0.4.2, 29.04.2002
|
||||
|
||||
- LUSERS verzaehlt sich bei eigenen Server-Links nicht mehr.
|
||||
- QUIT wird nun auch von noch nicht registrierten Clients akzeptiert.
|
||||
- IRC-Funktion LIST implementiert; bisher werden allerdings noch keine
|
||||
Wildcards (bis auf "*") unterstuetzt.
|
||||
|
||||
ngIRCd 0.4.1, 08.04.2002
|
||||
|
||||
- Bei Server-Links wird nicht mehr an Hand der Anzahl der Parameter
|
||||
eines empfangenen SERVER-Befehls, sondern "intern" erkannt, ob es
|
||||
sich um eine ein- oder ausgehende Verbindung handelt und somit das
|
||||
eigene PASS-SERVER-Paar gesendet werden muss oder nicht. Da sich
|
||||
verschiedene Versionen des Original-ircd's anders verhalten, schlug
|
||||
die Anmeldung je nach Gehenseite evtl. fehl.
|
||||
- Bei einem NICK-Befehl eines lokalen Client konnte der Server ab-
|
||||
stuerzen, da ein Format-String einer Log-Meldung fehlerhaft war.
|
||||
|
||||
ngIRCd 0.4.0, 01.04.2002
|
||||
|
||||
- IRC-Befehle nochmal auf weitere Source-Dateien aufgespalten.
|
||||
- WHO implementiert (bisher ohne komplette Unerstuetzung von Masks).
|
||||
- WHO implementiert (bisher ohne komplette Unterstuetzung von Masks).
|
||||
- Der AWAY-Mode wurde nicht ueber mehrere Server-Links weitergegeben.
|
||||
- stderr wird nun in eine Datei umgelenkt (/usr/local/var/ngircd.err).
|
||||
- stderr wird nun in eine Datei umgelenkt (/tmp/ngircd-<PID>.err).
|
||||
Laeuft der Server nicht im Debug-Modus, so wird diese bei Programm-
|
||||
ende geloescht. Sollte der Server abstuerzen, finden sich hier evtl.
|
||||
zusaetzliche Informationen.
|
||||
@@ -23,7 +169,6 @@ ngIRCd 0.3.x, ??.??.2002
|
||||
- die Beispiel-Konfigurationsdatei (doc/sample-ngircd.conf) wird als
|
||||
ngircd.conf installiert, wenn noch keine "echte" Konfigurationsdatei
|
||||
vorhanden ist.
|
||||
- bei "ngircd --help" werden nun die eincompilierten Pfade angezeigt.
|
||||
- bei WHO, WHOIS und NAMES wird nun nur noch der Status "Operator" oder
|
||||
"voiced" geliefert -- nicht mehr beides.
|
||||
- Server-Gruppen implementiert: es wird immer nur zu einem Server in
|
||||
@@ -31,19 +176,20 @@ ngIRCd 0.3.x, ??.??.2002
|
||||
nicht, so wird der naechste probiert (Variable "Group" in der Kon-
|
||||
figurationsdatei, Sektion [Server]).
|
||||
- IRC_PING() ist, wenn nicht im "strict RFC"-Mode, toleranter und ak-
|
||||
zeptiert beliebig viele Parameter: z.B. BitchX sendet soetwas.
|
||||
zeptiert beliebig viele Parameter (z.B. BitchX sendet soetwas).
|
||||
- die "Portab-Header" werden nicht mehr benoetigt, die System-Erkennung
|
||||
wird nun ausschliesslich vom configure-Script durchgefuehrt. System-
|
||||
abhaengige Definitionen finden sich nun unter src/portrab/.
|
||||
- Clients und Channels werden nicht mehr ueber ihren Namen, sondern
|
||||
einen Hash-Wert gesucht: sollte deutlich schneller sein.
|
||||
- neuer Kommandozeilen-Parameter "--configtest": die Konfiguration wird
|
||||
gelesen und die dann verwendeten Werte angezeigt.
|
||||
gelesen und dann die verwendeten Werte angezeigt.
|
||||
- Client-Mode "s" (Server Notices) implementiert.
|
||||
- mit dem neuen Kommandozeilen-Parameter "--config"/"-f" kann eine
|
||||
alternative Konfigurationsdatei angegeben werden.
|
||||
- nach dem Start kann der ngIRCd, wenn er mit root-Rechten laeuft,
|
||||
zu einer anderen User-ID und Group-ID wechseln.
|
||||
- URL der Homepage wird u.a. bei "--version" mit angezeigt.
|
||||
|
||||
ngIRCd 0.3.0, 02.03.2002
|
||||
|
||||
@@ -174,4 +320,4 @@ ngIRCd 0.0.1, 31.12.2001
|
||||
|
||||
|
||||
--
|
||||
$Id: ChangeLog,v 1.54 2002/03/29 23:41:23 alex Exp $
|
||||
$Id: ChangeLog,v 1.87.2.18 2002/11/29 11:42:24 alex Exp $
|
||||
|
114
INSTALL
114
INSTALL
@@ -8,40 +8,39 @@
|
||||
der GNU General Public License.
|
||||
|
||||
-- INSTALL / Installation --
|
||||
|
||||
Ilja Osthoff, <ilja@glide.ath.cx>
|
||||
|
||||
|
||||
ngIRCd ist fuer UNIXoide-Systeme konzipiert. Dieser Text beschreibt den
|
||||
"Standardfall": ein UNIX bzw. UNIX-aehnliches System, das von GNU automake
|
||||
und GNU autoconf ("configure") unterstuetzt wird.
|
||||
+-----------------------------------------------------------------------+
|
||||
| Please note: English translations of some of the german documentation |
|
||||
| files can be found in the directory "doc/en" -- please have a look! |
|
||||
+-----------------------------------------------------------------------+
|
||||
|
||||
|
||||
I. Voraussetzungen
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
I. Standard-Installation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
ngIRCd benoetigt "Alex' Portability Headers" (portab.h). Diese koennen von
|
||||
der Homepage heruntergeladen werden:
|
||||
ngIRCd ist fuer UNIXoide-Systeme konzipiert worden, das bedeutet, dass die
|
||||
Installation auf einem modernen UNIX-aehnlichen System kein Problem dar-
|
||||
stellen sollte. Das System muss nur von GNU automake und GNU autoconf
|
||||
("configure") unterstuetzt werden.
|
||||
|
||||
<http://arthur.ath.cx/~alex/ngircd/#download>
|
||||
Die Standard-Installation sieht so aus:
|
||||
|
||||
Vor dem configure-Lauf des ngIRCd muessen dies Header auf dem System in-
|
||||
stalliert sein, anonsten bricht configure ab.
|
||||
1) tar xzf ngircd-<Version>.tar.gz
|
||||
2) cd ngircd-<Version>
|
||||
3) ./autogen.sh [nur erforderlich, wenn ueber CVS bezogen]
|
||||
4) ./configure
|
||||
5) make
|
||||
6) make install
|
||||
|
||||
|
||||
II. Quick Start
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
In der Regel sind folgende Schritte ausreichend:
|
||||
|
||||
1) ./autogen.sh [nur erforderlich, wenn ueber CVS bezogen]
|
||||
2) ./configure
|
||||
3) make
|
||||
|
||||
|
||||
zu 1) autogen.sh:
|
||||
zu 3): "autogen.sh"
|
||||
|
||||
Der erste Schritt, autogen.sh, ist nur notwendig, wenn das configure-Script
|
||||
noch nicht vorhanden ist. Dies ist nie bei offiziellen ("stabilen") Versionen
|
||||
in tar.gz-Archiven der Fall, jedoch nie, wenn der Source-Code ueber CVS
|
||||
in tar.gz-Archiven der Fall, jedoch immer, wenn der Source-Code ueber CVS
|
||||
bezogen wurde.
|
||||
|
||||
Dieser Absatz ist also eigentlich ausschliesslich fuer Entwickler interessant.
|
||||
@@ -54,7 +53,7 @@ Versionen!) benoetigt.
|
||||
(nochmal: "Endanwender" mussen diesen Schritt i.d.R. nicht ausfuehren!)
|
||||
|
||||
|
||||
zu 2) ./configure:
|
||||
zu 4): "./configure"
|
||||
|
||||
Mit dem configure-Script wird ngIRCd, wie GNU Software meistens, an das
|
||||
lokale System angepasst und die erforderlichen Makefile's erzeugt.
|
||||
@@ -64,14 +63,26 @@ erkennen und entsprechend reagieren. Sollte dies einmal nicht der Fall sein,
|
||||
so zeigt "./configure --help" moegliche Optionen.
|
||||
|
||||
|
||||
zu 3) make:
|
||||
zu 5): "make"
|
||||
|
||||
Der make-Befehl bearbeitet die vom configure-Script erzeugten Makefile's und
|
||||
uebersetzt die comBase-Library und die Testprogramme.
|
||||
uebersetzt den ngIRCd.
|
||||
|
||||
|
||||
III. Nuetzliche make-Targets
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
zu 6): "make install"
|
||||
|
||||
Mit "make install" wird der Server und ggf. eine Beispiels-Konfiguration
|
||||
im System installiert; hierzu sind in der Regel root-Rechte erforderlich.
|
||||
Eine bereits vorhandene Konfigurationsdatei wird nie ueberschrieben.
|
||||
|
||||
Folgende Dateien werden installiert:
|
||||
|
||||
- /usr/local/sbin/ngircd: ausfuehrbarer Server
|
||||
- /usr/local/etc/ngircd.conf: Beispiel-Konfiguration, wenn nicht vorhanden
|
||||
|
||||
|
||||
II. Nuetzliche make-Targets
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Die vom configure-Script erzeugten Makefile's enthalten immer die folgenden
|
||||
nuetzlichen Targets:
|
||||
@@ -86,5 +97,52 @@ nuetzlichen Targets:
|
||||
Naechster Schritt: -> ./autogen.sh
|
||||
|
||||
|
||||
|
||||
III. Konfigurationsdatei ngircd.conf
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
In der Konfigurationsdatei werden Kommentare durch "#" oder durch ";"
|
||||
eingeleitet. Dieses dient nur der besseren Lesbarkeit.
|
||||
|
||||
Die Datei ist in drei Abschnitte unterteilt: [Global], [Operator] und
|
||||
[Server]. Im [Global]-Teil werden die grundlegenden Einstellungen vor-
|
||||
genommen, z.B. der Server-Name und die Ports, auf denen er Verbindungen
|
||||
annehmen soll. In [Operator]-Abschnitten werden Server-Operatoren fest-
|
||||
gelegt und unter [Server] werden die Einstellungen fuer die Verbindung
|
||||
mit anderen Servern konfiguriert.
|
||||
|
||||
Die Bedeutung der einzelnen Variablen ist in der Beispiel-Konfiguration
|
||||
"doc/sample-ngircd.conf" erklaert, die bei "make install" auch als
|
||||
"ngircd.conf" in /usr/local/etc installiert wird, wenn dort noch keine
|
||||
Konfigurationsdatei vorhanden ist.
|
||||
|
||||
|
||||
IV. Kommandozeilen-Optionen
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Folgende Parameter koennen dem ngIRCd u.a. uebergeben werden:
|
||||
|
||||
-f, --config <file>
|
||||
Der Daemon wird angewiesen, statt der Standard-Konfigurationsdatei
|
||||
/usr/local/etc/ngircd.conf die Datei <file> einzulesen.
|
||||
|
||||
-n, --nodaemon
|
||||
ngIRCd soll im Fordergrund laufen; alle Meldungen werden zusaetzlich
|
||||
zum Syslog auch auf der Konsole ausgegeben.
|
||||
|
||||
-p, --passive
|
||||
Verbindungen zu anderen Servern (wie in der Konfigurationsdatei in
|
||||
[Server]-Abschnitten definiert) werden nicht automatisch hergestellt.
|
||||
|
||||
--configtest
|
||||
Die Konfigurationsdatei wird eingelesen, ueberprueft und so aus-
|
||||
gegeben, wie sie vom ngIRCd interpretiert wurde. Danach beendet
|
||||
sich der Server wieder.
|
||||
|
||||
Mit dem Parameter "--help" werden alle unterstuetzten Parameter angezeigt,
|
||||
mit "--version" die Versionsnummer. Bei beiden Parametern beendet sich der
|
||||
Server nach der Ausgabe wieder.
|
||||
|
||||
|
||||
--
|
||||
$Id: INSTALL,v 1.5 2002/03/03 13:07:01 alex Exp $
|
||||
$Id: INSTALL,v 1.8 2002/09/16 11:03:05 alex Exp $
|
||||
|
@@ -3,7 +3,7 @@
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 34;
|
||||
objectVersion = 38;
|
||||
objects = {
|
||||
014CEA520018CE5811CA2923 = {
|
||||
buildRules = (
|
||||
@@ -60,23 +60,25 @@
|
||||
targets = (
|
||||
08FB779FFE84155DC02AAC07,
|
||||
F538241E024F89BC01A85B04,
|
||||
F5BEF13002A129DC01A85B03,
|
||||
);
|
||||
};
|
||||
08FB7794FE84155DC02AAC07 = {
|
||||
children = (
|
||||
1AB674ADFE9D54B511CA2CBB,
|
||||
F51F791401DFD0DE01D13771,
|
||||
F520AF150335F1B801A85B04,
|
||||
F56D8B9E01E0BFA00155ADA7,
|
||||
F52162B301C7B904012300F4,
|
||||
F52162C301C7B904012300F4,
|
||||
F52162C401C7B904012300F4,
|
||||
F52162C501C7B904012300F4,
|
||||
F52162CB01C7B904012300F4,
|
||||
F52162C601C7B904012300F4,
|
||||
F52162C701C7B904012300F4,
|
||||
F52162C801C7B904012300F4,
|
||||
F52162C901C7B904012300F4,
|
||||
F52162CA01C7B904012300F4,
|
||||
F52162CB01C7B904012300F4,
|
||||
F52162C801C7B904012300F4,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
name = ngircd;
|
||||
@@ -136,9 +138,14 @@
|
||||
F5F18139023EC63701A85B04,
|
||||
F5F1813A023EC63701A85B04,
|
||||
F55047BC0240F6E501A85B04,
|
||||
F51044550297AC170173DE11,
|
||||
F5BEF12A02A0EFE201A85B03,
|
||||
F5BEF12E02A1169C01A85B03,
|
||||
F5BEF13302A12AFE01A85B03,
|
||||
F5E9448502C9F49D01A85B04,
|
||||
);
|
||||
isa = PBXHeadersBuildPhase;
|
||||
name = Headers;
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
08FB77A1FE84155DC02AAC07 = {
|
||||
buildActionMask = 2147483647;
|
||||
@@ -159,23 +166,28 @@
|
||||
F57C888C0232884501A85B04,
|
||||
F57C889002328D7201A85B04,
|
||||
F55047BD0240F6E501A85B04,
|
||||
F51044560297B5D40173DE11,
|
||||
F5BEF12B02A0EFE201A85B03,
|
||||
F5BEF12F02A1169C01A85B03,
|
||||
F5BEF13502A24F1001A85B03,
|
||||
F5E9448602C9F49D01A85B04,
|
||||
);
|
||||
isa = PBXSourcesBuildPhase;
|
||||
name = Sources;
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
08FB77A3FE84155DC02AAC07 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
name = "Frameworks & Libraries";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
08FB77A5FE84155DC02AAC07 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
isa = PBXRezBuildPhase;
|
||||
name = "ResourceManager Resources";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
//080
|
||||
//081
|
||||
@@ -206,6 +218,30 @@
|
||||
//F52
|
||||
//F53
|
||||
//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 = {
|
||||
isa = PBXFileReference;
|
||||
name = client.c;
|
||||
@@ -352,8 +388,13 @@
|
||||
};
|
||||
F51F791401DFD0DE01D13771 = {
|
||||
children = (
|
||||
F5E9447B02C9EE0E01A85B04,
|
||||
F5263AEF01E2A9B801CE8F8F,
|
||||
F51F791501DFD0DE01D13771,
|
||||
F5E9447D02C9EE2801A85B04,
|
||||
F5B565290325412B01A85B04,
|
||||
F5E9447E02C9EE2801A85B04,
|
||||
F5E9447F02C9EE2801A85B04,
|
||||
F51F791601DFD0DE01D13771,
|
||||
F51F791701DFD0DE01D13771,
|
||||
);
|
||||
@@ -377,12 +418,137 @@
|
||||
path = "sample-ngircd.conf";
|
||||
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 = {
|
||||
children = (
|
||||
F52162B801C7B904012300F4,
|
||||
F52162D801C7BAAE012300F4,
|
||||
F52162B901C7B904012300F4,
|
||||
F5F18132023EC61E01A85B04,
|
||||
F520AEA80335E29001A85B04,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
name = src;
|
||||
@@ -417,16 +583,24 @@
|
||||
F51DBB1C022D9D8F01A85B04,
|
||||
F51DBB17022D995501A85B04,
|
||||
F51DBB18022D995501A85B04,
|
||||
F5BEF12C02A1169C01A85B03,
|
||||
F5BEF12D02A1169C01A85B03,
|
||||
F57C88850232853501A85B04,
|
||||
F57C88860232853501A85B04,
|
||||
F57C88890232884501A85B04,
|
||||
F57C888A0232884501A85B04,
|
||||
F51DBB13022D95E801A85B04,
|
||||
F51DBB14022D95E801A85B04,
|
||||
F5BEF12802A0EFE201A85B03,
|
||||
F5BEF12902A0EFE201A85B03,
|
||||
F52162BB01C7B904012300F4,
|
||||
F52162BC01C7B904012300F4,
|
||||
F5E9448402C9F49D01A85B04,
|
||||
F5E9448302C9F49D01A85B04,
|
||||
F576ABFA01D5E77301A85B03,
|
||||
F576ABFB01D5E77301A85B03,
|
||||
F5BEF13102A12AFE01A85B03,
|
||||
F5BEF13202A12AFE01A85B03,
|
||||
F52162C001C7B904012300F4,
|
||||
F52162C101C7B904012300F4,
|
||||
F51F791201DFC95301D13771,
|
||||
@@ -671,7 +845,7 @@
|
||||
F5382422024F89BC01A85B04,
|
||||
);
|
||||
isa = PBXHeadersBuildPhase;
|
||||
name = Headers;
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
F5382420024F89BC01A85B04 = {
|
||||
fileRef = F5F18134023EC63701A85B04;
|
||||
@@ -697,7 +871,7 @@
|
||||
F5382424024F89BC01A85B04,
|
||||
);
|
||||
isa = PBXSourcesBuildPhase;
|
||||
name = Sources;
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
F5382424024F89BC01A85B04 = {
|
||||
fileRef = F5F18137023EC63701A85B04;
|
||||
@@ -710,14 +884,14 @@
|
||||
files = (
|
||||
);
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
name = "Frameworks & Libraries";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
F5382426024F89BC01A85B04 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
isa = PBXRezBuildPhase;
|
||||
name = "ResourceManager Resources";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
F55047BA0240F6E501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
@@ -869,6 +1043,168 @@
|
||||
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 = {
|
||||
children = (
|
||||
F5F18133023EC63701A85B04,
|
||||
@@ -876,6 +1212,8 @@
|
||||
F5F18135023EC63701A85B04,
|
||||
F5F18136023EC63701A85B04,
|
||||
F5F18137023EC63701A85B04,
|
||||
F51044540297AC170173DE11,
|
||||
F51044520297ABF80173DE11,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
name = portab;
|
||||
|
@@ -9,12 +9,12 @@
|
||||
# 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.8 2002/03/25 19:39:48 alex Exp $
|
||||
# $Id: Makefile.am,v 1.9.2.1 2002/10/03 16:13:38 alex Exp $
|
||||
#
|
||||
|
||||
AUTOMAKE_OPTIONS = gnu
|
||||
|
||||
SUBDIRS = doc MacOSX src
|
||||
SUBDIRS = doc MacOSX src man contrib
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -rf autom4te.cache
|
||||
@@ -25,4 +25,7 @@ maintainer-clean-local:
|
||||
lint:
|
||||
make -C src/ngircd lint
|
||||
|
||||
rpm: distcheck
|
||||
rpm -ta ngircd-*.tar.gz
|
||||
|
||||
# -eof-
|
||||
|
33
NEWS
33
NEWS
@@ -10,10 +10,35 @@
|
||||
-- NEWS / Neuigkeiten --
|
||||
|
||||
|
||||
ngIRCd 0.3.x, ??.??.2002
|
||||
ngIRCd 0.5.0, 20.09.2002
|
||||
|
||||
- WHO implementiert (bisher ohne komplette Unerstuetzung von Masks).
|
||||
- stderr wird nun in eine Datei umgelenkt (/usr/local/var/ngircd.err).
|
||||
- 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
|
||||
|
||||
- WHO implementiert (bisher ohne komplette Unterstuetzung von Masks).
|
||||
- stderr wird nun in eine Datei umgelenkt (/ngircd-<PID>.err).
|
||||
Laeuft der Server nicht im Debug-Modus, so wird diese bei Programm-
|
||||
ende geloescht. Sollte der Server abstuerzen, finden sich hier evtl.
|
||||
zusaetzliche Informationen.
|
||||
@@ -85,4 +110,4 @@ ngIRCd 0.0.1, 31.12.2001
|
||||
|
||||
|
||||
--
|
||||
$Id: NEWS,v 1.25 2002/03/29 23:41:23 alex Exp $
|
||||
$Id: NEWS,v 1.38.2.4 2002/10/03 16:09:50 alex Exp $
|
||||
|
111
README
111
README
@@ -8,61 +8,98 @@
|
||||
der GNU General Public License.
|
||||
|
||||
-- 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
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
ngIRCd ist ein Server fuer den Internet Relay Chat (IRC). Er ist von Grund
|
||||
auf neu geschrieben, also nicht wie die meisten anderen IRCd's vom Urvater,
|
||||
dem Daemon des IRCNet abgeleitet.
|
||||
ngIRCd ist ein Open-Source-Server fuer den Internet Relay Chat (IRC), der
|
||||
unter der GNU General Public License (http://www.gnu.org/licenses/gpl.html)
|
||||
entwickelt wird. ngIRCd steht fuer "next generation IRC daemon", er ist von
|
||||
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.
|
||||
|
||||
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
|
||||
Server jedoch noch nicht alles.
|
||||
II. Status
|
||||
~~~~~~~~~~~
|
||||
|
||||
Zur Zeit befindet sich der ngIRCd noch in Entwicklung, manche Features sind
|
||||
noch nicht implementiert, andere nur teilweise.
|
||||
|
||||
Bisher (mehr oder wenig vollstaendig) implementierte IRC-Befehle:
|
||||
|
||||
AWAY, DIE, ERROR, ISON, JOIN, KILL, LINKS, LUSERS, MODE, MOTD, NAMES, NICK,
|
||||
NOTICE, NJOIN, OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, RESTART, SERVER,
|
||||
SQUIT, TOPIC, USER, USERHOST, 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/>.
|
||||
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.
|
||||
|
||||
|
||||
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.
|
||||
Das README liest du gerade ,-)
|
||||
III. Features (oder: warum gerade ngIRCd?)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- keine Probleme mit Servern, deren IP-Adresse dynamisch ist,
|
||||
- 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.
|
||||
|
||||
|
||||
II. Vorteile
|
||||
~~~~~~~~~~~~
|
||||
IV. Dokumentation
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
- keine Probleme mit Servern, deren IP-Adressen nicht statisch sind,
|
||||
- uebersichtliche ("schlanke") Konfigurationsdatei,
|
||||
- frei verfuegbarer, moderner und "aufgeraeumter" C-Quellcode.
|
||||
- ngIRCd wird aktiv weiter entwickelt.
|
||||
Im Paket enthalten ist u.a.:
|
||||
|
||||
- README: das Dokument, das Du gerade liest :-)
|
||||
- INSTALL: Hinweise zur Installation des ngIRCd
|
||||
- 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
|
||||
|
||||
|
||||
III. Unterstuetzte Plattformen
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
V. Bezugsquellen
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
- A/UX
|
||||
- FreeBSD
|
||||
- Linux
|
||||
- Mac OS X
|
||||
- NetBSD
|
||||
- Windows mit Cygwin
|
||||
Die Homepage des ngIRCd ist: <http://arthur.ath.cx/~alex/ngircd>; dort
|
||||
findest du immer die neusten Informationen ueber den ngIRCd und die aktuellen
|
||||
freigegebenen ("stabilen") Releases.
|
||||
|
||||
Falls du dich fuer die aktuellen Entwicklungs-Versionen (die jedoch nicht
|
||||
immer "stabil" sind) interessierst, dann lese bitte den Punkt "CVS" auf der
|
||||
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.8 2002/03/21 23:25:15 alex Exp $
|
||||
$Id: README,v 1.13 2002/09/16 11:03:05 alex Exp $
|
||||
|
136
configure.in
136
configure.in
@@ -9,15 +9,16 @@
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
#
|
||||
# $Id: configure.in,v 1.39 2002/03/30 18:02:39 alex Exp $
|
||||
# $Id: configure.in,v 1.58.2.11 2002/11/29 10:53:44 alex Exp $
|
||||
#
|
||||
|
||||
# -- Initialisierung --
|
||||
|
||||
AC_INIT
|
||||
AC_PREREQ(2.50)
|
||||
AC_CANONICAL_TARGET
|
||||
AC_CONFIG_SRCDIR(src/config.h.in)
|
||||
AM_INIT_AUTOMAKE(ngircd,0.3.0-CVS)
|
||||
AM_INIT_AUTOMAKE(ngircd,0.5.x-CVS)
|
||||
AM_CONFIG_HEADER(src/config.h)
|
||||
|
||||
# -- Templates fuer config.h --
|
||||
@@ -27,6 +28,7 @@ AH_TEMPLATE([HAVE_socklen_t], [Define if socklen_t exists])
|
||||
AH_TEMPLATE([SNIFFER], [Define if IRC sniffer should be enabled])
|
||||
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([IRCPLUS], [Define if IRC+ protocol should be used])
|
||||
|
||||
AH_TEMPLATE([TARGET_OS], [Target operating system name])
|
||||
AH_TEMPLATE([TARGET_VENDOR], [Target system vendor])
|
||||
@@ -35,7 +37,6 @@ AH_TEMPLATE([TARGET_CPU], [Target CPU name])
|
||||
# -- C Compiler --
|
||||
|
||||
AC_PROG_CC
|
||||
AC_LANG_C
|
||||
|
||||
# -- Hilfsprogramme --
|
||||
|
||||
@@ -45,19 +46,28 @@ AC_PROG_LN_S
|
||||
AC_PROG_MAKE_SET
|
||||
AC_PROG_RANLIB
|
||||
|
||||
# -- Compiler Features --
|
||||
|
||||
AC_LANG_C
|
||||
|
||||
AM_C_PROTOTYPES
|
||||
AC_C_CONST
|
||||
|
||||
# -- Header --
|
||||
|
||||
AC_HEADER_STDC
|
||||
|
||||
AC_HEADER_TIME
|
||||
|
||||
AC_CHECK_HEADERS(arpa/inet.h)
|
||||
AC_HEADER_SYS_WAIT
|
||||
|
||||
AC_CHECK_HEADERS([ \
|
||||
errno.h fcntl.h netdb.h netinet/in.h stdlib.h string.h \
|
||||
sys/socket.h sys/time.h sys/wait.h unistd.h \
|
||||
ctype.h errno.h fcntl.h netdb.h netinet/in.h stdlib.h string.h \
|
||||
strings.h sys/socket.h sys/time.h unistd.h \
|
||||
],,AC_MSG_ERROR([required C header missing!]))
|
||||
|
||||
AC_CHECK_HEADERS(arpa/inet.h malloc.h stdint.h sys/select.h varargs.h)
|
||||
|
||||
# -- Datentypen --
|
||||
|
||||
AC_MSG_CHECKING(whether socklen_t exists)
|
||||
@@ -73,61 +83,64 @@ AC_TRY_COMPILE([
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
|
||||
AC_TYPE_SIGNAL
|
||||
|
||||
AC_TYPE_SIZE_T
|
||||
|
||||
# -- Libraries --
|
||||
|
||||
AC_CHECK_LIB(UTIL,memmove)
|
||||
AC_CHECK_LIB(socket,bind)
|
||||
AC_CHECK_LIB(nsl,gethostent)
|
||||
|
||||
# -- Funktionen --
|
||||
|
||||
AC_FUNC_MALLOC
|
||||
|
||||
AC_FUNC_FORK
|
||||
|
||||
AC_FUNC_STRFTIME
|
||||
|
||||
AC_CHECK_FUNCS([ \
|
||||
bind gethostbyaddr gethostbyname gethostname inet_ntoa memmove \
|
||||
memset select setsockopt socket strcasecmp strchr strerror strftime \
|
||||
strstr vsnprintf waitpid \
|
||||
memset select setsockopt socket strcasecmp strchr strerror \
|
||||
strstr waitpid \
|
||||
],,AC_MSG_ERROR([required function missing!]))
|
||||
|
||||
AC_CHECK_FUNCS(inet_aton)
|
||||
|
||||
AC_CHECK_FUNCS(sigaction)
|
||||
AC_CHECK_FUNCS(inet_aton sigaction snprintf vsnprintf)
|
||||
|
||||
# -- Konfigurationsoptionen --
|
||||
|
||||
x_syslog_on=no
|
||||
AC_ARG_ENABLE(syslog,
|
||||
[ --disable-syslog disable syslog (autodetected by default)],
|
||||
[ if test "$enableval" = "yes"; then
|
||||
AC_CHECK_HEADER(syslog.h,
|
||||
[ AC_DEFINE(USE_SYSLOG, 1)
|
||||
AC_CHECK_LIB(be,syslog)
|
||||
],
|
||||
AC_CHECK_HEADER(syslog.h, x_syslog_on=yes,
|
||||
AC_MSG_ERROR([Can't enable syslog: syslog.h not found!])
|
||||
)
|
||||
else
|
||||
AC_MSG_RESULT([disabling syslog])
|
||||
fi
|
||||
],
|
||||
[ AC_CHECK_HEADER(syslog.h,
|
||||
[ AC_DEFINE(USE_SYSLOG, 1)
|
||||
AC_CHECK_LIB(be,syslog)
|
||||
]
|
||||
)
|
||||
]
|
||||
[ AC_CHECK_HEADER(syslog.h, x_syslog_on=yes) ]
|
||||
)
|
||||
if test "$x_syslog_on" = "yes"; then
|
||||
AC_DEFINE(USE_SYSLOG, 1)
|
||||
AC_CHECK_LIB(be,syslog)
|
||||
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)
|
||||
AC_MSG_RESULT([enabling strict RFC conformance])
|
||||
fi
|
||||
x_ircplus_on=yes
|
||||
AC_ARG_ENABLE(ircplus,
|
||||
[ --disable-ircplus disable IRC+ protocol],
|
||||
if test "$enableval" = "no"; then x_ircplus_on=no; fi
|
||||
)
|
||||
if test "$x_ircplus_on" = "yes"; then
|
||||
AC_DEFINE(IRCPLUS, 1)
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(sniffer,
|
||||
[ --enable-sniffer enable network traffic monitor (enables debug mode!)],
|
||||
[ --enable-sniffer enable IRC traffic sniffer (enables debug mode)],
|
||||
if test "$enableval" = "yes"; then
|
||||
AC_DEFINE(SNIFFER, 1)
|
||||
AC_MSG_RESULT([enabling network traffic monitor])
|
||||
x_debug_on=yes
|
||||
x_sniffer_on=yes; x_debug_on=yes
|
||||
fi
|
||||
)
|
||||
|
||||
@@ -137,15 +150,29 @@ AC_ARG_ENABLE(debug,
|
||||
)
|
||||
if test "$x_debug_on" = "yes"; then
|
||||
AC_DEFINE(DEBUG, 1)
|
||||
AC_MSG_RESULT([enabling additional debug output])
|
||||
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 --
|
||||
|
||||
AC_DEFINE_UNQUOTED(TARGET_CPU, "$target_cpu" )
|
||||
AC_DEFINE_UNQUOTED(TARGET_VENDOR, "$target_vendor" )
|
||||
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 --
|
||||
|
||||
if test "$GCC" = "yes"; then
|
||||
@@ -154,22 +181,51 @@ fi
|
||||
|
||||
CFLAGS="$CFLAGS -DSYSCONFDIR='\"\$(sysconfdir)\"'"
|
||||
|
||||
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 --
|
||||
# -- Ausgabe der Dateien --
|
||||
|
||||
AC_OUTPUT([ \
|
||||
Makefile \
|
||||
doc/Makefile \
|
||||
doc/en/Makefile \
|
||||
MacOSX/Makefile \
|
||||
MacOSX/ngircd.pbproj/Makefile \
|
||||
src/Makefile \
|
||||
src/portab/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-
|
||||
|
20
contrib/Makefile.am
Normal file
20
contrib/Makefile.am
Normal file
@@ -0,0 +1,20 @@
|
||||
#
|
||||
# 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-
|
54
contrib/ngircd.spec
Normal file
54
contrib/ngircd.spec
Normal file
@@ -0,0 +1,54 @@
|
||||
%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/
|
@@ -1,27 +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.
|
||||
|
||||
-- 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 $
|
@@ -9,11 +9,13 @@
|
||||
# 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.7 2002/03/30 15:33:14 alex Exp $
|
||||
# $Id: Makefile.am,v 1.10 2002/09/16 10:35:06 alex Exp $
|
||||
#
|
||||
|
||||
EXTRA_DIST = CC-Speed.txt CVS.txt FAQ.txt README-AUX.txt README-BeOS.txt \
|
||||
RFC.txt sample-ngircd.conf
|
||||
SUBDIRS = en
|
||||
|
||||
EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt README-AUX.txt \
|
||||
README-BeOS.txt RFC.txt sample-ngircd.conf
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
109
doc/Protocol.txt
Normal file
109
doc/Protocol.txt
Normal file
@@ -0,0 +1,109 @@
|
||||
|
||||
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 $
|
@@ -18,7 +18,7 @@ Folgende Software wird jedoch benoetigt:
|
||||
- GNU C Compiler (gcc)
|
||||
Bezugsquellen:
|
||||
http://www.rezepte-im-web.de/appleux/gcc281.tar.gz
|
||||
ftp://arthur.ath.cx/pub/AUX/Software/Development/gcc281.tar.gz
|
||||
ftp://arthur.ath.cx/pub/AUX/Software/Development/gcc-2.8.1-auxbin.tar.gz
|
||||
|
||||
- GNU make
|
||||
Bezugsquellen:
|
||||
@@ -30,6 +30,13 @@ Folgende Software wird jedoch benoetigt:
|
||||
http://www.rezepte-im-web.de/appleux/sed-3.02.tar.gz
|
||||
ftp://arthur.ath.cx/pub/AUX/Software/Tools/sed-3.02.tar.gz
|
||||
|
||||
- install (z.B. aus den GNU fileutils)
|
||||
Ein install, welches entweder so "broken" ist, dass configure das eigene
|
||||
Shell-Script waehlt, oder eines, das funktioniert. Leider ist mindestens
|
||||
ein Binary im Umlauf, das Probleme macht.
|
||||
Bezugsquelle:
|
||||
ftp://arthur.ath.cx/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz
|
||||
|
||||
- libUTIL.a
|
||||
Bezugsquellen:
|
||||
http://ftp.mayn.de/pub/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz
|
||||
@@ -39,9 +46,26 @@ Nachdem diese Pakete entsprechend installiert sind, reicht ein ganz normales
|
||||
"./configure" und "make" aus, um den ngIRCd unter A/UX zu compilieren.
|
||||
|
||||
|
||||
Noch ein paar Hinweise, wenn es doch (noch) nicht klappt:
|
||||
|
||||
- auf dem System muss entweder ein install vorhanden sein, welches so
|
||||
"broken" ist, dass configure das eigene Shell-Skript waehlt, oder eben
|
||||
eines, welches funktioniert. Leider ist mindestens ein Binary im Um-
|
||||
lauf, welches Probleme verursacht. Das Binary aus folgenden GNU
|
||||
fileutils funktioniert hier aber z.B.:
|
||||
ftp://arthur.ath.cx/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz
|
||||
|
||||
- das sich im Umlauf befindende vorcompilierte Binary der alten Bash sollte
|
||||
unbedingt ausserhalb von /bin (z.B. unter /usr/local/bin) installiert
|
||||
werden. Ansonsten waehlt es das configure-Script als Shell aus, leider
|
||||
funktioniert das aber nicht.
|
||||
Das config.status-Script sollte mit der ksh als Interpreter erstellt
|
||||
worden sein (siehe erste Zeile davon!).
|
||||
|
||||
|
||||
Hier die Zeiten von Alex System (Macintosh SE/30, 32 MB, A/UX 3.0.1):
|
||||
configure: 7:33, make: 12:02
|
||||
|
||||
|
||||
--
|
||||
$Id: README-AUX.txt,v 1.1 2002/02/25 14:02:32 alex Exp $
|
||||
$Id: README-AUX.txt,v 1.3 2002/04/29 14:19:48 alex Exp $
|
||||
|
@@ -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
|
||||
obiger Meldung.
|
||||
|
||||
Theoretische "L<EFBFBD>sung"/Workaround:
|
||||
Theoretische "Loesung"/Workaround:
|
||||
Den Resolver unter BeOS nicht verwenden, sondern mit IP-Adressen arbeiten.
|
||||
Nachteil: der ngIRCd koennte sich nicht zu Servern verbinden, die dynamische
|
||||
Adressen benutzen -- dazu muesste er den Namen aufloesen. Ansonsten sollte
|
||||
@@ -32,5 +32,16 @@ Also: wenn es jemand implementieren will ... ;-))
|
||||
|
||||
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.1 2002/02/25 14:02:32 alex Exp $
|
||||
$Id: README-BeOS.txt,v 1.3 2002/05/19 13:10:26 alex Exp $
|
||||
|
126
doc/en/INSTALL
Normal file
126
doc/en/INSTALL
Normal file
@@ -0,0 +1,126 @@
|
||||
|
||||
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 $
|
20
doc/en/Makefile.am
Normal file
20
doc/en/Makefile.am
Normal file
@@ -0,0 +1,20 @@
|
||||
#
|
||||
# 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-
|
101
doc/en/README
Normal file
101
doc/en/README
Normal file
@@ -0,0 +1,101 @@
|
||||
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 $
|
@@ -1,4 +1,4 @@
|
||||
# $Id: sample-ngircd.conf,v 1.8 2002/03/30 13:03:12 alex Exp $
|
||||
# $Id: sample-ngircd.conf,v 1.11 2002/09/16 10:33:09 alex Exp $
|
||||
|
||||
#
|
||||
# Das ist eine Beispiel-Konfiguration fuer den ngIRCd, die an die
|
||||
@@ -6,6 +6,9 @@
|
||||
#
|
||||
# Kommentare werden mit "#" oder ";" eingeleitet.
|
||||
#
|
||||
# Autor: Alexander Barton, <alex@barton.de>
|
||||
# Erweiterungen von Ilja Osthoff, <ilja@glide.ath.cx>
|
||||
#
|
||||
|
||||
[Global]
|
||||
|
||||
@@ -13,20 +16,29 @@
|
||||
# Im [Global]-Abschnitt der Konfigurationsdatei wird der Server
|
||||
# "an sich" konfiguriert. Notwendig ist nur die Variable "Name",
|
||||
# Info ist in der Regel ebengalls anzupassen. Fuer alle uebrigen
|
||||
# Variablen koennen oft die Defaults benutzt werden.
|
||||
# Variablen koennen oft die Defaults benutzt werden, d.h. hier
|
||||
# muss die Variable nicht angegeben werden.
|
||||
#
|
||||
|
||||
# Servername im IRC-Netz
|
||||
Name = irc.the.net
|
||||
|
||||
# Info-Text des Servers
|
||||
# Info-Text des Servers. Dieser wird z.B. bei WHOIS- oder LINKS-
|
||||
# Abfragen entsprechend mit ausgegeben.
|
||||
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
|
||||
# mehrere Ports mit "," getrennt angegeben werden. (Default: 6667)
|
||||
;Ports = 6667, 6668, 6669
|
||||
|
||||
# Textdatei mit der "Message of the Day" (MOTD)
|
||||
# Textdatei mit der "Message of the Day" (MOTD). Diese wird aus-
|
||||
# gegeben, wenn sich ein User mit dem Server verbindet.
|
||||
;MotdFile = /usr/local/etc/ngircd.motd
|
||||
|
||||
# User-ID, unter der der Daemon laufen soll (dazu muss der Server
|
||||
@@ -50,7 +62,10 @@
|
||||
# Der Server versucht alle <ConnectRetry> Sekunden, noch nicht bzw.
|
||||
# nicht mehr connectierte Server-Links aufzubauen.
|
||||
;ConnectRetry = 60
|
||||
|
||||
|
||||
# Sollen IRC-Operatoren immer den MODE-Befehl in Channel benutzen
|
||||
# koennen, auch wenn sie kein(!) Channel-Operator sind?
|
||||
;OperCanUseMode = no
|
||||
|
||||
[Operator]
|
||||
|
||||
@@ -66,26 +81,27 @@
|
||||
# Passwort des IRC-Operators
|
||||
;Password = ThePwd
|
||||
|
||||
|
||||
[Server]
|
||||
|
||||
#
|
||||
# In [Server]-Bloecken werden Server konfiguriert, zu denen dieser
|
||||
# Server sich verbinden soll bzw. von denen Verbindungen angekommen
|
||||
# In [Server]-Bloecken werden Server konfiguriert, zu denen sich
|
||||
# dieser ngIRCd verbinden soll bzw. von denen Verbindungen angekommen
|
||||
# werden duerfen.
|
||||
# Es koennen mehrere Server konfiguriert werden, d.h. [Server]-
|
||||
# Bloecke koennen mehrfach vorkommen.
|
||||
# Ist fuer einen Server ein Port konfiguriert, so versucht dieser
|
||||
# Server die Gegenseite zu connectieren. Ist kein Port vorgegeben,
|
||||
# so wartet dieser Server auf eine Verbindung der Gegenseite.
|
||||
# Wenn man fuer einen Server einen Port angegeben hat, dann versucht
|
||||
# sich der ngIRCd mit der Gegenseite zu verbinden. Hat man keinen
|
||||
# Port konfiguriert, dann wartet der ngIRCd darauf, dass sich die
|
||||
# Gegenseite mit ihm verbindet.
|
||||
#
|
||||
# Server-Gruppen:
|
||||
# Fuer jeden Server kann (optinal!) eine Gruppe konfiguriert werden,
|
||||
# zu der er gehoert (wird nur beachtet, wenn ein Port konfiguriert
|
||||
# ist!): eine solche Server-Gruppe wird quasi als ein Server ange-
|
||||
# sehen, der ngIRCd baut also nur eine Verbindung auf. Schlaegt die
|
||||
# Verbindung zu einem Server in einer Gruppe fehl, so wird der
|
||||
# naechste Server in der Gruppe probiert.
|
||||
# Der ngIRCd unterstuetzt "Server-Gruppen": das bedeutet, man kann
|
||||
# jedem Server, mit dem man sich verbinden will, einer Gruppe zu-
|
||||
# ordnen. Wenn der ngIRCd sich dann mit einem Server aus der Gruppe
|
||||
# verbinden will und keine Antwort erhaelt, dann wird der naechste
|
||||
# Server aus der Gruppe versucht.
|
||||
# Achtung: Gruppen werden nur beachtet, wenn man einen Port fur
|
||||
# die Gegenseite angegeben hat!
|
||||
#
|
||||
|
||||
# Hostname des Servers
|
||||
@@ -105,4 +121,24 @@
|
||||
# Gruppe, zu der dieser Server gehoert (optional).
|
||||
;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-
|
||||
|
22
man/Makefile.am
Normal file
22
man/Makefile.am
Normal file
@@ -0,0 +1,22 @@
|
||||
#
|
||||
# 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-
|
52
man/ngircd.8
Normal file
52
man/ngircd.8
Normal file
@@ -0,0 +1,52 @@
|
||||
.\"
|
||||
.\" $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-
|
26
man/ngircd.conf.5
Normal file
26
man/ngircd.conf.5
Normal file
@@ -0,0 +1,26 @@
|
||||
.\"
|
||||
.\" $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-
|
@@ -9,10 +9,10 @@
|
||||
# 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 2002/03/12 14:37:51 alex Exp $
|
||||
# $Id: Makefile.am,v 1.4 2002/09/09 10:00:15 alex Exp $
|
||||
#
|
||||
|
||||
SUBDIRS = portab ngircd
|
||||
SUBDIRS = portab ngircd testsuite
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in config.h config.h.in stamp-h.in
|
||||
|
@@ -9,22 +9,28 @@
|
||||
# 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.19 2002/03/29 22:52:12 alex Exp $
|
||||
# $Id: Makefile.am,v 1.27 2002/09/07 18:06:29 alex Exp $
|
||||
#
|
||||
|
||||
AM_CFLAGS = -I$(srcdir)/../portab
|
||||
AUTOMAKE_OPTIONS = ../portab/ansi2knr
|
||||
|
||||
INCLUDES = -I$(srcdir)/../portab
|
||||
|
||||
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN
|
||||
|
||||
sbin_PROGRAMS = ngircd
|
||||
|
||||
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-oper.c irc-server.c \
|
||||
irc-write.c log.c parse.c tool.c
|
||||
irc-channel.c irc-login.c irc-mode.c irc-op.c irc-oper.c irc-server.c \
|
||||
irc-write.c lists.c log.c match.c parse.c resolve.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 \
|
||||
irc-channel.h irc-login.h irc-mode.h irc-oper.h irc-server.h \
|
||||
irc-write.h log.h parse.h tool.h \
|
||||
irc-channel.h irc-login.h irc-mode.h irc-op.h irc-oper.h irc-server.h \
|
||||
irc-write.h lists.h log.h match.h parse.h resolve.h tool.h \
|
||||
messages.h defines.h
|
||||
|
||||
clean-local:
|
||||
@@ -35,7 +41,7 @@ maintainer-clean-local:
|
||||
|
||||
check-version: Makefile
|
||||
echo "#!/bin/sh" > check-version
|
||||
echo "./ngircd --version | grep version > /dev/null 2>&1" >> check-version
|
||||
echo "./ngircd --version | grep ngircd > /dev/null 2>&1" >> check-version
|
||||
chmod 755 check-version
|
||||
|
||||
check-help: Makefile
|
||||
@@ -47,7 +53,7 @@ lint:
|
||||
rm -f lint.out
|
||||
for f in *.c; do \
|
||||
echo "checking $$f ..."; \
|
||||
splint $$f $(LINTARGS) -I./.. $(AM_CFLAGS) > lint.out 2>&1; \
|
||||
splint $$f $(LINTARGS) -I./.. -I./../portab $(AM_CFLAGS) > lint.out 2>&1; \
|
||||
grep "no warnings" lint.out > /dev/null 2>&1; \
|
||||
if [ $$? -ne 0 ]; then \
|
||||
echo; cat lint.out; echo; \
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: channel.c,v 1.20 2002/03/25 16:54:26 alex Exp $
|
||||
* $Id: channel.c,v 1.32.2.1 2002/11/04 19:18:39 alex Exp $
|
||||
*
|
||||
* channel.c: Management der Channels
|
||||
*/
|
||||
@@ -25,37 +25,87 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "hash.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "channel.h"
|
||||
|
||||
#include "imp.h"
|
||||
#include "irc-write.h"
|
||||
#include "resolve.h"
|
||||
#include "conf.h"
|
||||
#include "hash.h"
|
||||
#include "lists.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "channel.h"
|
||||
|
||||
|
||||
#define REMOVE_PART 0
|
||||
#define REMOVE_QUIT 1
|
||||
#define REMOVE_KICK 2
|
||||
|
||||
|
||||
LOCAL CHANNEL *My_Channels;
|
||||
LOCAL CL2CHAN *My_Cl2Chan;
|
||||
|
||||
|
||||
LOCAL CHANNEL *New_Chan( CHAR *Name );
|
||||
LOCAL CL2CHAN *Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client );
|
||||
LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client );
|
||||
LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN ServerPART );
|
||||
LOCAL CL2CHAN *Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan );
|
||||
LOCAL CL2CHAN *Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan );
|
||||
LOCAL BOOLEAN Delete_Channel( CHANNEL *Chan );
|
||||
LOCAL CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client ));
|
||||
LOCAL CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client ));
|
||||
LOCAL BOOLEAN Remove_Client PARAMS(( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN InformServer ));
|
||||
LOCAL CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan ));
|
||||
LOCAL CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan ));
|
||||
LOCAL BOOLEAN Delete_Channel PARAMS(( CHANNEL *Chan ));
|
||||
|
||||
|
||||
GLOBAL VOID Channel_Init( VOID )
|
||||
GLOBAL VOID
|
||||
Channel_Init( VOID )
|
||||
{
|
||||
My_Channels = NULL;
|
||||
My_Cl2Chan = NULL;
|
||||
} /* Channel_Init */
|
||||
|
||||
|
||||
GLOBAL VOID Channel_Exit( VOID )
|
||||
GLOBAL 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;
|
||||
CL2CHAN *cl2chan, *cl2chan_next;
|
||||
@@ -80,7 +130,8 @@ GLOBAL VOID Channel_Exit( VOID )
|
||||
} /* Channel_Exit */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name )
|
||||
GLOBAL BOOLEAN
|
||||
Channel_Join( CLIENT *Client, CHAR *Name )
|
||||
{
|
||||
CHANNEL *chan;
|
||||
|
||||
@@ -104,12 +155,8 @@ GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name )
|
||||
else
|
||||
{
|
||||
/* Gibt es noch nicht? Dann neu anlegen: */
|
||||
chan = New_Chan( Name );
|
||||
chan = Channel_Create( Name );
|
||||
if( ! chan ) return FALSE;
|
||||
|
||||
/* Verketten */
|
||||
chan->next = My_Channels;
|
||||
My_Channels = chan;
|
||||
}
|
||||
|
||||
/* User dem Channel hinzufuegen */
|
||||
@@ -118,12 +165,14 @@ GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name )
|
||||
} /* Channel_Join */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
|
||||
GLOBAL BOOLEAN
|
||||
Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
|
||||
{
|
||||
CHANNEL *chan;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Name != NULL );
|
||||
assert( Reason != NULL );
|
||||
|
||||
/* Channel suchen */
|
||||
chan = Channel_Search( Name );
|
||||
@@ -134,31 +183,77 @@ GLOBAL BOOLEAN Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *R
|
||||
}
|
||||
|
||||
/* User aus Channel entfernen */
|
||||
if( ! Remove_Client( chan, Client, Origin, Reason, TRUE )) return FALSE;
|
||||
if( ! Remove_Client( REMOVE_PART, chan, Client, Origin, Reason, TRUE )) return FALSE;
|
||||
else return TRUE;
|
||||
} /* Channel_Part */
|
||||
|
||||
|
||||
GLOBAL VOID Channel_RemoveClient( CLIENT *Client, CHAR *Reason )
|
||||
GLOBAL VOID
|
||||
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;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Reason != NULL );
|
||||
|
||||
c = My_Channels;
|
||||
while( c )
|
||||
{
|
||||
next_c = c->next;
|
||||
Remove_Client( c, Client, Client_ThisServer( ), Reason, FALSE );
|
||||
Remove_Client( REMOVE_QUIT, c, Client, Client, Reason, FALSE );
|
||||
c = next_c;
|
||||
}
|
||||
} /* Channel_RemoveClient */
|
||||
} /* Channel_Quit */
|
||||
|
||||
|
||||
GLOBAL INT Channel_Count( VOID )
|
||||
GLOBAL LONG
|
||||
Channel_Count( VOID )
|
||||
{
|
||||
CHANNEL *c;
|
||||
INT count;
|
||||
LONG count;
|
||||
|
||||
count = 0;
|
||||
c = My_Channels;
|
||||
@@ -171,34 +266,58 @@ GLOBAL INT Channel_Count( VOID )
|
||||
} /* Channel_Count */
|
||||
|
||||
|
||||
GLOBAL CHAR *Channel_Name( CHANNEL *Chan )
|
||||
GLOBAL LONG
|
||||
Channel_MemberCount( CHANNEL *Chan )
|
||||
{
|
||||
CL2CHAN *cl2chan;
|
||||
LONG count;
|
||||
|
||||
assert( Chan != NULL );
|
||||
|
||||
count = 0;
|
||||
cl2chan = My_Cl2Chan;
|
||||
while( cl2chan )
|
||||
{
|
||||
if( cl2chan->channel == Chan ) count++;
|
||||
cl2chan = cl2chan->next;
|
||||
}
|
||||
return count;
|
||||
} /* Channel_MemberCount */
|
||||
|
||||
|
||||
GLOBAL CHAR *
|
||||
Channel_Name( CHANNEL *Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Chan->name;
|
||||
} /* Channel_Name */
|
||||
|
||||
|
||||
GLOBAL CHAR *Channel_Modes( CHANNEL *Chan )
|
||||
GLOBAL CHAR *
|
||||
Channel_Modes( CHANNEL *Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Chan->modes;
|
||||
} /* Channel_Modes */
|
||||
|
||||
|
||||
GLOBAL CHANNEL *Channel_First( VOID )
|
||||
GLOBAL CHANNEL *
|
||||
Channel_First( VOID )
|
||||
{
|
||||
return My_Channels;
|
||||
} /* Channel_First */
|
||||
|
||||
|
||||
GLOBAL CHANNEL *Channel_Next( CHANNEL *Chan )
|
||||
GLOBAL CHANNEL *
|
||||
Channel_Next( CHANNEL *Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Chan->next;
|
||||
} /* Channel_Next */
|
||||
|
||||
|
||||
GLOBAL CHANNEL *Channel_Search( CHAR *Name )
|
||||
GLOBAL CHANNEL *
|
||||
Channel_Search( CHAR *Name )
|
||||
{
|
||||
/* Channel-Struktur suchen */
|
||||
|
||||
@@ -222,14 +341,16 @@ GLOBAL CHANNEL *Channel_Search( CHAR *Name )
|
||||
} /* Channel_Search */
|
||||
|
||||
|
||||
GLOBAL CL2CHAN *Channel_FirstMember( CHANNEL *Chan )
|
||||
GLOBAL CL2CHAN *
|
||||
Channel_FirstMember( CHANNEL *Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Get_First_Cl2Chan( NULL, Chan );
|
||||
} /* Channel_FirstMember */
|
||||
|
||||
|
||||
GLOBAL CL2CHAN *Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan )
|
||||
GLOBAL CL2CHAN *
|
||||
Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
assert( Cl2Chan != NULL );
|
||||
@@ -237,14 +358,16 @@ GLOBAL CL2CHAN *Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan )
|
||||
} /* Channel_NextMember */
|
||||
|
||||
|
||||
GLOBAL CL2CHAN *Channel_FirstChannelOf( CLIENT *Client )
|
||||
GLOBAL CL2CHAN *
|
||||
Channel_FirstChannelOf( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Get_First_Cl2Chan( Client, NULL );
|
||||
} /* Channel_FirstChannelOf */
|
||||
|
||||
|
||||
GLOBAL CL2CHAN *Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan )
|
||||
GLOBAL CL2CHAN *
|
||||
Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Cl2Chan != NULL );
|
||||
@@ -252,31 +375,35 @@ GLOBAL CL2CHAN *Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan )
|
||||
} /* Channel_NextChannelOf */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Channel_GetClient( CL2CHAN *Cl2Chan )
|
||||
GLOBAL CLIENT *
|
||||
Channel_GetClient( CL2CHAN *Cl2Chan )
|
||||
{
|
||||
assert( Cl2Chan != NULL );
|
||||
return Cl2Chan->client;
|
||||
} /* Channel_GetClient */
|
||||
|
||||
|
||||
GLOBAL CHANNEL *Channel_GetChannel( CL2CHAN *Cl2Chan )
|
||||
GLOBAL CHANNEL *
|
||||
Channel_GetChannel( CL2CHAN *Cl2Chan )
|
||||
{
|
||||
assert( Cl2Chan != NULL );
|
||||
return Cl2Chan->channel;
|
||||
} /* Channel_GetChannel */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_IsValidName( CHAR *Name )
|
||||
GLOBAL BOOLEAN
|
||||
Channel_IsValidName( CHAR *Name )
|
||||
{
|
||||
/* Pr<EFBFBD>fen, ob Name als Channelname gueltig */
|
||||
/* Pruefen, ob Name als Channelname gueltig */
|
||||
|
||||
CHAR *ptr, badchars[] = " ,:\x07";
|
||||
CHAR *ptr, badchars[10];
|
||||
|
||||
assert( Name != NULL );
|
||||
|
||||
if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return FALSE;
|
||||
|
||||
ptr = Name;
|
||||
strcpy( badchars, " ,:\x07" );
|
||||
while( *ptr )
|
||||
{
|
||||
if( strchr( badchars, *ptr )) return FALSE;
|
||||
@@ -287,7 +414,8 @@ GLOBAL BOOLEAN Channel_IsValidName( CHAR *Name )
|
||||
} /* Channel_IsValidName */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_ModeAdd( CHANNEL *Chan, CHAR Mode )
|
||||
GLOBAL BOOLEAN
|
||||
Channel_ModeAdd( CHANNEL *Chan, CHAR Mode )
|
||||
{
|
||||
/* Mode soll gesetzt werden. TRUE wird geliefert, wenn der
|
||||
* Mode neu gesetzt wurde, FALSE, wenn der Channel den Mode
|
||||
@@ -308,7 +436,8 @@ GLOBAL BOOLEAN Channel_ModeAdd( CHANNEL *Chan, CHAR Mode )
|
||||
} /* Channel_ModeAdd */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_ModeDel( CHANNEL *Chan, CHAR Mode )
|
||||
GLOBAL BOOLEAN
|
||||
Channel_ModeDel( CHANNEL *Chan, CHAR Mode )
|
||||
{
|
||||
/* Mode soll geloescht werden. TRUE wird geliefert, wenn der
|
||||
* Mode entfernt wurde, FALSE, wenn der Channel den Mode
|
||||
@@ -333,7 +462,8 @@ GLOBAL BOOLEAN Channel_ModeDel( CHANNEL *Chan, CHAR Mode )
|
||||
} /* Channel_ModeDel */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
|
||||
GLOBAL BOOLEAN
|
||||
Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
|
||||
{
|
||||
/* Channel-User-Mode soll gesetzt werden. TRUE wird geliefert,
|
||||
* wenn der Mode neu gesetzt wurde, FALSE, wenn der User den
|
||||
@@ -359,7 +489,8 @@ GLOBAL BOOLEAN Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
|
||||
} /* Channel_UserModeAdd */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
|
||||
GLOBAL BOOLEAN
|
||||
Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
|
||||
{
|
||||
/* Channel-User-Mode soll geloescht werden. TRUE wird geliefert,
|
||||
* wenn der Mode entfernt wurde, FALSE, wenn der User den Channel-Mode
|
||||
@@ -389,7 +520,8 @@ GLOBAL BOOLEAN Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
|
||||
} /* Channel_UserModeDel */
|
||||
|
||||
|
||||
GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
|
||||
GLOBAL CHAR *
|
||||
Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
|
||||
{
|
||||
/* Channel-Modes eines Users liefern */
|
||||
|
||||
@@ -405,7 +537,8 @@ GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
|
||||
} /* Channel_UserModes */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
|
||||
GLOBAL BOOLEAN
|
||||
Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
|
||||
{
|
||||
/* Pruefen, ob Client Mitglied in Channel ist */
|
||||
|
||||
@@ -417,14 +550,16 @@ GLOBAL BOOLEAN Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
|
||||
} /* Channel_IsMemberOf */
|
||||
|
||||
|
||||
GLOBAL CHAR *Channel_Topic( CHANNEL *Chan )
|
||||
GLOBAL CHAR *
|
||||
Channel_Topic( CHANNEL *Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Chan->topic;
|
||||
} /* Channel_Topic */
|
||||
|
||||
|
||||
GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic )
|
||||
GLOBAL VOID
|
||||
Channel_SetTopic( CHANNEL *Chan, CHAR *Topic )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
assert( Topic != NULL );
|
||||
@@ -434,7 +569,20 @@ GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic )
|
||||
} /* Channel_SetTopic */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text )
|
||||
GLOBAL VOID
|
||||
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;
|
||||
|
||||
@@ -460,8 +608,8 @@ GLOBAL BOOLEAN Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR
|
||||
} /* Channel_Write */
|
||||
|
||||
|
||||
|
||||
LOCAL CHANNEL *New_Chan( CHAR *Name )
|
||||
GLOBAL CHANNEL *
|
||||
Channel_Create( CHAR *Name )
|
||||
{
|
||||
/* Neue Channel-Struktur anlegen */
|
||||
|
||||
@@ -472,7 +620,7 @@ LOCAL CHANNEL *New_Chan( CHAR *Name )
|
||||
c = malloc( sizeof( CHANNEL ));
|
||||
if( ! c )
|
||||
{
|
||||
Log( LOG_EMERG, "Can't allocate memory!" );
|
||||
Log( LOG_EMERG, "Can't allocate memory! [New_Chan]" );
|
||||
return NULL;
|
||||
}
|
||||
c->next = NULL;
|
||||
@@ -482,13 +630,18 @@ LOCAL CHANNEL *New_Chan( CHAR *Name )
|
||||
strcpy( c->topic, "" );
|
||||
c->hash = Hash( c->name );
|
||||
|
||||
/* Verketten */
|
||||
c->next = My_Channels;
|
||||
My_Channels = c;
|
||||
|
||||
Log( LOG_DEBUG, "Created new channel structure for \"%s\".", Name );
|
||||
|
||||
return c;
|
||||
} /* New_Chan */
|
||||
} /* Channel_Create */
|
||||
|
||||
|
||||
LOCAL CL2CHAN *Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
|
||||
LOCAL CL2CHAN *
|
||||
Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
|
||||
{
|
||||
CL2CHAN *cl2chan;
|
||||
|
||||
@@ -505,7 +658,8 @@ LOCAL CL2CHAN *Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
|
||||
} /* Get_Cl2Chan */
|
||||
|
||||
|
||||
LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client )
|
||||
LOCAL CL2CHAN *
|
||||
Add_Client( CHANNEL *Chan, CLIENT *Client )
|
||||
{
|
||||
CL2CHAN *cl2chan;
|
||||
|
||||
@@ -516,7 +670,7 @@ LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client )
|
||||
cl2chan = malloc( sizeof( CL2CHAN ));
|
||||
if( ! cl2chan )
|
||||
{
|
||||
Log( LOG_EMERG, "Can't allocate memory!" );
|
||||
Log( LOG_EMERG, "Can't allocate memory! [Add_Client]" );
|
||||
return NULL;
|
||||
}
|
||||
cl2chan->channel = Chan;
|
||||
@@ -533,7 +687,8 @@ LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client )
|
||||
} /* Add_Client */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN ServerPART )
|
||||
LOCAL BOOLEAN
|
||||
Remove_Client( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN InformServer )
|
||||
{
|
||||
CL2CHAN *cl2chan, *last_cl2chan;
|
||||
CHANNEL *c;
|
||||
@@ -561,26 +716,50 @@ LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR
|
||||
else My_Cl2Chan = cl2chan->next;
|
||||
free( cl2chan );
|
||||
|
||||
if( ServerPART ) 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 );
|
||||
switch( Type )
|
||||
{
|
||||
case REMOVE_QUIT:
|
||||
/* 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 );
|
||||
}
|
||||
|
||||
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
|
||||
|
||||
/* Wenn Channel nun leer: loeschen */
|
||||
if( ! Get_First_Cl2Chan( NULL, Chan )) Delete_Channel( Chan );
|
||||
/* Wenn Channel nun leer und nicht pre-defined: loeschen */
|
||||
if( ! strchr( Channel_Modes( Chan ), 'P' ))
|
||||
{
|
||||
if( ! Get_First_Cl2Chan( NULL, Chan )) Delete_Channel( Chan );
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
} /* Remove_Client */
|
||||
|
||||
|
||||
LOCAL CL2CHAN *Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
|
||||
LOCAL CL2CHAN *
|
||||
Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
|
||||
{
|
||||
return Get_Next_Cl2Chan( My_Cl2Chan, Client, Chan );
|
||||
} /* Get_First_Cl2Chan */
|
||||
|
||||
|
||||
LOCAL CL2CHAN *Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
|
||||
LOCAL CL2CHAN *
|
||||
Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
|
||||
{
|
||||
CL2CHAN *cl2chan;
|
||||
|
||||
@@ -597,7 +776,8 @@ LOCAL CL2CHAN *Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channe
|
||||
} /* Get_Next_Cl2Chan */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Delete_Channel( CHANNEL *Chan )
|
||||
LOCAL BOOLEAN
|
||||
Delete_Channel( CHANNEL *Chan )
|
||||
{
|
||||
/* Channel-Struktur loeschen */
|
||||
|
||||
@@ -615,6 +795,9 @@ LOCAL BOOLEAN Delete_Channel( CHANNEL *Chan )
|
||||
|
||||
Log( LOG_DEBUG, "Freed channel structure for \"%s\".", Chan->name );
|
||||
|
||||
/* Invite- und Ban-Lists aufraeumen */
|
||||
Lists_DeleteChannel( chan );
|
||||
|
||||
/* Neu verketten und freigeben */
|
||||
if( last_chan ) last_chan->next = chan->next;
|
||||
else My_Channels = chan->next;
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: channel.h,v 1.16 2002/03/25 19:11:01 alex Exp $
|
||||
* $Id: channel.h,v 1.21.2.1 2002/11/04 19:18:39 alex Exp $
|
||||
*
|
||||
* channel.h: Management der Channels (Header)
|
||||
*/
|
||||
@@ -18,8 +18,6 @@
|
||||
#ifndef __channel_h__
|
||||
#define __channel_h__
|
||||
|
||||
#include "client.h"
|
||||
|
||||
|
||||
#if defined(__channel_c__) | defined(S_SPLINT_S)
|
||||
|
||||
@@ -50,47 +48,54 @@ typedef POINTER CL2CHAN;
|
||||
#endif
|
||||
|
||||
|
||||
GLOBAL VOID Channel_Init( VOID );
|
||||
GLOBAL VOID Channel_Exit( VOID );
|
||||
GLOBAL VOID Channel_Init PARAMS((VOID ));
|
||||
GLOBAL VOID Channel_InitPredefined PARAMS(( VOID ));
|
||||
GLOBAL VOID Channel_Exit PARAMS((VOID ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name );
|
||||
GLOBAL BOOLEAN Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason );
|
||||
GLOBAL BOOLEAN Channel_Join PARAMS((CLIENT *Client, CHAR *Name ));
|
||||
GLOBAL BOOLEAN Channel_Part PARAMS((CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason ));
|
||||
|
||||
GLOBAL VOID Channel_RemoveClient( CLIENT *Client, CHAR *Reason );
|
||||
GLOBAL VOID Channel_Quit PARAMS((CLIENT *Client, CHAR *Reason ));
|
||||
|
||||
GLOBAL INT Channel_Count( VOID );
|
||||
GLOBAL VOID Channel_Kick PARAMS(( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason ));
|
||||
|
||||
GLOBAL CHAR *Channel_Name( CHANNEL *Chan );
|
||||
GLOBAL CHAR *Channel_Modes( CHANNEL *Chan );
|
||||
GLOBAL CHAR *Channel_Topic( CHANNEL *Chan );
|
||||
GLOBAL LONG Channel_Count PARAMS((VOID ));
|
||||
GLOBAL LONG Channel_MemberCount PARAMS((CHANNEL *Chan ));
|
||||
|
||||
GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic );
|
||||
GLOBAL CHAR *Channel_Name PARAMS((CHANNEL *Chan ));
|
||||
GLOBAL CHAR *Channel_Modes PARAMS((CHANNEL *Chan ));
|
||||
GLOBAL CHAR *Channel_Topic PARAMS((CHANNEL *Chan ));
|
||||
|
||||
GLOBAL CHANNEL *Channel_Search( CHAR *Name );
|
||||
GLOBAL VOID Channel_SetTopic PARAMS((CHANNEL *Chan, CHAR *Topic ));
|
||||
GLOBAL VOID Channel_SetModes PARAMS((CHANNEL *Chan, CHAR *Modes ));
|
||||
|
||||
GLOBAL CHANNEL *Channel_First( VOID );
|
||||
GLOBAL CHANNEL *Channel_Next( CHANNEL *Chan );
|
||||
GLOBAL CHANNEL *Channel_Search PARAMS((CHAR *Name ));
|
||||
|
||||
GLOBAL CL2CHAN *Channel_FirstMember( 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 CHANNEL *Channel_First PARAMS((VOID ));
|
||||
GLOBAL CHANNEL *Channel_Next PARAMS((CHANNEL *Chan ));
|
||||
|
||||
GLOBAL CLIENT *Channel_GetClient( CL2CHAN *Cl2Chan );
|
||||
GLOBAL CHANNEL *Channel_GetChannel( CL2CHAN *Cl2Chan );
|
||||
GLOBAL CL2CHAN *Channel_FirstMember PARAMS((CHANNEL *Chan ));
|
||||
GLOBAL CL2CHAN *Channel_NextMember PARAMS((CHANNEL *Chan, CL2CHAN *Cl2Chan ));
|
||||
GLOBAL CL2CHAN *Channel_FirstChannelOf PARAMS((CLIENT *Client ));
|
||||
GLOBAL CL2CHAN *Channel_NextChannelOf PARAMS((CLIENT *Client, CL2CHAN *Cl2Chan ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_IsValidName( CHAR *Name );
|
||||
GLOBAL CLIENT *Channel_GetClient PARAMS((CL2CHAN *Cl2Chan ));
|
||||
GLOBAL CHANNEL *Channel_GetChannel PARAMS((CL2CHAN *Cl2Chan ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_ModeAdd( CHANNEL *Chan, CHAR Mode );
|
||||
GLOBAL BOOLEAN Channel_ModeDel( CHANNEL *Chan, CHAR Mode );
|
||||
GLOBAL BOOLEAN Channel_IsValidName PARAMS((CHAR *Name ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode );
|
||||
GLOBAL BOOLEAN Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode );
|
||||
GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client );
|
||||
GLOBAL BOOLEAN Channel_ModeAdd PARAMS((CHANNEL *Chan, CHAR Mode ));
|
||||
GLOBAL BOOLEAN Channel_ModeDel PARAMS((CHANNEL *Chan, CHAR Mode ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client );
|
||||
GLOBAL BOOLEAN Channel_UserModeAdd PARAMS((CHANNEL *Chan, CLIENT *Client, CHAR Mode ));
|
||||
GLOBAL BOOLEAN Channel_UserModeDel PARAMS((CHANNEL *Chan, CLIENT *Client, CHAR Mode ));
|
||||
GLOBAL CHAR *Channel_UserModes PARAMS((CHANNEL *Chan, CLIENT *Client ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text );
|
||||
GLOBAL BOOLEAN Channel_IsMemberOf PARAMS((CHANNEL *Chan, CLIENT *Client ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_Write PARAMS((CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text ));
|
||||
|
||||
GLOBAL CHANNEL *Channel_Create PARAMS((CHAR *Name ));
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: client.c,v 1.53 2002/03/27 20:52:58 alex Exp $
|
||||
* $Id: client.c,v 1.60.2.2 2002/11/04 19:18:39 alex Exp $
|
||||
*
|
||||
* client.c: Management aller Clients
|
||||
*
|
||||
@@ -35,14 +35,16 @@
|
||||
#include <string.h>
|
||||
#include <netdb.h>
|
||||
|
||||
#include "conn.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "client.h"
|
||||
|
||||
#include <imp.h>
|
||||
#include "ngircd.h"
|
||||
#include "channel.h"
|
||||
#include "resolve.h"
|
||||
#include "conf.h"
|
||||
#include "conn.h"
|
||||
#include "hash.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
@@ -51,18 +53,22 @@
|
||||
#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 CHAR GetID_Buffer[CLIENT_ID_LEN];
|
||||
LOCAL CHAR GetID_Buffer[GETID_LEN];
|
||||
|
||||
|
||||
LOCAL INT Count( CLIENT_TYPE Type );
|
||||
LOCAL INT MyCount( CLIENT_TYPE Type );
|
||||
LOCAL LONG Count PARAMS(( CLIENT_TYPE Type ));
|
||||
LOCAL LONG MyCount PARAMS(( CLIENT_TYPE Type ));
|
||||
|
||||
LOCAL CLIENT *New_Client_Struct( VOID );
|
||||
LOCAL VOID Generate_MyToken( CLIENT *Client );
|
||||
LOCAL CLIENT *New_Client_Struct PARAMS(( VOID ));
|
||||
LOCAL VOID Generate_MyToken PARAMS(( CLIENT *Client ));
|
||||
|
||||
|
||||
GLOBAL VOID Client_Init( VOID )
|
||||
GLOBAL VOID
|
||||
Client_Init( VOID )
|
||||
{
|
||||
struct hostent *h;
|
||||
|
||||
@@ -70,7 +76,7 @@ GLOBAL VOID Client_Init( VOID )
|
||||
if( ! This_Server )
|
||||
{
|
||||
Log( LOG_EMERG, "Can't allocate client structure for server! Going down." );
|
||||
Log( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
|
||||
Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
@@ -93,12 +99,14 @@ GLOBAL VOID Client_Init( VOID )
|
||||
} /* Client_Init */
|
||||
|
||||
|
||||
GLOBAL VOID Client_Exit( VOID )
|
||||
GLOBAL VOID
|
||||
Client_Exit( VOID )
|
||||
{
|
||||
CLIENT *c, *next;
|
||||
INT cnt;
|
||||
|
||||
Client_Destroy( This_Server, "Server going down.", NULL, FALSE );
|
||||
if( NGIRCd_Restart ) Client_Destroy( This_Server, "Server going down (restarting).", NULL, FALSE );
|
||||
else Client_Destroy( This_Server, "Server going down.", NULL, FALSE );
|
||||
|
||||
cnt = 0;
|
||||
c = My_Clients;
|
||||
@@ -113,34 +121,39 @@ GLOBAL VOID Client_Exit( VOID )
|
||||
} /* Client_Exit */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_ThisServer( VOID )
|
||||
GLOBAL CLIENT *
|
||||
Client_ThisServer( VOID )
|
||||
{
|
||||
return This_Server;
|
||||
} /* Client_ThisServer */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_NewLocal( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented )
|
||||
GLOBAL CLIENT *
|
||||
Client_NewLocal( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented )
|
||||
{
|
||||
/* 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 );
|
||||
} /* Client_NewLocal */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_NewRemoteServer( 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 )
|
||||
{
|
||||
/* 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 );
|
||||
} /* Client_NewRemoteServer */
|
||||
|
||||
|
||||
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_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 (). */
|
||||
return Client_New( NONE, Introducer, NULL, CLIENT_USER, Nick, User, Hostname, Info, Hops, Token, Modes, Idented );
|
||||
} /* Client_NewRemoteUser */
|
||||
|
||||
|
||||
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 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 *client;
|
||||
|
||||
@@ -176,7 +189,8 @@ GLOBAL CLIENT *Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, I
|
||||
} /* Client_New */
|
||||
|
||||
|
||||
GLOBAL VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )
|
||||
GLOBAL VOID
|
||||
Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )
|
||||
{
|
||||
/* Client entfernen. */
|
||||
|
||||
@@ -239,7 +253,7 @@ GLOBAL VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN
|
||||
else IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "QUIT :" );
|
||||
}
|
||||
}
|
||||
Channel_RemoveClient( c, FwdMsg ? FwdMsg : c->id );
|
||||
Channel_Quit( c, FwdMsg ? FwdMsg : c->id );
|
||||
}
|
||||
else if( c->type == CLIENT_SERVER )
|
||||
{
|
||||
@@ -279,7 +293,8 @@ GLOBAL VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN
|
||||
} /* Client_Destroy */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetHostname( CLIENT *Client, CHAR *Hostname )
|
||||
GLOBAL VOID
|
||||
Client_SetHostname( CLIENT *Client, CHAR *Hostname )
|
||||
{
|
||||
/* Hostname eines Clients setzen */
|
||||
|
||||
@@ -291,7 +306,8 @@ GLOBAL VOID Client_SetHostname( CLIENT *Client, CHAR *Hostname )
|
||||
} /* Client_SetHostname */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetID( CLIENT *Client, CHAR *ID )
|
||||
GLOBAL VOID
|
||||
Client_SetID( CLIENT *Client, CHAR *ID )
|
||||
{
|
||||
/* Hostname eines Clients setzen, Hash-Wert berechnen */
|
||||
|
||||
@@ -306,7 +322,8 @@ GLOBAL VOID Client_SetID( CLIENT *Client, CHAR *ID )
|
||||
} /* Client_SetID */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented )
|
||||
GLOBAL VOID
|
||||
Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented )
|
||||
{
|
||||
/* Username eines Clients setzen */
|
||||
|
||||
@@ -323,7 +340,8 @@ GLOBAL VOID Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented )
|
||||
} /* Client_SetUser */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetInfo( CLIENT *Client, CHAR *Info )
|
||||
GLOBAL VOID
|
||||
Client_SetInfo( CLIENT *Client, CHAR *Info )
|
||||
{
|
||||
/* Hostname eines Clients setzen */
|
||||
|
||||
@@ -335,9 +353,10 @@ GLOBAL VOID Client_SetInfo( CLIENT *Client, CHAR *Info )
|
||||
} /* Client_SetInfo */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetModes( CLIENT *Client, CHAR *Modes )
|
||||
GLOBAL VOID
|
||||
Client_SetModes( CLIENT *Client, CHAR *Modes )
|
||||
{
|
||||
/* Hostname eines Clients setzen */
|
||||
/* Modes eines Clients setzen */
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Modes != NULL );
|
||||
@@ -347,7 +366,21 @@ GLOBAL VOID Client_SetModes( CLIENT *Client, CHAR *Modes )
|
||||
} /* Client_SetModes */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetPassword( CLIENT *Client, CHAR *Pwd )
|
||||
GLOBAL VOID
|
||||
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 */
|
||||
|
||||
@@ -359,7 +392,8 @@ GLOBAL VOID Client_SetPassword( CLIENT *Client, CHAR *Pwd )
|
||||
} /* Client_SetPassword */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetAway( CLIENT *Client, CHAR *Txt )
|
||||
GLOBAL VOID
|
||||
Client_SetAway( CLIENT *Client, CHAR *Txt )
|
||||
{
|
||||
/* Von einem Client gelieferte AWAY-Nachricht */
|
||||
|
||||
@@ -382,7 +416,8 @@ GLOBAL VOID Client_SetAway( CLIENT *Client, CHAR *Txt )
|
||||
} /* Client_SetAway */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetType( CLIENT *Client, INT Type )
|
||||
GLOBAL VOID
|
||||
Client_SetType( CLIENT *Client, INT Type )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
Client->type = Type;
|
||||
@@ -390,21 +425,24 @@ GLOBAL VOID Client_SetType( CLIENT *Client, INT Type )
|
||||
} /* Client_SetType */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetHops( CLIENT *Client, INT Hops )
|
||||
GLOBAL VOID
|
||||
Client_SetHops( CLIENT *Client, INT Hops )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
Client->hops = Hops;
|
||||
} /* Client_SetHops */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetToken( CLIENT *Client, INT Token )
|
||||
GLOBAL VOID
|
||||
Client_SetToken( CLIENT *Client, INT Token )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
Client->token = Token;
|
||||
} /* Client_SetToken */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer )
|
||||
GLOBAL VOID
|
||||
Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Introducer != NULL );
|
||||
@@ -412,14 +450,16 @@ GLOBAL VOID Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer )
|
||||
} /* Client_SetIntroducer */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetOperByMe( CLIENT *Client, BOOLEAN OperByMe )
|
||||
GLOBAL VOID
|
||||
Client_SetOperByMe( CLIENT *Client, BOOLEAN OperByMe )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
Client->oper_by_me = OperByMe;
|
||||
} /* Client_SetOperByMe */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Client_ModeAdd( CLIENT *Client, CHAR Mode )
|
||||
GLOBAL BOOLEAN
|
||||
Client_ModeAdd( CLIENT *Client, CHAR Mode )
|
||||
{
|
||||
/* Mode soll gesetzt werden. TRUE wird geliefert, wenn der
|
||||
* Mode neu gesetzt wurde, FALSE, wenn der Client den Mode
|
||||
@@ -440,7 +480,8 @@ GLOBAL BOOLEAN Client_ModeAdd( CLIENT *Client, CHAR Mode )
|
||||
} /* Client_ModeAdd */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Client_ModeDel( CLIENT *Client, CHAR Mode )
|
||||
GLOBAL BOOLEAN
|
||||
Client_ModeDel( CLIENT *Client, CHAR Mode )
|
||||
{
|
||||
/* Mode soll geloescht werden. TRUE wird geliefert, wenn der
|
||||
* Mode entfernt wurde, FALSE, wenn der Client den Mode
|
||||
@@ -465,7 +506,8 @@ GLOBAL BOOLEAN Client_ModeDel( CLIENT *Client, CHAR Mode )
|
||||
} /* Client_ModeDel */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_GetFromConn( CONN_ID Idx )
|
||||
GLOBAL CLIENT *
|
||||
Client_GetFromConn( CONN_ID Idx )
|
||||
{
|
||||
/* Client-Struktur, die zur lokalen Verbindung Idx gehoert,
|
||||
* liefern. Wird keine gefunden, so wird NULL geliefert. */
|
||||
@@ -484,7 +526,8 @@ GLOBAL CLIENT *Client_GetFromConn( CONN_ID Idx )
|
||||
} /* Client_GetFromConn */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_Search( CHAR *Nick )
|
||||
GLOBAL CLIENT *
|
||||
Client_Search( CHAR *Nick )
|
||||
{
|
||||
/* Client-Struktur, die den entsprechenden Nick hat, liefern.
|
||||
* Wird keine gefunden, so wird NULL geliefert. */
|
||||
@@ -517,7 +560,8 @@ GLOBAL CLIENT *Client_Search( CHAR *Nick )
|
||||
} /* Client_Search */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_GetFromToken( CLIENT *Client, INT Token )
|
||||
GLOBAL CLIENT *
|
||||
Client_GetFromToken( CLIENT *Client, INT Token )
|
||||
{
|
||||
/* Client-Struktur, die den entsprechenden Introducer (=Client)
|
||||
* und das gegebene Token hat, liefern. Wird keine gefunden,
|
||||
@@ -538,21 +582,24 @@ GLOBAL CLIENT *Client_GetFromToken( CLIENT *Client, INT Token )
|
||||
} /* Client_GetFromToken */
|
||||
|
||||
|
||||
GLOBAL INT Client_Type( CLIENT *Client )
|
||||
GLOBAL INT
|
||||
Client_Type( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Client->type;
|
||||
} /* Client_Type */
|
||||
|
||||
|
||||
GLOBAL CONN_ID Client_Conn( CLIENT *Client )
|
||||
GLOBAL CONN_ID
|
||||
Client_Conn( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Client->conn_id;
|
||||
} /* Client_Conn */
|
||||
|
||||
|
||||
GLOBAL CHAR *Client_ID( CLIENT *Client )
|
||||
GLOBAL CHAR *
|
||||
Client_ID( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
|
||||
@@ -565,14 +612,16 @@ GLOBAL CHAR *Client_ID( CLIENT *Client )
|
||||
} /* Client_ID */
|
||||
|
||||
|
||||
GLOBAL CHAR *Client_Info( CLIENT *Client )
|
||||
GLOBAL CHAR *
|
||||
Client_Info( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Client->info;
|
||||
} /* Client_Info */
|
||||
|
||||
|
||||
GLOBAL CHAR *Client_User( CLIENT *Client )
|
||||
GLOBAL CHAR *
|
||||
Client_User( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
if( Client->user[0] ) return Client->user;
|
||||
@@ -580,56 +629,72 @@ GLOBAL CHAR *Client_User( CLIENT *Client )
|
||||
} /* Client_User */
|
||||
|
||||
|
||||
GLOBAL CHAR *Client_Hostname( CLIENT *Client )
|
||||
GLOBAL CHAR *
|
||||
Client_Hostname( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Client->host;
|
||||
} /* Client_Hostname */
|
||||
|
||||
|
||||
GLOBAL CHAR *Client_Password( CLIENT *Client )
|
||||
GLOBAL CHAR *
|
||||
Client_Password( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Client->pwd;
|
||||
} /* Client_Password */
|
||||
|
||||
|
||||
GLOBAL CHAR *Client_Modes( CLIENT *Client )
|
||||
GLOBAL CHAR *
|
||||
Client_Modes( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Client->modes;
|
||||
} /* Client_Modes */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Client_OperByMe( CLIENT *Client )
|
||||
GLOBAL CHAR *
|
||||
Client_Flags( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Client->flags;
|
||||
} /* Client_Flags */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
Client_OperByMe( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Client->oper_by_me;
|
||||
} /* Client_OperByMe */
|
||||
|
||||
|
||||
GLOBAL INT Client_Hops( CLIENT *Client )
|
||||
GLOBAL INT
|
||||
Client_Hops( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Client->hops;
|
||||
} /* Client_Hops */
|
||||
|
||||
|
||||
GLOBAL INT Client_Token( CLIENT *Client )
|
||||
GLOBAL INT
|
||||
Client_Token( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Client->token;
|
||||
} /* Client_Token */
|
||||
|
||||
|
||||
GLOBAL INT Client_MyToken( CLIENT *Client )
|
||||
GLOBAL INT
|
||||
Client_MyToken( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Client->mytoken;
|
||||
} /* Client_MyToken */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_NextHop( CLIENT *Client )
|
||||
GLOBAL CLIENT *
|
||||
Client_NextHop( CLIENT *Client )
|
||||
{
|
||||
CLIENT *c;
|
||||
|
||||
@@ -641,7 +706,8 @@ GLOBAL CLIENT *Client_NextHop( CLIENT *Client )
|
||||
} /* Client_NextHop */
|
||||
|
||||
|
||||
GLOBAL CHAR *Client_Mask( CLIENT *Client )
|
||||
GLOBAL CHAR *
|
||||
Client_Mask( CLIENT *Client )
|
||||
{
|
||||
/* Client-"ID" liefern, wie sie z.B. fuer
|
||||
* Prefixe benoetigt wird. */
|
||||
@@ -650,33 +716,37 @@ GLOBAL CHAR *Client_Mask( CLIENT *Client )
|
||||
|
||||
if( Client->type == CLIENT_SERVER ) return Client->id;
|
||||
|
||||
sprintf( GetID_Buffer, "%s!%s@%s", Client->id, Client->user, Client->host );
|
||||
snprintf( GetID_Buffer, GETID_LEN, "%s!%s@%s", Client->id, Client->user, Client->host );
|
||||
return GetID_Buffer;
|
||||
} /* Client_Mask */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_Introducer( CLIENT *Client )
|
||||
GLOBAL CLIENT *
|
||||
Client_Introducer( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Client->introducer;
|
||||
} /* Client_Introducer */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_TopServer( CLIENT *Client )
|
||||
GLOBAL CLIENT *
|
||||
Client_TopServer( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Client->topserver;
|
||||
} /* Client_TopServer */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Client_HasMode( CLIENT *Client, CHAR Mode )
|
||||
GLOBAL BOOLEAN
|
||||
Client_HasMode( CLIENT *Client, CHAR Mode )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return strchr( Client->modes, Mode ) != NULL;
|
||||
} /* Client_HasMode */
|
||||
|
||||
|
||||
GLOBAL CHAR *Client_Away( CLIENT *Client )
|
||||
GLOBAL CHAR *
|
||||
Client_Away( CLIENT *Client )
|
||||
{
|
||||
/* AWAY-Text liefern */
|
||||
|
||||
@@ -685,7 +755,8 @@ GLOBAL CHAR *Client_Away( CLIENT *Client )
|
||||
} /* Client_Away */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick )
|
||||
GLOBAL BOOLEAN
|
||||
Client_CheckNick( CLIENT *Client, CHAR *Nick )
|
||||
{
|
||||
/* Nick ueberpruefen */
|
||||
|
||||
@@ -711,7 +782,8 @@ GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick )
|
||||
} /* Client_CheckNick */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Client_CheckID( CLIENT *Client, CHAR *ID )
|
||||
GLOBAL BOOLEAN
|
||||
Client_CheckID( CLIENT *Client, CHAR *ID )
|
||||
{
|
||||
/* Nick ueberpruefen */
|
||||
|
||||
@@ -748,7 +820,8 @@ GLOBAL BOOLEAN Client_CheckID( CLIENT *Client, CHAR *ID )
|
||||
} /* Client_CheckID */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_First( VOID )
|
||||
GLOBAL CLIENT *
|
||||
Client_First( VOID )
|
||||
{
|
||||
/* Ersten Client liefern. */
|
||||
|
||||
@@ -756,7 +829,8 @@ GLOBAL CLIENT *Client_First( VOID )
|
||||
} /* Client_First */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_Next( CLIENT *c )
|
||||
GLOBAL CLIENT *
|
||||
Client_Next( CLIENT *c )
|
||||
{
|
||||
/* Naechsten Client liefern. Existiert keiner,
|
||||
* so wird NULL geliefert. */
|
||||
@@ -766,46 +840,63 @@ GLOBAL CLIENT *Client_Next( CLIENT *c )
|
||||
} /* Client_Next */
|
||||
|
||||
|
||||
GLOBAL INT Client_UserCount( VOID )
|
||||
GLOBAL LONG
|
||||
Client_UserCount( VOID )
|
||||
{
|
||||
return Count( CLIENT_USER );
|
||||
} /* Client_UserCount */
|
||||
|
||||
|
||||
GLOBAL INT Client_ServiceCount( VOID )
|
||||
GLOBAL LONG
|
||||
Client_ServiceCount( VOID )
|
||||
{
|
||||
return Count( CLIENT_SERVICE );;
|
||||
} /* Client_ServiceCount */
|
||||
|
||||
|
||||
GLOBAL INT Client_ServerCount( VOID )
|
||||
GLOBAL LONG
|
||||
Client_ServerCount( VOID )
|
||||
{
|
||||
return Count( CLIENT_SERVER );
|
||||
} /* Client_ServerCount */
|
||||
|
||||
|
||||
GLOBAL INT Client_MyUserCount( VOID )
|
||||
GLOBAL LONG
|
||||
Client_MyUserCount( VOID )
|
||||
{
|
||||
return MyCount( CLIENT_USER );
|
||||
} /* Client_MyUserCount */
|
||||
|
||||
|
||||
GLOBAL INT Client_MyServiceCount( VOID )
|
||||
GLOBAL LONG
|
||||
Client_MyServiceCount( VOID )
|
||||
{
|
||||
return MyCount( CLIENT_SERVICE );
|
||||
} /* Client_MyServiceCount */
|
||||
|
||||
|
||||
GLOBAL INT Client_MyServerCount( VOID )
|
||||
GLOBAL LONG
|
||||
Client_MyServerCount( VOID )
|
||||
{
|
||||
return MyCount( CLIENT_SERVER );
|
||||
CLIENT *c;
|
||||
LONG cnt;
|
||||
|
||||
cnt = 0;
|
||||
c = My_Clients;
|
||||
while( c )
|
||||
{
|
||||
if(( c->type == CLIENT_SERVER ) && ( c->hops == 1 )) cnt++;
|
||||
c = (CLIENT *)c->next;
|
||||
}
|
||||
return cnt;
|
||||
} /* Client_MyServerCount */
|
||||
|
||||
|
||||
GLOBAL INT Client_OperCount( VOID )
|
||||
GLOBAL LONG
|
||||
Client_OperCount( VOID )
|
||||
{
|
||||
CLIENT *c;
|
||||
INT cnt;
|
||||
LONG cnt;
|
||||
|
||||
cnt = 0;
|
||||
c = My_Clients;
|
||||
@@ -818,10 +909,11 @@ GLOBAL INT Client_OperCount( VOID )
|
||||
} /* Client_OperCount */
|
||||
|
||||
|
||||
GLOBAL INT Client_UnknownCount( VOID )
|
||||
GLOBAL LONG
|
||||
Client_UnknownCount( VOID )
|
||||
{
|
||||
CLIENT *c;
|
||||
INT cnt;
|
||||
LONG cnt;
|
||||
|
||||
cnt = 0;
|
||||
c = My_Clients;
|
||||
@@ -834,14 +926,17 @@ GLOBAL INT Client_UnknownCount( VOID )
|
||||
} /* Client_UnknownCount */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Client_IsValidNick( CHAR *Nick )
|
||||
GLOBAL BOOLEAN
|
||||
Client_IsValidNick( CHAR *Nick )
|
||||
{
|
||||
/* Ist der Nick gueltig? */
|
||||
|
||||
CHAR *ptr, goodchars[] = ";0123456789-";
|
||||
CHAR *ptr, goodchars[20];
|
||||
|
||||
assert( Nick != NULL );
|
||||
|
||||
strcpy( goodchars, ";0123456789-" );
|
||||
|
||||
if( Nick[0] == '#' ) return FALSE;
|
||||
if( strchr( goodchars, Nick[0] )) return FALSE;
|
||||
if( strlen( Nick ) >= CLIENT_NICK_LEN ) return FALSE;
|
||||
@@ -858,39 +953,42 @@ GLOBAL BOOLEAN Client_IsValidNick( CHAR *Nick )
|
||||
} /* Client_IsValidNick */
|
||||
|
||||
|
||||
LOCAL INT Count( CLIENT_TYPE Type )
|
||||
LOCAL LONG
|
||||
Count( CLIENT_TYPE Type )
|
||||
{
|
||||
CLIENT *c;
|
||||
INT cnt;
|
||||
LONG cnt;
|
||||
|
||||
cnt = 0;
|
||||
c = My_Clients;
|
||||
while( c )
|
||||
{
|
||||
if( c && ( c->type == Type )) cnt++;
|
||||
if( c->type == Type ) cnt++;
|
||||
c = (CLIENT *)c->next;
|
||||
}
|
||||
return cnt;
|
||||
} /* Count */
|
||||
|
||||
|
||||
LOCAL INT MyCount( CLIENT_TYPE Type )
|
||||
LOCAL LONG
|
||||
MyCount( CLIENT_TYPE Type )
|
||||
{
|
||||
CLIENT *c;
|
||||
INT cnt;
|
||||
LONG cnt;
|
||||
|
||||
cnt = 0;
|
||||
c = My_Clients;
|
||||
while( c )
|
||||
{
|
||||
if( c && ( c->introducer == This_Server ) && ( c->type == Type )) cnt++;
|
||||
if(( c->introducer == This_Server ) && ( c->type == Type )) cnt++;
|
||||
c = (CLIENT *)c->next;
|
||||
}
|
||||
return cnt;
|
||||
} /* MyCount */
|
||||
|
||||
|
||||
LOCAL CLIENT *New_Client_Struct( VOID )
|
||||
LOCAL CLIENT *
|
||||
New_Client_Struct( VOID )
|
||||
{
|
||||
/* Neue CLIENT-Struktur pre-initialisieren */
|
||||
|
||||
@@ -899,7 +997,7 @@ LOCAL CLIENT *New_Client_Struct( VOID )
|
||||
c = malloc( sizeof( CLIENT ));
|
||||
if( ! c )
|
||||
{
|
||||
Log( LOG_EMERG, "Can't allocate memory!" );
|
||||
Log( LOG_EMERG, "Can't allocate memory! [New_Client_Struct]" );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -920,12 +1018,14 @@ LOCAL CLIENT *New_Client_Struct( VOID )
|
||||
c->token = -1;
|
||||
c->mytoken = -1;
|
||||
strcpy( c->away, "" );
|
||||
strcpy( c->flags, "" );
|
||||
|
||||
return c;
|
||||
} /* New_Client */
|
||||
|
||||
|
||||
LOCAL VOID Generate_MyToken( CLIENT *Client )
|
||||
LOCAL VOID
|
||||
Generate_MyToken( CLIENT *Client )
|
||||
{
|
||||
CLIENT *c;
|
||||
INT token;
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: client.h,v 1.27 2002/03/25 19:11:01 alex Exp $
|
||||
* $Id: client.h,v 1.29.2.1 2002/11/04 19:18:39 alex Exp $
|
||||
*
|
||||
* client.h: Konfiguration des ngircd (Header)
|
||||
*/
|
||||
@@ -18,8 +18,6 @@
|
||||
#ifndef __client_h__
|
||||
#define __client_h__
|
||||
|
||||
#include "conn.h"
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
@@ -56,6 +54,7 @@ typedef struct _CLIENT
|
||||
INT hops, token, mytoken; /* "Hops" und "Token" (-> SERVER-Befehl) */
|
||||
BOOLEAN oper_by_me; /* IRC-Operator-Status durch diesen Server? */
|
||||
CHAR away[CLIENT_AWAY_LEN]; /* AWAY-Text, wenn Mode 'a' gesetzt */
|
||||
CHAR flags[CLIENT_FLAGS_LEN]; /* Flags des Client (aktuell nur bei Servern) */
|
||||
} CLIENT;
|
||||
|
||||
#else
|
||||
@@ -65,74 +64,76 @@ typedef POINTER CLIENT;
|
||||
#endif
|
||||
|
||||
|
||||
GLOBAL VOID Client_Init( VOID );
|
||||
GLOBAL VOID Client_Exit( VOID );
|
||||
GLOBAL VOID Client_Init PARAMS((VOID ));
|
||||
GLOBAL VOID Client_Exit PARAMS((VOID ));
|
||||
|
||||
GLOBAL CLIENT *Client_NewLocal( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented );
|
||||
GLOBAL CLIENT *Client_NewRemoteServer( CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, 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( 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_NewLocal PARAMS((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_NewRemoteUser PARAMS((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 VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit );
|
||||
GLOBAL VOID Client_Destroy PARAMS((CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit ));
|
||||
|
||||
GLOBAL CLIENT *Client_ThisServer( VOID );
|
||||
GLOBAL CLIENT *Client_ThisServer PARAMS((VOID ));
|
||||
|
||||
GLOBAL CLIENT *Client_GetFromConn( CONN_ID Idx );
|
||||
GLOBAL CLIENT *Client_GetFromToken( CLIENT *Client, INT Token );
|
||||
GLOBAL CLIENT *Client_GetFromConn PARAMS((CONN_ID Idx ));
|
||||
GLOBAL CLIENT *Client_GetFromToken PARAMS((CLIENT *Client, INT Token ));
|
||||
|
||||
GLOBAL CLIENT *Client_Search( CHAR *ID );
|
||||
GLOBAL CLIENT *Client_First( VOID );
|
||||
GLOBAL CLIENT *Client_Next( CLIENT *c );
|
||||
GLOBAL CLIENT *Client_Search PARAMS((CHAR *ID ));
|
||||
GLOBAL CLIENT *Client_First PARAMS((VOID ));
|
||||
GLOBAL CLIENT *Client_Next PARAMS((CLIENT *c ));
|
||||
|
||||
GLOBAL INT Client_Type( CLIENT *Client );
|
||||
GLOBAL CONN_ID Client_Conn( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_ID( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_Mask( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_Info( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_User( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_Hostname( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_Password( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_Modes( CLIENT *Client );
|
||||
GLOBAL CLIENT *Client_Introducer( CLIENT *Client );
|
||||
GLOBAL BOOLEAN Client_OperByMe( CLIENT *Client );
|
||||
GLOBAL INT Client_Hops( CLIENT *Client );
|
||||
GLOBAL INT Client_Token( CLIENT *Client );
|
||||
GLOBAL INT Client_MyToken( CLIENT *Client );
|
||||
GLOBAL CLIENT *Client_TopServer( CLIENT *Client );
|
||||
GLOBAL CLIENT *Client_NextHop( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_Away( CLIENT *Client );
|
||||
GLOBAL INT Client_Type PARAMS((CLIENT *Client ));
|
||||
GLOBAL CONN_ID Client_Conn PARAMS((CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_ID PARAMS((CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_Mask PARAMS((CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_Info PARAMS((CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_User PARAMS((CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_Hostname PARAMS((CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_Password PARAMS((CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_Modes PARAMS((CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_Flags PARAMS((CLIENT *Client ));
|
||||
GLOBAL CLIENT *Client_Introducer PARAMS((CLIENT *Client ));
|
||||
GLOBAL BOOLEAN Client_OperByMe PARAMS((CLIENT *Client ));
|
||||
GLOBAL INT Client_Hops PARAMS((CLIENT *Client ));
|
||||
GLOBAL INT Client_Token PARAMS((CLIENT *Client ));
|
||||
GLOBAL INT Client_MyToken PARAMS((CLIENT *Client ));
|
||||
GLOBAL CLIENT *Client_TopServer PARAMS((CLIENT *Client ));
|
||||
GLOBAL CLIENT *Client_NextHop PARAMS((CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_Away PARAMS((CLIENT *Client ));
|
||||
|
||||
GLOBAL BOOLEAN Client_HasMode( CLIENT *Client, CHAR Mode );
|
||||
GLOBAL BOOLEAN Client_HasMode PARAMS((CLIENT *Client, CHAR Mode ));
|
||||
|
||||
GLOBAL VOID Client_SetHostname( CLIENT *Client, CHAR *Hostname );
|
||||
GLOBAL VOID Client_SetID( CLIENT *Client, CHAR *Nick );
|
||||
GLOBAL VOID Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented );
|
||||
GLOBAL VOID Client_SetInfo( CLIENT *Client, CHAR *Info );
|
||||
GLOBAL VOID Client_SetPassword( CLIENT *Client, CHAR *Pwd );
|
||||
GLOBAL VOID Client_SetType( CLIENT *Client, INT Type );
|
||||
GLOBAL VOID Client_SetHops( CLIENT *Client, INT Hops );
|
||||
GLOBAL VOID Client_SetToken( CLIENT *Client, INT Token );
|
||||
GLOBAL VOID Client_SetOperByMe( CLIENT *Client, BOOLEAN OperByMe );
|
||||
GLOBAL VOID Client_SetModes( CLIENT *Client, CHAR *Modes );
|
||||
GLOBAL VOID Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer );
|
||||
GLOBAL VOID Client_SetAway( CLIENT *Client, CHAR *Txt );
|
||||
GLOBAL VOID Client_SetHostname PARAMS((CLIENT *Client, CHAR *Hostname ));
|
||||
GLOBAL VOID Client_SetID PARAMS((CLIENT *Client, CHAR *Nick ));
|
||||
GLOBAL VOID Client_SetUser PARAMS((CLIENT *Client, CHAR *User, BOOLEAN Idented ));
|
||||
GLOBAL VOID Client_SetInfo PARAMS((CLIENT *Client, CHAR *Info ));
|
||||
GLOBAL VOID Client_SetPassword PARAMS((CLIENT *Client, CHAR *Pwd ));
|
||||
GLOBAL VOID Client_SetType PARAMS((CLIENT *Client, INT Type ));
|
||||
GLOBAL VOID Client_SetHops PARAMS((CLIENT *Client, INT Hops ));
|
||||
GLOBAL VOID Client_SetToken PARAMS((CLIENT *Client, INT Token ));
|
||||
GLOBAL VOID Client_SetOperByMe PARAMS((CLIENT *Client, BOOLEAN OperByMe ));
|
||||
GLOBAL VOID Client_SetModes PARAMS((CLIENT *Client, CHAR *Modes ));
|
||||
GLOBAL VOID Client_SetFlags PARAMS((CLIENT *Client, CHAR *Flags ));
|
||||
GLOBAL VOID Client_SetIntroducer PARAMS((CLIENT *Client, CLIENT *Introducer ));
|
||||
GLOBAL VOID Client_SetAway PARAMS((CLIENT *Client, CHAR *Txt ));
|
||||
|
||||
GLOBAL BOOLEAN Client_ModeAdd( CLIENT *Client, CHAR Mode );
|
||||
GLOBAL BOOLEAN Client_ModeDel( CLIENT *Client, CHAR Mode );
|
||||
GLOBAL BOOLEAN Client_ModeAdd PARAMS((CLIENT *Client, CHAR Mode ));
|
||||
GLOBAL BOOLEAN Client_ModeDel PARAMS((CLIENT *Client, CHAR Mode ));
|
||||
|
||||
GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick );
|
||||
GLOBAL BOOLEAN Client_CheckID( CLIENT *Client, CHAR *ID );
|
||||
GLOBAL BOOLEAN Client_CheckNick PARAMS((CLIENT *Client, CHAR *Nick ));
|
||||
GLOBAL BOOLEAN Client_CheckID PARAMS((CLIENT *Client, CHAR *ID ));
|
||||
|
||||
GLOBAL INT Client_UserCount( VOID );
|
||||
GLOBAL INT Client_ServiceCount( VOID );
|
||||
GLOBAL INT Client_ServerCount( VOID );
|
||||
GLOBAL INT Client_OperCount( VOID );
|
||||
GLOBAL INT Client_UnknownCount( VOID );
|
||||
GLOBAL INT Client_MyUserCount( VOID );
|
||||
GLOBAL INT Client_MyServiceCount( VOID );
|
||||
GLOBAL INT Client_MyServerCount( VOID );
|
||||
GLOBAL LONG Client_UserCount PARAMS((VOID ));
|
||||
GLOBAL LONG Client_ServiceCount PARAMS((VOID ));
|
||||
GLOBAL LONG Client_ServerCount PARAMS((VOID ));
|
||||
GLOBAL LONG Client_OperCount PARAMS((VOID ));
|
||||
GLOBAL LONG Client_UnknownCount PARAMS((VOID ));
|
||||
GLOBAL LONG Client_MyUserCount PARAMS((VOID ));
|
||||
GLOBAL LONG Client_MyServiceCount PARAMS((VOID ));
|
||||
GLOBAL LONG Client_MyServerCount PARAMS((VOID ));
|
||||
|
||||
GLOBAL BOOLEAN Client_IsValidNick( CHAR *Nick );
|
||||
GLOBAL BOOLEAN Client_IsValidNick PARAMS((CHAR *Nick ));
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: conf.c,v 1.23 2002/03/30 13:08:10 alex Exp $
|
||||
* $Id: conf.c,v 1.29.2.5 2002/11/24 15:25:25 alex Exp $
|
||||
*
|
||||
* conf.h: Konfiguration des ngircd
|
||||
*/
|
||||
@@ -25,11 +25,16 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "defines.h"
|
||||
#include "log.h"
|
||||
#include "resolve.h"
|
||||
#include "tool.h"
|
||||
|
||||
#include "exp.h"
|
||||
@@ -39,18 +44,20 @@
|
||||
LOCAL BOOLEAN Use_Log = TRUE;
|
||||
|
||||
|
||||
LOCAL VOID Set_Defaults( VOID );
|
||||
LOCAL VOID Read_Config( VOID );
|
||||
LOCAL VOID Validate_Config( VOID );
|
||||
LOCAL VOID Set_Defaults PARAMS(( VOID ));
|
||||
LOCAL VOID Read_Config PARAMS(( VOID ));
|
||||
LOCAL VOID Validate_Config PARAMS(( VOID ));
|
||||
|
||||
GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg );
|
||||
GLOBAL VOID Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg );
|
||||
GLOBAL VOID Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg );
|
||||
LOCAL VOID Handle_GLOBAL PARAMS(( INT Line, CHAR *Var, CHAR *Arg ));
|
||||
LOCAL VOID Handle_OPERATOR PARAMS(( INT Line, CHAR *Var, CHAR *Arg ));
|
||||
LOCAL VOID Handle_SERVER PARAMS(( INT Line, CHAR *Var, CHAR *Arg ));
|
||||
LOCAL VOID Handle_CHANNEL PARAMS(( INT Line, CHAR *Var, CHAR *Arg ));
|
||||
|
||||
LOCAL VOID Config_Error( CONST INT Level, CONST CHAR *Format, ... );
|
||||
LOCAL VOID Config_Error PARAMS(( CONST INT Level, CONST CHAR *Format, ... ));
|
||||
|
||||
|
||||
GLOBAL VOID Conf_Init( VOID )
|
||||
GLOBAL VOID
|
||||
Conf_Init( VOID )
|
||||
{
|
||||
Set_Defaults( );
|
||||
Read_Config( );
|
||||
@@ -58,11 +65,14 @@ GLOBAL VOID Conf_Init( VOID )
|
||||
} /* Config_Init */
|
||||
|
||||
|
||||
GLOBAL INT Conf_Test( VOID )
|
||||
GLOBAL INT
|
||||
Conf_Test( VOID )
|
||||
{
|
||||
/* Konfiguration einlesen, ueberpruefen und ausgeben. */
|
||||
|
||||
UINT i;
|
||||
struct passwd *pwd;
|
||||
struct group *grp;
|
||||
INT i;
|
||||
|
||||
Use_Log = FALSE;
|
||||
Set_Defaults( );
|
||||
@@ -82,23 +92,34 @@ GLOBAL INT Conf_Test( VOID )
|
||||
printf( " ServerName = %s\n", Conf_ServerName );
|
||||
printf( " ServerInfo = %s\n", Conf_ServerInfo );
|
||||
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( " ListenPorts = " );
|
||||
printf( " Ports = " );
|
||||
for( i = 0; i < Conf_ListenPorts_Count; i++ )
|
||||
{
|
||||
if( i != 0 ) printf( ", " );
|
||||
printf( "%u", Conf_ListenPorts[i] );
|
||||
}
|
||||
puts( "" );
|
||||
printf( " ServerUID = %ld\n", (INT32)Conf_UID );
|
||||
printf( " ServerGID = %ld\n", (INT32)Conf_GID );
|
||||
pwd = getpwuid( Conf_UID );
|
||||
if( pwd ) printf( " ServerUID = %s\n", pwd->pw_name );
|
||||
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( " PongTimeout = %d\n", Conf_PongTimeout );
|
||||
printf( " ConnectRetry = %d\n", Conf_ConnectRetry );
|
||||
printf( " OperCanUseMode = %s\n", Conf_OperCanMode == TRUE ? "yes" : "no" );
|
||||
puts( "" );
|
||||
|
||||
for( i = 0; i < Conf_Oper_Count; i++ )
|
||||
{
|
||||
if( ! Conf_Oper[i].name[0] ) continue;
|
||||
|
||||
/* gueltiger Operator-Block: ausgeben */
|
||||
puts( "[OPERATOR]" );
|
||||
printf( " Name = %s\n", Conf_Oper[i].name );
|
||||
printf( " Password = %s\n", Conf_Oper[i].pwd );
|
||||
@@ -107,6 +128,10 @@ GLOBAL INT Conf_Test( VOID )
|
||||
|
||||
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]" );
|
||||
printf( " Name = %s\n", Conf_Server[i].name );
|
||||
printf( " Host = %s\n", Conf_Server[i].host );
|
||||
@@ -115,25 +140,36 @@ GLOBAL INT Conf_Test( VOID )
|
||||
printf( " Group = %d\n", Conf_Server[i].group );
|
||||
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;
|
||||
} /* Conf_Test */
|
||||
|
||||
|
||||
GLOBAL VOID Conf_Exit( VOID )
|
||||
{
|
||||
/* ... */
|
||||
} /* Config_Exit */
|
||||
|
||||
|
||||
LOCAL VOID Set_Defaults( VOID )
|
||||
LOCAL VOID
|
||||
Set_Defaults( VOID )
|
||||
{
|
||||
/* Konfigurationsvariablen initialisieren, d.h. auf Default-Werte setzen. */
|
||||
|
||||
strcpy( Conf_ServerName, "" );
|
||||
strcpy( Conf_ServerInfo, PACKAGE" "VERSION );
|
||||
sprintf( Conf_ServerInfo, "%s %s", PACKAGE, VERSION );
|
||||
strcpy( Conf_ServerPwd, "" );
|
||||
|
||||
strcpy( Conf_ServerAdmin1, "" );
|
||||
strcpy( Conf_ServerAdmin2, "" );
|
||||
strcpy( Conf_ServerAdminMail, "" );
|
||||
|
||||
strcpy( Conf_MotdFile, MOTD_FILE );
|
||||
|
||||
Conf_ListenPorts_Count = 0;
|
||||
@@ -146,12 +182,15 @@ LOCAL VOID Set_Defaults( VOID )
|
||||
Conf_ConnectRetry = 60;
|
||||
|
||||
Conf_Oper_Count = 0;
|
||||
|
||||
Conf_Server_Count = 0;
|
||||
Conf_Channel_Count = 0;
|
||||
|
||||
Conf_OperCanMode = FALSE;
|
||||
} /* Set_Defaults */
|
||||
|
||||
|
||||
LOCAL VOID Read_Config( VOID )
|
||||
LOCAL VOID
|
||||
Read_Config( VOID )
|
||||
{
|
||||
/* Konfigurationsdatei einlesen. */
|
||||
|
||||
@@ -164,7 +203,7 @@ LOCAL VOID Read_Config( VOID )
|
||||
{
|
||||
/* Keine Konfigurationsdatei gefunden */
|
||||
Config_Error( LOG_ALERT, "Can't read configuration \"%s\": %s", NGIRCd_ConfFile, strerror( errno ));
|
||||
Config_Error( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
|
||||
Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
@@ -214,6 +253,19 @@ LOCAL VOID Read_Config( VOID )
|
||||
}
|
||||
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 );
|
||||
section[0] = 0x1;
|
||||
}
|
||||
@@ -233,6 +285,7 @@ LOCAL VOID Read_Config( VOID )
|
||||
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, "[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 );
|
||||
}
|
||||
|
||||
@@ -247,10 +300,13 @@ LOCAL VOID Read_Config( VOID )
|
||||
} /* Read_Config */
|
||||
|
||||
|
||||
GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
|
||||
LOCAL VOID
|
||||
Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
|
||||
{
|
||||
struct passwd *pwd;
|
||||
struct group *grp;
|
||||
CHAR *ptr;
|
||||
INT32 port;
|
||||
LONG port;
|
||||
|
||||
assert( Line > 0 );
|
||||
assert( Var != NULL );
|
||||
@@ -277,6 +333,27 @@ GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
|
||||
Conf_ServerPwd[CLIENT_PASS_LEN - 1] = '\0';
|
||||
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 )
|
||||
{
|
||||
/* Ports, durch "," getrennt, auf denen der Server
|
||||
@@ -306,13 +383,17 @@ GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
|
||||
if( strcasecmp( Var, "ServerUID" ) == 0 )
|
||||
{
|
||||
/* UID, mit der der Daemon laufen soll */
|
||||
Conf_UID = (UINT)atoi( Arg );
|
||||
pwd = getpwnam( Arg );
|
||||
if( pwd ) Conf_UID = pwd->pw_uid;
|
||||
else Conf_UID = (UINT)atoi( Arg );
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "ServerGID" ) == 0 )
|
||||
{
|
||||
/* GID, mit der der Daemon laufen soll */
|
||||
Conf_GID = (UINT)atoi( Arg );
|
||||
grp = getgrnam( Arg );
|
||||
if( grp ) Conf_GID = grp->gr_gid;
|
||||
else Conf_GID = (UINT)atoi( Arg );
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "PingTimeout" ) == 0 )
|
||||
@@ -336,12 +417,22 @@ GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
|
||||
if(( Conf_ConnectRetry ) < 5 ) Conf_ConnectRetry = 5;
|
||||
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 );
|
||||
} /* Handle_GLOBAL */
|
||||
|
||||
|
||||
GLOBAL VOID Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg )
|
||||
LOCAL VOID
|
||||
Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg )
|
||||
{
|
||||
assert( Line > 0 );
|
||||
assert( Var != NULL );
|
||||
@@ -351,8 +442,8 @@ GLOBAL VOID Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg )
|
||||
if( strcasecmp( Var, "Name" ) == 0 )
|
||||
{
|
||||
/* Name des IRC Operator */
|
||||
strncpy( Conf_Oper[Conf_Oper_Count - 1].name, Arg, CLIENT_ID_LEN - 1 );
|
||||
Conf_Oper[Conf_Oper_Count - 1].name[CLIENT_ID_LEN - 1] = '\0';
|
||||
strncpy( Conf_Oper[Conf_Oper_Count - 1].name, Arg, CLIENT_PASS_LEN - 1 );
|
||||
Conf_Oper[Conf_Oper_Count - 1].name[CLIENT_PASS_LEN - 1] = '\0';
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "Password" ) == 0 )
|
||||
@@ -367,9 +458,10 @@ GLOBAL VOID Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg )
|
||||
} /* Handle_OPERATOR */
|
||||
|
||||
|
||||
GLOBAL VOID Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg )
|
||||
LOCAL VOID
|
||||
Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg )
|
||||
{
|
||||
INT32 port;
|
||||
LONG port;
|
||||
|
||||
assert( Line > 0 );
|
||||
assert( Var != NULL );
|
||||
@@ -415,21 +507,78 @@ GLOBAL VOID Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg )
|
||||
} /* Handle_SERVER */
|
||||
|
||||
|
||||
LOCAL VOID Validate_Config( VOID )
|
||||
LOCAL 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 */
|
||||
|
||||
if( ! Conf_ServerName[0] )
|
||||
{
|
||||
/* Kein Servername konfiguriert */
|
||||
Config_Error( LOG_ALERT, "No server name configured in \"%s\"!", NGIRCd_ConfFile );
|
||||
Config_Error( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
|
||||
Config_Error( LOG_ALERT, "No server name configured in \"%s\" ('ServerName')!", NGIRCd_ConfFile );
|
||||
Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE );
|
||||
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 */
|
||||
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
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 */
|
||||
|
||||
@@ -439,14 +588,18 @@ LOCAL VOID Config_Error( CONST INT Level, CONST CHAR *Format, ... )
|
||||
assert( Format != NULL );
|
||||
|
||||
/* String mit variablen Argumenten zusammenbauen ... */
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
/* Im "normalen Betrieb" soll der Log-Mechanismus des ngIRCd verwendet
|
||||
* werden, beim Testen der Konfiguration jedoch nicht, hier sollen alle
|
||||
* Meldungen direkt auf die Konsole ausgegeben werden: */
|
||||
if( Use_Log ) Log( Level, msg );
|
||||
if( Use_Log ) Log( Level, "%s", msg );
|
||||
else puts( msg );
|
||||
} /* Config_Error */
|
||||
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: conf.h,v 1.15 2002/03/29 22:53:59 alex Exp $
|
||||
* $Id: conf.h,v 1.19 2002/09/16 09:13:40 alex Exp $
|
||||
*
|
||||
* conf.h: Konfiguration des ngircd (Header)
|
||||
*/
|
||||
@@ -20,7 +20,6 @@
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#include "conn.h"
|
||||
#include "defines.h"
|
||||
|
||||
|
||||
@@ -42,16 +41,28 @@ typedef struct _Conf_Server
|
||||
RES_STAT *res_stat; /* Status des Resolver */
|
||||
} 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 */
|
||||
GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN];
|
||||
|
||||
/* Servers-Info-Text */
|
||||
/* Server-Info-Text */
|
||||
GLOBAL CHAR Conf_ServerInfo[CLIENT_INFO_LEN];
|
||||
|
||||
/* Server-Passwort */
|
||||
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 */
|
||||
GLOBAL CHAR Conf_MotdFile[FNAME_LEN];
|
||||
|
||||
@@ -78,10 +89,15 @@ GLOBAL INT Conf_Oper_Count;
|
||||
GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
|
||||
GLOBAL INT Conf_Server_Count;
|
||||
|
||||
/* Vorkonfigurierte Channels */
|
||||
GLOBAL CONF_CHANNEL Conf_Channel[MAX_DEFCHANNELS];
|
||||
GLOBAL INT Conf_Channel_Count;
|
||||
|
||||
GLOBAL VOID Conf_Init( VOID );
|
||||
GLOBAL INT Conf_Test( VOID );
|
||||
GLOBAL VOID Conf_Exit( VOID );
|
||||
/* Koennen IRC OPs immer Modes setzen? */
|
||||
GLOBAL BOOLEAN Conf_OperCanMode;
|
||||
|
||||
GLOBAL VOID Conf_Init PARAMS((VOID ));
|
||||
GLOBAL INT Conf_Test PARAMS((VOID ));
|
||||
|
||||
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: conn.h,v 1.14 2002/03/29 22:54:35 alex Exp $
|
||||
* $Id: conn.h,v 1.17 2002/08/26 00:03:15 alex Exp $
|
||||
*
|
||||
* conn.h: Verwaltung aller Netz-Verbindungen ("connections") (Header)
|
||||
*/
|
||||
@@ -24,28 +24,27 @@
|
||||
|
||||
typedef INT CONN_ID;
|
||||
|
||||
typedef struct _Res_Stat
|
||||
{
|
||||
INT pid; /* PID des Child-Prozess */
|
||||
INT pipe[2]; /* Pipe fuer IPC */
|
||||
} RES_STAT;
|
||||
|
||||
GLOBAL VOID Conn_Init PARAMS((VOID ));
|
||||
GLOBAL VOID Conn_Exit PARAMS(( VOID ));
|
||||
|
||||
GLOBAL BOOLEAN Conn_NewListener PARAMS(( CONST UINT Port ));
|
||||
|
||||
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 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 );
|
||||
GLOBAL INT Conn_MaxFD;
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: defines.h,v 1.21 2002/03/29 22:55:02 alex Exp $
|
||||
* $Id: defines.h,v 1.33.2.1 2002/11/23 16:20:25 alex Exp $
|
||||
*
|
||||
* defines.h: (globale) Konstanten
|
||||
*/
|
||||
@@ -20,6 +20,8 @@
|
||||
|
||||
#define NONE -1
|
||||
|
||||
#define TIME_RES 2 /* Zeit-Aufloesung des Servers in Sekunden */
|
||||
|
||||
#define FNAME_LEN 256 /* max. Laenge eines Dateinamen */
|
||||
|
||||
#define LINE_LEN 256 /* max. Laenge einer Konfigurationszeile */
|
||||
@@ -28,9 +30,11 @@
|
||||
|
||||
#define MAX_LISTEN_PORTS 16 /* max. Anzahl von Listen-Ports */
|
||||
|
||||
#define MAX_OPERATORS 8 /* max. Anzahl konfigurierbarer Operatoren */
|
||||
#define MAX_OPERATORS 16 /* max. Anzahl konfigurierbarer Operatoren */
|
||||
|
||||
#define MAX_SERVERS 8 /* 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 */
|
||||
|
||||
@@ -43,6 +47,7 @@
|
||||
#define CLIENT_MODE_LEN 8 /* max. Laenge der Client-Modes */
|
||||
#define CLIENT_INFO_LEN 64 /* max. Infotext-Laenge (Server) */
|
||||
#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_MODE_LEN 8 /* max. Laenge der Channel-Modes */
|
||||
@@ -54,27 +59,37 @@
|
||||
#define WRITEBUFFER_LEN 4096 /* Laenge des Schreibpuffers je Verbindung (Bytes) */
|
||||
|
||||
#define PROTOVER "0210" /* implementierte Protokoll-Version (RFC 2813, 4.1.1) */
|
||||
#define PROTOSUFFIX "-ngIRCd" /* Protokoll-Suffix (RFC 2813, 4.1.1) */
|
||||
#define PROTOIRC "-IRC" /* Protokoll-Suffix (RFC 2813, 4.1.1) */
|
||||
#define PROTOIRCPLUS "-IRC+" /* Protokoll-Suffix f<>r IRC+-Protokoll */
|
||||
|
||||
#define PASSSERVERADD PROTOVER""PROTOSUFFIX" IRC|"PACKAGE"-"VERSION" P"
|
||||
#ifdef IRCPLUS
|
||||
# define IRCPLUSFLAGS "C" /* IRC+-Flags, die immer zutreffen */
|
||||
#endif
|
||||
|
||||
#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 USERMODES "aios" /* unterstuetzte User-Modes */
|
||||
#define CHANMODES "amnopqstv" /* unterstuetzte Channel-Modes */
|
||||
#define CHANMODES "biImnoPtv" /* unterstuetzte Channel-Modes */
|
||||
|
||||
#define CONNECTED TRUE /* fuer die irc-xxx-Module */
|
||||
#define DISCONNECTED FALSE
|
||||
|
||||
#define DEFAULT_AWAY_MSG "Away" /* Away-Meldung fuer User von anderen Servern */
|
||||
|
||||
#define CONFIG_FILE SYSCONFDIR"/ngircd.conf"
|
||||
#define MOTD_FILE SYSCONFDIR"/ngircd.motd"
|
||||
#ifdef PROTOTYPES
|
||||
# define CONFIG_FILE SYSCONFDIR"/ngircd.conf"
|
||||
# define MOTD_FILE SYSCONFDIR"/ngircd.motd"
|
||||
#else
|
||||
# define CONFIG_FILE "ngircd.conf"
|
||||
# define MOTD_FILE "ngircd.motd"
|
||||
#endif
|
||||
#define ERROR_DIR "/tmp"
|
||||
|
||||
#define MAX_LOG_MSG_LEN 256 /* max. Laenge einer Log-Meldung */
|
||||
|
||||
#define TOKEN_OUTBOUND -2 /* Kennzeichnung fuer ausgehende Server-Links im Aufbau */
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: hash.c,v 1.4 2002/03/25 19:11:01 alex Exp $
|
||||
* $Id: hash.c,v 1.5 2002/05/27 12:54:07 alex Exp $
|
||||
*
|
||||
* hash.c: Hash-Werte berechnen
|
||||
*/
|
||||
@@ -29,10 +29,11 @@
|
||||
#include "hash.h"
|
||||
|
||||
|
||||
LOCAL UINT32 jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval);
|
||||
LOCAL UINT32 jenkins_hash PARAMS(( register UINT8 *k, register UINT32 length, register UINT32 initval ));
|
||||
|
||||
|
||||
GLOBAL UINT32 Hash( CHAR *String )
|
||||
GLOBAL UINT32
|
||||
Hash( CHAR *String )
|
||||
{
|
||||
/* Hash-Wert ueber String berechnen */
|
||||
|
||||
@@ -75,7 +76,8 @@ GLOBAL UINT32 Hash( CHAR *String )
|
||||
} /* mix */
|
||||
|
||||
|
||||
LOCAL UINT32 jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval)
|
||||
LOCAL UINT32
|
||||
jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval )
|
||||
{
|
||||
/* k: the key
|
||||
* length: length of the key
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: hash.h,v 1.2 2002/03/14 15:49:36 alex Exp $
|
||||
* $Id: hash.h,v 1.3 2002/05/27 12:54:07 alex Exp $
|
||||
*
|
||||
* hash.h: Hash-Werte berechnen (Header)
|
||||
*/
|
||||
@@ -19,7 +19,7 @@
|
||||
#define __hash_h__
|
||||
|
||||
|
||||
GLOBAL UINT32 Hash( CHAR *String );
|
||||
GLOBAL UINT32 Hash PARAMS((CHAR *String ));
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-channel.c,v 1.3 2002/03/25 17:08:54 alex Exp $
|
||||
* $Id: irc-channel.c,v 1.15 2002/09/16 09:16:17 alex Exp $
|
||||
*
|
||||
* irc-channel.c: IRC-Channel-Befehle
|
||||
*/
|
||||
@@ -22,19 +22,26 @@
|
||||
#include <string.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-write.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-channel.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR *channame, *flags, *topic, modes[8];
|
||||
BOOLEAN is_new_chan;
|
||||
BOOLEAN is_new_chan, is_invited, is_banned;
|
||||
CLIENT *target;
|
||||
CHANNEL *chan;
|
||||
|
||||
@@ -52,12 +59,13 @@ GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
|
||||
/* Channel-Namen durchgehen */
|
||||
chan = NULL;
|
||||
channame = strtok( Req->argv[0], "," );
|
||||
while( channame )
|
||||
{
|
||||
/* wird der Channel neu angelegt? */
|
||||
flags = NULL;
|
||||
chan = flags = NULL;
|
||||
|
||||
/* wird der Channel neu angelegt? */
|
||||
if( Channel_Search( channame )) is_new_chan = FALSE;
|
||||
else is_new_chan = TRUE;
|
||||
|
||||
@@ -66,14 +74,53 @@ GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
/* Channel-Flags extrahieren */
|
||||
flags = strchr( channame, 0x7 );
|
||||
if( flags ) *flags++ = '\0';
|
||||
if( flags )
|
||||
{
|
||||
*flags = '\0';
|
||||
flags++;
|
||||
}
|
||||
}
|
||||
|
||||
/* neuer Channel udn lokaler Client? */
|
||||
if( is_new_chan && ( Client_Type( Client ) == CLIENT_USER ))
|
||||
/* Lokaler Client? */
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
{
|
||||
/* Dann soll der Client Channel-Operator werden! */
|
||||
flags = "o";
|
||||
/* Existiert der Channel bereits, oder wird er im Moment neu erzeugt? */
|
||||
if( is_new_chan )
|
||||
{
|
||||
/* 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) */
|
||||
@@ -83,7 +130,7 @@ GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
channame = strtok( NULL, "," );
|
||||
continue;
|
||||
}
|
||||
chan = Channel_Search( channame );
|
||||
if( ! chan ) chan = Channel_Search( channame );
|
||||
assert( chan != NULL );
|
||||
|
||||
/* Modes setzen (wenn vorhanden) */
|
||||
@@ -93,6 +140,9 @@ GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
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? */
|
||||
strcpy( &modes[1], Channel_UserModes( chan, target ));
|
||||
if( modes[1] ) modes[0] = 0x7;
|
||||
@@ -106,7 +156,7 @@ GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
if( modes[1] )
|
||||
{
|
||||
/* Modes im Channel bekannt machen */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "MODE %s %s :%s", channame, modes, Client_ID( target ));
|
||||
IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "MODE %s +%s %s", channame, &modes[1], Client_ID( target ));
|
||||
}
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
@@ -130,7 +180,8 @@ GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_JOIN */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PART( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_PART( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target;
|
||||
CHAR *chan;
|
||||
@@ -166,7 +217,8 @@ GLOBAL BOOLEAN IRC_PART( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_PART */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHANNEL *chan;
|
||||
CLIENT *from;
|
||||
@@ -186,7 +238,7 @@ GLOBAL BOOLEAN IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
||||
|
||||
/* Welcher Channel? */
|
||||
chan = Channel_Search( Req->argv[0] );
|
||||
if( ! chan ) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( from ), Req->argv[0] );
|
||||
if( ! chan ) return IRC_WriteStrClient( from, ERR_NOSUCHCHANNEL_MSG, Client_ID( from ), Req->argv[0] );
|
||||
|
||||
/* 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] );
|
||||
@@ -218,4 +270,118 @@ GLOBAL BOOLEAN IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_TOPIC */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
IRC_LIST( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR *pattern;
|
||||
CHANNEL *chan;
|
||||
CLIENT *from, *target;
|
||||
|
||||
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 > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
if( Req->argc > 0 ) pattern = strtok( Req->argv[0], "," );
|
||||
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 )
|
||||
{
|
||||
/* alle Channel durchgehen */
|
||||
chan = Channel_First( );
|
||||
while( chan )
|
||||
{
|
||||
/* Passt die Suchmaske auf diesen Channel? */
|
||||
if( Match( pattern, Channel_Name( chan )))
|
||||
{
|
||||
/* Treffer! */
|
||||
if( ! IRC_WriteStrClient( from, RPL_LIST_MSG, from, Channel_Name( chan ), Channel_MemberCount( chan ), Channel_Topic( chan ))) return DISCONNECTED;
|
||||
}
|
||||
chan = Channel_Next( chan );
|
||||
}
|
||||
|
||||
/* naechsten Namen ermitteln */
|
||||
if( Req->argc > 0 ) pattern = strtok( NULL, "," );
|
||||
else pattern = NULL;
|
||||
}
|
||||
|
||||
return IRC_WriteStrClient( from, RPL_LISTEND_MSG, from );
|
||||
} /* 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- */
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-channel.h,v 1.2 2002/03/12 14:37:52 alex Exp $
|
||||
* $Id: irc-channel.h,v 1.5 2002/09/03 23:56:55 alex Exp $
|
||||
*
|
||||
* irc-channel.h: IRC-Channel-Befehle (Header)
|
||||
*/
|
||||
@@ -18,13 +18,14 @@
|
||||
#ifndef __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_JOIN( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_PART( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_TOPIC( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_LIST PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
GLOBAL BOOLEAN IRC_CHANINFO PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-login.c,v 1.11 2002/03/26 23:58:34 alex Exp $
|
||||
* $Id: irc-login.c,v 1.21.2.1 2002/09/22 21:37:06 alex Exp $
|
||||
*
|
||||
* irc-login.c: Anmeldung und Abmeldung im IRC
|
||||
*/
|
||||
@@ -24,21 +24,27 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "resolve.h"
|
||||
#include "conf.h"
|
||||
#include "irc.h"
|
||||
#include "irc-write.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
#include "parse.h"
|
||||
#include "irc.h"
|
||||
#include "irc-write.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-login.h"
|
||||
|
||||
|
||||
LOCAL BOOLEAN Hello_User( CLIENT *Client );
|
||||
LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason );
|
||||
LOCAL BOOLEAN Hello_User PARAMS(( CLIENT *Client ));
|
||||
LOCAL VOID Kill_Nick PARAMS(( CHAR *Nick, CHAR *Reason ));
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_PASS( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -59,13 +65,63 @@ GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req )
|
||||
}
|
||||
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 */
|
||||
Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client ));
|
||||
|
||||
/* Passwort speichern */
|
||||
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_SetFlags( Client, flags );
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else if(( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER ))
|
||||
@@ -77,7 +133,8 @@ GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_PASS */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *intr_c, *target, *c;
|
||||
CHAR *modes;
|
||||
@@ -116,7 +173,7 @@ GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
* wenn wir es nicht so machen. Ob es so okay ist? Hm ... */
|
||||
if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 ) return CONNECTED;
|
||||
#endif
|
||||
|
||||
|
||||
/* pruefen, ob Nick bereits vergeben. Speziallfall: der Client
|
||||
* will nur die Gross- und Kleinschreibung aendern. Das darf
|
||||
* er natuerlich machen :-) */
|
||||
@@ -140,8 +197,16 @@ GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
else
|
||||
{
|
||||
/* Nick-Aenderung */
|
||||
if( Client_Conn( target ) > NONE ) Log( LOG_INFO, "User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".", Client_Mask( target ), Client_ID( target ), Req->argv[0], Client_Conn( target ));
|
||||
else Log( LOG_DEBUG, "User \"%s\" changed nick: \"%s\" -> \"%s\".", Client_Mask( target ), Client_ID( target ), Req->argv[0] );
|
||||
if( Client_Conn( target ) > NONE )
|
||||
{
|
||||
/* lokaler Client */
|
||||
Log( LOG_INFO, "User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".", Client_Mask( target ), Client_Conn( target ), Client_ID( target ), Req->argv[0] );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Remote-Client */
|
||||
Log( LOG_DEBUG, "User \"%s\" changed nick: \"%s\" -> \"%s\".", Client_Mask( target ), Client_ID( target ), Req->argv[0] );
|
||||
}
|
||||
|
||||
/* alle betroffenen User und Server ueber Nick-Aenderung informieren */
|
||||
if( Client_Type( Client ) == CLIENT_USER ) IRC_WriteStrClientPrefix( Client, Client, "NICK :%s", Req->argv[0] );
|
||||
@@ -207,7 +272,8 @@ GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_NICK */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_USER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -237,26 +303,15 @@ GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_USER */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_QUIT( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
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 )
|
||||
if ( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Server */
|
||||
|
||||
@@ -276,11 +331,23 @@ GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req )
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
|
||||
else
|
||||
{
|
||||
/* 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 */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_PING( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *from;
|
||||
|
||||
@@ -315,7 +382,8 @@ GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_PING */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_PONG( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *from;
|
||||
|
||||
@@ -353,7 +421,8 @@ GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_PONG */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Hello_User( CLIENT *Client )
|
||||
LOCAL BOOLEAN
|
||||
Hello_User( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
|
||||
@@ -372,9 +441,9 @@ LOCAL BOOLEAN 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 ));
|
||||
|
||||
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( )))) 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_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return FALSE;
|
||||
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return FALSE;
|
||||
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), VERSION, USERMODES, CHANMODES )) return FALSE;
|
||||
|
||||
Client_SetType( Client, CLIENT_USER );
|
||||
|
||||
@@ -385,7 +454,8 @@ LOCAL BOOLEAN Hello_User( CLIENT *Client )
|
||||
} /* Hello_User */
|
||||
|
||||
|
||||
LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason )
|
||||
LOCAL VOID
|
||||
Kill_Nick( CHAR *Nick, CHAR *Reason )
|
||||
{
|
||||
CLIENT *c;
|
||||
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-login.h,v 1.3 2002/03/12 14:37:52 alex Exp $
|
||||
* $Id: irc-login.h,v 1.4 2002/05/27 13:09:27 alex Exp $
|
||||
*
|
||||
* irc-login.h: Anmeldung und Abmeldung im IRC (Header)
|
||||
*/
|
||||
@@ -18,16 +18,13 @@
|
||||
#ifndef __irc_login_h__
|
||||
#define __irc_login_h__
|
||||
|
||||
#include "parse.h"
|
||||
#include "client.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_PASS PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_USER PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_PING PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-mode.c,v 1.4 2002/03/25 17:11:45 alex Exp $
|
||||
* $Id: irc-mode.c,v 1.14 2002/09/08 17:07:14 alex Exp $
|
||||
*
|
||||
* irc-mode.c: IRC-Befehle zur Mode-Aenderung (MODE, AWAY, ...)
|
||||
*/
|
||||
@@ -21,21 +21,37 @@
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "defines.h"
|
||||
#include "irc-write.h"
|
||||
#include "lists.h"
|
||||
#include "log.h"
|
||||
#include "parse.h"
|
||||
#include "messages.h"
|
||||
#include "resolve.h"
|
||||
#include "conf.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-mode.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
|
||||
LOCAL BOOLEAN Add_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
|
||||
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];
|
||||
CLIENT *cl, *chan_cl, *prefix;
|
||||
BOOLEAN set, ok;
|
||||
BOOLEAN set, ok, modeok;
|
||||
CHANNEL *chan;
|
||||
|
||||
assert( Client != NULL );
|
||||
@@ -63,6 +79,63 @@ GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
|
||||
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 );
|
||||
|
||||
/* 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 */
|
||||
if(( chan ) && (Req->argc == 3 ))
|
||||
{
|
||||
@@ -104,14 +177,6 @@ GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
|
||||
else set = TRUE;
|
||||
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 */
|
||||
if( set ) strcpy( the_modes, "+" );
|
||||
@@ -140,11 +205,6 @@ GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
|
||||
/* invisible */
|
||||
x[0] = 'i';
|
||||
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':
|
||||
/* operator (kann nur geloescht werden) */
|
||||
if( ! set )
|
||||
@@ -154,6 +214,11 @@ GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
|
||||
}
|
||||
else ok = IRC_WriteStrClient( Client, ERR_UMODEUNKNOWNFLAG_MSG, Client_ID( Client ));
|
||||
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':
|
||||
/* server messages */
|
||||
x[0] = 's';
|
||||
@@ -167,7 +232,15 @@ GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
|
||||
if( chan )
|
||||
{
|
||||
/* Ist der User ein Channel Operator? */
|
||||
if( ! strchr( Channel_UserModes( chan, Client ), 'o' ))
|
||||
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 ));
|
||||
ok = IRC_WriteStrClient( Client, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Client ), Channel_Name( chan ));
|
||||
@@ -199,9 +272,9 @@ GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
|
||||
/* Channel-Modes */
|
||||
switch( *mode_ptr )
|
||||
{
|
||||
case 'a':
|
||||
/* Anonymous */
|
||||
x[0] = 'a';
|
||||
case 'i':
|
||||
/* Invite-Only */
|
||||
x[0] = 'i';
|
||||
break;
|
||||
case 'm':
|
||||
/* Moderated */
|
||||
@@ -211,22 +284,14 @@ GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
|
||||
/* kein Schreiben in den Channel von aussen */
|
||||
x[0] = 'n';
|
||||
break;
|
||||
case 'p':
|
||||
/* Private */
|
||||
x[0] = 'p';
|
||||
break;
|
||||
case 'q':
|
||||
/* Quiet */
|
||||
x[0] = 'q';
|
||||
break;
|
||||
case 's':
|
||||
/* Secret */
|
||||
x[0] = 's';
|
||||
break;
|
||||
case 't':
|
||||
/* Topic Lock */
|
||||
x[0] = 't';
|
||||
break;
|
||||
case 'P':
|
||||
/* Persistent */
|
||||
x[0] = 'P';
|
||||
break;
|
||||
default:
|
||||
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 );
|
||||
@@ -363,7 +428,8 @@ GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_MODE */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_AWAY( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_AWAY( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -390,4 +456,90 @@ GLOBAL BOOLEAN IRC_AWAY( CLIENT *Client, REQUEST *Req )
|
||||
} /* 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- */
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-mode.h,v 1.2 2002/03/12 14:37:52 alex Exp $
|
||||
* $Id: irc-mode.h,v 1.4 2002/05/27 13:09:27 alex Exp $
|
||||
*
|
||||
* irc-mode.h: IRC-Befehle zur Mode-Aenderung (MODE, AWAY, ...) (Header)
|
||||
*/
|
||||
@@ -18,15 +18,12 @@
|
||||
#ifndef __irc_mode_h__
|
||||
#define __irc_mode_h__
|
||||
|
||||
#include "parse.h"
|
||||
#include "client.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_AWAY( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_MODE PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_AWAY PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
/* -eof- */
|
||||
|
131
src/ngircd/irc-op.c
Normal file
131
src/ngircd/irc-op.c
Normal file
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
* 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- */
|
29
src/ngircd/irc-op.h
Normal file
29
src/ngircd/irc-op.h
Normal file
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* 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- */
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-oper.c,v 1.3 2002/03/27 20:52:58 alex Exp $
|
||||
* $Id: irc-oper.c,v 1.8 2002/09/03 23:54:59 alex Exp $
|
||||
*
|
||||
* irc-oper.c: IRC-Operator-Befehle
|
||||
*/
|
||||
@@ -19,18 +19,25 @@
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "resolve.h"
|
||||
#include "conf.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
#include "parse.h"
|
||||
|
||||
#include <exp.h>
|
||||
#include "irc-oper.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_OPER( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_OPER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
INT i;
|
||||
|
||||
@@ -75,7 +82,8 @@ GLOBAL BOOLEAN IRC_OPER( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_OPER */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_DIE( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_DIE( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -93,7 +101,8 @@ GLOBAL BOOLEAN IRC_DIE( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_DIE */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_RESTART( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_RESTART( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -111,4 +120,25 @@ GLOBAL BOOLEAN IRC_RESTART( CLIENT *Client, REQUEST *Req )
|
||||
} /* 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- */
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-oper.h,v 1.2 2002/03/12 14:37:52 alex Exp $
|
||||
* $Id: irc-oper.h,v 1.6 2002/09/03 23:54:59 alex Exp $
|
||||
*
|
||||
* irc-oper.h: IRC-Operator-Befehle (Header)
|
||||
*/
|
||||
@@ -18,13 +18,11 @@
|
||||
#ifndef __irc_oper_h__
|
||||
#define __irc_oper_h__
|
||||
|
||||
#include "parse.h"
|
||||
#include "client.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_OPER( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_DIE( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_RESTART( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_OPER PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_DIE PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_RESTART PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_CONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-server.c,v 1.8 2002/03/27 20:52:58 alex Exp $
|
||||
* $Id: irc-server.c,v 1.17.2.3 2002/11/29 10:58:49 alex Exp $
|
||||
*
|
||||
* irc-server.c: IRC-Befehle fuer Server-Links
|
||||
*/
|
||||
@@ -23,16 +23,23 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "resolve.h"
|
||||
#include "conf.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
#include "parse.h"
|
||||
#include "ngircd.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-server.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR str[LINE_LEN], *ptr;
|
||||
CLIENT *from, *c, *cl;
|
||||
@@ -80,12 +87,13 @@ GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
Client_SetHops( Client, 1 );
|
||||
Client_SetInfo( Client, Req->argv[Req->argc - 1] );
|
||||
|
||||
/* Meldet sich der Server bei uns an? */
|
||||
if( Req->argc == 2 )
|
||||
/* Meldet sich der Server bei uns an (d.h., bauen nicht wir
|
||||
* selber die Verbindung zu einem anderen Server auf)? */
|
||||
if( Client_Token( Client ) != TOKEN_OUTBOUND )
|
||||
{
|
||||
/* Unseren SERVER- und PASS-Befehl senden */
|
||||
/* Eingehende Verbindung: Unseren SERVER- und PASS-Befehl senden */
|
||||
ok = TRUE;
|
||||
if( ! IRC_WriteStrClient( Client, "PASS %s "PASSSERVERADD, Conf_Server[i].pwd )) ok = FALSE;
|
||||
if( ! IRC_WriteStrClient( Client, "PASS %s %s", Conf_Server[i].pwd, NGIRCd_ProtoID )) ok = FALSE;
|
||||
else ok = IRC_WriteStrClient( Client, "SERVER %s 1 :%s", Conf_ServerName, Conf_ServerInfo );
|
||||
if( ! ok )
|
||||
{
|
||||
@@ -95,7 +103,12 @@ GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
Client_SetIntroducer( Client, Client );
|
||||
Client_SetToken( Client, 1 );
|
||||
}
|
||||
else Client_SetToken( Client, atoi( Req->argv[1] ));
|
||||
else
|
||||
{
|
||||
/* Ausgehende verbindung, SERVER und PASS wurden von uns bereits
|
||||
* an die Gegenseite uerbermittelt */
|
||||
Client_SetToken( Client, atoi( Req->argv[1] ));
|
||||
}
|
||||
|
||||
Log( LOG_NOTICE|LOG_snotice, "Server \"%s\" registered (connection %d, 1 hop - direct link).", Client_ID( Client ), Client_Conn( Client ));
|
||||
|
||||
@@ -149,6 +162,15 @@ GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
chan = Channel_First( );
|
||||
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 */
|
||||
cl2chan = Channel_FirstMember( chan );
|
||||
sprintf( str, "NJOIN %s :", Channel_Name( chan ));
|
||||
@@ -166,7 +188,7 @@ GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 8 ))
|
||||
{
|
||||
/* Zeile senden */
|
||||
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
|
||||
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
|
||||
sprintf( str, "NJOIN %s :", Channel_Name( chan ));
|
||||
}
|
||||
|
||||
@@ -177,7 +199,7 @@ GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
if( str[strlen( str ) - 1] != ':')
|
||||
{
|
||||
/* Ja; Also senden ... */
|
||||
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
|
||||
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* naechsten Channel suchen */
|
||||
@@ -233,9 +255,10 @@ GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_SERVER */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR *channame, *ptr, modes[8];
|
||||
CHAR str[COMMAND_LEN], *channame, *ptr, modes[8];
|
||||
BOOLEAN is_op, is_voiced;
|
||||
CHANNEL *chan;
|
||||
CLIENT *c;
|
||||
@@ -248,8 +271,11 @@ GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
||||
/* Falsche Anzahl Parameter? */
|
||||
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];
|
||||
ptr = strtok( Req->argv[1], "," );
|
||||
ptr = strtok( str, "," );
|
||||
while( ptr )
|
||||
{
|
||||
is_op = is_voiced = FALSE;
|
||||
@@ -296,7 +322,8 @@ GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_NJOIN */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_SQUIT( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_SQUIT( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target;
|
||||
CHAR msg[LINE_LEN + 64];
|
||||
@@ -312,9 +339,6 @@ GLOBAL BOOLEAN 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] );
|
||||
|
||||
/* SQUIT an alle Server weiterleiten */
|
||||
IRC_WriteStrServers( Client, "SQUIT %s :%s", Req->argv[0], Req->argv[1] );
|
||||
|
||||
target = Client_Search( Req->argv[0] );
|
||||
if( ! target )
|
||||
{
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-server.h,v 1.2 2002/03/12 14:37:52 alex Exp $
|
||||
* $Id: irc-server.h,v 1.3 2002/05/27 13:09:27 alex Exp $
|
||||
*
|
||||
* irc-server.h: IRC-Befehle fuer Server-Links (Header)
|
||||
*/
|
||||
@@ -18,13 +18,10 @@
|
||||
#ifndef __irc_server_h__
|
||||
#define __irc_server_h__
|
||||
|
||||
#include "parse.h"
|
||||
#include "client.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_SQUIT( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_SERVER PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_NJOIN PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_SQUIT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-write.c,v 1.3 2002/03/25 17:13:07 alex Exp $
|
||||
* $Id: irc-write.c,v 1.7.2.3 2002/10/04 13:12:46 alex Exp $
|
||||
*
|
||||
* irc-write.c: IRC-Texte und Befehle ueber Netzwerk versenden
|
||||
*/
|
||||
@@ -21,17 +21,30 @@
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "defines.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-write.h"
|
||||
|
||||
|
||||
LOCAL CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client );
|
||||
LOCAL CHAR *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client ));
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
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];
|
||||
BOOLEAN ok = CONNECTED;
|
||||
@@ -40,18 +53,32 @@ GLOBAL BOOLEAN IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... )
|
||||
assert( Client != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
/* an den Client selber */
|
||||
ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), buffer );
|
||||
ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), "%s", buffer );
|
||||
|
||||
return ok;
|
||||
} /* IRC_WriteStrClient */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
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. */
|
||||
|
||||
@@ -62,7 +89,11 @@ GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *F
|
||||
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 );
|
||||
|
||||
@@ -70,7 +101,18 @@ GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *F
|
||||
} /* IRC_WriteStrClientPrefix */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
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];
|
||||
va_list ap;
|
||||
@@ -78,15 +120,31 @@ GLOBAL BOOLEAN IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remot
|
||||
assert( Client != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, buffer );
|
||||
return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, "%s", buffer );
|
||||
} /* IRC_WriteStrChannel */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
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;
|
||||
CHAR buffer[1000];
|
||||
@@ -100,7 +158,11 @@ GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT
|
||||
assert( Prefix != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
@@ -146,23 +208,77 @@ GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT
|
||||
} /* IRC_WriteStrChannelPrefix */
|
||||
|
||||
|
||||
GLOBAL VOID IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
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];
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
/* an den Client selber */
|
||||
return IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), buffer );
|
||||
IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), "%s", buffer );
|
||||
} /* IRC_WriteStrServers */
|
||||
|
||||
|
||||
GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
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];
|
||||
CLIENT *c;
|
||||
@@ -171,7 +287,11 @@ GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *F
|
||||
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 );
|
||||
|
||||
@@ -180,15 +300,26 @@ GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *F
|
||||
{
|
||||
if(( Client_Type( c ) == CLIENT_SERVER ) && ( Client_Conn( c ) > NONE ) && ( c != Client_ThisServer( )) && ( c != ExceptOf ))
|
||||
{
|
||||
/* Ziel-Server gefunden */
|
||||
IRC_WriteStrClientPrefix( c, Prefix, buffer );
|
||||
/* Ziel-Server gefunden. Nun noch pruefen, ob Flags stimmen */
|
||||
if(( Flag == '\0' ) || ( strchr( Client_Flags( c ), Flag ) != NULL )) IRC_WriteStrClientPrefix( c, Prefix, "%s", buffer );
|
||||
}
|
||||
c = Client_Next( c );
|
||||
}
|
||||
} /* IRC_WriteStrServersPrefix */
|
||||
} /* IRC_WriteStrServersPrefixFlag */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
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;
|
||||
CL2CHAN *chan_cl2chan, *cl2chan;
|
||||
@@ -202,7 +333,11 @@ GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEA
|
||||
assert( Prefix != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
@@ -258,7 +393,8 @@ GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEA
|
||||
} /* IRC_WriteStrRelatedPrefix */
|
||||
|
||||
|
||||
LOCAL CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client )
|
||||
LOCAL CHAR *
|
||||
Get_Prefix( CLIENT *Target, CLIENT *Client )
|
||||
{
|
||||
assert( Target != NULL );
|
||||
assert( Client != NULL );
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-write.h,v 1.2 2002/03/12 14:37:52 alex Exp $
|
||||
* $Id: irc-write.h,v 1.4 2002/09/03 23:56:06 alex Exp $
|
||||
*
|
||||
* irc-write.h: IRC-Texte und Befehle ueber Netzwerk versenden (Header)
|
||||
*/
|
||||
@@ -18,19 +18,18 @@
|
||||
#ifndef __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_WriteStrClient( CLIENT *Client, CHAR *Format, ... );
|
||||
GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... );
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannel PARAMS((CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... ));
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannelPrefix PARAMS((CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... ));
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... );
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... );
|
||||
GLOBAL VOID IRC_WriteStrServers PARAMS((CLIENT *ExceptOf, CHAR *Format, ... ));
|
||||
GLOBAL VOID IRC_WriteStrServersPrefix PARAMS((CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... ));
|
||||
GLOBAL VOID IRC_WriteStrServersPrefixFlag PARAMS((CLIENT *ExceptOf, CLIENT *Prefix, CHAR Flag, 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, ... );
|
||||
GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix PARAMS((CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... ));
|
||||
|
||||
|
||||
#endif
|
||||
|
138
src/ngircd/irc.c
138
src/ngircd/irc.c
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc.c,v 1.89 2002/03/25 17:04:02 alex Exp $
|
||||
* $Id: irc.c,v 1.95.2.3 2002/11/04 19:18:39 alex Exp $
|
||||
*
|
||||
* irc.c: IRC-Befehle
|
||||
*/
|
||||
@@ -25,20 +25,24 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "channel.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "resolve.h"
|
||||
#include "conf.h"
|
||||
#include "conn.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
#include "parse.h"
|
||||
#include "tool.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_MOTD( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_MOTD( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -52,7 +56,8 @@ GLOBAL BOOLEAN IRC_MOTD( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_MOTD */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *cl, *from;
|
||||
CHANNEL *chan;
|
||||
@@ -74,6 +79,9 @@ GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
|
||||
cl = Client_Search( Req->argv[0] );
|
||||
if( cl )
|
||||
{
|
||||
/* Okay, Ziel ist ein Client. Aber ist es auch ein User? */
|
||||
if( Client_Type( cl ) != CLIENT_USER ) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( from ), Req->argv[0] );
|
||||
|
||||
/* Okay, Ziel ist ein User */
|
||||
if(( Client_Type( Client ) != CLIENT_SERVER ) && ( strchr( Client_Modes( cl ), 'a' )))
|
||||
{
|
||||
@@ -93,14 +101,15 @@ GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_PRIVMSG */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_NOTICE( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *to, *from;
|
||||
|
||||
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 ));
|
||||
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return CONNECTED;
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 2 ) return CONNECTED;
|
||||
@@ -110,7 +119,7 @@ GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req )
|
||||
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
|
||||
to = Client_Search( Req->argv[0] );
|
||||
if( to )
|
||||
if(( to ) && ( Client_Type( to ) == CLIENT_USER ))
|
||||
{
|
||||
/* Okay, Ziel ist ein User */
|
||||
return IRC_WriteStrClientPrefix( to, from, "NOTICE %s :%s", Client_ID( to ), Req->argv[1] );
|
||||
@@ -119,7 +128,8 @@ GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_NOTICE */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_NAMES( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR rpl[COMMAND_LEN], *ptr;
|
||||
CLIENT *target, *from, *c;
|
||||
@@ -196,7 +206,7 @@ GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req )
|
||||
if( strlen( rpl ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 ))
|
||||
{
|
||||
/* Zeile wird zu lang: senden! */
|
||||
if( ! IRC_WriteStrClient( from, rpl )) return DISCONNECTED;
|
||||
if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED;
|
||||
sprintf( rpl, RPL_NAMREPLY_MSG, Client_ID( from ), "*", "*" );
|
||||
}
|
||||
}
|
||||
@@ -207,14 +217,15 @@ GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req )
|
||||
if( rpl[strlen( rpl ) - 1] != ':')
|
||||
{
|
||||
/* es wurden User gefunden */
|
||||
if( ! IRC_WriteStrClient( from, rpl )) return DISCONNECTED;
|
||||
if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED;
|
||||
}
|
||||
|
||||
return IRC_WriteStrClient( from, RPL_ENDOFNAMES_MSG, Client_ID( from ), "*" );
|
||||
} /* IRC_NAMES */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_ISON( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_ISON( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR rpl[COMMAND_LEN];
|
||||
CLIENT *c;
|
||||
@@ -248,11 +259,12 @@ GLOBAL BOOLEAN IRC_ISON( CLIENT *Client, REQUEST *Req )
|
||||
}
|
||||
if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
|
||||
|
||||
return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) );
|
||||
return IRC_WriteStrClient( Client, "%s", rpl, Client_ID( Client ) );
|
||||
} /* IRC_ISON */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_WHOIS( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *from, *target, *c;
|
||||
CHAR str[LINE_LEN + 1], *ptr = NULL;
|
||||
@@ -313,7 +325,7 @@ GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req )
|
||||
if( strlen( str ) > ( LINE_LEN - CHANNEL_NAME_LEN - 4 ))
|
||||
{
|
||||
/* Zeile wird zu lang: senden! */
|
||||
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
|
||||
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
|
||||
sprintf( str, RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c ));
|
||||
}
|
||||
|
||||
@@ -323,7 +335,7 @@ GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req )
|
||||
if( str[strlen( str ) - 1] != ':')
|
||||
{
|
||||
/* Es sind noch Daten da, die gesendet werden muessen */
|
||||
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
|
||||
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* IRC-Operator? */
|
||||
@@ -349,7 +361,8 @@ GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_WHOIS */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WHO( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_WHO( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
BOOLEAN ok, only_ops;
|
||||
CHAR flags[8], *ptr;
|
||||
@@ -426,7 +439,8 @@ GLOBAL BOOLEAN IRC_WHO( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_WHO */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_USERHOST( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_USERHOST( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR rpl[COMMAND_LEN];
|
||||
CLIENT *c;
|
||||
@@ -463,11 +477,12 @@ GLOBAL BOOLEAN IRC_USERHOST( CLIENT *Client, REQUEST *Req )
|
||||
}
|
||||
if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
|
||||
|
||||
return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) );
|
||||
return IRC_WriteStrClient( Client, "%s", rpl, Client_ID( Client ) );
|
||||
} /* IRC_USERHOST */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_ERROR( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_ERROR( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -479,7 +494,8 @@ GLOBAL BOOLEAN IRC_ERROR( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_ERROR */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_LUSERS( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_LUSERS( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *from;
|
||||
|
||||
@@ -515,7 +531,8 @@ GLOBAL BOOLEAN IRC_LUSERS( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_LUSERS */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_LINKS( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_LINKS( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *from, *c;
|
||||
CHAR *mask;
|
||||
@@ -564,7 +581,8 @@ GLOBAL BOOLEAN IRC_LINKS( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_LINKS */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_VERSION( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_VERSION( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *prefix;
|
||||
|
||||
@@ -594,11 +612,12 @@ GLOBAL BOOLEAN IRC_VERSION( CLIENT *Client, REQUEST *Req )
|
||||
}
|
||||
|
||||
/* mit Versionsinfo antworten */
|
||||
return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( ));
|
||||
return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE, VERSION, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( ));
|
||||
} /* IRC_VERSION */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_KILL( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_KILL( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *prefix, *c;
|
||||
|
||||
@@ -624,13 +643,63 @@ GLOBAL BOOLEAN IRC_KILL( CLIENT *Client, REQUEST *Req )
|
||||
|
||||
/* haben wir selber einen solchen Client? */
|
||||
c = Client_Search( Req->argv[0] );
|
||||
if( c && ( Client_Conn( c ) != NONE )) Conn_Close( Client_Conn( c ), NULL, Req->argv[1], TRUE );
|
||||
|
||||
if( c )
|
||||
{
|
||||
/* 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;
|
||||
} /* IRC_KILL */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_Show_MOTD( CLIENT *Client )
|
||||
GLOBAL BOOLEAN
|
||||
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;
|
||||
CHAR line[127];
|
||||
@@ -664,7 +733,8 @@ GLOBAL BOOLEAN IRC_Show_MOTD( CLIENT *Client )
|
||||
} /* IRC_Show_MOTD */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
|
||||
{
|
||||
BOOLEAN is_visible, is_member;
|
||||
CHAR str[LINE_LEN + 1];
|
||||
@@ -698,7 +768,7 @@ GLOBAL BOOLEAN IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
|
||||
if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 ))
|
||||
{
|
||||
/* Zeile wird zu lang: senden! */
|
||||
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
|
||||
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
|
||||
sprintf( str, RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan ));
|
||||
}
|
||||
}
|
||||
@@ -709,14 +779,15 @@ GLOBAL BOOLEAN IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
|
||||
if( str[strlen( str ) - 1] != ':')
|
||||
{
|
||||
/* Es sind noch Daten da, die gesendet werden muessen */
|
||||
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
|
||||
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
|
||||
}
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_Send_NAMES */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )
|
||||
{
|
||||
BOOLEAN is_visible, is_member;
|
||||
CL2CHAN *cl2chan;
|
||||
@@ -760,9 +831,10 @@ GLOBAL BOOLEAN IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )
|
||||
} /* IRC_Send_WHO */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_Send_LUSERS( CLIENT *Client )
|
||||
GLOBAL BOOLEAN
|
||||
IRC_Send_LUSERS( CLIENT *Client )
|
||||
{
|
||||
INT cnt;
|
||||
LONG cnt;
|
||||
|
||||
assert( Client != NULL );
|
||||
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc.h,v 1.30 2002/03/12 14:37:52 alex Exp $
|
||||
* $Id: irc.h,v 1.32 2002/09/16 09:14:45 alex Exp $
|
||||
*
|
||||
* irc.h: IRC-Befehle (Header)
|
||||
*/
|
||||
@@ -18,32 +18,29 @@
|
||||
#ifndef __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_MOTD( 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_PRIVMSG PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_NOTICE PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_NAMES PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_ISON PARAMS((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_NAMES( 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_ERROR PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_KILL PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
GLOBAL BOOLEAN IRC_ERROR( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_KILL( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
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 );
|
||||
GLOBAL BOOLEAN IRC_Send_NAMES PARAMS((CLIENT *Client, CHANNEL *Chan ));
|
||||
GLOBAL BOOLEAN IRC_Send_LUSERS PARAMS((CLIENT *Client ));
|
||||
GLOBAL BOOLEAN IRC_Show_MOTD PARAMS((CLIENT *Client ));
|
||||
GLOBAL BOOLEAN IRC_Send_WHO PARAMS((CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps ));
|
||||
|
||||
|
||||
#endif
|
||||
|
448
src/ngircd/lists.c
Normal file
448
src/ngircd/lists.c
Normal file
@@ -0,0 +1,448 @@
|
||||
/*
|
||||
* 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- */
|
43
src/ngircd/lists.h
Normal file
43
src/ngircd/lists.h
Normal file
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* 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- */
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: log.c,v 1.32 2002/03/31 16:46:15 alex Exp $
|
||||
* $Id: log.c,v 1.37.2.3 2002/11/04 19:18:39 alex Exp $
|
||||
*
|
||||
* log.c: Logging-Funktionen
|
||||
*/
|
||||
@@ -31,8 +31,10 @@
|
||||
#endif
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "client.h"
|
||||
#include "defines.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "irc-write.h"
|
||||
|
||||
#include "exp.h"
|
||||
@@ -43,10 +45,11 @@ LOCAL CHAR Error_File[FNAME_LEN];
|
||||
LOCAL CHAR Init_Txt[127];
|
||||
|
||||
|
||||
LOCAL VOID Wall_ServerNotice( CHAR *Msg );
|
||||
LOCAL VOID Wall_ServerNotice PARAMS(( CHAR *Msg ));
|
||||
|
||||
|
||||
GLOBAL VOID Log_Init( VOID )
|
||||
GLOBAL VOID
|
||||
Log_Init( VOID )
|
||||
{
|
||||
#ifdef USE_SYSLOG
|
||||
/* Syslog initialisieren */
|
||||
@@ -86,13 +89,14 @@ GLOBAL VOID Log_Init( VOID )
|
||||
} /* Log_Init */
|
||||
|
||||
|
||||
GLOBAL VOID Log_InitErrorfile( VOID )
|
||||
GLOBAL VOID
|
||||
Log_InitErrorfile( VOID )
|
||||
{
|
||||
/* "Error-Log" initialisieren: stderr in Datei umlenken. Dort
|
||||
* landen z.B. alle Ausgaben von assert()-Aufrufen. */
|
||||
|
||||
/* Dateiname zusammen bauen */
|
||||
sprintf( Error_File, ERROR_DIR"/"PACKAGE"-%ld.err", (INT32)getpid( ));
|
||||
sprintf( Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE, (LONG)getpid( ));
|
||||
|
||||
/* stderr umlenken */
|
||||
fflush( stderr );
|
||||
@@ -112,10 +116,12 @@ GLOBAL VOID Log_InitErrorfile( VOID )
|
||||
} /* Log_InitErrfile */
|
||||
|
||||
|
||||
GLOBAL VOID Log_Exit( VOID )
|
||||
GLOBAL VOID
|
||||
Log_Exit( VOID )
|
||||
{
|
||||
/* Good Bye! */
|
||||
Log( LOG_NOTICE, PACKAGE" done.");
|
||||
if( NGIRCd_Restart ) Log( LOG_NOTICE, "%s done (restarting).", PACKAGE );
|
||||
else Log( LOG_NOTICE, "%s done.", PACKAGE );
|
||||
|
||||
/* Error-File (stderr) loeschen */
|
||||
if( unlink( Error_File ) != 0 ) Log( LOG_ERR, "Can't delete \"%s\": %s", Error_File, strerror( errno ));
|
||||
@@ -127,7 +133,16 @@ GLOBAL VOID Log_Exit( VOID )
|
||||
} /* Log_Exit */
|
||||
|
||||
|
||||
GLOBAL VOID Log( INT Level, CONST CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
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 */
|
||||
|
||||
@@ -152,15 +167,27 @@ GLOBAL VOID Log( INT Level, CONST CHAR *Format, ... )
|
||||
#endif
|
||||
|
||||
/* String mit variablen Argumenten zusammenbauen ... */
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
if( NGIRCd_NoDaemon )
|
||||
{
|
||||
/* auf Konsole ausgeben */
|
||||
printf( "[%d] %s\n", Level, msg );
|
||||
fprintf( stdout, "[%d] %s\n", Level, msg );
|
||||
fflush( stdout );
|
||||
}
|
||||
#ifdef USE_SYSLOG
|
||||
else
|
||||
{
|
||||
/* Syslog */
|
||||
syslog( Level, "%s", msg );
|
||||
}
|
||||
#endif
|
||||
|
||||
if( Level <= LOG_CRIT )
|
||||
{
|
||||
@@ -169,11 +196,6 @@ GLOBAL VOID Log( INT Level, CONST CHAR *Format, ... )
|
||||
fflush( stderr );
|
||||
}
|
||||
|
||||
#ifdef USE_SYSLOG
|
||||
/* Syslog */
|
||||
syslog( Level, msg );
|
||||
#endif
|
||||
|
||||
if( snotice )
|
||||
{
|
||||
/* NOTICE an lokale User mit "s"-Mode */
|
||||
@@ -182,7 +204,8 @@ GLOBAL VOID Log( INT Level, CONST CHAR *Format, ... )
|
||||
} /* Log */
|
||||
|
||||
|
||||
GLOBAL VOID Log_Init_Resolver( VOID )
|
||||
GLOBAL VOID
|
||||
Log_Init_Resolver( VOID )
|
||||
{
|
||||
#ifdef USE_SYSLOG
|
||||
openlog( PACKAGE, LOG_CONS|LOG_PID, LOG_LOCAL5 );
|
||||
@@ -190,7 +213,8 @@ GLOBAL VOID Log_Init_Resolver( VOID )
|
||||
} /* Log_Init_Resolver */
|
||||
|
||||
|
||||
GLOBAL VOID Log_Exit_Resolver( VOID )
|
||||
GLOBAL VOID
|
||||
Log_Exit_Resolver( VOID )
|
||||
{
|
||||
#ifdef USE_SYSLOG
|
||||
closelog( );
|
||||
@@ -198,7 +222,16 @@ GLOBAL VOID Log_Exit_Resolver( VOID )
|
||||
} /* Log_Exit_Resolver */
|
||||
|
||||
|
||||
GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
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 */
|
||||
|
||||
@@ -211,6 +244,8 @@ GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... )
|
||||
|
||||
assert( Format != NULL );
|
||||
|
||||
if( NGIRCd_NoDaemon ) return;
|
||||
|
||||
#ifdef DEBUG
|
||||
if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return;
|
||||
#else
|
||||
@@ -218,7 +253,11 @@ GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... )
|
||||
#endif
|
||||
|
||||
/* String mit variablen Argumenten zusammenbauen ... */
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
@@ -229,7 +268,8 @@ GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... )
|
||||
} /* Log_Resolver */
|
||||
|
||||
|
||||
LOCAL VOID Wall_ServerNotice( CHAR *Msg )
|
||||
LOCAL VOID
|
||||
Wall_ServerNotice( CHAR *Msg )
|
||||
{
|
||||
/* Server-Notice an entsprechende User verschicken */
|
||||
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: log.h,v 1.11 2002/03/29 23:33:42 alex Exp $
|
||||
* $Id: log.h,v 1.12 2002/05/27 13:09:27 alex Exp $
|
||||
*
|
||||
* log.h: Logging-Funktionen (Header)
|
||||
*/
|
||||
@@ -36,16 +36,16 @@
|
||||
#define LOG_snotice 1024
|
||||
|
||||
|
||||
GLOBAL VOID Log_Init( VOID );
|
||||
GLOBAL VOID Log_Exit( VOID );
|
||||
GLOBAL VOID Log_Init PARAMS((VOID ));
|
||||
GLOBAL VOID Log_Exit PARAMS((VOID ));
|
||||
|
||||
GLOBAL VOID Log_InitErrorfile( VOID );
|
||||
GLOBAL VOID Log( INT Level, CONST CHAR *Format, ... );
|
||||
GLOBAL VOID Log_InitErrorfile PARAMS((VOID ));
|
||||
GLOBAL VOID Log PARAMS((INT Level, CONST CHAR *Format, ... ));
|
||||
|
||||
GLOBAL VOID Log_Init_Resolver( VOID );
|
||||
GLOBAL VOID Log_Exit_Resolver( VOID );
|
||||
GLOBAL VOID Log_Init_Resolver PARAMS((VOID ));
|
||||
GLOBAL VOID Log_Exit_Resolver PARAMS((VOID ));
|
||||
|
||||
GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... );
|
||||
GLOBAL VOID Log_Resolver PARAMS((CONST INT Level, CONST CHAR *Format, ... ));
|
||||
|
||||
|
||||
#endif
|
||||
|
254
src/ngircd/match.c
Normal file
254
src/ngircd/match.c
Normal file
@@ -0,0 +1,254 @@
|
||||
/*
|
||||
* 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- */
|
28
src/ngircd/match.h
Normal file
28
src/ngircd/match.h
Normal file
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* 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- */
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: messages.h,v 1.37 2002/03/12 22:08:24 alex Exp $
|
||||
* $Id: messages.h,v 1.46.2.4 2002/11/22 22:55:05 alex Exp $
|
||||
*
|
||||
* irc.h: IRC-Befehle (Header)
|
||||
*/
|
||||
@@ -19,181 +19,84 @@
|
||||
#define __messages_h__
|
||||
|
||||
|
||||
#define RPL_WELCOME "001"
|
||||
#define RPL_WELCOME_MSG RPL_WELCOME" %s :Welcome to the Internet Relay Network %s"
|
||||
#define RPL_WELCOME_MSG "001 %s :Welcome to the Internet Relay Network %s"
|
||||
#define RPL_YOURHOST_MSG "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%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_YOURHOST "002"
|
||||
#define RPL_YOURHOST_MSG RPL_YOURHOST" %s :Your host is %s, running ngircd "VERSION"-"TARGET_CPU"/"TARGET_VENDOR"/"TARGET_OS
|
||||
#define RPL_AWAY_MSG "301 %s %s :%s"
|
||||
#define RPL_USERHOST_MSG "302 %s :"
|
||||
#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 RPL_CREATED "003"
|
||||
#define RPL_CREATED_MSG RPL_CREATED" %s :This server was started %s"
|
||||
#define ERR_NOSUCHNICK_MSG "401 %s %s :No such nick or channel name"
|
||||
#define ERR_NOSUCHSERVER_MSG "402 %s %s :No such server"
|
||||
#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 RPL_MYINFO "004"
|
||||
#define RPL_MYINFO_MSG RPL_MYINFO" %s :%s ngircd-"VERSION" "USERMODES" "CHANMODES
|
||||
|
||||
#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_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"
|
||||
#define ERR_UMODEUNKNOWNFLAG_MSG "501 %s :Unknown mode"
|
||||
#define ERR_UMODEUNKNOWNFLAG2_MSG "501 %s :Unknown mode \"%c%c\""
|
||||
#define ERR_USERSDONTMATCH_MSG "502 %s :Can't set/get mode for other users"
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: ngircd.c,v 1.41 2002/03/31 13:20:42 alex Exp $
|
||||
* $Id: ngircd.c,v 1.54.2.4 2002/11/24 15:25:25 alex Exp $
|
||||
*
|
||||
* ngircd.c: Hier beginnt alles ;-)
|
||||
*/
|
||||
@@ -21,41 +21,52 @@
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
#include <time.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
|
||||
#include "channel.h"
|
||||
#include "client.h"
|
||||
#include "conf.h"
|
||||
#include "resolve.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "conf.h"
|
||||
#include "defines.h"
|
||||
#include "irc.h"
|
||||
#include "lists.h"
|
||||
#include "log.h"
|
||||
#include "parse.h"
|
||||
#include "irc.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "ngircd.h"
|
||||
|
||||
|
||||
LOCAL VOID Initialize_Signal_Handler( VOID );
|
||||
LOCAL VOID Signal_Handler( INT Signal );
|
||||
LOCAL VOID Initialize_Signal_Handler PARAMS(( VOID ));
|
||||
LOCAL VOID Signal_Handler PARAMS(( INT Signal ));
|
||||
|
||||
LOCAL VOID Initialize_Listen_Ports( VOID );
|
||||
LOCAL VOID Initialize_Listen_Ports PARAMS(( VOID ));
|
||||
|
||||
LOCAL VOID Show_Version( VOID );
|
||||
LOCAL VOID Show_Help( VOID );
|
||||
LOCAL VOID Show_Version PARAMS(( VOID ));
|
||||
LOCAL VOID Show_Help PARAMS(( VOID ));
|
||||
|
||||
|
||||
GLOBAL int main( int argc, const char *argv[] )
|
||||
GLOBAL int
|
||||
main( int argc, const char *argv[] )
|
||||
{
|
||||
struct passwd *pwd;
|
||||
struct group *grp;
|
||||
BOOLEAN ok, configtest = FALSE;
|
||||
INT32 pid, n;
|
||||
LONG pid, n;
|
||||
INT i;
|
||||
|
||||
umask( 0077 );
|
||||
|
||||
NGIRCd_Restart = FALSE;
|
||||
NGIRCd_Quit = FALSE;
|
||||
NGIRCd_NoDaemon = FALSE;
|
||||
@@ -133,7 +144,7 @@ GLOBAL int main( int argc, const char *argv[] )
|
||||
{
|
||||
/* Kurze Option */
|
||||
|
||||
for( n = 1; n < (INT32)strlen( argv[i] ); n++ )
|
||||
for( n = 1; n < (LONG)strlen( argv[i] ); n++ )
|
||||
{
|
||||
ok = FALSE;
|
||||
#ifdef DEBUG
|
||||
@@ -152,7 +163,7 @@ GLOBAL int main( int argc, const char *argv[] )
|
||||
NGIRCd_ConfFile[FNAME_LEN - 1] = '\0';
|
||||
|
||||
/* zum uebernaechsten Parameter */
|
||||
i++; n = strlen( argv[i] );
|
||||
i++; n = (LONG)strlen( argv[i] );
|
||||
ok = TRUE;
|
||||
}
|
||||
}
|
||||
@@ -176,8 +187,8 @@ GLOBAL int main( int argc, const char *argv[] )
|
||||
|
||||
if( ! ok )
|
||||
{
|
||||
printf( PACKAGE": invalid option \"-%c\"!\n", argv[i][n] );
|
||||
puts( "Try \""PACKAGE" --help\" for more information." );
|
||||
printf( "%s: invalid option \"-%c\"!\n", PACKAGE, argv[i][n] );
|
||||
printf( "Try \"%s --help\" for more information.\n", PACKAGE );
|
||||
exit( 1 );
|
||||
}
|
||||
}
|
||||
@@ -185,8 +196,8 @@ GLOBAL int main( int argc, const char *argv[] )
|
||||
}
|
||||
if( ! ok )
|
||||
{
|
||||
printf( PACKAGE": invalid option \"%s\"!\n", argv[i] );
|
||||
puts( "Try \""PACKAGE" --help\" for more information." );
|
||||
printf( "%s: invalid option \"%s\"!\n", PACKAGE, argv[i] );
|
||||
printf( "Try \"%s --help\" for more information.\n", PACKAGE );
|
||||
exit( 1 );
|
||||
}
|
||||
}
|
||||
@@ -197,7 +208,11 @@ GLOBAL int main( int argc, const char *argv[] )
|
||||
if( NGIRCd_Debug ) strcpy( NGIRCd_DebugLevel, "1" );
|
||||
#endif
|
||||
#ifdef SNIFFER
|
||||
if( NGIRCd_Sniffer ) strcpy( NGIRCd_DebugLevel, "2" );
|
||||
if( NGIRCd_Sniffer )
|
||||
{
|
||||
NGIRCd_Debug = TRUE;
|
||||
strcpy( NGIRCd_DebugLevel, "2" );
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Soll nur die Konfigurations ueberprueft und ausgegeben werden? */
|
||||
@@ -216,7 +231,7 @@ GLOBAL int main( int argc, const char *argv[] )
|
||||
if( ! NGIRCd_NoDaemon )
|
||||
{
|
||||
/* Daemon im Hintergrund erzeugen */
|
||||
pid = (INT32)fork( );
|
||||
pid = (LONG)fork( );
|
||||
if( pid > 0 )
|
||||
{
|
||||
/* "alter" Prozess */
|
||||
@@ -225,7 +240,7 @@ GLOBAL int main( int argc, const char *argv[] )
|
||||
if( pid < 0 )
|
||||
{
|
||||
/* Fehler */
|
||||
printf( PACKAGE": Can't fork: %s!\nFatal error, exiting now ...", strerror( errno ));
|
||||
printf( "%s: Can't fork: %s!\nFatal error, exiting now ...\n", PACKAGE, strerror( errno ));
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
@@ -242,7 +257,9 @@ GLOBAL int main( int argc, const char *argv[] )
|
||||
|
||||
/* Module initialisieren */
|
||||
Log_Init( );
|
||||
Resolve_Init( );
|
||||
Conf_Init( );
|
||||
Lists_Init( );
|
||||
Channel_Init( );
|
||||
Client_Init( );
|
||||
Conn_Init( );
|
||||
@@ -262,28 +279,43 @@ GLOBAL int 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 ));
|
||||
}
|
||||
}
|
||||
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( );
|
||||
|
||||
/* Signal-Handler initialisieren */
|
||||
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 */
|
||||
Initialize_Listen_Ports( );
|
||||
|
||||
/* Hauptschleife */
|
||||
while( TRUE )
|
||||
{
|
||||
if( NGIRCd_Quit || NGIRCd_Restart ) break;
|
||||
Conn_Handler( 5 );
|
||||
}
|
||||
Conn_Handler( );
|
||||
|
||||
/* Alles abmelden */
|
||||
Conn_Exit( );
|
||||
Client_Exit( );
|
||||
Channel_Exit( );
|
||||
Conf_Exit( );
|
||||
Lists_Exit( );
|
||||
Log_Exit( );
|
||||
}
|
||||
|
||||
@@ -291,16 +323,18 @@ GLOBAL int main( int argc, const char *argv[] )
|
||||
} /* main */
|
||||
|
||||
|
||||
GLOBAL CHAR *NGIRCd_Version( VOID )
|
||||
GLOBAL CHAR *
|
||||
NGIRCd_Version( VOID )
|
||||
{
|
||||
STATIC CHAR version[126];
|
||||
|
||||
sprintf( version, PACKAGE" version "VERSION"-%s", NGIRCd_VersionAddition( ));
|
||||
sprintf( version, "%s %s-%s", PACKAGE, VERSION, NGIRCd_VersionAddition( ));
|
||||
return version;
|
||||
} /* NGIRCd_Version */
|
||||
|
||||
|
||||
GLOBAL CHAR *NGIRCd_VersionAddition( VOID )
|
||||
GLOBAL CHAR *
|
||||
NGIRCd_VersionAddition( VOID )
|
||||
{
|
||||
STATIC CHAR txt[64];
|
||||
|
||||
@@ -310,10 +344,6 @@ GLOBAL CHAR *NGIRCd_VersionAddition( VOID )
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
strcat( txt, "SYSLOG" );
|
||||
#endif
|
||||
#ifdef STRICT_RFC
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
strcat( txt, "RFC" );
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
strcat( txt, "DEBUG" );
|
||||
@@ -322,15 +352,28 @@ GLOBAL CHAR *NGIRCd_VersionAddition( VOID )
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
strcat( txt, "SNIFFER" );
|
||||
#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, "-" );
|
||||
strcat( txt, TARGET_CPU"/"TARGET_VENDOR"/"TARGET_OS );
|
||||
strcat( txt, TARGET_CPU );
|
||||
strcat( txt, "/" );
|
||||
strcat( txt, TARGET_VENDOR );
|
||||
strcat( txt, "/" );
|
||||
strcat( txt, TARGET_OS );
|
||||
|
||||
return txt;
|
||||
} /* NGIRCd_VersionAddition */
|
||||
|
||||
|
||||
LOCAL VOID Initialize_Signal_Handler( VOID )
|
||||
LOCAL VOID
|
||||
Initialize_Signal_Handler( VOID )
|
||||
{
|
||||
/* Signal-Handler initialisieren: einige Signale
|
||||
* werden ignoriert, andere speziell behandelt. */
|
||||
@@ -376,7 +419,8 @@ LOCAL VOID Initialize_Signal_Handler( VOID )
|
||||
} /* Initialize_Signal_Handler */
|
||||
|
||||
|
||||
LOCAL VOID Signal_Handler( INT Signal )
|
||||
LOCAL VOID
|
||||
Signal_Handler( INT Signal )
|
||||
{
|
||||
/* Signal-Handler. Dieser wird aufgerufen, wenn eines der Signale eintrifft,
|
||||
* fuer das wir uns registriert haben (vgl. Initialize_Signal_Handler). Die
|
||||
@@ -409,12 +453,13 @@ LOCAL VOID Signal_Handler( INT Signal )
|
||||
} /* Signal_Handler */
|
||||
|
||||
|
||||
LOCAL VOID Initialize_Listen_Ports( VOID )
|
||||
LOCAL VOID
|
||||
Initialize_Listen_Ports( VOID )
|
||||
{
|
||||
/* Ports, auf denen der Server Verbindungen entgegennehmen
|
||||
* soll, initialisieren */
|
||||
|
||||
UINT created, i;
|
||||
INT created, i;
|
||||
|
||||
created = 0;
|
||||
for( i = 0; i < Conf_ListenPorts_Count; i++ )
|
||||
@@ -426,22 +471,25 @@ LOCAL VOID Initialize_Listen_Ports( VOID )
|
||||
if( created < 1 )
|
||||
{
|
||||
Log( LOG_ALERT, "Server isn't listening on a single port!" );
|
||||
Log( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
|
||||
Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE );
|
||||
exit( 1 );
|
||||
}
|
||||
} /* Initialize_Listen_Ports */
|
||||
|
||||
|
||||
LOCAL VOID Show_Version( VOID )
|
||||
LOCAL VOID
|
||||
Show_Version( VOID )
|
||||
{
|
||||
puts( NGIRCd_Version( ));
|
||||
puts( "Copyright (c)2001,2002 by Alexander Barton (alex@barton.de).\n" );
|
||||
puts( "Copyright (c)2001,2002 by Alexander Barton (<alex@barton.de>)." );
|
||||
puts( "Homepage: <http://arthur.ath.cx/~alex/ngircd/>\n" );
|
||||
puts( "This is free software; see the source for copying conditions. There is NO" );
|
||||
puts( "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." );
|
||||
} /* Show_Version */
|
||||
|
||||
|
||||
LOCAL VOID Show_Help( VOID )
|
||||
LOCAL VOID
|
||||
Show_Help( VOID )
|
||||
{
|
||||
#ifdef DEBUG
|
||||
puts( " -d, --debug log extra debug messages" );
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: ngircd.h,v 1.12 2002/03/27 16:40:31 alex Exp $
|
||||
* $Id: ngircd.h,v 1.14 2002/09/02 19:01:11 alex Exp $
|
||||
*
|
||||
* ngircd.h: Prototypen aus dem "Haupt-Modul"
|
||||
*/
|
||||
@@ -45,8 +45,10 @@ GLOBAL CHAR NGIRCd_DebugLevel[2]; /* Debug-Level fuer IRC_VERSION() */
|
||||
|
||||
GLOBAL CHAR NGIRCd_ConfFile[FNAME_LEN]; /* Konfigurationsdatei */
|
||||
|
||||
GLOBAL CHAR *NGIRCd_Version( VOID );
|
||||
GLOBAL CHAR *NGIRCd_VersionAddition( VOID );
|
||||
GLOBAL CHAR NGIRCd_ProtoID[1024]; /* Protokoll- und Server-Identifikation */
|
||||
|
||||
GLOBAL CHAR *NGIRCd_Version PARAMS((VOID ));
|
||||
GLOBAL CHAR *NGIRCd_VersionAddition PARAMS((VOID ));
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: parse.c,v 1.31 2002/03/25 17:13:46 alex Exp $
|
||||
* $Id: parse.c,v 1.41.2.4 2002/11/29 10:59:51 alex Exp $
|
||||
*
|
||||
* parse.c: Parsen der Client-Anfragen
|
||||
*/
|
||||
@@ -24,16 +24,10 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "client.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 "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
#include "tool.h"
|
||||
@@ -41,19 +35,30 @@
|
||||
#include "exp.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"
|
||||
|
||||
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 );
|
||||
#include "exp.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
LOCAL VOID Init_Request PARAMS(( REQUEST *Req ));
|
||||
|
||||
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
|
||||
* die Verbindung geschlossen und FALSE geliefert.
|
||||
@@ -61,6 +66,7 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
|
||||
REQUEST req;
|
||||
CHAR *start, *ptr;
|
||||
BOOLEAN closed;
|
||||
|
||||
assert( Idx >= 0 );
|
||||
assert( Request != NULL );
|
||||
@@ -68,7 +74,7 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
#ifdef SNIFFER
|
||||
if( NGIRCd_Sniffer ) Log( LOG_DEBUG, " <- connection %d: '%s'.", Idx, Request );
|
||||
#endif
|
||||
|
||||
|
||||
Init_Request( &req );
|
||||
|
||||
/* Fuehrendes und folgendes "Geraffel" verwerfen */
|
||||
@@ -80,7 +86,11 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
/* Prefix vorhanden */
|
||||
req.prefix = Request + 1;
|
||||
ptr = strchr( Request, ' ' );
|
||||
if( ! ptr ) return Parse_Error( Idx, "Prefix without command!?" );
|
||||
if( ! ptr )
|
||||
{
|
||||
Log( LOG_DEBUG, "Connection %d: Parse error: prefix without command!?", Idx );
|
||||
return Conn_WriteStr( Idx, "ERROR :Prefix without command!?" );
|
||||
}
|
||||
*ptr = '\0';
|
||||
#ifndef STRICT_RFC
|
||||
/* multiple Leerzeichen als Trenner zwischen
|
||||
@@ -91,8 +101,6 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
}
|
||||
else start = Request;
|
||||
|
||||
if( ! Validate_Prefix( &req )) return Parse_Error( Idx, "Invalid prefix");
|
||||
|
||||
/* Befehl */
|
||||
ptr = strchr( start, ' ' );
|
||||
if( ptr )
|
||||
@@ -106,8 +114,6 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
}
|
||||
req.command = start;
|
||||
|
||||
if( ! Validate_Command( &req )) return Parse_Error( Idx, "Invalid command" );
|
||||
|
||||
/* Argumente, Parameter */
|
||||
if( ptr )
|
||||
{
|
||||
@@ -135,29 +141,33 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
req.argc++;
|
||||
|
||||
if( start[0] == ':' ) break;
|
||||
if( req.argc > 14 ) break;
|
||||
|
||||
|
||||
if( ptr ) start = ptr + 1;
|
||||
else start = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if( ! Validate_Args( &req )) return Parse_Error( Idx, "Invalid argument(s)" );
|
||||
|
||||
/* Daten validieren */
|
||||
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 );
|
||||
} /* Parse_Request */
|
||||
|
||||
|
||||
LOCAL VOID Init_Request( REQUEST *Req )
|
||||
LOCAL VOID
|
||||
Init_Request( REQUEST *Req )
|
||||
{
|
||||
/* Neue Request-Struktur initialisieren */
|
||||
|
||||
INT i;
|
||||
|
||||
|
||||
assert( Req != NULL );
|
||||
|
||||
Req->prefix = NULL;
|
||||
@@ -167,42 +177,83 @@ LOCAL VOID Init_Request( REQUEST *Req )
|
||||
} /* Init_Request */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Parse_Error( CONN_ID Idx, CHAR *Error )
|
||||
LOCAL BOOLEAN
|
||||
Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
|
||||
{
|
||||
/* Fehler beim Parsen. Fehlermeldung an den Client schicken.
|
||||
* TRUE: Connection wurde durch diese Funktion nicht geschlossen,
|
||||
* FALSE: Connection wurde terminiert. */
|
||||
|
||||
CLIENT *client, *c;
|
||||
|
||||
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 );
|
||||
|
||||
*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;
|
||||
} /* Validate_Prefix */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Validate_Command( REQUEST *Req )
|
||||
LOCAL BOOLEAN
|
||||
Validate_Command( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
|
||||
{
|
||||
assert( Idx >= 0 );
|
||||
assert( Req != NULL );
|
||||
*Closed = FALSE;
|
||||
|
||||
return TRUE;
|
||||
} /* Validate_Comman */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Validate_Args( REQUEST *Req )
|
||||
LOCAL BOOLEAN
|
||||
Validate_Args( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
|
||||
{
|
||||
assert( Idx >= 0 );
|
||||
assert( Req != NULL );
|
||||
*Closed = FALSE;
|
||||
|
||||
return TRUE;
|
||||
} /* Validate_Args */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req )
|
||||
LOCAL BOOLEAN
|
||||
Handle_Request( CONN_ID Idx, REQUEST *Req )
|
||||
{
|
||||
/* Client-Request verarbeiten. Bei einem schwerwiegenden Fehler
|
||||
* wird die Verbindung geschlossen und FALSE geliefert. */
|
||||
@@ -228,8 +279,8 @@ LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req )
|
||||
else target = NULL;
|
||||
if( ! target )
|
||||
{
|
||||
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!" );
|
||||
if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code %s: \"%s\"", Req->command, Req->argv[0] );
|
||||
else Log( LOG_WARNING, "Unknown target for status code %s!", Req->command );
|
||||
return TRUE;
|
||||
}
|
||||
if( target == Client_ThisServer( ))
|
||||
@@ -259,7 +310,7 @@ LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req )
|
||||
else strcat( str, " :" );
|
||||
strcat( str, Req->argv[i] );
|
||||
}
|
||||
return IRC_WriteStrClientPrefix( target, prefix, str );
|
||||
return IRC_WriteStrClientPrefix( target, prefix, "%s", str );
|
||||
}
|
||||
|
||||
if( strcasecmp( Req->command, "PASS" ) == 0 ) return IRC_PASS( client, Req );
|
||||
@@ -292,6 +343,14 @@ LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req )
|
||||
else if( strcasecmp( Req->command, "AWAY" ) == 0 ) return IRC_AWAY( 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, "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 */
|
||||
if( Client_Type( client ) != CLIENT_SERVER ) IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( client ), Req->command );
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: parse.h,v 1.6 2002/03/12 14:37:52 alex Exp $
|
||||
* $Id: parse.h,v 1.7 2002/05/27 13:09:27 alex Exp $
|
||||
*
|
||||
* parse.h: Parsen der Client-Anfragen (Header)
|
||||
*/
|
||||
@@ -18,8 +18,6 @@
|
||||
#ifndef __parse_h__
|
||||
#define __parse_h__
|
||||
|
||||
#include "conn.h"
|
||||
|
||||
|
||||
typedef struct _REQUEST /* vgl. RFC 2812, 2.3 */
|
||||
{
|
||||
@@ -30,7 +28,7 @@ typedef struct _REQUEST /* vgl. RFC 2812, 2.3 */
|
||||
} REQUEST;
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request );
|
||||
GLOBAL BOOLEAN Parse_Request PARAMS((CONN_ID Idx, CHAR *Request ));
|
||||
|
||||
|
||||
#endif
|
||||
|
266
src/ngircd/resolve.c
Normal file
266
src/ngircd/resolve.c
Normal file
@@ -0,0 +1,266 @@
|
||||
/*
|
||||
* 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- */
|
48
src/ngircd/resolve.h
Normal file
48
src/ngircd/resolve.h
Normal file
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* 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- */
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: tool.c,v 1.8 2002/03/22 00:17:27 alex Exp $
|
||||
* $Id: tool.c,v 1.9 2002/05/27 13:09:27 alex Exp $
|
||||
*
|
||||
* tool.c: Hilfsfunktionen, ggf. Platformabhaengig
|
||||
*/
|
||||
@@ -27,7 +27,8 @@
|
||||
#include "tool.h"
|
||||
|
||||
|
||||
GLOBAL VOID ngt_TrimStr( CHAR *String )
|
||||
GLOBAL VOID
|
||||
ngt_TrimStr( CHAR *String )
|
||||
{
|
||||
/* Mit ngt_TrimStr() werden fuehrende und folgende Leerzeichen,
|
||||
* Tabulatoren und Zeilenumbrueche (ASCII 10 und ASCII 13) aus
|
||||
@@ -51,7 +52,8 @@ GLOBAL VOID ngt_TrimStr( CHAR *String )
|
||||
} /* ngt_TrimStr */
|
||||
|
||||
|
||||
GLOBAL CHAR *ngt_LowerStr( CHAR *String )
|
||||
GLOBAL CHAR *
|
||||
ngt_LowerStr( CHAR *String )
|
||||
{
|
||||
/* String in Kleinbuchstaben konvertieren. Der uebergebene
|
||||
* Speicherbereich wird durch das Ergebnis ersetzt, zusaetzlich
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: tool.h,v 1.7 2002/03/22 00:17:27 alex Exp $
|
||||
* $Id: tool.h,v 1.8 2002/05/27 13:09:27 alex Exp $
|
||||
*
|
||||
* log.h: Hilfsfunktionen (Header)
|
||||
*/
|
||||
@@ -19,9 +19,9 @@
|
||||
#define __tool_h__
|
||||
|
||||
|
||||
GLOBAL VOID ngt_TrimStr( CHAR *String );
|
||||
GLOBAL VOID ngt_TrimStr PARAMS((CHAR *String ));
|
||||
|
||||
GLOBAL CHAR *ngt_LowerStr( CHAR *String );
|
||||
GLOBAL CHAR *ngt_LowerStr PARAMS((CHAR *String ));
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -9,9 +9,15 @@
|
||||
# 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.2 2002/03/15 15:41:55 alex Exp $
|
||||
# $Id: Makefile.am,v 1.4 2002/05/22 09:09:43 alex Exp $
|
||||
#
|
||||
|
||||
AUTOMAKE_OPTIONS = ansi2knr
|
||||
|
||||
noinst_LIBRARIES = libngportab.a
|
||||
|
||||
libngportab_a_SOURCES = vsnprintf.c
|
||||
|
||||
check_PROGRAMS = portabtest
|
||||
|
||||
portabtest_SOURCES = portabtest.c
|
||||
|
36
src/portab/ansi2knr.1
Normal file
36
src/portab/ansi2knr.1
Normal file
@@ -0,0 +1,36 @@
|
||||
.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>.
|
738
src/portab/ansi2knr.c
Normal file
738
src/portab/ansi2knr.c
Normal file
@@ -0,0 +1,738 @@
|
||||
/* 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;
|
||||
}
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: portab.h,v 1.3 2002/03/25 19:13:19 alex Exp $
|
||||
* $Id: portab.h,v 1.7.2.1 2002/11/04 19:18:39 alex Exp $
|
||||
*
|
||||
* portab.h: "Portabilitaets-Definitionen"
|
||||
*/
|
||||
@@ -22,21 +22,43 @@
|
||||
#include "config.h"
|
||||
|
||||
|
||||
/* Compiler Features */
|
||||
|
||||
|
||||
#ifndef PARAMS
|
||||
# if PROTOTYPES
|
||||
# define PARAMS(args) args
|
||||
# else
|
||||
# define PARAMS(args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/* Keywords */
|
||||
|
||||
#define EXTERN extern
|
||||
#define STATIC static
|
||||
#define LOCAL static
|
||||
#define CONST const
|
||||
#define REGISTER register
|
||||
|
||||
|
||||
/* Datatentypen */
|
||||
|
||||
#ifndef PROTOTYPES
|
||||
# ifndef signed
|
||||
# define signed
|
||||
# endif
|
||||
#endif
|
||||
|
||||
typedef void VOID;
|
||||
typedef void POINTER;
|
||||
|
||||
typedef signed int INT;
|
||||
typedef unsigned int UINT;
|
||||
typedef signed long LONG;
|
||||
typedef unsigned long ULONG;
|
||||
|
||||
typedef signed char INT8;
|
||||
typedef unsigned char UINT8;
|
||||
typedef signed short INT16;
|
||||
@@ -44,6 +66,7 @@ typedef unsigned short UINT16;
|
||||
typedef signed long INT32;
|
||||
typedef unsigned long UINT32;
|
||||
|
||||
typedef double DOUBLE;
|
||||
typedef float FLOAT;
|
||||
|
||||
typedef char CHAR;
|
||||
@@ -57,7 +80,11 @@ typedef UINT8 BOOLEAN;
|
||||
#define FALSE (BOOLEAN)0
|
||||
|
||||
#undef NULL
|
||||
#define NULL (VOID *)0
|
||||
#ifdef PROTOTYPES
|
||||
# define NULL (VOID *)0
|
||||
#else
|
||||
# define NULL 0L
|
||||
#endif
|
||||
|
||||
#undef GLOBAL
|
||||
#define GLOBAL
|
||||
@@ -77,10 +104,6 @@ typedef UINT8 BOOLEAN;
|
||||
#define socklen_t int /* u.a. fuer Mac OS X */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_INET_ATON
|
||||
#define inet_aton( opt, bind ) 0 /* Dummy fuer inet_aton() */
|
||||
#endif
|
||||
|
||||
#if OS_UNIX_AUX
|
||||
#define _POSIX_SOURCE /* muss unter A/UX definiert sein */
|
||||
#endif
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: portabtest.c,v 1.3 2002/03/12 21:47:40 alex Exp $
|
||||
* $Id: portabtest.c,v 1.8 2002/09/09 10:05:10 alex Exp $
|
||||
*
|
||||
* portabtest.c: Testprogramm fuer portab.h
|
||||
*/
|
||||
@@ -23,38 +23,21 @@
|
||||
#include "exp.h"
|
||||
|
||||
|
||||
LOCAL BOOLEAN portab_check_types( VOID );
|
||||
|
||||
|
||||
GLOBAL INT main( VOID )
|
||||
GLOBAL int
|
||||
main( VOID )
|
||||
{
|
||||
INT ret = 0;
|
||||
|
||||
printf( "- datatypes: ");
|
||||
if( ! portab_check_types( ))
|
||||
{
|
||||
puts( "FAILED!" );
|
||||
ret = 1;
|
||||
}
|
||||
else puts( "ok." );
|
||||
|
||||
puts( "- system type: "TARGET_CPU"/"TARGET_VENDOR"/"TARGET_OS );
|
||||
|
||||
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;
|
||||
/* Datentypen pruefen */
|
||||
if( FALSE != 0 ) return 1;
|
||||
if( TRUE != 1 ) return 1;
|
||||
if( sizeof( INT8 ) != 1 ) return 1;
|
||||
if( sizeof( UINT8 ) != 1 ) return 1;
|
||||
if( sizeof( INT16 ) != 2 ) return 1;
|
||||
if( sizeof( UINT16 ) != 2 ) return 1;
|
||||
if( sizeof( INT32 ) != 4 ) return 1;
|
||||
if( sizeof( UINT32 ) != 4 ) return 1;
|
||||
|
||||
/* kein Fehler */
|
||||
return 0;
|
||||
} /* portab_check_types */
|
||||
|
||||
|
||||
|
926
src/portab/vsnprintf.c
Normal file
926
src/portab/vsnprintf.c
Normal file
@@ -0,0 +1,926 @@
|
||||
/*
|
||||
* 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- */
|
55
src/testsuite/Makefile.am
Normal file
55
src/testsuite/Makefile.am
Normal file
@@ -0,0 +1,55 @@
|
||||
#
|
||||
# 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-
|
74
src/testsuite/channel-test.e
Normal file
74
src/testsuite/channel-test.e
Normal file
@@ -0,0 +1,74 @@
|
||||
# $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-
|
31
src/testsuite/check-idle.e
Normal file
31
src/testsuite/check-idle.e
Normal file
@@ -0,0 +1,31 @@
|
||||
# $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-
|
21
src/testsuite/connect-test.e
Normal file
21
src/testsuite/connect-test.e
Normal file
@@ -0,0 +1,21 @@
|
||||
# $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-
|
28
src/testsuite/getpid.sh
Executable file
28
src/testsuite/getpid.sh
Executable file
@@ -0,0 +1,28 @@
|
||||
#!/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-
|
108
src/testsuite/mode-test.e
Normal file
108
src/testsuite/mode-test.e
Normal file
@@ -0,0 +1,108 @@
|
||||
# $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-
|
14
src/testsuite/ngircd-test.conf
Normal file
14
src/testsuite/ngircd-test.conf
Normal file
@@ -0,0 +1,14 @@
|
||||
# $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-
|
32
src/testsuite/start-server.sh
Executable file
32
src/testsuite/start-server.sh
Executable file
@@ -0,0 +1,32 @@
|
||||
#!/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-
|
17
src/testsuite/stop-server.sh
Executable file
17
src/testsuite/stop-server.sh
Executable file
@@ -0,0 +1,17 @@
|
||||
#!/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-
|
9
src/testsuite/stress-A.e
Normal file
9
src/testsuite/stress-A.e
Normal file
@@ -0,0 +1,9 @@
|
||||
# $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-
|
69
src/testsuite/stress-B.e
Normal file
69
src/testsuite/stress-B.e
Normal file
@@ -0,0 +1,69 @@
|
||||
# $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-
|
46
src/testsuite/stress-server.sh
Executable file
46
src/testsuite/stress-server.sh
Executable file
@@ -0,0 +1,46 @@
|
||||
#!/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-
|
21
src/testsuite/tests.sh
Executable file
21
src/testsuite/tests.sh
Executable file
@@ -0,0 +1,21 @@
|
||||
#!/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-
|
Reference in New Issue
Block a user