mirror of
https://github.com/osmarks/ngircd.git
synced 2025-09-28 23:14:04 +00:00
Compare commits
329 Commits
rel-0-0-2
...
branch-0-4
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a0318e8d0b | ||
![]() |
d0084cfae2 | ||
![]() |
880d35f82b | ||
![]() |
83e49bf74b | ||
![]() |
b6f53b6f82 | ||
![]() |
ab52d2b818 | ||
![]() |
aaf42ae77b | ||
![]() |
fa30f2a0d2 | ||
![]() |
1fa46bedbe | ||
![]() |
d772acf9d6 | ||
![]() |
15f380592d | ||
![]() |
54b9381dd0 | ||
![]() |
889b7ef48f | ||
![]() |
31c8078706 | ||
![]() |
34eb2528d0 | ||
![]() |
b58ab32b9f | ||
![]() |
85aad86906 | ||
![]() |
d79b2f0a35 | ||
![]() |
c5eaea7161 | ||
![]() |
e506ae44e0 | ||
![]() |
bebf0383d0 | ||
![]() |
1c99b8377f | ||
![]() |
c9e8d4bbad | ||
![]() |
d68fb7a320 | ||
![]() |
7efefd30f1 | ||
![]() |
fe06f6e990 | ||
![]() |
3d74a9c323 | ||
![]() |
1c2d0ae5de | ||
![]() |
07c3e62e11 | ||
![]() |
773d886df6 | ||
![]() |
d47f88427d | ||
![]() |
95d55c56c6 | ||
![]() |
4cdc98154c | ||
![]() |
d4a9ceae75 | ||
![]() |
6fbb2b7a67 | ||
![]() |
1c00ddffec | ||
![]() |
f4b23bfc96 | ||
![]() |
72accd4ee5 | ||
![]() |
d7ecb84847 | ||
![]() |
da8da1ce7d | ||
![]() |
20a2ffef88 | ||
![]() |
6b58ab8427 | ||
![]() |
e9b98fefc6 | ||
![]() |
95be386e9d | ||
![]() |
a89dc54690 | ||
![]() |
e8668cf593 | ||
![]() |
bdf53a6d29 | ||
![]() |
d09dfb3e36 | ||
![]() |
f86083a057 | ||
![]() |
bcc5138518 | ||
![]() |
e39925af9b | ||
![]() |
d58fe2f185 | ||
![]() |
b79ba679a1 | ||
![]() |
8d79f26721 | ||
![]() |
95a4b1b158 | ||
![]() |
c0ef984273 | ||
![]() |
a323186926 | ||
![]() |
117c1df65a | ||
![]() |
d4fca86ae8 | ||
![]() |
bc4ed22635 | ||
![]() |
c74083645a | ||
![]() |
0ac6151be9 | ||
![]() |
b5c16c228b | ||
![]() |
cec0e2a4d7 | ||
![]() |
0e38d10bcd | ||
![]() |
7bb2c6b012 | ||
![]() |
281d8e454d | ||
![]() |
8e5a56cea7 | ||
![]() |
0df6a76103 | ||
![]() |
fdf23efef4 | ||
![]() |
d7d2ab3d7f | ||
![]() |
b9a2c4a8ec | ||
![]() |
69f683070a | ||
![]() |
31015c8306 | ||
![]() |
b422b11865 | ||
![]() |
8a45b177ce | ||
![]() |
28c5a21fa0 | ||
![]() |
239727b411 | ||
![]() |
34d5434478 | ||
![]() |
03c3f3c990 | ||
![]() |
9146fa2534 | ||
![]() |
882c91280e | ||
![]() |
e298b83b92 | ||
![]() |
c46f623d6f | ||
![]() |
27d131a177 | ||
![]() |
7049b60af4 | ||
![]() |
7633e2f8c3 | ||
![]() |
ca33cbda05 | ||
![]() |
d18ca0b85d | ||
![]() |
fbfb343176 | ||
![]() |
f7a0ff1f65 | ||
![]() |
50ec7a56a4 | ||
![]() |
92793d3114 | ||
![]() |
9fc7e66f66 | ||
![]() |
590f2a3f0c | ||
![]() |
221058009c | ||
![]() |
5fa05dcea8 | ||
![]() |
dce77559fa | ||
![]() |
df09e7afd3 | ||
![]() |
2464556a7d | ||
![]() |
a8aab6bfdd | ||
![]() |
23add79c3e | ||
![]() |
e6faca1337 | ||
![]() |
d67d94ea04 | ||
![]() |
0777bca325 | ||
![]() |
0903e7763c | ||
![]() |
89f9522e22 | ||
![]() |
965855756b | ||
![]() |
5bd4734a88 | ||
![]() |
37c7087c6f | ||
![]() |
317941d840 | ||
![]() |
652a003ef5 | ||
![]() |
81889df4b7 | ||
![]() |
0e092b3f06 | ||
![]() |
2006b6195e | ||
![]() |
fe2bc90e45 | ||
![]() |
10aa35cc91 | ||
![]() |
c68c092ce3 | ||
![]() |
0a13ff41ea | ||
![]() |
ae6ab2c3e0 | ||
![]() |
b3a64f5e08 | ||
![]() |
802a17b11d | ||
![]() |
2b6309719f | ||
![]() |
5562f411c4 | ||
![]() |
a1a3e67de6 | ||
![]() |
7de4683506 | ||
![]() |
360bddd600 | ||
![]() |
9d5551ba6d | ||
![]() |
14aba7c1b2 | ||
![]() |
10363b398e | ||
![]() |
2ee05c9a68 | ||
![]() |
8dd92fbcd8 | ||
![]() |
e7214c151f | ||
![]() |
829f741ccd | ||
![]() |
6878d25d04 | ||
![]() |
250ef1ab55 | ||
![]() |
7b8b542396 | ||
![]() |
5457e0788a | ||
![]() |
09da2c9afd | ||
![]() |
7157d93651 | ||
![]() |
0370c4843f | ||
![]() |
a3ee1a9a26 | ||
![]() |
cbce54e0fc | ||
![]() |
5facc989c5 | ||
![]() |
02f394f0ce | ||
![]() |
6da91c34b4 | ||
![]() |
40f07f2f5c | ||
![]() |
ef7f7a90f4 | ||
![]() |
c23199d971 | ||
![]() |
b56eb4d8d4 | ||
![]() |
d022c1bf4e | ||
![]() |
fc186d77c1 | ||
![]() |
ff54198f43 | ||
![]() |
a22a3d5f29 | ||
![]() |
070da48826 | ||
![]() |
9780ed1f21 | ||
![]() |
d59f029043 | ||
![]() |
d58e22a3ea | ||
![]() |
8975c7a204 | ||
![]() |
52548bd3e3 | ||
![]() |
caf41e5bba | ||
![]() |
3c01ac4e33 | ||
![]() |
949977e878 | ||
![]() |
83177581e4 | ||
![]() |
18d881876d | ||
![]() |
c48501245e | ||
![]() |
b53b5728a6 | ||
![]() |
cd6e40493c | ||
![]() |
82da6d2ff1 | ||
![]() |
f99a8ed18f | ||
![]() |
a7bbcef6e0 | ||
![]() |
c147ebef0d | ||
![]() |
153aa0aac8 | ||
![]() |
28d5898617 | ||
![]() |
140d1aa505 | ||
![]() |
d360137d94 | ||
![]() |
805096d173 | ||
![]() |
70e3c6b50a | ||
![]() |
b181f1bd3c | ||
![]() |
1575e30d77 | ||
![]() |
e4754c3447 | ||
![]() |
180095be32 | ||
![]() |
93a52dfab8 | ||
![]() |
08d43d5f67 | ||
![]() |
1ff2fceb22 | ||
![]() |
8c956d5989 | ||
![]() |
6817e293c5 | ||
![]() |
67295c48ca | ||
![]() |
b7a6bf27cc | ||
![]() |
abe6a2c107 | ||
![]() |
c90cf7c9ed | ||
![]() |
ed1dac585d | ||
![]() |
a809fe36c7 | ||
![]() |
62266a8d46 | ||
![]() |
498e6e0d22 | ||
![]() |
5d306a1dc9 | ||
![]() |
aaa682fb24 | ||
![]() |
6f955d2a34 | ||
![]() |
8465653c6e | ||
![]() |
2a69ee905a | ||
![]() |
3c233aa9c5 | ||
![]() |
0253bcc8af | ||
![]() |
367657fd36 | ||
![]() |
944352717a | ||
![]() |
1b30228caa | ||
![]() |
9919f38dae | ||
![]() |
2617d21336 | ||
![]() |
c66702c6d4 | ||
![]() |
eea1a88b24 | ||
![]() |
d1382fab5c | ||
![]() |
fcb47ae64b | ||
![]() |
1fe8355fcf | ||
![]() |
26ffbc7850 | ||
![]() |
b0482db966 | ||
![]() |
0470cdfdcc | ||
![]() |
b80fc259d8 | ||
![]() |
efe152336c | ||
![]() |
3fbbfe44ed | ||
![]() |
5a8a789511 | ||
![]() |
458174ffb0 | ||
![]() |
00529c8fbd | ||
![]() |
71fa0781d4 | ||
![]() |
8fdb46361d | ||
![]() |
3232c7d245 | ||
![]() |
2c0a42e935 | ||
![]() |
a233adfbd8 | ||
![]() |
9f3a9df24a | ||
![]() |
44b396d9a5 | ||
![]() |
25e1e8b690 | ||
![]() |
b60f369266 | ||
![]() |
1b1b718e7e | ||
![]() |
ce2738c984 | ||
![]() |
bec7783ec9 | ||
![]() |
db7ea9c4b3 | ||
![]() |
2d87beed3d | ||
![]() |
05a493e1d0 | ||
![]() |
825711973a | ||
![]() |
621a3ca102 | ||
![]() |
57f36fc883 | ||
![]() |
213fa0994f | ||
![]() |
b10d05f2d2 | ||
![]() |
645aeacf0a | ||
![]() |
70ac29b253 | ||
![]() |
f3f121b8f8 | ||
![]() |
f908e78118 | ||
![]() |
e1a1e7ecf4 | ||
![]() |
6610d6e4ba | ||
![]() |
207937da2a | ||
![]() |
84a2f8ab26 | ||
![]() |
5ef9ff5b2d | ||
![]() |
617cdf068e | ||
![]() |
d2d6dcbb1f | ||
![]() |
0595f42fbe | ||
![]() |
b9f005af75 | ||
![]() |
2184b3615b | ||
![]() |
d72c55a09d | ||
![]() |
4da8fc54ac | ||
![]() |
5c48cbff1d | ||
![]() |
f29ae5ae0e | ||
![]() |
175b20bbb5 | ||
![]() |
33944e8cdb | ||
![]() |
40c9f5c332 | ||
![]() |
f53914b17a | ||
![]() |
6e9ec92974 | ||
![]() |
1e56fb35ab | ||
![]() |
408793c2ca | ||
![]() |
1ab92bb9cb | ||
![]() |
5a0f118df0 | ||
![]() |
eab20beefc | ||
![]() |
0bb9db1aa0 | ||
![]() |
8316d98b16 | ||
![]() |
a0123e424c | ||
![]() |
ff25b7291f | ||
![]() |
eba8d4d553 | ||
![]() |
71c7a6fcc0 | ||
![]() |
3b38d3ca0d | ||
![]() |
6491b9843f | ||
![]() |
40c9fd26d6 | ||
![]() |
b5ee4552c1 | ||
![]() |
8f521aa8bf | ||
![]() |
b28dab3632 | ||
![]() |
9f9e9a496f | ||
![]() |
d17748e978 | ||
![]() |
d14588f368 | ||
![]() |
d569c9246e | ||
![]() |
791301dc7d | ||
![]() |
92fb409fe2 | ||
![]() |
8a324b6d9c | ||
![]() |
7709acf754 | ||
![]() |
077b610eb0 | ||
![]() |
23253edb54 | ||
![]() |
bb19cfda95 | ||
![]() |
4b0c9849d6 | ||
![]() |
fc3c82f7df | ||
![]() |
5999fcea4e | ||
![]() |
87fc9566b0 | ||
![]() |
85ac414908 | ||
![]() |
01999cfdb1 | ||
![]() |
4c32a6cebd | ||
![]() |
9951e13510 | ||
![]() |
d3e0d78d4d | ||
![]() |
20640e1a90 | ||
![]() |
6debfc3123 | ||
![]() |
49ed223c1b | ||
![]() |
00f86465ef | ||
![]() |
d79a7d287a | ||
![]() |
5829be2944 | ||
![]() |
bd923fc757 | ||
![]() |
6600c90890 | ||
![]() |
b9d701dbeb | ||
![]() |
b3ccaa76b6 | ||
![]() |
8d48f07de1 | ||
![]() |
568239244f | ||
![]() |
22cf0c5def | ||
![]() |
c2ee5437da | ||
![]() |
4fe7e9d6f1 | ||
![]() |
006c0328b4 | ||
![]() |
52424b49cb | ||
![]() |
baf845ddeb | ||
![]() |
428cc6258f | ||
![]() |
3543c2220a | ||
![]() |
8f7e7d666a | ||
![]() |
a53857b4c7 | ||
![]() |
2714a94f43 | ||
![]() |
6359ec48f0 | ||
![]() |
b89c310891 | ||
![]() |
bf92db85a6 | ||
![]() |
9e18ec30ff | ||
![]() |
a56776892b |
2
COPYING
2
COPYING
@@ -2,7 +2,7 @@
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
162
ChangeLog
162
ChangeLog
@@ -10,6 +10,166 @@
|
||||
-- ChangeLog / Aenderungen --
|
||||
|
||||
|
||||
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
|
||||
Regular Expressions (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 Unterstuetzung von Masks).
|
||||
- Der AWAY-Mode wurde nicht ueber mehrere Server-Links weitergegeben.
|
||||
- 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.
|
||||
- In Nicknames wird das Zeichen "-" nun als zulaessig erkannt.
|
||||
- die Beispiel-Konfigurationsdatei (doc/sample-ngircd.conf) wird als
|
||||
ngircd.conf installiert, wenn noch keine "echte" Konfigurationsdatei
|
||||
vorhanden ist.
|
||||
- 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
|
||||
einer Gruppe eine Verbindung aufgebaut, klappt es beim ersten Server
|
||||
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).
|
||||
- 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 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
|
||||
|
||||
- bekommt der Server ein HUP-Signal, so startet er neu -- genau so, wie
|
||||
er auf den IRC-Befehl RESTART reagiert.
|
||||
- FAQ um Hinweise auf den Bugtracker erweitert.
|
||||
- neuer Kommandozeilen-Schalter "--passive" (-p): wird er angegeben, so
|
||||
verbindet sich der ngIRCd nicht mehr automatisch zu anderen Servern.
|
||||
Zum Debuggen manchmal ganz praktisch :-)
|
||||
- direkt nach dem Start schreibt der ngIRCd nun die aktiven Kommando-
|
||||
zeilenschalter in's Logfile (Passive, Debug, Sniffer ...).
|
||||
- das Signal-Flag SA_RESTART wird nur noch gesetzt, wenn es auf dem
|
||||
jeweiligen System auch definiert ist.
|
||||
- bei ausgehenden Verbindungen wird nun der Ziel-Port protokolliert.
|
||||
- neue Befehle VERSION und KILL implementiert.
|
||||
- make-Target "check" (und "distcheck") mit Sinn erfuellt :-)
|
||||
(die Tests sind aber bisher nicht all zu tiefgehend ...)
|
||||
- Durch einen Ueberlauf konnte die Idle-Time bei WHOIS negativ werden ...
|
||||
- Anpassungen an A/UX: gehoert nun auch zu den unterstuetzten Platformen.
|
||||
- WHOIS wird nicht mehr automatisch an den "Original-Server" weiterge-
|
||||
leitet: war eh nicht RFC-konform und machte mit Clients Probleme.
|
||||
- an User wird nun immer ein "komplettes" Prefix (mit Host-Mask) ver-
|
||||
schickt, Server bekommen nach wie vor kurze: das "Original" hat bei
|
||||
bestimmten Befehlen (PRIVMSG) ansonsten evtl. Probleme ...
|
||||
- NAMES korrigiert und vollstaendig implementiert.
|
||||
- SQUIT wird auf jeden Fall geforwarded, zudem besseres Logging.
|
||||
- Ist ein Nick bei der User-Registrierung bereits belegt, nimmt der
|
||||
Server nun korrekt weitere NICK-Befehle an und verwendet diese.
|
||||
- PRIVMSG beachtet nun die Channel-Modes "n" und "m".
|
||||
- AWAY implementiert. PRIVMSG, MODE, USERHOST und WHOIS angepasst.
|
||||
- der ngIRCd unterstuetzt nun Channel-Topics (TOPIC-Befehl).
|
||||
- ausgehende Server-Verbindungen werden nun asyncron connectiert und
|
||||
blockieren nicht mehr den ganzen Server, wenn die Gegenseite nicht
|
||||
erreicht werden kann (bis zum Timeout konnten Minuten vergehen!).
|
||||
- Wert der Konfigurations-Variable "ConnectRetry" wird besser beachtet.
|
||||
- Channel- und Nicknames werden nun ordentlich validiert.
|
||||
|
||||
ngIRCd 0.2.1, 17.02.2002
|
||||
|
||||
- NICK korrigiert: es werden nun auch alle "betroffenen" User informiert.
|
||||
- configure-Script erweitert, u.a. bessere Anpassung an BeOS: dort wird
|
||||
nun die "libbe" zum ngIRCd gelinkt, somit funktioniert auch syslog.
|
||||
- Fehlerhafte bzw. noch nicht verstandene Modes werden nun ausfuehrlicher
|
||||
an den Client geliefert.
|
||||
|
||||
ngIRCd 0.2.0, 15.02.2002
|
||||
|
||||
- Nicknames und Channel-Namen werden etwas besser auf Gueltigkeit ueber-
|
||||
prueft; ist aber nach wie vor noch nicht ausreichend.
|
||||
- NJOINS von Servern wurden nicht an andere Server weitergeleitet.
|
||||
- Begonnen Channel-Modes und User-Channel-Modes zu implementieren: der
|
||||
Server versteht an User-Modes o und v, beachtet letzteres allerdings
|
||||
noch nirgends. Bekannte (aber nicht beachtete!) Channel-Modes sind
|
||||
bisher a, m, n, p, q, s und t. Diese Modes werden von Usern ange-
|
||||
nommen, von anderen Servern werden auch unbekannte Modes uebernommen.
|
||||
- Benutzer von connectierenden Servern wurden nicht in den Channels ange-
|
||||
kuendigt, es wurden nur die internen Strukturen angepasst.
|
||||
- Nach dem Connect eines Users werden LUSERS-Informationen angezeigt.
|
||||
|
||||
ngIRCd 0.1.0, 29.01.2002
|
||||
|
||||
- User-Modes bei User-Registrierungen von andere Servern (NICK-Befehl)
|
||||
wurden falsch uebernommen. Zudem wurden die Modes falsch gekuerzt.
|
||||
- Server-Verbindungen werden nun nach dem Start erst nach einer kurzen
|
||||
Pause aufgebaut (zur Zeit drei Sekunden).
|
||||
- Hilfetext korrigiert: --help und --version waren vertauscht, die
|
||||
Option --sniffer wurde gar nicht erwaehnt.
|
||||
- FAQ.txt in doc/ begonnen.
|
||||
- der IRC-Sniffer wird nur noch aktiviert, wenn die Option auf der
|
||||
Kommandozeile angegeben wurde (bei entsprechend compiliertem Server).
|
||||
- Channels implementiert, bisher jedoch noch ohne Channel-Modes, d.h.
|
||||
es gibt keine Channel-Ops, kein Topic, kein "topic lock" etc. pp.
|
||||
Chatten in Channels ist aber natuerlich moeglich ;-)
|
||||
- neue Befehle fuer Channles: JOIN, PART und NJOIN.
|
||||
- durch die Channels einige Aenderungen an PRIVMSG, WHOIS, MODE etc.
|
||||
- neu connectierenden Servern werden nun Channels mit NJOIN angekuendigt.
|
||||
- Signal-Hander geaendert: die Fehlermeldung "interrupted system call"
|
||||
sollte so nicht mehr auftreten.
|
||||
- "spaeter" neu connectierende Server werden nun im Netz angekuendigt.
|
||||
- SERVER-Meldungen an andere Server sind nun korrekt sortiert.
|
||||
- Clients werden nun korrekt sowohl nur ueber den Nickname als auch die
|
||||
komplette "Host Mask" erkannt.
|
||||
|
||||
|
||||
ngIRCd 0.0.3, 16.01.2002
|
||||
|
||||
- Server-Links vollstaendig implementiert: der ngIRCd kann nun auch
|
||||
"Sub-Server" haben, also sowohl als Leaf-Node als auch Hub in einem
|
||||
IRC-Netzwerk arbeiten.
|
||||
- MODE und NICK melden nun die Aenderungen an andere Server, ebenso
|
||||
die Befehle QUIT und SQUIT.
|
||||
- WHOIS wird nun immer an den "Original-Server" weitergeleitet.
|
||||
- Parses handhabt Leerzeichen zw. Parametern nun etwas "lockerer".
|
||||
- Status-Codes an den Server selber werden ignorier.
|
||||
- Log-Meldungen und Log-Level ueberarbeitet und korrigiert.
|
||||
- Kommandozeilen-Parser: Debug- und No-Daemon-Modus, Hilfe.
|
||||
- ngIRCd wandelt sich nun in einen Daemon (Hintergrundprozess) um.
|
||||
- WHOIS korrigiert: Anfrage wurde u.U. an User geforwarded anstatt vom
|
||||
Server beantwortet zu werden.
|
||||
- neue Befehle: LUSERS, LINKS
|
||||
- Client-Modes von Remote-Servern wurden nicht korrekt uerbernommen.
|
||||
|
||||
ngIRCd 0.0.2, 06.01.2002
|
||||
|
||||
- Struktur der Konfigurationsdatei geaendert: sie ist nun "Samba like",
|
||||
@@ -38,4 +198,4 @@ ngIRCd 0.0.1, 31.12.2001
|
||||
|
||||
|
||||
--
|
||||
$Id: ChangeLog,v 1.7 2002/01/06 15:40:01 alex Exp $
|
||||
$Id: ChangeLog,v 1.54.2.6 2002/06/11 20:29:44 alex Exp $
|
||||
|
105
INSTALL
105
INSTALL
@@ -8,24 +8,29 @@
|
||||
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.
|
||||
I. Standard-Installation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
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.
|
||||
|
||||
Die Standard-Installation sieht so aus:
|
||||
|
||||
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
|
||||
|
||||
|
||||
I. 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
|
||||
@@ -42,7 +47,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.
|
||||
@@ -52,14 +57,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.
|
||||
|
||||
|
||||
II. 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
|
||||
|
||||
|
||||
III. Nuetzliche make-Targets
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Die vom configure-Script erzeugten Makefile's enthalten immer die folgenden
|
||||
nuetzlichen Targets:
|
||||
@@ -73,3 +90,53 @@ nuetzlichen Targets:
|
||||
- maintainer-clean: alle automat. erzeugten Dateien loeschen.
|
||||
Naechster Schritt: -> ./autogen.sh
|
||||
|
||||
|
||||
|
||||
IV. 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.
|
||||
|
||||
|
||||
V. 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.6.2.1 2002/05/08 15:47:06 alex Exp $
|
||||
|
@@ -9,18 +9,7 @@
|
||||
# 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/01/02 02:40:15 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.3 2002/01/02 02:40:15 alex
|
||||
# - Copyright-Texte ergaenzt und aktualisiert,
|
||||
# - fehlende Dateien in Projekt aufgenommen.
|
||||
#
|
||||
# Revision 1.2 2001/12/31 16:02:12 alex
|
||||
# - Projektdateien von Mac OS X werden nun auch in die Distribution aufgenommen.
|
||||
#
|
||||
# Revision 1.1 2001/12/12 17:21:58 alex
|
||||
# - Projektdatei fuer den Mac OS X Project Builder erstellt.
|
||||
# $Id: Makefile.am,v 1.4 2002/03/12 14:37:51 alex Exp $
|
||||
#
|
||||
|
||||
SUBDIRS = ngircd.pbproj
|
||||
|
@@ -9,15 +9,7 @@
|
||||
# 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/01/02 02:40:15 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.2 2002/01/02 02:40:15 alex
|
||||
# - Copyright-Texte ergaenzt und aktualisiert,
|
||||
# - fehlende Dateien in Projekt aufgenommen.
|
||||
#
|
||||
# Revision 1.1 2001/12/31 16:02:12 alex
|
||||
# - Projektdateien von Mac OS X werden nun auch in die Distribution aufgenommen.
|
||||
# $Id: Makefile.am,v 1.3 2002/03/12 14:37:51 alex Exp $
|
||||
#
|
||||
|
||||
EXTRA_DIST = project.pbxproj
|
||||
|
@@ -59,6 +59,7 @@
|
||||
projectDirPath = "";
|
||||
targets = (
|
||||
08FB779FFE84155DC02AAC07,
|
||||
F538241E024F89BC01A85B04,
|
||||
);
|
||||
};
|
||||
08FB7794FE84155DC02AAC07 = {
|
||||
@@ -67,7 +68,6 @@
|
||||
F51F791401DFD0DE01D13771,
|
||||
F56D8B9E01E0BFA00155ADA7,
|
||||
F52162B301C7B904012300F4,
|
||||
F52162C201C7B904012300F4,
|
||||
F52162C301C7B904012300F4,
|
||||
F52162C401C7B904012300F4,
|
||||
F52162C501C7B904012300F4,
|
||||
@@ -94,13 +94,13 @@
|
||||
HEADER_SEARCH_PATHS = "";
|
||||
INSTALL_PATH = "$(HOME)/bin";
|
||||
LIBRARY_SEARCH_PATHS = "";
|
||||
OTHER_CFLAGS = "";
|
||||
OTHER_CFLAGS = "-DLOCALSTATEDIR=\\\\\\\"/usr/local/var\\\\\\\" -DSYSCONFDIR=\\\\\\\"/usr/local/etc\\\\\\\"";
|
||||
OTHER_LDFLAGS = "";
|
||||
OTHER_REZFLAGS = "";
|
||||
PRODUCT_NAME = ngircd;
|
||||
REZ_EXECUTABLE = YES;
|
||||
SECTORDER_FLAGS = "";
|
||||
WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
|
||||
WARNING_CFLAGS = "-Wall";
|
||||
};
|
||||
dependencies = (
|
||||
);
|
||||
@@ -114,8 +114,6 @@
|
||||
08FB77A0FE84155DC02AAC07 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
F52162CC01C7B904012300F4,
|
||||
F52162CD01C7B904012300F4,
|
||||
F52162CE01C7B904012300F4,
|
||||
F52162CF01C7B904012300F4,
|
||||
F52162D001C7B904012300F4,
|
||||
@@ -128,6 +126,16 @@
|
||||
F576ABFC01D5E77301A85B03,
|
||||
F576ABFF01D61D7401A85B03,
|
||||
F51F791301DFC95301D13771,
|
||||
F51DBB15022D95E801A85B04,
|
||||
F51DBB19022D995501A85B04,
|
||||
F51DBB1D022D9D8F01A85B04,
|
||||
F57C88870232853501A85B04,
|
||||
F57C888B0232884501A85B04,
|
||||
F57C888F02328D7201A85B04,
|
||||
F5F18138023EC63701A85B04,
|
||||
F5F18139023EC63701A85B04,
|
||||
F5F1813A023EC63701A85B04,
|
||||
F55047BC0240F6E501A85B04,
|
||||
);
|
||||
isa = PBXHeadersBuildPhase;
|
||||
name = Headers;
|
||||
@@ -144,6 +152,13 @@
|
||||
F51D180701C8FDD001E11C2E,
|
||||
F576ABFD01D5E77301A85B03,
|
||||
F5263AEE01E263D201CE8F8F,
|
||||
F51DBB16022D95E801A85B04,
|
||||
F51DBB1A022D995501A85B04,
|
||||
F51DBB1E022D9D8F01A85B04,
|
||||
F57C88880232853501A85B04,
|
||||
F57C888C0232884501A85B04,
|
||||
F57C889002328D7201A85B04,
|
||||
F55047BD0240F6E501A85B04,
|
||||
);
|
||||
isa = PBXSourcesBuildPhase;
|
||||
name = Sources;
|
||||
@@ -175,6 +190,7 @@
|
||||
1AB674ADFE9D54B511CA2CBB = {
|
||||
children = (
|
||||
034768E8FF38A79811DB9C8B,
|
||||
F538241D024F89BC01A85B04,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
name = Products;
|
||||
@@ -256,6 +272,72 @@
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB13022D95E801A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-write.c";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB14022D95E801A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-write.h";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB15022D95E801A85B04 = {
|
||||
fileRef = F51DBB14022D95E801A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB16022D95E801A85B04 = {
|
||||
fileRef = F51DBB13022D95E801A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB17022D995501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-mode.c";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB18022D995501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-mode.h";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB19022D995501A85B04 = {
|
||||
fileRef = F51DBB18022D995501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB1A022D995501A85B04 = {
|
||||
fileRef = F51DBB17022D995501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB1B022D9D8F01A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-login.c";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB1C022D9D8F01A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-login.h";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB1D022D9D8F01A85B04 = {
|
||||
fileRef = F51DBB1C022D9D8F01A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB1E022D9D8F01A85B04 = {
|
||||
fileRef = F51DBB1B022D9D8F01A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51F791201DFC95301D13771 = {
|
||||
isa = PBXFileReference;
|
||||
name = defines.h;
|
||||
@@ -300,6 +382,7 @@
|
||||
F52162B801C7B904012300F4,
|
||||
F52162D801C7BAAE012300F4,
|
||||
F52162B901C7B904012300F4,
|
||||
F5F18132023EC61E01A85B04,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
name = src;
|
||||
@@ -314,7 +397,6 @@
|
||||
F52162B901C7B904012300F4 = {
|
||||
children = (
|
||||
F52162BD01C7B904012300F4,
|
||||
F52162BA01C7B904012300F4,
|
||||
F52162BE01C7B904012300F4,
|
||||
F52162BF01C7B904012300F4,
|
||||
F51D180001C8FDD001E11C2E,
|
||||
@@ -325,8 +407,22 @@
|
||||
F52162E301C7C77B012300F4,
|
||||
F52162DA01C7BCDC012300F4,
|
||||
F52162DB01C7BCDC012300F4,
|
||||
F55047BA0240F6E501A85B04,
|
||||
F55047BB0240F6E501A85B04,
|
||||
F51D180201C8FDD001E11C2E,
|
||||
F51D180301C8FDD001E11C2E,
|
||||
F57C888D02328D7201A85B04,
|
||||
F57C888E02328D7201A85B04,
|
||||
F51DBB1B022D9D8F01A85B04,
|
||||
F51DBB1C022D9D8F01A85B04,
|
||||
F51DBB17022D995501A85B04,
|
||||
F51DBB18022D995501A85B04,
|
||||
F57C88850232853501A85B04,
|
||||
F57C88860232853501A85B04,
|
||||
F57C88890232884501A85B04,
|
||||
F57C888A0232884501A85B04,
|
||||
F51DBB13022D95E801A85B04,
|
||||
F51DBB14022D95E801A85B04,
|
||||
F52162BB01C7B904012300F4,
|
||||
F52162BC01C7B904012300F4,
|
||||
F576ABFA01D5E77301A85B03,
|
||||
@@ -340,11 +436,6 @@
|
||||
path = ngircd;
|
||||
refType = 4;
|
||||
};
|
||||
F52162BA01C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
path = global.h;
|
||||
refType = 4;
|
||||
};
|
||||
F52162BB01C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
path = log.c;
|
||||
@@ -380,12 +471,6 @@
|
||||
path = tool.h;
|
||||
refType = 4;
|
||||
};
|
||||
F52162C201C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = acconfig.h;
|
||||
path = ../acconfig.h;
|
||||
refType = 2;
|
||||
};
|
||||
F52162C301C7B904012300F4 = {
|
||||
isa = PBXExecutableFileReference;
|
||||
name = autogen.sh;
|
||||
@@ -440,18 +525,6 @@
|
||||
path = ../README;
|
||||
refType = 2;
|
||||
};
|
||||
F52162CC01C7B904012300F4 = {
|
||||
fileRef = F52162C201C7B904012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162CD01C7B904012300F4 = {
|
||||
fileRef = F52162BA01C7B904012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162CE01C7B904012300F4 = {
|
||||
fileRef = F52162BC01C7B904012300F4;
|
||||
isa = PBXBuildFile;
|
||||
@@ -560,6 +633,114 @@
|
||||
path = ../doc/Makefile.am;
|
||||
refType = 2;
|
||||
};
|
||||
F538241D024F89BC01A85B04 = {
|
||||
isa = PBXExecutableFileReference;
|
||||
path = portabtest;
|
||||
refType = 3;
|
||||
};
|
||||
F538241E024F89BC01A85B04 = {
|
||||
buildPhases = (
|
||||
F538241F024F89BC01A85B04,
|
||||
F5382423024F89BC01A85B04,
|
||||
F5382425024F89BC01A85B04,
|
||||
F5382426024F89BC01A85B04,
|
||||
);
|
||||
buildSettings = {
|
||||
OTHER_CFLAGS = "";
|
||||
OTHER_LDFLAGS = "";
|
||||
OTHER_REZFLAGS = "";
|
||||
PRODUCT_NAME = portabtest;
|
||||
REZ_EXECUTABLE = YES;
|
||||
SECTORDER_FLAGS = "";
|
||||
WARNING_CFLAGS = "-Wall";
|
||||
};
|
||||
dependencies = (
|
||||
);
|
||||
isa = PBXToolTarget;
|
||||
name = portabtest;
|
||||
productInstallPath = /usr/local/bin;
|
||||
productName = portabtest;
|
||||
productReference = F538241D024F89BC01A85B04;
|
||||
shouldUseHeadermap = 0;
|
||||
};
|
||||
F538241F024F89BC01A85B04 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
F5382420024F89BC01A85B04,
|
||||
F5382421024F89BC01A85B04,
|
||||
F5382422024F89BC01A85B04,
|
||||
);
|
||||
isa = PBXHeadersBuildPhase;
|
||||
name = Headers;
|
||||
};
|
||||
F5382420024F89BC01A85B04 = {
|
||||
fileRef = F5F18134023EC63701A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5382421024F89BC01A85B04 = {
|
||||
fileRef = F5F18135023EC63701A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5382422024F89BC01A85B04 = {
|
||||
fileRef = F5F18136023EC63701A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5382423024F89BC01A85B04 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
F5382424024F89BC01A85B04,
|
||||
);
|
||||
isa = PBXSourcesBuildPhase;
|
||||
name = Sources;
|
||||
};
|
||||
F5382424024F89BC01A85B04 = {
|
||||
fileRef = F5F18137023EC63701A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5382425024F89BC01A85B04 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
name = "Frameworks & Libraries";
|
||||
};
|
||||
F5382426024F89BC01A85B04 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
isa = PBXRezBuildPhase;
|
||||
name = "ResourceManager Resources";
|
||||
};
|
||||
F55047BA0240F6E501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = hash.c;
|
||||
refType = 4;
|
||||
};
|
||||
F55047BB0240F6E501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = hash.h;
|
||||
refType = 4;
|
||||
};
|
||||
F55047BC0240F6E501A85B04 = {
|
||||
fileRef = F55047BB0240F6E501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F55047BD0240F6E501A85B04 = {
|
||||
fileRef = F55047BA0240F6E501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F56D8B9E01E0BFA00155ADA7 = {
|
||||
children = (
|
||||
F56D8B9F01E0BFA00155ADA7,
|
||||
@@ -622,6 +803,133 @@
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F57C88850232853501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-oper.c";
|
||||
refType = 4;
|
||||
};
|
||||
F57C88860232853501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-oper.h";
|
||||
refType = 4;
|
||||
};
|
||||
F57C88870232853501A85B04 = {
|
||||
fileRef = F57C88860232853501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F57C88880232853501A85B04 = {
|
||||
fileRef = F57C88850232853501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F57C88890232884501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-server.c";
|
||||
refType = 4;
|
||||
};
|
||||
F57C888A0232884501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-server.h";
|
||||
refType = 4;
|
||||
};
|
||||
F57C888B0232884501A85B04 = {
|
||||
fileRef = F57C888A0232884501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F57C888C0232884501A85B04 = {
|
||||
fileRef = F57C88890232884501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F57C888D02328D7201A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-channel.c";
|
||||
refType = 4;
|
||||
};
|
||||
F57C888E02328D7201A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-channel.h";
|
||||
refType = 4;
|
||||
};
|
||||
F57C888F02328D7201A85B04 = {
|
||||
fileRef = F57C888E02328D7201A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F57C889002328D7201A85B04 = {
|
||||
fileRef = F57C888D02328D7201A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5F18132023EC61E01A85B04 = {
|
||||
children = (
|
||||
F5F18133023EC63701A85B04,
|
||||
F5F18134023EC63701A85B04,
|
||||
F5F18135023EC63701A85B04,
|
||||
F5F18136023EC63701A85B04,
|
||||
F5F18137023EC63701A85B04,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
name = portab;
|
||||
path = /Users/alex/Develop/ngircd/src;
|
||||
refType = 0;
|
||||
};
|
||||
F5F18133023EC63701A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
name = Makefile.am;
|
||||
path = portab/Makefile.am;
|
||||
refType = 4;
|
||||
};
|
||||
F5F18134023EC63701A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
name = exp.h;
|
||||
path = portab/exp.h;
|
||||
refType = 4;
|
||||
};
|
||||
F5F18135023EC63701A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
name = imp.h;
|
||||
path = portab/imp.h;
|
||||
refType = 4;
|
||||
};
|
||||
F5F18136023EC63701A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
name = portab.h;
|
||||
path = portab/portab.h;
|
||||
refType = 4;
|
||||
};
|
||||
F5F18137023EC63701A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
name = portabtest.c;
|
||||
path = portab/portabtest.c;
|
||||
refType = 4;
|
||||
};
|
||||
F5F18138023EC63701A85B04 = {
|
||||
fileRef = F5F18134023EC63701A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5F18139023EC63701A85B04 = {
|
||||
fileRef = F5F18135023EC63701A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5F1813A023EC63701A85B04 = {
|
||||
fileRef = F5F18136023EC63701A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
};
|
||||
rootObject = 08FB7793FE84155DC02AAC07;
|
||||
}
|
||||
|
24
Makefile.am
24
Makefile.am
@@ -9,34 +9,20 @@
|
||||
# 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/01/02 02:52:09 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.5 2002/01/02 02:52:09 alex
|
||||
# - Copyright-Texte angepasst ;-)
|
||||
#
|
||||
# Revision 1.4 2001/12/31 02:20:20 alex
|
||||
# - Unterverzeichnis "doc" aufgenommen.
|
||||
#
|
||||
# Revision 1.3 2001/12/30 19:24:28 alex
|
||||
# - acconfig.h in die "noinst_HEADERS" aufgenommen.
|
||||
#
|
||||
# Revision 1.2 2001/12/12 17:21:58 alex
|
||||
# - Projektdatei fuer den Mac OS X Project Builder erstellt.
|
||||
#
|
||||
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
# Imported sources to CVS.
|
||||
# $Id: Makefile.am,v 1.8 2002/03/25 19:39:48 alex Exp $
|
||||
#
|
||||
|
||||
AUTOMAKE_OPTIONS = gnu
|
||||
|
||||
SUBDIRS = doc MacOSX src
|
||||
|
||||
noinst_HEADERS = acconfig.h
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -rf autom4te.cache
|
||||
rm -f Makefile.in Makefile aclocal.m4 configure
|
||||
rm -f mkinstalldirs missing depcomp install-sh
|
||||
rm -f config.log
|
||||
|
||||
lint:
|
||||
make -C src/ngircd lint
|
||||
|
||||
# -eof-
|
||||
|
64
NEWS
64
NEWS
@@ -10,6 +10,68 @@
|
||||
-- NEWS / Neuigkeiten --
|
||||
|
||||
|
||||
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.
|
||||
- Server-Gruppen implementiert: es wird immer nur zu einem Server in
|
||||
einer Gruppe eine Verbindung aufgebaut, klappt es beim ersten Server
|
||||
nicht, so wird der naechste probiert.
|
||||
- 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.
|
||||
- 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.
|
||||
|
||||
ngIRCd 0.3.0, 02.03.2002
|
||||
|
||||
- bekommt der Server ein HUP-Signal, so startet er neu -- genau so, wie
|
||||
er auf den IRC-Befehl RESTART reagiert.
|
||||
- neuer Kommandozeilen-Schalter "--passive" (-p): wird er angegeben, so
|
||||
verbindet sich der ngIRCd nicht mehr automatisch zu anderen Servern.
|
||||
Zum Debuggen manchmal ganz praktisch :-)
|
||||
- neue Befehle VERSION und KILL implementiert. NAMES korrigiert.
|
||||
- Anpassungen an A/UX: gehoert nun auch zu den unterstuetzten Platformen.
|
||||
- AWAY (und der User-Mode 'a') ist nun implementiert.
|
||||
- der ngIRCd unterstuetzt nun Channel-Topics (TOPIC-Befehl).
|
||||
- Channel- und Nicknames werden nun ordentlich validiert.
|
||||
|
||||
ngIRCd 0.2.0, 15.02.2002
|
||||
|
||||
- Begonnen Channel-Modes und User-Channel-Modes zu implementieren: der
|
||||
Server versteht an User-Modes o und v, beachtet letzteres allerdings
|
||||
noch nirgends. Bekannte (aber nicht beachtete!) Channel-Modes sind
|
||||
bisher a, m, n, p, q, s und t. Diese Modes werden von Usern ange-
|
||||
nommen, von anderen Servern werden auch unbekannte Modes uebernommen.
|
||||
- Nach dem Connect eines Users werden LUSERS-Informationen angezeigt.
|
||||
|
||||
ngIRCd 0.1.0, 29.01.2002
|
||||
|
||||
- Channels implementiert, bisher jedoch noch ohne Channel-Modes, d.h.
|
||||
es gibt keine Channel-Ops, kein Topic, kein "topic lock" etc. pp.
|
||||
Chatten in Channels ist aber natuerlich moeglich ;-)
|
||||
Dadurch zum Teil groessere Aenderungen an bisherigen Funktionen.
|
||||
- neue Befehle fuer Channles: JOIN, PART und NJOIN.
|
||||
- FAQ.txt in doc/ begonnen.
|
||||
|
||||
ngIRCd 0.0.3, 16.01.2002
|
||||
|
||||
- Server-Links vollstaendig implementiert: der ngIRCd kann nun auch
|
||||
"Sub-Server" haben, also sowohl als Leaf-Node als auch Hub in einem
|
||||
IRC-Netzwerk arbeiten.
|
||||
- WHOIS wird nun immer an den "Original-Server" weitergeleitet.
|
||||
- Parser handhabt Leerzeichen zw. Parametern nun etwas "lockerer".
|
||||
- Kommandozeilen-Parser: Debug- und No-Daemon-Modus, Hilfe.
|
||||
- ngIRCd wandelt sich nun in einen Daemon (Hintergrundprozess) um.
|
||||
- neue Befehle: LUSERS, LINKS.
|
||||
|
||||
ngIRCd 0.0.2, 06.01.2002
|
||||
|
||||
- neuer Aufbau der Konfigurationsdatei,
|
||||
@@ -23,4 +85,4 @@ ngIRCd 0.0.1, 31.12.2001
|
||||
|
||||
|
||||
--
|
||||
$Id: NEWS,v 1.4 2002/01/06 15:40:01 alex Exp $
|
||||
$Id: NEWS,v 1.25.2.3 2002/04/01 17:18:03 alex Exp $
|
||||
|
48
README
48
README
@@ -1,4 +1,4 @@
|
||||
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
@@ -10,22 +10,26 @@
|
||||
-- README / Liesmich --
|
||||
|
||||
|
||||
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.
|
||||
|
||||
Zur Zeit befindet sich ngIRCd noch in Entwicklung, vieles ist noch nicht
|
||||
implementiert bzw. nur "halbherzig": Channels gibt es noch nicht, genau so
|
||||
wenig wie Server-Links. Das private Chatten (PRIVMSG) mit den Client-Befehlen
|
||||
/msg und /query sollte hingegen funktionieren, ein wenig praktische Funk-
|
||||
tionalitaet ist also tatsaechlich schon vorhanden ;-)
|
||||
Zur Zeit befindet sich der ngIRCd noch in Entwicklung, teilweise fehlen noch
|
||||
Features oder sind noch nicht "final" implementiert.
|
||||
|
||||
Diese Version ist aber auf jeden Fall als "Preview" anzusehen!
|
||||
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.
|
||||
|
||||
Bisher (mehr oder wenig vollstaendig) implementierte IRC-Befehle:
|
||||
|
||||
DIE, ISON, MODE, MOTD, NAMES, NICK, NOTICE, OPER, PASS, PING, PONG, PRIVMSG,
|
||||
QUIT, RESTART, USER, USERHOST, WHOIS.
|
||||
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! :-))
|
||||
@@ -33,10 +37,32 @@ 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/>.
|
||||
|
||||
[ ... more to come ... ]
|
||||
|
||||
|
||||
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 ,-)
|
||||
|
||||
|
||||
II. Vorteile
|
||||
~~~~~~~~~~~~
|
||||
|
||||
- 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.
|
||||
|
||||
|
||||
III. Unterstuetzte Plattformen
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- A/UX
|
||||
- FreeBSD
|
||||
- Linux
|
||||
- Mac OS X
|
||||
- NetBSD
|
||||
- Windows mit Cygwin
|
||||
|
||||
|
||||
--
|
||||
$Id: README,v 1.8 2002/03/21 23:25:15 alex Exp $
|
||||
|
49
acconfig.h
49
acconfig.h
@@ -1,49 +0,0 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: acconfig.h,v 1.7 2002/01/02 02:52:09 alex Exp $
|
||||
*
|
||||
* $Log: acconfig.h,v $
|
||||
* Revision 1.7 2002/01/02 02:52:09 alex
|
||||
* - Copyright-Texte angepasst ;-)
|
||||
*
|
||||
* Revision 1.6 2001/12/31 02:21:00 alex
|
||||
* - "doc"-Unterverzeichnis aufgenommen.
|
||||
*
|
||||
* Revision 1.5 2001/12/29 03:04:35 alex
|
||||
* - neue configure-Option "--enable-strict-rfc", #define STRICT_RFC.
|
||||
*
|
||||
* Revision 1.4 2001/12/27 01:44:49 alex
|
||||
* - die Verwendung von syslog kann nun abgeschaltet werden.
|
||||
*
|
||||
* Revision 1.3 2001/12/25 22:01:47 alex
|
||||
* - neue configure-Option "--enable-sniffer".
|
||||
*
|
||||
* Revision 1.2 2001/12/21 23:54:15 alex
|
||||
* - zusaetzliche Debug-Ausgaben koennen eingeschaltet werden.
|
||||
*
|
||||
* Revision 1.1 2001/12/12 01:58:52 alex
|
||||
* - Test auf socklen_t verbessert.
|
||||
*/
|
||||
|
||||
|
||||
#undef HAVE_socklen_t
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#undef SNIFFER
|
||||
|
||||
#undef USE_SYSLOG
|
||||
|
||||
#undef STRICT_RFC
|
||||
|
||||
|
||||
/* -eof- */
|
@@ -1,13 +1,6 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# $Id: autogen.sh,v 1.2 2001/12/12 01:58:17 alex Exp $
|
||||
#
|
||||
# $Log: autogen.sh,v $
|
||||
# Revision 1.2 2001/12/12 01:58:17 alex
|
||||
# - fuer fehlende Dateien werden nun "nur noch" symbolische Links erzeugt.
|
||||
#
|
||||
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
# Imported sources to CVS.
|
||||
# $Id: autogen.sh,v 1.3 2002/03/12 14:37:51 alex Exp $
|
||||
#
|
||||
|
||||
if [ -f configure ]; then
|
||||
|
1321
config.guess
vendored
Normal file
1321
config.guess
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1443
config.sub
vendored
Normal file
1443
config.sub
vendored
Normal file
File diff suppressed because it is too large
Load Diff
149
configure.in
149
configure.in
@@ -9,75 +9,28 @@
|
||||
# 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.19 2002/01/06 16:21:09 alex Exp $
|
||||
#
|
||||
# $Log: configure.in,v $
|
||||
# Revision 1.19 2002/01/06 16:21:09 alex
|
||||
# - CVS-Version auf "0.0.3-pre" angehoben.
|
||||
#
|
||||
# Revision 1.18 2002/01/06 16:09:37 alex
|
||||
# - Version 0.0.2
|
||||
#
|
||||
# Revision 1.17 2002/01/05 15:53:20 alex
|
||||
# - Test auf Header "arpa/inet.h" und Funktion inet_aton() hinzugefuegt (BeOS).
|
||||
#
|
||||
# Revision 1.16 2002/01/02 13:41:36 alex
|
||||
# - CFLAGS wird nur noch gesetzt, wenn der GCC verwendet wird.
|
||||
#
|
||||
# Revision 1.15 2002/01/02 02:52:09 alex
|
||||
# - Copyright-Texte angepasst ;-)
|
||||
#
|
||||
# Revision 1.14 2001/12/31 16:11:13 alex
|
||||
# - CVS-Version auf "0.0.2-pre" angehoben.
|
||||
#
|
||||
# Revision 1.13 2001/12/31 16:02:30 alex
|
||||
# - Version 0.0.1
|
||||
#
|
||||
# Revision 1.12 2001/12/31 02:21:00 alex
|
||||
# - "doc"-Unterverzeichnis aufgenommen.
|
||||
#
|
||||
# Revision 1.11 2001/12/29 03:04:06 alex
|
||||
# - neue configure-Option "--enable-strict-rfc".
|
||||
#
|
||||
# Revision 1.10 2001/12/27 16:25:36 alex
|
||||
# - neue configure-Option "--with-portab=DIR".
|
||||
#
|
||||
# Revision 1.9 2001/12/27 02:08:38 alex
|
||||
# - da fehlte an zwei Stellen ein AC_MSG_ERROR ... ups!
|
||||
#
|
||||
# Revision 1.8 2001/12/27 01:44:49 alex
|
||||
# - die Verwendung von syslog kann nun abgeschaltet werden.
|
||||
#
|
||||
# Revision 1.7 2001/12/27 00:37:07 alex
|
||||
# - Erkennung der "portab header" geaendert, CFLAGS werden nun anders gesetzt.
|
||||
#
|
||||
# Revision 1.6 2001/12/25 22:01:47 alex
|
||||
# - neue configure-Option "--enable-sniffer".
|
||||
#
|
||||
# Revision 1.5 2001/12/21 23:54:26 alex
|
||||
# - zusaetzliche Debug-Ausgaben koennen eingeschaltet werden.
|
||||
#
|
||||
# Revision 1.4 2001/12/12 17:21:58 alex
|
||||
# - Projektdatei fuer den Mac OS X Project Builder erstellt.
|
||||
#
|
||||
# Revision 1.3 2001/12/12 01:58:53 alex
|
||||
# - Test auf socklen_t verbessert.
|
||||
#
|
||||
# Revision 1.2 2001/12/11 22:04:21 alex
|
||||
# - Test auf stdint.h (HAVE_STDINT_H) hinzugefuegt.
|
||||
#
|
||||
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
# Imported sources to CVS.
|
||||
# $Id: configure.in,v 1.39.2.5 2002/06/11 20:29:44 alex Exp $
|
||||
#
|
||||
|
||||
# -- Initialisierung --
|
||||
|
||||
AC_INIT
|
||||
AC_CONFIG_SRCDIR(src/ngircd/ngircd.c)
|
||||
AM_INIT_AUTOMAKE(ngircd,0.0.3-pre)
|
||||
AC_CANONICAL_TARGET
|
||||
AC_CONFIG_SRCDIR(src/config.h.in)
|
||||
AM_INIT_AUTOMAKE(ngircd,0.4.3)
|
||||
AM_CONFIG_HEADER(src/config.h)
|
||||
|
||||
# -- Variablen --
|
||||
# -- Templates fuer config.h --
|
||||
|
||||
AH_TEMPLATE([DEBUG], [Define if debug-mode should be enabled])
|
||||
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([TARGET_OS], [Target operating system name])
|
||||
AH_TEMPLATE([TARGET_VENDOR], [Target system vendor])
|
||||
AH_TEMPLATE([TARGET_CPU], [Target CPU name])
|
||||
|
||||
# -- C Compiler --
|
||||
|
||||
@@ -98,38 +51,13 @@ AC_HEADER_STDC
|
||||
|
||||
AC_HEADER_TIME
|
||||
|
||||
AC_ARG_WITH(portab,
|
||||
[ --with-portab=DIR search the "portab headers" in DIR],
|
||||
[ if test "x$withval" != "xno"; then
|
||||
CFLAGS="$CFLAGS -I${withval}"
|
||||
if test -f ${withval}/portab.h; then
|
||||
AC_MSG_RESULT([searching "portab headers" in ${withval}...])
|
||||
else
|
||||
AC_MSG_ERROR([${withval}/portab.h not found!])
|
||||
fi
|
||||
else
|
||||
AC_MSG_ERROR([Can't disable Alex \"portability headers\"!])
|
||||
fi
|
||||
],
|
||||
[ AC_CHECK_HEADER(portab.h,[
|
||||
AC_CHECK_HEADER(imp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
|
||||
AC_CHECK_HEADER(exp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
|
||||
],[
|
||||
AC_CHECK_HEADER(/usr/local/include/portab.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
|
||||
AC_CHECK_HEADER(/usr/local/include/imp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
|
||||
AC_CHECK_HEADER(/usr/local/include/exp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
|
||||
CFLAGS="$CFLAGS -I/usr/local/include"
|
||||
])
|
||||
]
|
||||
)
|
||||
AC_CHECK_HEADERS(arpa/inet.h)
|
||||
|
||||
AC_CHECK_HEADERS([ \
|
||||
errno.h fcntl.h netinet/in.h string.h \
|
||||
sys/socket.h sys/time.h unistd.h \
|
||||
errno.h fcntl.h netdb.h netinet/in.h stdlib.h string.h \
|
||||
sys/socket.h sys/time.h sys/wait.h unistd.h \
|
||||
],,AC_MSG_ERROR([required C header missing!]))
|
||||
|
||||
AC_CHECK_HEADERS(arpa/inet.h)
|
||||
|
||||
# -- Datentypen --
|
||||
|
||||
AC_MSG_CHECKING(whether socklen_t exists)
|
||||
@@ -145,30 +73,44 @@ AC_TRY_COMPILE([
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
|
||||
# -- Libraries --
|
||||
|
||||
AC_CHECK_LIB(UTIL,memmove)
|
||||
|
||||
# -- Funktionen --
|
||||
|
||||
AC_FUNC_MALLOC
|
||||
|
||||
AC_CHECK_FUNCS([ \
|
||||
gethostname inet_ntoa memmove memset select \
|
||||
socket strcasecmp strchr strerror strstr waitpid \
|
||||
bind gethostbyaddr gethostbyname gethostname inet_ntoa memmove \
|
||||
memset select setsockopt socket strcasecmp strchr strerror strftime \
|
||||
strstr vsnprintf waitpid \
|
||||
],,AC_MSG_ERROR([required function missing!]))
|
||||
|
||||
AC_CHECK_FUNCS(inet_aton)
|
||||
|
||||
# -- Libraries --
|
||||
AC_CHECK_FUNCS(sigaction)
|
||||
|
||||
# -- Konfigurationsoptionen --
|
||||
|
||||
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_MSG_ERROR([Can't enable syslog: syslog.h not found!]))
|
||||
AC_CHECK_HEADER(syslog.h,
|
||||
[ AC_DEFINE(USE_SYSLOG, 1)
|
||||
AC_CHECK_LIB(be,syslog)
|
||||
],
|
||||
AC_MSG_ERROR([Can't enable syslog: syslog.h not found!])
|
||||
)
|
||||
else
|
||||
AC_MSG_RESULT([disabling syslog])
|
||||
fi
|
||||
],
|
||||
[ AC_CHECK_HEADER(syslog.h,AC_DEFINE(USE_SYSLOG, 1))
|
||||
[ AC_CHECK_HEADER(syslog.h,
|
||||
[ AC_DEFINE(USE_SYSLOG, 1)
|
||||
AC_CHECK_LIB(be,syslog)
|
||||
]
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
@@ -198,12 +140,26 @@ if test "$x_debug_on" = "yes"; then
|
||||
AC_MSG_RESULT([enabling additional debug output])
|
||||
fi
|
||||
|
||||
# -- Variablen II --
|
||||
# -- Definitionen --
|
||||
|
||||
AC_DEFINE_UNQUOTED(TARGET_CPU, "$target_cpu" )
|
||||
AC_DEFINE_UNQUOTED(TARGET_VENDOR, "$target_vendor" )
|
||||
AC_DEFINE_UNQUOTED(TARGET_OS, "$target_os" )
|
||||
|
||||
# -- Variablen --
|
||||
|
||||
if test "$GCC" = "yes"; then
|
||||
CFLAGS="-Wall $CFLAGS"
|
||||
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 --
|
||||
|
||||
AC_OUTPUT([ \
|
||||
@@ -212,6 +168,7 @@ AC_OUTPUT([ \
|
||||
MacOSX/Makefile \
|
||||
MacOSX/ngircd.pbproj/Makefile \
|
||||
src/Makefile \
|
||||
src/portab/Makefile \
|
||||
src/ngircd/Makefile \
|
||||
])
|
||||
|
||||
|
27
doc/CC-Speed.txt
Normal file
27
doc/CC-Speed.txt
Normal file
@@ -0,0 +1,27 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd ist freie Software und steht unter
|
||||
der GNU General Public License.
|
||||
|
||||
-- CC-Speed.txt --
|
||||
|
||||
|
||||
ngIRCd-0.2.1-pre (2002-02-25):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
[nach make-Zeiten sortiert]
|
||||
|
||||
Intel PIII, 1 GHz, 256 MB Ram, FreeBSD 4.4: configure: 00:10, make: 00:05
|
||||
Intel PIII, 1 GHz, 256 MB Ram, Linux 2.4.10: configure: 00:06, make: 00:06
|
||||
Intel PIII, 1 GHz, 256 MB Ram, BeOS R5: configure: 00:19, make: 00:07
|
||||
Intel PIII, 1 GHz, 256 MB Ram, Win2k+CygWin: configure: 00:27, make: 00:08
|
||||
AMD K6/2, 400 Mhz, 256 MB Ram, Linux 2.4.12: configure: 00:14, make: 00:12
|
||||
PowerMac G4, 400 Mhz, 768 MB Ram, Mac OS X 10.1.2: configure: 00:32, make: 00:19
|
||||
Macintosh SE/30, 68030 16 MHz, 32 MB, A/UX 3.0.1: configure: 07:33, make: 12:02
|
||||
|
||||
|
||||
--
|
||||
$Id: CC-Speed.txt,v 1.1 2002/02/25 14:02:32 alex Exp $
|
51
doc/CVS.txt
51
doc/CVS.txt
@@ -14,8 +14,51 @@ Die Sourcen des ngIRCd werden mit dem "Concurrent Versions System" (CVS)
|
||||
verwaltet. Somit koennen ohne Probleme mehrere Leute gleichzeitig die Sourcen
|
||||
bearbeitet.
|
||||
|
||||
Dieser Text soll in Zukunft die Grundlagen beschreiben. Tut er aber leider
|
||||
noch nicht, also frage einfach Alex direkt (siehe AUTHORS-Text), wenn du
|
||||
daran interessiert bist, Zugriff auf den Quellcode via CVS zu bekommen!
|
||||
|
||||
[ ... more to come ... ]
|
||||
I. Anonymer "Nur-Lesen"-Zugang
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Anonymer Zugriff auf die CVS-Repository von ngIRCd ist im "nur-lesen"-Modus
|
||||
moeglich. Dazu sind folgende Schritte noetig:
|
||||
|
||||
Beim CVS-Server anmelden
|
||||
|
||||
$ cvs -d:pserver:anonymous@arthur.ath.cx:/usr/local/CVS/ngircd login
|
||||
|
||||
Als Benutzername wird "anonymous" mit einem leeren Passwort verwendet.
|
||||
Nun ein "Check-Out" der Quellcodes durchfuehren:
|
||||
|
||||
$ cvs -d:pserver:anonymous@arthur.ath.cx:/usr/local/CVS/ngircd checkout ngircd
|
||||
|
||||
Dadurch wird im aktuellen Verzeichnis der neue Ordner "ngircd" mit allen
|
||||
Quell-Dateien des ngIRCd erzeugt.
|
||||
|
||||
Dieses ist der "Arbeitsordner", alle CVS-Befehle werden in Zukunft aus
|
||||
diesem Ordner bzw. einem Unterordner davon ausgefuehrt.
|
||||
|
||||
Wichtig: wenn ngIRCd "frisch" aus dem CVS compiliert werden soll, so
|
||||
existiert das configure-Script noch nicht. Dieses muss zunaechst mit dem
|
||||
Script "autogen.sh" erzeugt werden. Letzteres setzt ein installiertes GNU
|
||||
automake und GNU autoconf voraus!
|
||||
|
||||
CVS-Tree aktualisieren:
|
||||
|
||||
$ cvs update
|
||||
|
||||
Dieser Befehl aktualisiert alle Dateien im aktuellen Verzeichnis sowie allen
|
||||
Unterverzeichnissen.
|
||||
|
||||
$ cvs update <filename>
|
||||
|
||||
So kann eine einzelne Datei aktualisiert werden (auch dann, wenn sie lokal
|
||||
z.B. geloescht wurde -- praktisch, um eigene "Experimente" rueckgaengig zu
|
||||
machen ;-))
|
||||
|
||||
|
||||
III. Schreibzugriff
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
Wer Schreibzugriff auf die CVS-Repository wuenscht, der moege sich bitte
|
||||
mit Alex Barton, <alex@barton.de> in Verbindung setzen.
|
||||
|
||||
|
||||
--
|
||||
$Id: CVS.txt,v 1.5 2002/02/15 15:15:22 alex Exp $
|
||||
|
61
doc/FAQ.txt
Normal file
61
doc/FAQ.txt
Normal file
@@ -0,0 +1,61 @@
|
||||
|
||||
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.
|
||||
|
||||
-- FAQ: Frequently Asked Questions --
|
||||
|
||||
|
||||
I. Allgemein
|
||||
~~~~~~~~~~~~
|
||||
Q: Kann der ngIRCd im Netz zusammen mit "normalen" Servern betrieben werden?
|
||||
A: Ja. ngIRCd ist zum Original kompatibel, getestet wird dies zur Zeit mit
|
||||
der Version 2.10.3p3 des ircd.
|
||||
|
||||
Q: Gibt es eine Homepage mit Informationen und Downloads?
|
||||
A: Ja. Die URL ist <http://arthur.ath.cx/~alex/ngircd/>.
|
||||
|
||||
|
||||
II. Compilieren
|
||||
~~~~~~~~~~~~~~~
|
||||
Q: Ich habe die Sourcen von ngIRCd ueber CVS installiert. Nun kann ich
|
||||
./configure nicht ausfuehren, da es nicht existiert!?
|
||||
A: Bei Builds direkt aus dem CVS-Tree muss das configure-Script zunaechst
|
||||
durch GNU autoconf sowie die Makefile.in's durch GNU automake generiert
|
||||
werden. Um dies zu vereinfachen existiert das Script "./autogen.sh".
|
||||
GNU automake und GNU autoconf werden -- im Gegensatz zu Builds aus den
|
||||
Sourcen eines .tar.gz-Archivs -- hierbei benoetigt!
|
||||
|
||||
Q: ./autogen.sh bricht mit der Meldung "autoheader: command not found" ab.
|
||||
A: GNU autoconf ist nicht installiert, wird jedoch bei Builds direkt aus
|
||||
dem CVS-Tree benoetigt.
|
||||
|
||||
Q: ./autogen.sh bricht mit der Meldung "autoconf: Undefined macros:
|
||||
AC_FUNC_MALLOC" bzw. "AC_CONFIG_SRCDIR" ab.
|
||||
A: Auf dem System ist eine zu alte Version von GNU autoconf installiert.
|
||||
Ein Update auf z.B. Version 2.52 loest dieses Problem (eine installiete
|
||||
alte Version sollte ggf. zunaechst entfernt werden, bei RPM-Paketen z.B.
|
||||
mit dem Befehl "rpm -e autoconf").
|
||||
|
||||
|
||||
III. Bugs!?
|
||||
~~~~~~~~~~~
|
||||
Q: Gibt es eine Liste der bekannten Bugs bzw. Feature-Wuensche?
|
||||
A: Ja. Es existiert ein Bug-Tracking-System fuer den ngIRCd (Bugzilla):
|
||||
URL: <http://arthur.ath.cx/bugzilla/ngircd/>. Dort koennen Bugs ge-
|
||||
meldet und Feature-Wunsche kundgetan werden. Bekannte Bugs koennen in
|
||||
der Datenbank gesucht und aufgelistet werden.
|
||||
Einen Account zum Suchen und Melden von Bugs bzw. Feature-Wuenschen
|
||||
kannst du dir dort selber anlegen.
|
||||
|
||||
Q: Was mache ich, wenn ich einen Bug gefunden habe?
|
||||
A: Am besten traegst du ihn in das Bug-Tracking-System des ngIRCd ein:
|
||||
URL: <http://arthur.ath.cx/bugzilla/ngircd/>
|
||||
|
||||
|
||||
--
|
||||
$Id: FAQ.txt,v 1.2 2002/02/19 20:05:02 alex Exp $
|
@@ -9,22 +9,19 @@
|
||||
# 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/01/02 02:40:31 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.3 2002/01/02 02:40:31 alex
|
||||
# - Copyright-Text ergaenzt.
|
||||
#
|
||||
# Revision 1.2 2001/12/31 02:45:24 alex
|
||||
# - nun werden alle generierten Dateien bei "maintainer-clean" geloescht.
|
||||
#
|
||||
# Revision 1.1 2001/12/31 02:22:29 alex
|
||||
# - Makefile.am fuer das "doc"-Verzeichnis begonnen.
|
||||
# $Id: Makefile.am,v 1.7 2002/03/30 15:33:14 alex Exp $
|
||||
#
|
||||
|
||||
EXTRA_DIST = CVS.txt RFC.txt sample-ngircd.conf
|
||||
EXTRA_DIST = CC-Speed.txt CVS.txt FAQ.txt README-AUX.txt README-BeOS.txt \
|
||||
RFC.txt sample-ngircd.conf
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
||||
install-data-hook:
|
||||
$(mkinstalldirs) $(DESTDIR)$(sysconfdir)
|
||||
if [ ! -f $(DESTDIR)$(sysconfdir)/ngircd.conf ]; then \
|
||||
$(INSTALL) -m 600 -c $(srcdir)/sample-ngircd.conf $(DESTDIR)$(sysconfdir)/ngircd.conf; \
|
||||
fi
|
||||
|
||||
# -eof-
|
||||
|
71
doc/README-AUX.txt
Normal file
71
doc/README-AUX.txt
Normal file
@@ -0,0 +1,71 @@
|
||||
|
||||
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.
|
||||
|
||||
-- README-AUX.txt --
|
||||
|
||||
|
||||
Seit Version 0.2.2-pre gehoert Apple A/UX zu den offiziell unterstuetzten
|
||||
Platformen. Er ist im vollen Funktionsumfang nutzbar.
|
||||
|
||||
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/gcc-2.8.1-auxbin.tar.gz
|
||||
|
||||
- GNU make
|
||||
Bezugsquellen:
|
||||
http://www.rezepte-im-web.de/appleux/make-3.79.tar.gz
|
||||
ftp://arthur.ath.cx/pub/AUX/Software/Development/make-3.79.tar.gz
|
||||
|
||||
- GNU sed
|
||||
Bezugsquellen:
|
||||
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
|
||||
ftp://arthur.ath.cx/pub/AUX/Software/Libraries/libUTIL-2.1.tar.gz
|
||||
|
||||
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.2.2 2002/04/29 14:44:24 alex Exp $
|
36
doc/README-BeOS.txt
Normal file
36
doc/README-BeOS.txt
Normal file
@@ -0,0 +1,36 @@
|
||||
|
||||
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.
|
||||
|
||||
-- README-BeOS.txt --
|
||||
|
||||
|
||||
BeOS gehoert im Moment (noch?) nicht zu den offiziell unterstuetzten Plat-
|
||||
formen: der ngIRCd enthaelt zwar bereits einige Anpassungen an BeOS und
|
||||
compiliert auch, jedoch bricht er bei jedem Connect-Versuch eines Clients
|
||||
mit diesem Fehler ab:
|
||||
|
||||
select(): Bad file descriptor!
|
||||
|
||||
Es sieht leider so aus, als ob das select() von BeOS nicht mit File-Handles
|
||||
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<>sung"/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
|
||||
es eigentlich zu keinen Beeintraechtigungen kommen ...
|
||||
|
||||
Also: wenn es jemand implementieren will ... ;-))
|
||||
|
||||
Vielleicht mache ich es auch irgendwann mal selber. Mal sehen.
|
||||
|
||||
--
|
||||
$Id: README-BeOS.txt,v 1.1 2002/02/25 14:02:32 alex Exp $
|
@@ -27,3 +27,6 @@ Das IRC-Protokoll ist in diesen RFC's (Request For Comments) dokumentiert:
|
||||
2813 Kalt, C., "Internet Relay Chat: Server Protocol",
|
||||
April 2000, [IRC-SERVER].
|
||||
|
||||
|
||||
--
|
||||
$Id: RFC.txt,v 1.4 2002/01/23 18:20:04 alex Exp $
|
||||
|
@@ -1,22 +1,108 @@
|
||||
# $Id: sample-ngircd.conf,v 1.2 2002/01/06 16:54:05 alex Exp $
|
||||
# $Id: sample-ngircd.conf,v 1.8 2002/03/30 13:03:12 alex Exp $
|
||||
|
||||
#
|
||||
# Das ist eine Beispiel-Konfiguration fuer den ngIRCd, die an die
|
||||
# jeweiligen Beduerfnisse angepasst werden kann/muss.
|
||||
#
|
||||
# Kommentare werden mit "#" oder ";" eingeleitet.
|
||||
#
|
||||
|
||||
[Global]
|
||||
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
# Servername im IRC-Netz
|
||||
Name = irc.the.net
|
||||
|
||||
# Info-Text des Servers
|
||||
Info = Server Info Text
|
||||
Ports = 6667, 6668, 6669
|
||||
MotdFile = /usr/local/etc/ngircd.motd
|
||||
PingTimeout = 120
|
||||
PongTimeout = 10
|
||||
ConnectRetry = 60
|
||||
|
||||
# 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)
|
||||
;MotdFile = /usr/local/etc/ngircd.motd
|
||||
|
||||
# User-ID, unter der der Daemon laufen soll (dazu muss der Server
|
||||
# jedoch mit root-Rechten gestartet werden).
|
||||
# ACHTUNG: Die Konfigurations- und MOTD-Datei muessen fuer diesen
|
||||
# Benutzer lesbar sein, ansonsten schlaegt ein RESTART fehl!
|
||||
;ServerUID = 65534
|
||||
|
||||
# Group-ID, zu der der Daemon wechseln soll (hierzu muss der Server
|
||||
# jedoch mit root-Rechten gestartet werden)
|
||||
;ServerGID = 65534
|
||||
|
||||
# Nach <PingTimeout> Sekunden verschickt der Server bei Inaktivitaet
|
||||
# von einem Client diesem ein PING.
|
||||
;PingTimeout = 120
|
||||
|
||||
# Antwortet ein Client, der ein PING bekam, nicht innerhalb von
|
||||
# <PongTimeout> Sekunden mit einem PONG, so wird er disconnectiert.
|
||||
;PongTimeout = 20
|
||||
|
||||
# Der Server versucht alle <ConnectRetry> Sekunden, noch nicht bzw.
|
||||
# nicht mehr connectierte Server-Links aufzubauen.
|
||||
;ConnectRetry = 60
|
||||
|
||||
|
||||
[Operator]
|
||||
; Name = TheOper
|
||||
; Password = ThePwd
|
||||
|
||||
#
|
||||
# Mit einem [Operator]-Block wird der Name und das Passwort eines
|
||||
# IRC-Operators konfiguriert. Es darf mehrere [Operator]-Bloecke
|
||||
# geben (fuer jeden Operator einen).
|
||||
#
|
||||
|
||||
# ID des IRC-Operators (muss nicht mit dem Nick identisch sein).
|
||||
;Name = TheOper
|
||||
|
||||
# Passwort des IRC-Operators
|
||||
;Password = ThePwd
|
||||
|
||||
|
||||
[Server]
|
||||
; Host = host2.the.net
|
||||
; Name = irc2.the.net
|
||||
; Port = 6666
|
||||
; Password = ThePwd
|
||||
|
||||
#
|
||||
# In [Server]-Bloecken werden Server konfiguriert, zu denen dieser
|
||||
# Server sich 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.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
# Hostname des Servers
|
||||
;Host = connect-to-host.the.net
|
||||
|
||||
# IRC-Name des Servers
|
||||
;Name = irc2.the.net
|
||||
|
||||
# Port, zu dem dieser Server eine Verbindung herstellen soll. Wird
|
||||
# kein Port angegeben, so wird auf eine Verbindung der Gegenseite
|
||||
# gewartet.
|
||||
;Port = 6666
|
||||
|
||||
# Passwort fuer diese Verbindung
|
||||
;Password = ThePwd1
|
||||
|
||||
# Gruppe, zu der dieser Server gehoert (optional).
|
||||
;Group = 123
|
||||
|
||||
# -eof-
|
||||
|
@@ -9,17 +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.2 2002/01/02 02:41:11 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.2 2002/01/02 02:41:11 alex
|
||||
# - fehlenden Copyright-Text ergaenzt.
|
||||
#
|
||||
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
# Imported sources to CVS.
|
||||
# $Id: Makefile.am,v 1.3 2002/03/12 14:37:51 alex Exp $
|
||||
#
|
||||
|
||||
SUBDIRS = ngircd
|
||||
SUBDIRS = portab ngircd
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in config.h config.h.in stamp-h.in
|
||||
|
@@ -9,51 +9,51 @@
|
||||
# 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.10 2002/01/02 02:43:50 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.10 2002/01/02 02:43:50 alex
|
||||
# - Copyright-Text ergaenzt bzw. aktualisiert.
|
||||
#
|
||||
# Revision 1.9 2001/12/31 02:18:51 alex
|
||||
# - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
# - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
# - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
#
|
||||
# Revision 1.8 2001/12/30 19:25:03 alex
|
||||
# - in "noinst_HEADERS" waren einige Dateien als .c anstelle .h aufgefuehrt.
|
||||
#
|
||||
# Revision 1.7 2001/12/27 00:37:07 alex
|
||||
# - Erkennung der "portab header" geaendert, CFLAGS werden nun anders gesetzt.
|
||||
#
|
||||
# Revision 1.6 2001/12/23 21:53:54 alex
|
||||
# - Header messages.h eingefuegt.
|
||||
#
|
||||
# Revision 1.5 2001/12/21 22:25:30 alex
|
||||
# - neues Modul "parse" eingebunden.
|
||||
#
|
||||
# Revision 1.4 2001/12/14 08:14:03 alex
|
||||
# - neue Module (irc, client, channel) aufgenommen.
|
||||
#
|
||||
# Revision 1.3 2001/12/13 02:03:33 alex
|
||||
# - beim Compilieren werden nun Informationen fuer den Debugger erzeugt.
|
||||
#
|
||||
# Revision 1.2 2001/12/12 17:20:02 alex
|
||||
# - neue Sourcefiles und Header ergaenzt.
|
||||
#
|
||||
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
# - Imported sources to CVS.
|
||||
# $Id: Makefile.am,v 1.19 2002/03/29 22:52:12 alex Exp $
|
||||
#
|
||||
|
||||
AM_CFLAGS = -I$(srcdir)/../portab
|
||||
|
||||
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN
|
||||
|
||||
sbin_PROGRAMS = ngircd
|
||||
|
||||
ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c irc.c log.c \
|
||||
parse.c tool.c
|
||||
ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c hash.c irc.c \
|
||||
irc-channel.c irc-login.c irc-mode.c irc-oper.c irc-server.c \
|
||||
irc-write.c log.c parse.c tool.c
|
||||
|
||||
noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h irc.h log.h \
|
||||
parse.h tool.h global.h messages.h defines.h
|
||||
noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h hash.h irc.h \
|
||||
irc-channel.h irc-login.h irc-mode.h irc-oper.h irc-server.h \
|
||||
irc-write.h log.h parse.h tool.h \
|
||||
messages.h defines.h
|
||||
|
||||
clean-local:
|
||||
rm -f check-version check-help lint.out
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
||||
check-version: Makefile
|
||||
echo "#!/bin/sh" > check-version
|
||||
echo "./ngircd --version | grep version > /dev/null 2>&1" >> check-version
|
||||
chmod 755 check-version
|
||||
|
||||
check-help: Makefile
|
||||
echo "#!/bin/sh" > check-help
|
||||
echo "./ngircd --help | grep help > /dev/null 2>&1" >> check-help
|
||||
chmod 755 check-help
|
||||
|
||||
lint:
|
||||
rm -f lint.out
|
||||
for f in *.c; do \
|
||||
echo "checking $$f ..."; \
|
||||
splint $$f $(LINTARGS) -I./.. $(AM_CFLAGS) > lint.out 2>&1; \
|
||||
grep "no warnings" lint.out > /dev/null 2>&1; \
|
||||
if [ $$? -ne 0 ]; then \
|
||||
echo; cat lint.out; echo; \
|
||||
fi; \
|
||||
done;
|
||||
|
||||
TESTS = check-version check-help
|
||||
|
||||
# -eof-
|
||||
|
@@ -9,47 +9,637 @@
|
||||
* 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.3 2002/01/02 02:42:58 alex Exp $
|
||||
* $Id: channel.c,v 1.20.2.1 2002/04/29 14:11:23 alex Exp $
|
||||
*
|
||||
* channel.c: Management der Channels
|
||||
*
|
||||
* $Log: channel.c,v $
|
||||
* Revision 1.3 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.2 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.1 2001/12/14 08:13:43 alex
|
||||
* - neues Modul begonnen :-)
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <portab.h>
|
||||
#include "global.h"
|
||||
#define __channel_c__
|
||||
|
||||
#include <imp.h>
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <exp.h>
|
||||
#include "client.h"
|
||||
#include "hash.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "channel.h"
|
||||
|
||||
|
||||
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 );
|
||||
|
||||
|
||||
GLOBAL VOID Channel_Init( VOID )
|
||||
{
|
||||
My_Channels = NULL;
|
||||
My_Cl2Chan = NULL;
|
||||
} /* Channel_Init */
|
||||
|
||||
|
||||
GLOBAL VOID Channel_Exit( VOID )
|
||||
{
|
||||
CHANNEL *c, *c_next;
|
||||
CL2CHAN *cl2chan, *cl2chan_next;
|
||||
|
||||
/* Channel-Strukturen freigeben */
|
||||
c = My_Channels;
|
||||
while( c )
|
||||
{
|
||||
c_next = c->next;
|
||||
free( c );
|
||||
c = c_next;
|
||||
}
|
||||
|
||||
/* Channel-Zuordnungstabelle freigeben */
|
||||
cl2chan = My_Cl2Chan;
|
||||
while( c )
|
||||
{
|
||||
cl2chan_next = cl2chan->next;
|
||||
free( cl2chan );
|
||||
cl2chan = cl2chan_next;
|
||||
}
|
||||
} /* Channel_Exit */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name )
|
||||
{
|
||||
CHANNEL *chan;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Name != NULL );
|
||||
|
||||
/* Valider Channel-Name? */
|
||||
if( ! Channel_IsValidName( Name ))
|
||||
{
|
||||
IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Channel suchen */
|
||||
chan = Channel_Search( Name );
|
||||
if( chan )
|
||||
{
|
||||
/* Ist der Client bereits Mitglied? */
|
||||
if( Get_Cl2Chan( chan, Client )) return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Gibt es noch nicht? Dann neu anlegen: */
|
||||
chan = New_Chan( Name );
|
||||
if( ! chan ) return FALSE;
|
||||
|
||||
/* Verketten */
|
||||
chan->next = My_Channels;
|
||||
My_Channels = chan;
|
||||
}
|
||||
|
||||
/* User dem Channel hinzufuegen */
|
||||
if( ! Add_Client( chan, Client )) return FALSE;
|
||||
else return TRUE;
|
||||
} /* Channel_Join */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
|
||||
{
|
||||
CHANNEL *chan;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Name != NULL );
|
||||
|
||||
/* Channel suchen */
|
||||
chan = Channel_Search( Name );
|
||||
if(( ! chan ) || ( ! Get_Cl2Chan( chan, Client )))
|
||||
{
|
||||
IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* User aus Channel entfernen */
|
||||
if( ! Remove_Client( chan, Client, Origin, Reason, TRUE )) return FALSE;
|
||||
else return TRUE;
|
||||
} /* Channel_Part */
|
||||
|
||||
|
||||
GLOBAL VOID Channel_RemoveClient( CLIENT *Client, CHAR *Reason )
|
||||
{
|
||||
CHANNEL *c, *next_c;
|
||||
|
||||
assert( Client != NULL );
|
||||
|
||||
c = My_Channels;
|
||||
while( c )
|
||||
{
|
||||
next_c = c->next;
|
||||
Remove_Client( c, Client, Client_ThisServer( ), Reason, FALSE );
|
||||
c = next_c;
|
||||
}
|
||||
} /* Channel_RemoveClient */
|
||||
|
||||
|
||||
GLOBAL INT Channel_Count( VOID )
|
||||
{
|
||||
CHANNEL *c;
|
||||
INT count;
|
||||
|
||||
count = 0;
|
||||
c = My_Channels;
|
||||
while( c )
|
||||
{
|
||||
count++;
|
||||
c = c->next;
|
||||
}
|
||||
return count;
|
||||
} /* Channel_Count */
|
||||
|
||||
|
||||
GLOBAL INT Channel_MemberCount( CHANNEL *Chan )
|
||||
{
|
||||
CL2CHAN *cl2chan;
|
||||
INT 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 )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Chan->modes;
|
||||
} /* Channel_Modes */
|
||||
|
||||
|
||||
GLOBAL CHANNEL *Channel_First( VOID )
|
||||
{
|
||||
return My_Channels;
|
||||
} /* Channel_First */
|
||||
|
||||
|
||||
GLOBAL CHANNEL *Channel_Next( CHANNEL *Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Chan->next;
|
||||
} /* Channel_Next */
|
||||
|
||||
|
||||
GLOBAL CHANNEL *Channel_Search( CHAR *Name )
|
||||
{
|
||||
/* Channel-Struktur suchen */
|
||||
|
||||
CHANNEL *c;
|
||||
UINT32 search_hash;
|
||||
|
||||
assert( Name != NULL );
|
||||
|
||||
search_hash = Hash( Name );
|
||||
c = My_Channels;
|
||||
while( c )
|
||||
{
|
||||
if( search_hash == c->hash )
|
||||
{
|
||||
/* lt. Hash-Wert: Treffer! */
|
||||
if( strcasecmp( Name, c->name ) == 0 ) return c;
|
||||
}
|
||||
c = c->next;
|
||||
}
|
||||
return NULL;
|
||||
} /* Channel_Search */
|
||||
|
||||
|
||||
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 )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
assert( Cl2Chan != NULL );
|
||||
return Get_Next_Cl2Chan( Cl2Chan->next, NULL, Chan );
|
||||
} /* Channel_NextMember */
|
||||
|
||||
|
||||
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 )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Cl2Chan != NULL );
|
||||
return Get_Next_Cl2Chan( Cl2Chan->next, Client, NULL );
|
||||
} /* Channel_NextChannelOf */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Channel_GetClient( CL2CHAN *Cl2Chan )
|
||||
{
|
||||
assert( Cl2Chan != NULL );
|
||||
return Cl2Chan->client;
|
||||
} /* Channel_GetClient */
|
||||
|
||||
|
||||
GLOBAL CHANNEL *Channel_GetChannel( CL2CHAN *Cl2Chan )
|
||||
{
|
||||
assert( Cl2Chan != NULL );
|
||||
return Cl2Chan->channel;
|
||||
} /* Channel_GetChannel */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_IsValidName( CHAR *Name )
|
||||
{
|
||||
/* Pr<50>fen, ob Name als Channelname gueltig */
|
||||
|
||||
CHAR *ptr, badchars[] = " ,:\x07";
|
||||
|
||||
assert( Name != NULL );
|
||||
|
||||
if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return FALSE;
|
||||
|
||||
ptr = Name;
|
||||
while( *ptr )
|
||||
{
|
||||
if( strchr( badchars, *ptr )) return FALSE;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
} /* Channel_IsValidName */
|
||||
|
||||
|
||||
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
|
||||
* bereits hatte. */
|
||||
|
||||
CHAR x[2];
|
||||
|
||||
assert( Chan != NULL );
|
||||
|
||||
x[0] = Mode; x[1] = '\0';
|
||||
if( ! strchr( Chan->modes, x[0] ))
|
||||
{
|
||||
/* Client hat den Mode noch nicht -> setzen */
|
||||
strcat( Chan->modes, x );
|
||||
return TRUE;
|
||||
}
|
||||
else return FALSE;
|
||||
} /* Channel_ModeAdd */
|
||||
|
||||
|
||||
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
|
||||
* ueberhaupt nicht hatte. */
|
||||
|
||||
CHAR x[2], *p;
|
||||
|
||||
assert( Chan != NULL );
|
||||
|
||||
x[0] = Mode; x[1] = '\0';
|
||||
|
||||
p = strchr( Chan->modes, x[0] );
|
||||
if( ! p ) return FALSE;
|
||||
|
||||
/* Client hat den Mode -> loeschen */
|
||||
while( *p )
|
||||
{
|
||||
*p = *(p + 1);
|
||||
p++;
|
||||
}
|
||||
return TRUE;
|
||||
} /* Channel_ModeDel */
|
||||
|
||||
|
||||
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
|
||||
* Channel-Mode bereits hatte. */
|
||||
|
||||
CL2CHAN *cl2chan;
|
||||
CHAR x[2];
|
||||
|
||||
assert( Chan != NULL );
|
||||
assert( Client != NULL );
|
||||
|
||||
cl2chan = Get_Cl2Chan( Chan, Client );
|
||||
assert( cl2chan != NULL );
|
||||
|
||||
x[0] = Mode; x[1] = '\0';
|
||||
if( ! strchr( cl2chan->modes, x[0] ))
|
||||
{
|
||||
/* Client hat den Mode noch nicht -> setzen */
|
||||
strcat( cl2chan->modes, x );
|
||||
return TRUE;
|
||||
}
|
||||
else return FALSE;
|
||||
} /* Channel_UserModeAdd */
|
||||
|
||||
|
||||
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
|
||||
* ueberhaupt nicht hatte. */
|
||||
|
||||
CL2CHAN *cl2chan;
|
||||
CHAR x[2], *p;
|
||||
|
||||
assert( Chan != NULL );
|
||||
assert( Client != NULL );
|
||||
|
||||
cl2chan = Get_Cl2Chan( Chan, Client );
|
||||
assert( cl2chan != NULL );
|
||||
|
||||
x[0] = Mode; x[1] = '\0';
|
||||
|
||||
p = strchr( cl2chan->modes, x[0] );
|
||||
if( ! p ) return FALSE;
|
||||
|
||||
/* Client hat den Mode -> loeschen */
|
||||
while( *p )
|
||||
{
|
||||
*p = *(p + 1);
|
||||
p++;
|
||||
}
|
||||
return TRUE;
|
||||
} /* Channel_UserModeDel */
|
||||
|
||||
|
||||
GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
|
||||
{
|
||||
/* Channel-Modes eines Users liefern */
|
||||
|
||||
CL2CHAN *cl2chan;
|
||||
|
||||
assert( Chan != NULL );
|
||||
assert( Client != NULL );
|
||||
|
||||
cl2chan = Get_Cl2Chan( Chan, Client );
|
||||
assert( cl2chan != NULL );
|
||||
|
||||
return cl2chan->modes;
|
||||
} /* Channel_UserModes */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
|
||||
{
|
||||
/* Pruefen, ob Client Mitglied in Channel ist */
|
||||
|
||||
assert( Chan != NULL );
|
||||
assert( Client != NULL );
|
||||
|
||||
if( Get_Cl2Chan( Chan, Client )) return TRUE;
|
||||
else return FALSE;
|
||||
} /* Channel_IsMemberOf */
|
||||
|
||||
|
||||
GLOBAL CHAR *Channel_Topic( CHANNEL *Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Chan->topic;
|
||||
} /* Channel_Topic */
|
||||
|
||||
|
||||
GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
assert( Topic != NULL );
|
||||
|
||||
strncpy( Chan->topic, Topic, CHANNEL_TOPIC_LEN - 1 );
|
||||
Chan->topic[CHANNEL_TOPIC_LEN - 1] = '\0';
|
||||
} /* Channel_SetTopic */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text )
|
||||
{
|
||||
BOOLEAN is_member, has_voice, is_op, ok;
|
||||
|
||||
/* Okay, Ziel ist ein Channel */
|
||||
is_member = has_voice = is_op = FALSE;
|
||||
if( Channel_IsMemberOf( Chan, From ))
|
||||
{
|
||||
is_member = TRUE;
|
||||
if( strchr( Channel_UserModes( Chan, From ), 'v' )) has_voice = TRUE;
|
||||
if( strchr( Channel_UserModes( Chan, From ), 'o' )) is_op = TRUE;
|
||||
}
|
||||
|
||||
/* pruefen, ob Client in Channel schreiben darf */
|
||||
ok = TRUE;
|
||||
if( strchr( Channel_Modes( Chan ), 'n' ) && ( ! is_member )) ok = FALSE;
|
||||
if( strchr( Channel_Modes( Chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = FALSE;
|
||||
|
||||
if( ! ok ) return IRC_WriteStrClient( From, ERR_CANNOTSENDTOCHAN_MSG, Client_ID( From ), Channel_Name( Chan ));
|
||||
|
||||
/* Text senden */
|
||||
if( Client_Conn( From ) > NONE ) Conn_UpdateIdle( Client_Conn( From ));
|
||||
return IRC_WriteStrChannelPrefix( Client, Chan, From, TRUE, "PRIVMSG %s :%s", Channel_Name( Chan ), Text );
|
||||
} /* Channel_Write */
|
||||
|
||||
|
||||
|
||||
LOCAL CHANNEL *New_Chan( CHAR *Name )
|
||||
{
|
||||
/* Neue Channel-Struktur anlegen */
|
||||
|
||||
CHANNEL *c;
|
||||
|
||||
assert( Name != NULL );
|
||||
|
||||
c = malloc( sizeof( CHANNEL ));
|
||||
if( ! c )
|
||||
{
|
||||
Log( LOG_EMERG, "Can't allocate memory!" );
|
||||
return NULL;
|
||||
}
|
||||
c->next = NULL;
|
||||
strncpy( c->name, Name, CHANNEL_NAME_LEN - 1 );
|
||||
c->name[CHANNEL_NAME_LEN - 1] = '\0';
|
||||
strcpy( c->modes, "" );
|
||||
strcpy( c->topic, "" );
|
||||
c->hash = Hash( c->name );
|
||||
|
||||
Log( LOG_DEBUG, "Created new channel structure for \"%s\".", Name );
|
||||
|
||||
return c;
|
||||
} /* New_Chan */
|
||||
|
||||
|
||||
LOCAL CL2CHAN *Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
|
||||
{
|
||||
CL2CHAN *cl2chan;
|
||||
|
||||
assert( Chan != NULL );
|
||||
assert( Client != NULL );
|
||||
|
||||
cl2chan = My_Cl2Chan;
|
||||
while( cl2chan )
|
||||
{
|
||||
if(( cl2chan->channel == Chan ) && ( cl2chan->client == Client )) return cl2chan;
|
||||
cl2chan = cl2chan->next;
|
||||
}
|
||||
return NULL;
|
||||
} /* Get_Cl2Chan */
|
||||
|
||||
|
||||
LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client )
|
||||
{
|
||||
CL2CHAN *cl2chan;
|
||||
|
||||
assert( Chan != NULL );
|
||||
assert( Client != NULL );
|
||||
|
||||
/* neue CL2CHAN-Struktur anlegen */
|
||||
cl2chan = malloc( sizeof( CL2CHAN ));
|
||||
if( ! cl2chan )
|
||||
{
|
||||
Log( LOG_EMERG, "Can't allocate memory!" );
|
||||
return NULL;
|
||||
}
|
||||
cl2chan->channel = Chan;
|
||||
cl2chan->client = Client;
|
||||
strcpy( cl2chan->modes, "" );
|
||||
|
||||
/* Verketten */
|
||||
cl2chan->next = My_Cl2Chan;
|
||||
My_Cl2Chan = cl2chan;
|
||||
|
||||
Log( LOG_DEBUG, "User \"%s\" joined channel \"%s\".", Client_Mask( Client ), Chan->name );
|
||||
|
||||
return cl2chan;
|
||||
} /* Add_Client */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN ServerPART )
|
||||
{
|
||||
CL2CHAN *cl2chan, *last_cl2chan;
|
||||
CHANNEL *c;
|
||||
|
||||
assert( Chan != NULL );
|
||||
assert( Client != NULL );
|
||||
assert( Origin != NULL );
|
||||
assert( Reason != NULL );
|
||||
|
||||
last_cl2chan = NULL;
|
||||
cl2chan = My_Cl2Chan;
|
||||
while( cl2chan )
|
||||
{
|
||||
if(( cl2chan->channel == Chan ) && ( cl2chan->client == Client )) break;
|
||||
last_cl2chan = cl2chan;
|
||||
cl2chan = cl2chan->next;
|
||||
}
|
||||
if( ! cl2chan ) return FALSE;
|
||||
|
||||
c = cl2chan->channel;
|
||||
assert( c != NULL );
|
||||
|
||||
/* Aus Verkettung loesen und freigeben */
|
||||
if( last_cl2chan ) last_cl2chan->next = cl2chan->next;
|
||||
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 );
|
||||
|
||||
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 );
|
||||
|
||||
return TRUE;
|
||||
} /* Remove_Client */
|
||||
|
||||
|
||||
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 )
|
||||
{
|
||||
CL2CHAN *cl2chan;
|
||||
|
||||
assert( Client != NULL || Channel != NULL );
|
||||
|
||||
cl2chan = Start;
|
||||
while( cl2chan )
|
||||
{
|
||||
if(( Client ) && ( cl2chan->client == Client )) return cl2chan;
|
||||
if(( Channel ) && ( cl2chan->channel == Channel )) return cl2chan;
|
||||
cl2chan = cl2chan->next;
|
||||
}
|
||||
return NULL;
|
||||
} /* Get_Next_Cl2Chan */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Delete_Channel( CHANNEL *Chan )
|
||||
{
|
||||
/* Channel-Struktur loeschen */
|
||||
|
||||
CHANNEL *chan, *last_chan;
|
||||
|
||||
last_chan = NULL;
|
||||
chan = My_Channels;
|
||||
while( chan )
|
||||
{
|
||||
if( chan == Chan ) break;
|
||||
last_chan = chan;
|
||||
chan = chan->next;
|
||||
}
|
||||
if( ! chan ) return FALSE;
|
||||
|
||||
Log( LOG_DEBUG, "Freed channel structure for \"%s\".", Chan->name );
|
||||
|
||||
/* Neu verketten und freigeben */
|
||||
if( last_chan ) last_chan->next = chan->next;
|
||||
else My_Channels = chan->next;
|
||||
free( chan );
|
||||
|
||||
return TRUE;
|
||||
} /* Delete_Channel */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
|
@@ -9,41 +9,90 @@
|
||||
* 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.4 2002/01/02 02:42:58 alex Exp $
|
||||
* $Id: channel.h,v 1.16.2.1 2002/04/29 14:11:23 alex Exp $
|
||||
*
|
||||
* channel.h: Management der Channels (Header)
|
||||
*
|
||||
* $Log: channel.h,v $
|
||||
* Revision 1.4 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.3 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.2 2001/12/23 21:54:30 alex
|
||||
* - Konstanten um Prefix "CHANNEL_" erweitert.
|
||||
*
|
||||
* Revision 1.1 2001/12/14 08:13:43 alex
|
||||
* - neues Modul begonnen :-)
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __channel_h__
|
||||
#define __channel_h__
|
||||
|
||||
#include "client.h"
|
||||
|
||||
|
||||
#if defined(__channel_c__) | defined(S_SPLINT_S)
|
||||
|
||||
#include "defines.h"
|
||||
|
||||
typedef struct _CHANNEL
|
||||
{
|
||||
CHAR name[CHANNEL_NAME_LEN]; /* Name */
|
||||
struct _CHANNEL *next;
|
||||
CHAR name[CHANNEL_NAME_LEN]; /* Name des Channel */
|
||||
UINT32 hash; /* Hash ueber (kleingeschrieben) Namen */
|
||||
CHAR modes[CHANNEL_MODE_LEN]; /* Channel-Modes */
|
||||
CHAR topic[CHANNEL_TOPIC_LEN]; /* Topic des Channels */
|
||||
} CHANNEL;
|
||||
|
||||
typedef struct _CLIENT2CHAN
|
||||
{
|
||||
struct _CLIENT2CHAN *next;
|
||||
CLIENT *client;
|
||||
CHANNEL *channel;
|
||||
CHAR modes[CHANNEL_MODE_LEN]; /* User-Modes in dem Channel */
|
||||
} CL2CHAN;
|
||||
|
||||
#else
|
||||
|
||||
typedef POINTER CHANNEL;
|
||||
typedef POINTER CL2CHAN;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
GLOBAL VOID Channel_Init( VOID );
|
||||
GLOBAL VOID Channel_Exit( VOID );
|
||||
|
||||
GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name );
|
||||
GLOBAL BOOLEAN Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason );
|
||||
|
||||
GLOBAL VOID Channel_RemoveClient( CLIENT *Client, CHAR *Reason );
|
||||
|
||||
GLOBAL INT Channel_Count( VOID );
|
||||
GLOBAL INT Channel_MemberCount( CHANNEL *Chan );
|
||||
|
||||
GLOBAL CHAR *Channel_Name( CHANNEL *Chan );
|
||||
GLOBAL CHAR *Channel_Modes( CHANNEL *Chan );
|
||||
GLOBAL CHAR *Channel_Topic( CHANNEL *Chan );
|
||||
|
||||
GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic );
|
||||
|
||||
GLOBAL CHANNEL *Channel_Search( CHAR *Name );
|
||||
|
||||
GLOBAL CHANNEL *Channel_First( VOID );
|
||||
GLOBAL CHANNEL *Channel_Next( CHANNEL *Chan );
|
||||
|
||||
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 CLIENT *Channel_GetClient( CL2CHAN *Cl2Chan );
|
||||
GLOBAL CHANNEL *Channel_GetChannel( CL2CHAN *Cl2Chan );
|
||||
|
||||
GLOBAL BOOLEAN Channel_IsValidName( CHAR *Name );
|
||||
|
||||
GLOBAL BOOLEAN Channel_ModeAdd( CHANNEL *Chan, CHAR Mode );
|
||||
GLOBAL BOOLEAN Channel_ModeDel( CHANNEL *Chan, CHAR Mode );
|
||||
|
||||
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_IsMemberOf( CHANNEL *Chan, CLIENT *Client );
|
||||
|
||||
GLOBAL BOOLEAN Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text );
|
||||
|
||||
|
||||
#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.24 2002/01/06 15:18:14 alex Exp $
|
||||
* $Id: client.c,v 1.53.2.1 2002/04/29 14:11:23 alex Exp $
|
||||
*
|
||||
* client.c: Management aller Clients
|
||||
*
|
||||
@@ -19,94 +19,15 @@
|
||||
* Ueber welchen IRC-Server die Verbindung nun tatsaechlich in das Netzwerk her-
|
||||
* gestellt wurde, muss der jeweiligen Struktur entnommen werden. Ist es dieser
|
||||
* Server gewesen, so existiert eine entsprechende CONNECTION-Struktur.
|
||||
*
|
||||
* $Log: client.c,v $
|
||||
* Revision 1.24 2002/01/06 15:18:14 alex
|
||||
* - Loglevel und Meldungen nochmals geaendert. Level passen nun besser.
|
||||
*
|
||||
* Revision 1.23 2002/01/05 23:26:05 alex
|
||||
* - Vorbereitungen fuer Ident-Abfragen in Client-Strukturen.
|
||||
*
|
||||
* Revision 1.22 2002/01/05 20:08:17 alex
|
||||
* - neue Funktion Client_NextHop().
|
||||
*
|
||||
* Revision 1.21 2002/01/05 19:15:03 alex
|
||||
* - Fehlerpruefung bei select() in der "Hauptschleife" korrigiert.
|
||||
*
|
||||
* Revision 1.20 2002/01/04 17:57:08 alex
|
||||
* - Client_Destroy() an Server-Links angepasst.
|
||||
*
|
||||
* Revision 1.19 2002/01/04 01:21:22 alex
|
||||
* - Client-Strukturen koennen von anderen Modulen nun nur noch ueber die
|
||||
* enstprechenden (zum Teil neuen) Funktionen angesprochen werden.
|
||||
*
|
||||
* Revision 1.18 2002/01/03 02:28:06 alex
|
||||
* - neue Funktion Client_CheckID(), diverse Aenderungen fuer Server-Links.
|
||||
*
|
||||
* Revision 1.17 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.16 2002/01/01 18:25:44 alex
|
||||
* - #include's fuer stdlib.h ergaenzt.
|
||||
*
|
||||
* Revision 1.15 2001/12/31 15:33:13 alex
|
||||
* - neuer Befehl NAMES, kleinere Bugfixes.
|
||||
* - Bug bei PING behoben: war zu restriktiv implementiert :-)
|
||||
*
|
||||
* Revision 1.14 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.13 2001/12/30 19:26:11 alex
|
||||
* - Unterstuetzung fuer die Konfigurationsdatei eingebaut.
|
||||
*
|
||||
* Revision 1.12 2001/12/29 20:18:18 alex
|
||||
* - neue Funktion Client_SetHostname().
|
||||
*
|
||||
* Revision 1.11 2001/12/29 03:10:47 alex
|
||||
* - Client-Modes implementiert; Loglevel mal wieder angepasst.
|
||||
*
|
||||
* Revision 1.10 2001/12/27 19:13:47 alex
|
||||
* - neue Funktion Client_Search(), besseres Logging.
|
||||
*
|
||||
* Revision 1.9 2001/12/27 17:15:29 alex
|
||||
* - der eigene Hostname wird nun komplet (als FQDN) ermittelt.
|
||||
*
|
||||
* Revision 1.8 2001/12/27 16:54:51 alex
|
||||
* - neue Funktion Client_GetID(), liefert die "Client ID".
|
||||
*
|
||||
* Revision 1.7 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.6 2001/12/26 03:19:16 alex
|
||||
* - neue Funktion Client_Nick().
|
||||
*
|
||||
* Revision 1.5 2001/12/25 22:04:26 alex
|
||||
* - Aenderungen an den Debug- und Logging-Funktionen.
|
||||
*
|
||||
* Revision 1.4 2001/12/25 19:21:26 alex
|
||||
* - Client-Typ ("Status") besser unterteilt, My_Clients ist zudem nun global.
|
||||
*
|
||||
* Revision 1.3 2001/12/24 01:31:14 alex
|
||||
* - einige assert()'s eingestraeut.
|
||||
*
|
||||
* Revision 1.2 2001/12/23 22:04:37 alex
|
||||
* - einige neue Funktionen,
|
||||
* - CLIENT-Struktur erweitert.
|
||||
*
|
||||
* Revision 1.1 2001/12/14 08:13:43 alex
|
||||
* - neues Modul begonnen :-)
|
||||
*/
|
||||
|
||||
|
||||
#define __client_c__
|
||||
|
||||
|
||||
#include <portab.h>
|
||||
#include "global.h"
|
||||
#include "portab.h"
|
||||
|
||||
#include <imp.h>
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
@@ -114,7 +35,7 @@
|
||||
#include <string.h>
|
||||
#include <netdb.h>
|
||||
|
||||
#include <exp.h>
|
||||
#include "exp.h"
|
||||
#include "client.h"
|
||||
|
||||
#include <imp.h>
|
||||
@@ -122,7 +43,8 @@
|
||||
#include "channel.h"
|
||||
#include "conf.h"
|
||||
#include "conn.h"
|
||||
#include "irc.h"
|
||||
#include "hash.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
|
||||
@@ -133,7 +55,11 @@ LOCAL CLIENT *This_Server, *My_Clients;
|
||||
LOCAL CHAR GetID_Buffer[CLIENT_ID_LEN];
|
||||
|
||||
|
||||
LOCAL INT Count( CLIENT_TYPE Type );
|
||||
LOCAL INT MyCount( CLIENT_TYPE Type );
|
||||
|
||||
LOCAL CLIENT *New_Client_Struct( VOID );
|
||||
LOCAL VOID Generate_MyToken( CLIENT *Client );
|
||||
|
||||
|
||||
GLOBAL VOID Client_Init( VOID )
|
||||
@@ -153,13 +79,15 @@ GLOBAL VOID Client_Init( VOID )
|
||||
This_Server->type = CLIENT_SERVER;
|
||||
This_Server->conn_id = NONE;
|
||||
This_Server->introducer = This_Server;
|
||||
This_Server->mytoken = 1;
|
||||
This_Server->hops = 0;
|
||||
|
||||
gethostname( This_Server->host, CLIENT_HOST_LEN );
|
||||
h = gethostbyname( This_Server->host );
|
||||
if( h ) strcpy( This_Server->host, h->h_name );
|
||||
|
||||
strcpy( This_Server->id, Conf_ServerName );
|
||||
strcpy( This_Server->info, Conf_ServerInfo );
|
||||
Client_SetID( This_Server, Conf_ServerName );
|
||||
Client_SetInfo( This_Server, Conf_ServerInfo );
|
||||
|
||||
My_Clients = This_Server;
|
||||
} /* Client_Init */
|
||||
@@ -170,14 +98,14 @@ GLOBAL VOID Client_Exit( VOID )
|
||||
CLIENT *c, *next;
|
||||
INT cnt;
|
||||
|
||||
Client_Destroy( This_Server, "Server going down.", NULL );
|
||||
Client_Destroy( This_Server, "Server going down.", NULL, FALSE );
|
||||
|
||||
cnt = 0;
|
||||
c = My_Clients;
|
||||
while( c )
|
||||
{
|
||||
cnt++;
|
||||
next = c->next;
|
||||
next = (CLIENT *)c->next;
|
||||
free( c );
|
||||
c = next;
|
||||
}
|
||||
@@ -194,25 +122,25 @@ GLOBAL CLIENT *Client_ThisServer( VOID )
|
||||
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, Type, NULL, NULL, Hostname, NULL, 0, 0, NULL, Idented );
|
||||
return Client_New( Idx, This_Server, NULL, Type, NULL, NULL, Hostname, NULL, 0, 0, NULL, Idented );
|
||||
} /* Client_NewLocal */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_NewRemoteServer( CLIENT *Introducer, CHAR *Hostname, 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, CLIENT_SERVER, Hostname, NULL, Hostname, Info, Hops, Token, NULL, Idented );
|
||||
return Client_New( NONE, Introducer, TopServer, CLIENT_SERVER, Hostname, NULL, Hostname, Info, Hops, Token, NULL, Idented );
|
||||
} /* Client_NewRemoteServer */
|
||||
|
||||
|
||||
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, CLIENT_USER, Nick, User, Hostname, Info, Hops, Token, NULL, Idented );
|
||||
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, 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;
|
||||
|
||||
@@ -226,6 +154,7 @@ GLOBAL CLIENT *Client_New( CONN_ID Idx, CLIENT *Introducer, INT Type, CHAR *ID,
|
||||
/* Initialisieren */
|
||||
client->conn_id = Idx;
|
||||
client->introducer = Introducer;
|
||||
client->topserver = TopServer;
|
||||
client->type = Type;
|
||||
if( ID ) Client_SetID( client, ID );
|
||||
if( User ) Client_SetUser( client, User, Idented );
|
||||
@@ -234,21 +163,25 @@ GLOBAL CLIENT *Client_New( CONN_ID Idx, CLIENT *Introducer, INT Type, CHAR *ID,
|
||||
client->hops = Hops;
|
||||
client->token = Token;
|
||||
if( Modes ) Client_SetModes( client, Modes );
|
||||
if( Type == CLIENT_SERVER ) Generate_MyToken( client );
|
||||
|
||||
/* ist der User away? */
|
||||
if( strchr( client->modes, 'a' )) strcpy( client->away, DEFAULT_AWAY_MSG );
|
||||
|
||||
/* Verketten */
|
||||
client->next = My_Clients;
|
||||
client->next = (POINTER *)My_Clients;
|
||||
My_Clients = client;
|
||||
|
||||
return client;
|
||||
} /* Client_New */
|
||||
|
||||
|
||||
GLOBAL VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg )
|
||||
GLOBAL VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )
|
||||
{
|
||||
/* Client entfernen. */
|
||||
|
||||
CLIENT *last, *c;
|
||||
CHAR *txt;
|
||||
CHAR msg[LINE_LEN], *txt;
|
||||
|
||||
assert( Client != NULL );
|
||||
|
||||
@@ -256,48 +189,92 @@ GLOBAL VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg )
|
||||
else txt = FwdMsg;
|
||||
if( ! txt ) txt = "Reason unknown.";
|
||||
|
||||
/* Netz-Split-Nachricht vorbereiten (noch nicht optimal) */
|
||||
if( Client->type == CLIENT_SERVER ) sprintf( msg, "%s: lost server %s", This_Server->id, Client->id );
|
||||
|
||||
last = NULL;
|
||||
c = My_Clients;
|
||||
while( c )
|
||||
{
|
||||
if(( Client->type == CLIENT_SERVER ) && ( c->introducer == Client ) && ( c != Client ))
|
||||
{
|
||||
Client_Destroy( c, LogMsg, FwdMsg );
|
||||
/* der Client, der geloescht wird ist ein Server. Der Client, den wir gerade
|
||||
* pruefen, ist ein Child von diesem und muss daher auch entfernt werden */
|
||||
Client_Destroy( c, NULL, msg, FALSE );
|
||||
last = NULL;
|
||||
c = My_Clients;
|
||||
continue;
|
||||
}
|
||||
if( c == Client )
|
||||
{
|
||||
/* Wir haben den Client gefunden: entfernen */
|
||||
if( last ) last->next = c->next;
|
||||
else My_Clients = c->next;
|
||||
else My_Clients = (CLIENT *)c->next;
|
||||
|
||||
if( c->type == CLIENT_USER )
|
||||
{
|
||||
if( c->conn_id != NONE )
|
||||
{
|
||||
/* Ein lokaler User. Andere Server informieren! */
|
||||
Log( LOG_NOTICE, "User \"%s\" unregistered (connection %d): %s", c->id, c->conn_id, txt );
|
||||
/* Ein lokaler User */
|
||||
Log( LOG_NOTICE, "User \"%s\" unregistered (connection %d): %s", Client_Mask( c ), c->conn_id, txt );
|
||||
|
||||
if( FwdMsg ) IRC_WriteStrServersPrefix( NULL, c, "QUIT :%s", FwdMsg );
|
||||
else IRC_WriteStrServersPrefix( NULL, c, "QUIT :" );
|
||||
if( SendQuit )
|
||||
{
|
||||
/* Alle andere Server informieren! */
|
||||
if( FwdMsg ) IRC_WriteStrServersPrefix( NULL, c, "QUIT :%s", FwdMsg );
|
||||
else IRC_WriteStrServersPrefix( NULL, c, "QUIT :" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log( LOG_DEBUG, "User \"%s\" unregistered: %s", c->id, txt );
|
||||
/* Remote User */
|
||||
Log( LOG_DEBUG, "User \"%s\" unregistered: %s", Client_Mask( c ), txt );
|
||||
|
||||
if( SendQuit )
|
||||
{
|
||||
/* Andere Server informieren, ausser denen, die "in
|
||||
* Richtung dem liegen", auf dem der User registriert
|
||||
* ist. Von denen haben wir das QUIT ja wohl bekommen. */
|
||||
if( FwdMsg ) IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "QUIT :%s", FwdMsg );
|
||||
else IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "QUIT :" );
|
||||
}
|
||||
}
|
||||
Channel_RemoveClient( c, FwdMsg ? FwdMsg : c->id );
|
||||
}
|
||||
else if( c->type == CLIENT_SERVER )
|
||||
{
|
||||
if( c != This_Server ) Log( LOG_NOTICE, "Server \"%s\" unregistered: %s", c->id, txt );
|
||||
if( c != This_Server )
|
||||
{
|
||||
if( c->conn_id != NONE ) Log( LOG_NOTICE|LOG_snotice, "Server \"%s\" unregistered (connection %d): %s", c->id, c->conn_id, txt );
|
||||
else Log( LOG_NOTICE|LOG_snotice, "Server \"%s\" unregistered: %s", c->id, txt );
|
||||
}
|
||||
|
||||
/* andere Server informieren */
|
||||
if( ! NGIRCd_Quit )
|
||||
{
|
||||
if( FwdMsg ) IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "SQUIT %s :%s", c->id, FwdMsg );
|
||||
else IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "SQUIT %s :", c->id );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( c->conn_id != NONE )
|
||||
{
|
||||
if( c->id[0] ) Log( LOG_NOTICE, "Client \"%s\" unregistered (connection %d): %s", c->id, c->conn_id, txt );
|
||||
else Log( LOG_NOTICE, "Client unregistered (connection %d): %s", c->conn_id, txt );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( c->id[0] ) Log( LOG_WARNING, "Unregistered unknown client \"%s\": %s", c->id, txt );
|
||||
else Log( LOG_WARNING, "Unregistered unknown client: %s", c->id, txt );
|
||||
}
|
||||
}
|
||||
else Log( LOG_NOTICE, "Unknown client \"%s\" unregistered: %s", c->id, txt );
|
||||
|
||||
free( c );
|
||||
break;
|
||||
}
|
||||
last = c;
|
||||
c = c->next;
|
||||
c = (CLIENT *)c->next;
|
||||
}
|
||||
} /* Client_Destroy */
|
||||
|
||||
@@ -307,18 +284,25 @@ GLOBAL VOID Client_SetHostname( CLIENT *Client, CHAR *Hostname )
|
||||
/* Hostname eines Clients setzen */
|
||||
|
||||
assert( Client != NULL );
|
||||
strncpy( Client->host, Hostname, CLIENT_HOST_LEN );
|
||||
assert( Hostname != NULL );
|
||||
|
||||
strncpy( Client->host, Hostname, CLIENT_HOST_LEN - 1 );
|
||||
Client->host[CLIENT_HOST_LEN - 1] = '\0';
|
||||
} /* Client_SetHostname */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetID( CLIENT *Client, CHAR *ID )
|
||||
{
|
||||
/* Hostname eines Clients setzen */
|
||||
/* Hostname eines Clients setzen, Hash-Wert berechnen */
|
||||
|
||||
assert( Client != NULL );
|
||||
strncpy( Client->id, ID, CLIENT_ID_LEN );
|
||||
assert( ID != NULL );
|
||||
|
||||
strncpy( Client->id, ID, CLIENT_ID_LEN - 1 );
|
||||
Client->id[CLIENT_ID_LEN - 1] = '\0';
|
||||
|
||||
/* Hash */
|
||||
Client->hash = Hash( Client->id );
|
||||
} /* Client_SetID */
|
||||
|
||||
|
||||
@@ -327,11 +311,13 @@ GLOBAL VOID Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented )
|
||||
/* Username eines Clients setzen */
|
||||
|
||||
assert( Client != NULL );
|
||||
if( Idented ) strncpy( Client->user, User, CLIENT_USER_LEN );
|
||||
assert( User != NULL );
|
||||
|
||||
if( Idented ) strncpy( Client->user, User, CLIENT_USER_LEN - 1 );
|
||||
else
|
||||
{
|
||||
Client->user[0] = '~';
|
||||
strncpy( Client->user + 1, User, CLIENT_USER_LEN - 1 );
|
||||
strncpy( Client->user + 1, User, CLIENT_USER_LEN - 2 );
|
||||
}
|
||||
Client->user[CLIENT_USER_LEN - 1] = '\0';
|
||||
} /* Client_SetUser */
|
||||
@@ -342,7 +328,9 @@ GLOBAL VOID Client_SetInfo( CLIENT *Client, CHAR *Info )
|
||||
/* Hostname eines Clients setzen */
|
||||
|
||||
assert( Client != NULL );
|
||||
strncpy( Client->info, Info, CLIENT_INFO_LEN );
|
||||
assert( Info != NULL );
|
||||
|
||||
strncpy( Client->info, Info, CLIENT_INFO_LEN - 1 );
|
||||
Client->info[CLIENT_INFO_LEN - 1] = '\0';
|
||||
} /* Client_SetInfo */
|
||||
|
||||
@@ -352,8 +340,10 @@ GLOBAL VOID Client_SetModes( CLIENT *Client, CHAR *Modes )
|
||||
/* Hostname eines Clients setzen */
|
||||
|
||||
assert( Client != NULL );
|
||||
strncpy( Client->modes, Modes, CLIENT_MODE_LEN );
|
||||
Client->info[CLIENT_MODE_LEN - 1] = '\0';
|
||||
assert( Modes != NULL );
|
||||
|
||||
strncpy( Client->modes, Modes, CLIENT_MODE_LEN - 1 );
|
||||
Client->modes[CLIENT_MODE_LEN - 1] = '\0';
|
||||
} /* Client_SetModes */
|
||||
|
||||
|
||||
@@ -362,15 +352,41 @@ GLOBAL VOID Client_SetPassword( CLIENT *Client, CHAR *Pwd )
|
||||
/* Von einem Client geliefertes Passwort */
|
||||
|
||||
assert( Client != NULL );
|
||||
strncpy( Client->pwd, Pwd, CLIENT_PASS_LEN );
|
||||
assert( Pwd != NULL );
|
||||
|
||||
strncpy( Client->pwd, Pwd, CLIENT_PASS_LEN - 1 );
|
||||
Client->pwd[CLIENT_PASS_LEN - 1] = '\0';
|
||||
} /* Client_SetPassword */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetAway( CLIENT *Client, CHAR *Txt )
|
||||
{
|
||||
/* Von einem Client gelieferte AWAY-Nachricht */
|
||||
|
||||
assert( Client != NULL );
|
||||
|
||||
if( Txt )
|
||||
{
|
||||
/* Client AWAY setzen */
|
||||
strncpy( Client->away, Txt, CLIENT_AWAY_LEN - 1 );
|
||||
Client->away[CLIENT_AWAY_LEN - 1] = '\0';
|
||||
Client_ModeAdd( Client, 'a' );
|
||||
Log( LOG_DEBUG, "User \"%s\" is away: %s", Client_Mask( Client ), Txt );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* AWAY loeschen */
|
||||
Client_ModeDel( Client, 'a' );
|
||||
Log( LOG_DEBUG, "User \"%s\" is no longer away.", Client_Mask( Client ));
|
||||
}
|
||||
} /* Client_SetAway */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetType( CLIENT *Client, INT Type )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
Client->type = Type;
|
||||
if( Type == CLIENT_SERVER ) Generate_MyToken( Client );
|
||||
} /* Client_SetType */
|
||||
|
||||
|
||||
@@ -391,6 +407,7 @@ GLOBAL VOID Client_SetToken( CLIENT *Client, INT Token )
|
||||
GLOBAL VOID Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Introducer != NULL );
|
||||
Client->introducer = Introducer;
|
||||
} /* Client_SetIntroducer */
|
||||
|
||||
@@ -461,29 +478,43 @@ GLOBAL CLIENT *Client_GetFromConn( CONN_ID Idx )
|
||||
while( c )
|
||||
{
|
||||
if( c->conn_id == Idx ) return c;
|
||||
c = c->next;
|
||||
c = (CLIENT *)c->next;
|
||||
}
|
||||
return NULL;
|
||||
} /* Client_GetFromConn */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_GetFromID( CHAR *Nick )
|
||||
GLOBAL CLIENT *Client_Search( CHAR *Nick )
|
||||
{
|
||||
/* Client-Struktur, die den entsprechenden Nick hat,
|
||||
* liefern. Wird keine gefunden, so wird NULL geliefert. */
|
||||
/* Client-Struktur, die den entsprechenden Nick hat, liefern.
|
||||
* Wird keine gefunden, so wird NULL geliefert. */
|
||||
|
||||
CLIENT *c;
|
||||
CHAR search_id[CLIENT_ID_LEN], *ptr;
|
||||
CLIENT *c = NULL;
|
||||
UINT32 search_hash;
|
||||
|
||||
assert( Nick != NULL );
|
||||
|
||||
/* Nick kopieren und ggf. Host-Mask abschneiden */
|
||||
strncpy( search_id, Nick, CLIENT_ID_LEN - 1 );
|
||||
search_id[CLIENT_ID_LEN - 1] = '\0';
|
||||
ptr = strchr( search_id, '!' );
|
||||
if( ptr ) *ptr = '\0';
|
||||
|
||||
search_hash = Hash( search_id );
|
||||
|
||||
c = My_Clients;
|
||||
while( c )
|
||||
{
|
||||
if( strcasecmp( c->id, Nick ) == 0 ) return c;
|
||||
c = c->next;
|
||||
if( c->hash == search_hash )
|
||||
{
|
||||
/* lt. Hash-Wert: Treffer! */
|
||||
if( strcasecmp( c->id, search_id ) == 0 ) return c;
|
||||
}
|
||||
c = (CLIENT *)c->next;
|
||||
}
|
||||
return NULL;
|
||||
} /* Client_GetFromID */
|
||||
} /* Client_Search */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_GetFromToken( CLIENT *Client, INT Token )
|
||||
@@ -501,7 +532,7 @@ GLOBAL CLIENT *Client_GetFromToken( CLIENT *Client, INT Token )
|
||||
while( c )
|
||||
{
|
||||
if(( c->type == CLIENT_SERVER ) && ( c->introducer == Client ) && ( c->token == Token )) return c;
|
||||
c = c->next;
|
||||
c = (CLIENT *)c->next;
|
||||
}
|
||||
return NULL;
|
||||
} /* Client_GetFromToken */
|
||||
@@ -525,6 +556,10 @@ GLOBAL CHAR *Client_ID( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
|
||||
#ifdef DEBUG
|
||||
if( Client->type == CLIENT_USER ) assert( strlen( Client->id ) < CLIENT_NICK_LEN );
|
||||
#endif
|
||||
|
||||
if( Client->id[0] ) return Client->id;
|
||||
else return "*";
|
||||
} /* Client_ID */
|
||||
@@ -540,7 +575,7 @@ GLOBAL CHAR *Client_Info( CLIENT *Client )
|
||||
GLOBAL CHAR *Client_User( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
if( Client->user ) return Client->user;
|
||||
if( Client->user[0] ) return Client->user;
|
||||
else return "~";
|
||||
} /* Client_User */
|
||||
|
||||
@@ -587,6 +622,13 @@ GLOBAL INT Client_Token( CLIENT *Client )
|
||||
} /* Client_Token */
|
||||
|
||||
|
||||
GLOBAL INT Client_MyToken( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Client->mytoken;
|
||||
} /* Client_MyToken */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_NextHop( CLIENT *Client )
|
||||
{
|
||||
CLIENT *c;
|
||||
@@ -620,6 +662,13 @@ GLOBAL CLIENT *Client_Introducer( CLIENT *Client )
|
||||
} /* Client_Introducer */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_TopServer( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Client->topserver;
|
||||
} /* Client_TopServer */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Client_HasMode( CLIENT *Client, CHAR Mode )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
@@ -627,29 +676,35 @@ GLOBAL BOOLEAN Client_HasMode( CLIENT *Client, CHAR Mode )
|
||||
} /* Client_HasMode */
|
||||
|
||||
|
||||
GLOBAL CHAR *Client_Away( CLIENT *Client )
|
||||
{
|
||||
/* AWAY-Text liefern */
|
||||
|
||||
assert( Client != NULL );
|
||||
return Client->away;
|
||||
} /* Client_Away */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick )
|
||||
{
|
||||
/* Nick ueberpruefen */
|
||||
|
||||
CLIENT *c;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Nick != NULL );
|
||||
|
||||
/* Nick zu lang? */
|
||||
if( strlen( Nick ) > CLIENT_NICK_LEN ) return IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), Nick );
|
||||
/* Nick ungueltig? */
|
||||
if( ! Client_IsValidNick( Nick ))
|
||||
{
|
||||
IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), Nick );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Nick bereits vergeben? */
|
||||
c = My_Clients;
|
||||
while( c )
|
||||
if( Client_Search( Nick ))
|
||||
{
|
||||
if( strcasecmp( c->id, Nick ) == 0 )
|
||||
{
|
||||
/* den Nick gibt es bereits */
|
||||
IRC_WriteStrClient( Client, ERR_NICKNAMEINUSE_MSG, Client_ID( Client ), Nick );
|
||||
return FALSE;
|
||||
}
|
||||
c = c->next;
|
||||
/* den Nick gibt es bereits */
|
||||
IRC_WriteStrClient( Client, ERR_NICKNAMEINUSE_MSG, Client_ID( Client ), Nick );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
@@ -668,7 +723,11 @@ GLOBAL BOOLEAN Client_CheckID( CLIENT *Client, CHAR *ID )
|
||||
assert( ID != NULL );
|
||||
|
||||
/* Nick zu lang? */
|
||||
if( strlen( ID ) > CLIENT_ID_LEN ) return IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), ID );
|
||||
if( strlen( ID ) > CLIENT_ID_LEN )
|
||||
{
|
||||
IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), ID );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* ID bereits vergeben? */
|
||||
c = My_Clients;
|
||||
@@ -682,32 +741,13 @@ GLOBAL BOOLEAN Client_CheckID( CLIENT *Client, CHAR *ID )
|
||||
Conn_Close( Client->conn_id, str, str, TRUE );
|
||||
return FALSE;
|
||||
}
|
||||
c = c->next;
|
||||
c = (CLIENT *)c->next;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
} /* Client_CheckID */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_Search( CHAR *ID )
|
||||
{
|
||||
/* Client suchen, auf den ID passt */
|
||||
|
||||
CLIENT *c;
|
||||
|
||||
assert( ID != NULL );
|
||||
|
||||
c = My_Clients;
|
||||
while( c )
|
||||
{
|
||||
if( strcasecmp( c->id, ID ) == 0 ) return c;
|
||||
c = c->next;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
} /* Client_Search */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Client_First( VOID )
|
||||
{
|
||||
/* Ersten Client liefern. */
|
||||
@@ -722,16 +762,149 @@ GLOBAL CLIENT *Client_Next( CLIENT *c )
|
||||
* so wird NULL geliefert. */
|
||||
|
||||
assert( c != NULL );
|
||||
return c->next;
|
||||
return (CLIENT *)c->next;
|
||||
} /* Client_Next */
|
||||
|
||||
|
||||
GLOBAL INT Client_UserCount( VOID )
|
||||
{
|
||||
return Count( CLIENT_USER );
|
||||
} /* Client_UserCount */
|
||||
|
||||
|
||||
GLOBAL INT Client_ServiceCount( VOID )
|
||||
{
|
||||
return Count( CLIENT_SERVICE );;
|
||||
} /* Client_ServiceCount */
|
||||
|
||||
|
||||
GLOBAL INT Client_ServerCount( VOID )
|
||||
{
|
||||
return Count( CLIENT_SERVER );
|
||||
} /* Client_ServerCount */
|
||||
|
||||
|
||||
GLOBAL INT Client_MyUserCount( VOID )
|
||||
{
|
||||
return MyCount( CLIENT_USER );
|
||||
} /* Client_MyUserCount */
|
||||
|
||||
|
||||
GLOBAL INT Client_MyServiceCount( VOID )
|
||||
{
|
||||
return MyCount( CLIENT_SERVICE );
|
||||
} /* Client_MyServiceCount */
|
||||
|
||||
|
||||
GLOBAL INT Client_MyServerCount( VOID )
|
||||
{
|
||||
CLIENT *c;
|
||||
INT 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 )
|
||||
{
|
||||
CLIENT *c;
|
||||
INT cnt;
|
||||
|
||||
cnt = 0;
|
||||
c = My_Clients;
|
||||
while( c )
|
||||
{
|
||||
if( c && ( c->type == CLIENT_USER ) && ( strchr( c->modes, 'o' ))) cnt++;
|
||||
c = (CLIENT *)c->next;
|
||||
}
|
||||
return cnt;
|
||||
} /* Client_OperCount */
|
||||
|
||||
|
||||
GLOBAL INT Client_UnknownCount( VOID )
|
||||
{
|
||||
CLIENT *c;
|
||||
INT cnt;
|
||||
|
||||
cnt = 0;
|
||||
c = My_Clients;
|
||||
while( c )
|
||||
{
|
||||
if( c && ( c->type != CLIENT_USER ) && ( c->type != CLIENT_SERVICE ) && ( c->type != CLIENT_SERVER )) cnt++;
|
||||
c = (CLIENT *)c->next;
|
||||
}
|
||||
return cnt;
|
||||
} /* Client_UnknownCount */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Client_IsValidNick( CHAR *Nick )
|
||||
{
|
||||
/* Ist der Nick gueltig? */
|
||||
|
||||
CHAR *ptr, goodchars[] = ";0123456789-";
|
||||
|
||||
assert( Nick != NULL );
|
||||
|
||||
if( Nick[0] == '#' ) return FALSE;
|
||||
if( strchr( goodchars, Nick[0] )) return FALSE;
|
||||
if( strlen( Nick ) >= CLIENT_NICK_LEN ) return FALSE;
|
||||
|
||||
ptr = Nick;
|
||||
while( *ptr )
|
||||
{
|
||||
if(( *ptr < 'A' ) && ( ! strchr( goodchars, *ptr ))) return FALSE;
|
||||
if(( *ptr > '}' ) && ( ! strchr( goodchars, *ptr ))) return FALSE;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
} /* Client_IsValidNick */
|
||||
|
||||
|
||||
LOCAL INT Count( CLIENT_TYPE Type )
|
||||
{
|
||||
CLIENT *c;
|
||||
INT cnt;
|
||||
|
||||
cnt = 0;
|
||||
c = My_Clients;
|
||||
while( c )
|
||||
{
|
||||
if( c->type == Type ) cnt++;
|
||||
c = (CLIENT *)c->next;
|
||||
}
|
||||
return cnt;
|
||||
} /* Count */
|
||||
|
||||
|
||||
LOCAL INT MyCount( CLIENT_TYPE Type )
|
||||
{
|
||||
CLIENT *c;
|
||||
INT cnt;
|
||||
|
||||
cnt = 0;
|
||||
c = My_Clients;
|
||||
while( c )
|
||||
{
|
||||
if(( c->introducer == This_Server ) && ( c->type == Type )) cnt++;
|
||||
c = (CLIENT *)c->next;
|
||||
}
|
||||
return cnt;
|
||||
} /* MyCount */
|
||||
|
||||
|
||||
LOCAL CLIENT *New_Client_Struct( VOID )
|
||||
{
|
||||
/* Neue CLIENT-Struktur pre-initialisieren */
|
||||
|
||||
CLIENT *c;
|
||||
INT i;
|
||||
|
||||
c = malloc( sizeof( CLIENT ));
|
||||
if( ! c )
|
||||
@@ -741,22 +914,48 @@ LOCAL CLIENT *New_Client_Struct( VOID )
|
||||
}
|
||||
|
||||
c->next = NULL;
|
||||
c->hash = 0;
|
||||
c->type = CLIENT_UNKNOWN;
|
||||
c->conn_id = NONE;
|
||||
c->introducer = NULL;
|
||||
c->topserver = NULL;
|
||||
strcpy( c->id, "" );
|
||||
strcpy( c->pwd, "" );
|
||||
strcpy( c->host, "" );
|
||||
strcpy( c->user, "" );
|
||||
strcpy( c->info, "" );
|
||||
for( i = 0; i < MAX_CHANNELS; c->channels[i++] = NULL );
|
||||
strcpy( c->modes, "" );
|
||||
c->oper_by_me = FALSE;
|
||||
c->hops = -1;
|
||||
c->token = -1;
|
||||
c->mytoken = -1;
|
||||
strcpy( c->away, "" );
|
||||
|
||||
return c;
|
||||
} /* New_Client */
|
||||
|
||||
|
||||
LOCAL VOID Generate_MyToken( CLIENT *Client )
|
||||
{
|
||||
CLIENT *c;
|
||||
INT token;
|
||||
|
||||
c = My_Clients;
|
||||
token = 2;
|
||||
while( c )
|
||||
{
|
||||
if( c->mytoken == token )
|
||||
{
|
||||
/* Das Token wurde bereits vergeben */
|
||||
token++;
|
||||
c = My_Clients;
|
||||
continue;
|
||||
}
|
||||
else c = (CLIENT *)c->next;
|
||||
}
|
||||
Client->mytoken = token;
|
||||
Log( LOG_DEBUG, "Assigned token %d to server \"%s\".", token, Client->id );
|
||||
} /* Generate_MyToken */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
|
@@ -9,73 +9,15 @@
|
||||
* 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.17 2002/01/06 15:18:14 alex Exp $
|
||||
* $Id: client.h,v 1.27 2002/03/25 19:11:01 alex Exp $
|
||||
*
|
||||
* client.h: Konfiguration des ngircd (Header)
|
||||
*
|
||||
* $Log: client.h,v $
|
||||
* Revision 1.17 2002/01/06 15:18:14 alex
|
||||
* - Loglevel und Meldungen nochmals geaendert. Level passen nun besser.
|
||||
*
|
||||
* Revision 1.16 2002/01/05 23:26:05 alex
|
||||
* - Vorbereitungen fuer Ident-Abfragen in Client-Strukturen.
|
||||
*
|
||||
* Revision 1.15 2002/01/05 20:08:17 alex
|
||||
* - neue Funktion Client_NextHop().
|
||||
*
|
||||
* Revision 1.14 2002/01/04 01:21:22 alex
|
||||
* - Client-Strukturen koennen von anderen Modulen nun nur noch ueber die
|
||||
* enstprechenden (zum Teil neuen) Funktionen angesprochen werden.
|
||||
*
|
||||
* Revision 1.13 2002/01/03 02:28:06 alex
|
||||
* - neue Funktion Client_CheckID(), diverse Aenderungen fuer Server-Links.
|
||||
*
|
||||
* Revision 1.12 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.11 2001/12/31 15:33:13 alex
|
||||
* - neuer Befehl NAMES, kleinere Bugfixes.
|
||||
* - Bug bei PING behoben: war zu restriktiv implementiert :-)
|
||||
*
|
||||
* Revision 1.10 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.9 2001/12/29 20:18:18 alex
|
||||
* - neue Funktion Client_SetHostname().
|
||||
*
|
||||
* Revision 1.8 2001/12/29 03:10:47 alex
|
||||
* - Client-Modes implementiert; Loglevel mal wieder angepasst.
|
||||
*
|
||||
* Revision 1.7 2001/12/27 19:13:47 alex
|
||||
* - neue Funktion Client_Search(), besseres Logging.
|
||||
*
|
||||
* Revision 1.6 2001/12/27 16:54:51 alex
|
||||
* - neue Funktion Client_GetID(), liefert die "Client ID".
|
||||
*
|
||||
* Revision 1.5 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.4 2001/12/26 03:19:16 alex
|
||||
* - neue Funktion Client_Nick().
|
||||
*
|
||||
* Revision 1.3 2001/12/25 19:21:26 alex
|
||||
* - Client-Typ ("Status") besser unterteilt, My_Clients ist zudem nun global.
|
||||
*
|
||||
* Revision 1.2 2001/12/23 22:03:47 alex
|
||||
* - einige neue Funktionen,
|
||||
* - Konstanten um "CLIENT_"-Prefix erweitert.
|
||||
*
|
||||
* Revision 1.1 2001/12/14 08:13:43 alex
|
||||
* - neues Modul begonnen :-)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __client_h__
|
||||
#define __client_h__
|
||||
|
||||
#include "channel.h"
|
||||
#include "conn.h"
|
||||
|
||||
|
||||
@@ -93,25 +35,33 @@ typedef enum
|
||||
} CLIENT_TYPE;
|
||||
|
||||
|
||||
#ifdef __client_c__
|
||||
#if defined(__client_c__) | defined(S_SPLINT_S)
|
||||
|
||||
#include "defines.h"
|
||||
|
||||
typedef struct _CLIENT
|
||||
{
|
||||
CHAR id[CLIENT_ID_LEN]; /* Nick (User) bzw. ID (Server) */
|
||||
UINT32 hash; /* Hash ueber die (kleingeschriebene) ID */
|
||||
POINTER *next; /* Zeiger auf naechste Client-Struktur */
|
||||
CLIENT_TYPE type; /* Typ des Client, vgl. CLIENT_TYPE */
|
||||
CONN_ID conn_id; /* ID der Connection (wenn lokal) bzw. NONE (remote) */
|
||||
struct _CLIENT *introducer; /* ID des Servers, der die Verbindung hat */
|
||||
struct _CLIENT *topserver; /* Toplevel-Servers (nur gueltig, wenn Client ein Server ist) */
|
||||
CHAR pwd[CLIENT_PASS_LEN]; /* Passwort, welches der Client angegeben hat */
|
||||
CHAR host[CLIENT_HOST_LEN]; /* Hostname des Client */
|
||||
CHAR user[CLIENT_USER_LEN]; /* Benutzername ("Login") */
|
||||
CHAR info[CLIENT_INFO_LEN]; /* Langer Benutzername (User) bzw. Infotext (Server) */
|
||||
CHANNEL *channels[MAX_CHANNELS];/* Channel, in denen der Client Mitglied ist */
|
||||
CHAR modes[CLIENT_MODE_LEN]; /* Client Modes */
|
||||
INT hops, token; /* "Hops" und "Token" (-> SERVER-Befehl) */
|
||||
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 */
|
||||
} CLIENT;
|
||||
|
||||
#else
|
||||
|
||||
typedef POINTER CLIENT;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -119,16 +69,15 @@ GLOBAL VOID Client_Init( VOID );
|
||||
GLOBAL VOID Client_Exit( VOID );
|
||||
|
||||
GLOBAL CLIENT *Client_NewLocal( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented );
|
||||
GLOBAL CLIENT *Client_NewRemoteServer( CLIENT *Introducer, CHAR *Hostname, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented );
|
||||
GLOBAL CLIENT *Client_NewRemoteServer( CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented );
|
||||
GLOBAL CLIENT *Client_NewRemoteUser( 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, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented );
|
||||
GLOBAL CLIENT *Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented );
|
||||
|
||||
GLOBAL VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg );
|
||||
GLOBAL VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit );
|
||||
|
||||
GLOBAL CLIENT *Client_ThisServer( VOID );
|
||||
|
||||
GLOBAL CLIENT *Client_GetFromConn( CONN_ID Idx );
|
||||
GLOBAL CLIENT *Client_GetFromID( CHAR *Nick );
|
||||
GLOBAL CLIENT *Client_GetFromToken( CLIENT *Client, INT Token );
|
||||
|
||||
GLOBAL CLIENT *Client_Search( CHAR *ID );
|
||||
@@ -148,7 +97,10 @@ 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 BOOLEAN Client_HasMode( CLIENT *Client, CHAR Mode );
|
||||
|
||||
@@ -163,6 +115,7 @@ 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 BOOLEAN Client_ModeAdd( CLIENT *Client, CHAR Mode );
|
||||
GLOBAL BOOLEAN Client_ModeDel( CLIENT *Client, CHAR Mode );
|
||||
@@ -170,6 +123,18 @@ GLOBAL BOOLEAN Client_ModeDel( CLIENT *Client, CHAR Mode );
|
||||
GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick );
|
||||
GLOBAL BOOLEAN Client_CheckID( 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 BOOLEAN Client_IsValidNick( CHAR *Nick );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
@@ -9,112 +9,148 @@
|
||||
* 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.12 2002/01/05 23:26:24 alex Exp $
|
||||
* $Id: conf.c,v 1.23 2002/03/30 13:08:10 alex Exp $
|
||||
*
|
||||
* conf.h: Konfiguration des ngircd
|
||||
*
|
||||
* $Log: conf.c,v $
|
||||
* Revision 1.12 2002/01/05 23:26:24 alex
|
||||
* - Fehlermeldungen korrigiert.
|
||||
*
|
||||
* Revision 1.11 2002/01/05 16:51:49 alex
|
||||
* - Bug bei Remote-Server-Namen entfernt: diese wurden falsch gekuerzt.
|
||||
*
|
||||
* Revision 1.10 2002/01/03 02:27:20 alex
|
||||
* - das Server-Passwort kann nun konfiguriert werden.
|
||||
*
|
||||
* Revision 1.9 2002/01/02 02:49:15 alex
|
||||
* - Konfigurationsdatei "Samba like" umgestellt.
|
||||
* - es koennen nun mehrere Server und Oprtatoren konfiguriert werden.
|
||||
*
|
||||
* Revision 1.7 2002/01/01 18:25:44 alex
|
||||
* - #include's fuer stdlib.h ergaenzt.
|
||||
*
|
||||
* Revision 1.6 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.5 2001/12/30 19:26:11 alex
|
||||
* - Unterstuetzung fuer die Konfigurationsdatei eingebaut.
|
||||
*
|
||||
* Revision 1.4 2001/12/26 22:48:53 alex
|
||||
* - MOTD-Datei ist nun konfigurierbar und wird gelesen.
|
||||
*
|
||||
* Revision 1.3 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.2 2001/12/26 03:19:57 alex
|
||||
* - erste Konfigurations-Variablen definiert: PING/PONG-Timeout.
|
||||
*
|
||||
* Revision 1.1 2001/12/12 17:18:20 alex
|
||||
* - Modul fuer Server-Konfiguration begonnen.
|
||||
*/
|
||||
|
||||
|
||||
#include <portab.h>
|
||||
#include "global.h"
|
||||
#include "portab.h"
|
||||
|
||||
#include <imp.h>
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "client.h"
|
||||
#include "defines.h"
|
||||
#include "log.h"
|
||||
#include "tool.h"
|
||||
|
||||
#include <exp.h>
|
||||
#include "exp.h"
|
||||
#include "conf.h"
|
||||
|
||||
|
||||
LOCAL BOOLEAN Use_Log = TRUE;
|
||||
|
||||
|
||||
LOCAL VOID Set_Defaults( VOID );
|
||||
LOCAL VOID Read_Config( VOID );
|
||||
LOCAL VOID Validate_Config( 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 Validate_Config( VOID );
|
||||
LOCAL VOID Config_Error( CONST INT Level, CONST CHAR *Format, ... );
|
||||
|
||||
|
||||
GLOBAL VOID Conf_Init( VOID )
|
||||
{
|
||||
/* Konfigurationsvariablen initialisieren: zunaechst Default-
|
||||
* Werte setzen, dann Konfigurationsdtaei einlesen. */
|
||||
|
||||
strcpy( Conf_File, "/usr/local/etc/ngircd.conf" );
|
||||
|
||||
strcpy( Conf_ServerName, "" );
|
||||
strcpy( Conf_ServerInfo, PACKAGE" "VERSION );
|
||||
strcpy( Conf_ServerPwd, "" );
|
||||
|
||||
strcpy( Conf_MotdFile, "/usr/local/etc/ngircd.motd" );
|
||||
|
||||
Conf_ListenPorts_Count = 0;
|
||||
|
||||
Conf_PingTimeout = 120;
|
||||
Conf_PongTimeout = 10;
|
||||
|
||||
Conf_ConnectRetry = 60;
|
||||
|
||||
Conf_Oper_Count = 0;
|
||||
|
||||
Conf_Server_Count = 0;
|
||||
|
||||
/* Konfigurationsdatei einlesen und validieren */
|
||||
Set_Defaults( );
|
||||
Read_Config( );
|
||||
Validate_Config( );
|
||||
} /* Config_Init */
|
||||
|
||||
|
||||
GLOBAL INT Conf_Test( VOID )
|
||||
{
|
||||
/* Konfiguration einlesen, ueberpruefen und ausgeben. */
|
||||
|
||||
UINT i;
|
||||
|
||||
Use_Log = FALSE;
|
||||
Set_Defaults( );
|
||||
|
||||
printf( "Using \"%s\" as configuration file ...\n", NGIRCd_ConfFile );
|
||||
Read_Config( );
|
||||
|
||||
/* Wenn stdin ein ein TTY ist: auf Taste warten */
|
||||
if( isatty( fileno( stdout )))
|
||||
{
|
||||
puts( "OK, press enter to see a dump of your service configuration ..." );
|
||||
getchar( );
|
||||
}
|
||||
else puts( "Ok, dump of your server configuration follows:\n" );
|
||||
|
||||
puts( "[GLOBAL]" );
|
||||
printf( " ServerName = %s\n", Conf_ServerName );
|
||||
printf( " ServerInfo = %s\n", Conf_ServerInfo );
|
||||
printf( " ServerPwd = %s\n", Conf_ServerPwd );
|
||||
printf( " MotdFile = %s\n", Conf_MotdFile );
|
||||
printf( " ListenPorts = " );
|
||||
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 );
|
||||
printf( " PingTimeout = %d\n", Conf_PingTimeout );
|
||||
printf( " PongTimeout = %d\n", Conf_PongTimeout );
|
||||
printf( " ConnectRetry = %d\n", Conf_ConnectRetry );
|
||||
puts( "" );
|
||||
|
||||
for( i = 0; i < Conf_Oper_Count; i++ )
|
||||
{
|
||||
puts( "[OPERATOR]" );
|
||||
printf( " Name = %s\n", Conf_Oper[i].name );
|
||||
printf( " Password = %s\n", Conf_Oper[i].pwd );
|
||||
puts( "" );
|
||||
}
|
||||
|
||||
for( i = 0; i < Conf_Server_Count; i++ )
|
||||
{
|
||||
puts( "[SERVER]" );
|
||||
printf( " Name = %s\n", Conf_Server[i].name );
|
||||
printf( " Host = %s\n", Conf_Server[i].host );
|
||||
printf( " Port = %d\n", Conf_Server[i].port );
|
||||
printf( " Password = %s\n", Conf_Server[i].pwd );
|
||||
printf( " Group = %d\n", Conf_Server[i].group );
|
||||
puts( "" );
|
||||
}
|
||||
|
||||
return 0;
|
||||
} /* Conf_Test */
|
||||
|
||||
|
||||
GLOBAL VOID Conf_Exit( VOID )
|
||||
{
|
||||
/* ... */
|
||||
} /* Config_Exit */
|
||||
|
||||
|
||||
LOCAL VOID Set_Defaults( VOID )
|
||||
{
|
||||
/* Konfigurationsvariablen initialisieren, d.h. auf Default-Werte setzen. */
|
||||
|
||||
strcpy( Conf_ServerName, "" );
|
||||
strcpy( Conf_ServerInfo, PACKAGE" "VERSION );
|
||||
strcpy( Conf_ServerPwd, "" );
|
||||
|
||||
strcpy( Conf_MotdFile, MOTD_FILE );
|
||||
|
||||
Conf_ListenPorts_Count = 0;
|
||||
|
||||
Conf_UID = Conf_GID = 0;
|
||||
|
||||
Conf_PingTimeout = 120;
|
||||
Conf_PongTimeout = 20;
|
||||
|
||||
Conf_ConnectRetry = 60;
|
||||
|
||||
Conf_Oper_Count = 0;
|
||||
|
||||
Conf_Server_Count = 0;
|
||||
} /* Set_Defaults */
|
||||
|
||||
|
||||
LOCAL VOID Read_Config( VOID )
|
||||
{
|
||||
/* Konfigurationsdatei einlesen. */
|
||||
@@ -123,12 +159,12 @@ LOCAL VOID Read_Config( VOID )
|
||||
INT line;
|
||||
FILE *fd;
|
||||
|
||||
fd = fopen( Conf_File, "r" );
|
||||
fd = fopen( NGIRCd_ConfFile, "r" );
|
||||
if( ! fd )
|
||||
{
|
||||
/* Keine Konfigurationsdatei gefunden */
|
||||
Log( LOG_ALERT, "Can't read configuration \"%s\": %s", Conf_File, strerror( errno ));
|
||||
Log( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
|
||||
Config_Error( LOG_ALERT, "Can't read configuration \"%s\": %s", NGIRCd_ConfFile, strerror( errno ));
|
||||
Config_Error( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
@@ -150,7 +186,7 @@ LOCAL VOID Read_Config( VOID )
|
||||
if( strcasecmp( section, "[GLOBAL]" ) == 0 ) continue;
|
||||
if( strcasecmp( section, "[OPERATOR]" ) == 0 )
|
||||
{
|
||||
if( Conf_Oper_Count + 1 > MAX_OPERATORS ) Log( LOG_ERR, "Too many operators configured." );
|
||||
if( Conf_Oper_Count + 1 > MAX_OPERATORS ) Config_Error( LOG_ERR, "Too many operators configured." );
|
||||
else
|
||||
{
|
||||
/* neuen Operator initialisieren */
|
||||
@@ -162,7 +198,7 @@ LOCAL VOID Read_Config( VOID )
|
||||
}
|
||||
if( strcasecmp( section, "[SERVER]" ) == 0 )
|
||||
{
|
||||
if( Conf_Server_Count + 1 > MAX_SERVERS ) Log( LOG_ERR, "Too many servers configured." );
|
||||
if( Conf_Server_Count + 1 > MAX_SERVERS ) Config_Error( LOG_ERR, "Too many servers configured." );
|
||||
else
|
||||
{
|
||||
/* neuen Server ("Peer") initialisieren */
|
||||
@@ -171,13 +207,14 @@ LOCAL VOID Read_Config( VOID )
|
||||
strcpy( Conf_Server[Conf_Server_Count].name, "" );
|
||||
strcpy( Conf_Server[Conf_Server_Count].pwd, "" );
|
||||
Conf_Server[Conf_Server_Count].port = 0;
|
||||
Conf_Server[Conf_Server_Count].lasttry = 0;
|
||||
Conf_Server[Conf_Server_Count].group = -1;
|
||||
Conf_Server[Conf_Server_Count].lasttry = time( NULL ) - Conf_ConnectRetry + STARTUP_DELAY;
|
||||
Conf_Server[Conf_Server_Count].res_stat = NULL;
|
||||
Conf_Server_Count++;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
Log( LOG_ERR, "%s, line %d: Unknown section \"%s\"!", Conf_File, line, section );
|
||||
Config_Error( LOG_ERR, "%s, line %d: Unknown section \"%s\"!", NGIRCd_ConfFile, line, section );
|
||||
section[0] = 0x1;
|
||||
}
|
||||
if( section[0] == 0x1 ) continue;
|
||||
@@ -186,7 +223,7 @@ LOCAL VOID Read_Config( VOID )
|
||||
ptr = strchr( str, '=' );
|
||||
if( ! ptr )
|
||||
{
|
||||
Log( LOG_ERR, "%s, line %d: Syntax error!", Conf_File, line );
|
||||
Config_Error( LOG_ERR, "%s, line %d: Syntax error!", NGIRCd_ConfFile, line );
|
||||
continue;
|
||||
}
|
||||
*ptr = '\0';
|
||||
@@ -196,17 +233,24 @@ 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 Log( LOG_ERR, "%s, line %d: Variable \"%s\" outside section!", Conf_File, line, var );
|
||||
else Config_Error( LOG_ERR, "%s, line %d: Variable \"%s\" outside section!", NGIRCd_ConfFile, line, var );
|
||||
}
|
||||
|
||||
fclose( fd );
|
||||
|
||||
/* Wenn kein Port definiert wurde, Port 6667 als Default benutzen */
|
||||
if( Conf_ListenPorts_Count < 1 )
|
||||
{
|
||||
Conf_ListenPorts_Count = 1;
|
||||
Conf_ListenPorts[0] = 6667;
|
||||
}
|
||||
} /* Read_Config */
|
||||
|
||||
|
||||
GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
|
||||
{
|
||||
CHAR *ptr;
|
||||
INT port;
|
||||
INT32 port;
|
||||
|
||||
assert( Line > 0 );
|
||||
assert( Var != NULL );
|
||||
@@ -215,21 +259,21 @@ GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
|
||||
if( strcasecmp( Var, "Name" ) == 0 )
|
||||
{
|
||||
/* Der Server-Name */
|
||||
strncpy( Conf_ServerName, Arg, CLIENT_ID_LEN );
|
||||
strncpy( Conf_ServerName, Arg, CLIENT_ID_LEN - 1 );
|
||||
Conf_ServerName[CLIENT_ID_LEN - 1] = '\0';
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "Info" ) == 0 )
|
||||
{
|
||||
/* Server-Info-Text */
|
||||
strncpy( Conf_ServerInfo, Arg, CLIENT_INFO_LEN );
|
||||
strncpy( Conf_ServerInfo, Arg, CLIENT_INFO_LEN - 1 );
|
||||
Conf_ServerInfo[CLIENT_INFO_LEN - 1] = '\0';
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "Password" ) == 0 )
|
||||
{
|
||||
/* Der Server-Name */
|
||||
strncpy( Conf_ServerPwd, Arg, CLIENT_PASS_LEN );
|
||||
/* Server-Passwort */
|
||||
strncpy( Conf_ServerPwd, Arg, CLIENT_PASS_LEN - 1 );
|
||||
Conf_ServerPwd[CLIENT_PASS_LEN - 1] = '\0';
|
||||
return;
|
||||
}
|
||||
@@ -242,11 +286,11 @@ GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
|
||||
{
|
||||
ngt_TrimStr( ptr );
|
||||
port = atol( ptr );
|
||||
if( Conf_ListenPorts_Count + 1 > MAX_LISTEN_PORTS ) Log( LOG_ERR, "Too many listen ports configured. Port %ld ignored.", port );
|
||||
if( Conf_ListenPorts_Count + 1 > MAX_LISTEN_PORTS ) Config_Error( LOG_ERR, "Too many listen ports configured. Port %ld ignored.", port );
|
||||
else
|
||||
{
|
||||
if( port > 0 && port < 0xFFFF ) Conf_ListenPorts[Conf_ListenPorts_Count++] = port;
|
||||
else Log( LOG_ERR, "%s, line %d (section \"Global\"): Illegal port number %ld!", Conf_File, Line, port );
|
||||
if( port > 0 && port < 0xFFFF ) Conf_ListenPorts[Conf_ListenPorts_Count++] = (UINT)port;
|
||||
else Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Illegal port number %ld!", NGIRCd_ConfFile, Line, port );
|
||||
}
|
||||
ptr = strtok( NULL, "," );
|
||||
}
|
||||
@@ -255,10 +299,22 @@ GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
|
||||
if( strcasecmp( Var, "MotdFile" ) == 0 )
|
||||
{
|
||||
/* Datei mit der "message of the day" (MOTD) */
|
||||
strncpy( Conf_MotdFile, Arg, FNAME_LEN );
|
||||
strncpy( Conf_MotdFile, Arg, FNAME_LEN - 1 );
|
||||
Conf_MotdFile[FNAME_LEN - 1] = '\0';
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "ServerUID" ) == 0 )
|
||||
{
|
||||
/* UID, mit der der Daemon laufen soll */
|
||||
Conf_UID = (UINT)atoi( Arg );
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "ServerGID" ) == 0 )
|
||||
{
|
||||
/* GID, mit der der Daemon laufen soll */
|
||||
Conf_GID = (UINT)atoi( Arg );
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "PingTimeout" ) == 0 )
|
||||
{
|
||||
/* PING-Timeout */
|
||||
@@ -281,7 +337,7 @@ GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
|
||||
return;
|
||||
}
|
||||
|
||||
Log( LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!", Conf_File, Line, Var );
|
||||
Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var );
|
||||
} /* Handle_GLOBAL */
|
||||
|
||||
|
||||
@@ -295,25 +351,25 @@ 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 );
|
||||
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';
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "Password" ) == 0 )
|
||||
{
|
||||
/* Passwort des IRC Operator */
|
||||
strncpy( Conf_Oper[Conf_Oper_Count - 1].pwd, Arg, CLIENT_PASS_LEN );
|
||||
strncpy( Conf_Oper[Conf_Oper_Count - 1].pwd, Arg, CLIENT_PASS_LEN - 1 );
|
||||
Conf_Oper[Conf_Oper_Count - 1].pwd[CLIENT_PASS_LEN - 1] = '\0';
|
||||
return;
|
||||
}
|
||||
|
||||
Log( LOG_ERR, "%s, line %d (section \"Operator\"): Unknown variable \"%s\"!", Conf_File, Line, Var );
|
||||
Config_Error( LOG_ERR, "%s, line %d (section \"Operator\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var );
|
||||
} /* Handle_OPERATOR */
|
||||
|
||||
|
||||
GLOBAL VOID Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg )
|
||||
{
|
||||
INT port;
|
||||
INT32 port;
|
||||
|
||||
assert( Line > 0 );
|
||||
assert( Var != NULL );
|
||||
@@ -322,21 +378,21 @@ GLOBAL VOID Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg )
|
||||
if( strcasecmp( Var, "Host" ) == 0 )
|
||||
{
|
||||
/* Hostname des Servers */
|
||||
strncpy( Conf_Server[Conf_Server_Count - 1].host, Arg, HOST_LEN );
|
||||
strncpy( Conf_Server[Conf_Server_Count - 1].host, Arg, HOST_LEN - 1 );
|
||||
Conf_Server[Conf_Server_Count - 1].host[HOST_LEN - 1] = '\0';
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "Name" ) == 0 )
|
||||
{
|
||||
/* Name des Servers ("Nick") */
|
||||
strncpy( Conf_Server[Conf_Server_Count - 1].name, Arg, CLIENT_ID_LEN );
|
||||
strncpy( Conf_Server[Conf_Server_Count - 1].name, Arg, CLIENT_ID_LEN - 1 );
|
||||
Conf_Server[Conf_Server_Count - 1].name[CLIENT_ID_LEN - 1] = '\0';
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "Password" ) == 0 )
|
||||
{
|
||||
/* Passwort des Servers */
|
||||
strncpy( Conf_Server[Conf_Server_Count - 1].pwd, Arg, CLIENT_PASS_LEN );
|
||||
strncpy( Conf_Server[Conf_Server_Count - 1].pwd, Arg, CLIENT_PASS_LEN - 1 );
|
||||
Conf_Server[Conf_Server_Count - 1].pwd[CLIENT_PASS_LEN - 1] = '\0';
|
||||
return;
|
||||
}
|
||||
@@ -344,12 +400,18 @@ GLOBAL VOID Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg )
|
||||
{
|
||||
/* Port, zu dem Verbunden werden soll */
|
||||
port = atol( Arg );
|
||||
if( port > 0 && port < 0xFFFF ) Conf_Server[Conf_Server_Count - 1].port = port;
|
||||
else Log( LOG_ERR, "%s, line %d (section \"Server\"): Illegal port number %ld!", Conf_File, Line, port );
|
||||
if( port > 0 && port < 0xFFFF ) Conf_Server[Conf_Server_Count - 1].port = (INT)port;
|
||||
else Config_Error( LOG_ERR, "%s, line %d (section \"Server\"): Illegal port number %ld!", NGIRCd_ConfFile, Line, port );
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "Group" ) == 0 )
|
||||
{
|
||||
/* Server-Gruppe */
|
||||
Conf_Server[Conf_Server_Count - 1].group = atoi( Arg );
|
||||
return;
|
||||
}
|
||||
|
||||
Log( LOG_ERR, "%s, line %d (section \"Server\"): Unknown variable \"%s\"!", Conf_File, Line, Var );
|
||||
Config_Error( LOG_ERR, "%s, line %d (section \"Server\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var );
|
||||
} /* Handle_SERVER */
|
||||
|
||||
|
||||
@@ -360,10 +422,33 @@ LOCAL VOID Validate_Config( VOID )
|
||||
if( ! Conf_ServerName[0] )
|
||||
{
|
||||
/* Kein Servername konfiguriert */
|
||||
Log( LOG_ALERT, "No server name configured in \"%s\"!", Conf_File );
|
||||
Log( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
|
||||
Config_Error( LOG_ALERT, "No server name configured in \"%s\"!", NGIRCd_ConfFile );
|
||||
Config_Error( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
|
||||
exit( 1 );
|
||||
}
|
||||
} /* Validate_Config */
|
||||
|
||||
|
||||
LOCAL VOID Config_Error( CONST INT Level, CONST CHAR *Format, ... )
|
||||
{
|
||||
/* Fehler! Auf Console und/oder ins Log schreiben */
|
||||
|
||||
CHAR msg[MAX_LOG_MSG_LEN];
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
|
||||
/* String mit variablen Argumenten zusammenbauen ... */
|
||||
va_start( ap, Format );
|
||||
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 );
|
||||
else puts( msg );
|
||||
} /* Config_Error */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
|
@@ -9,37 +9,9 @@
|
||||
* 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.9 2002/01/03 02:27:20 alex Exp $
|
||||
* $Id: conf.h,v 1.15 2002/03/29 22:53:59 alex Exp $
|
||||
*
|
||||
* conf.h: Konfiguration des ngircd (Header)
|
||||
*
|
||||
* $Log: conf.h,v $
|
||||
* Revision 1.9 2002/01/03 02:27:20 alex
|
||||
* - das Server-Passwort kann nun konfiguriert werden.
|
||||
*
|
||||
* Revision 1.8 2002/01/02 02:49:16 alex
|
||||
* - Konfigurationsdatei "Samba like" umgestellt.
|
||||
* - es koennen nun mehrere Server und Oprtatoren konfiguriert werden.
|
||||
*
|
||||
* Revision 1.6 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.5 2001/12/30 19:26:11 alex
|
||||
* - Unterstuetzung fuer die Konfigurationsdatei eingebaut.
|
||||
*
|
||||
* Revision 1.4 2001/12/26 22:48:53 alex
|
||||
* - MOTD-Datei ist nun konfigurierbar und wird gelesen.
|
||||
*
|
||||
* Revision 1.3 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.2 2001/12/26 03:19:57 alex
|
||||
* - erste Konfigurations-Variablen definiert: PING/PONG-Timeout.
|
||||
*
|
||||
* Revision 1.1 2001/12/12 17:18:20 alex
|
||||
* - Modul fuer Server-Konfiguration begonnen.
|
||||
*/
|
||||
|
||||
|
||||
@@ -48,28 +20,29 @@
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#include "conn.h"
|
||||
#include "defines.h"
|
||||
|
||||
|
||||
typedef struct _Conf_Oper
|
||||
{
|
||||
CHAR name[CLIENT_PASS_LEN];
|
||||
CHAR pwd[CLIENT_PASS_LEN];
|
||||
CHAR name[CLIENT_PASS_LEN]; /* Name (ID) des IRC-OPs */
|
||||
CHAR pwd[CLIENT_PASS_LEN]; /* Passwort */
|
||||
} CONF_OPER;
|
||||
|
||||
typedef struct _Conf_Server
|
||||
{
|
||||
CHAR host[HOST_LEN];
|
||||
CHAR ip[16];
|
||||
CHAR name[CLIENT_ID_LEN];
|
||||
CHAR pwd[CLIENT_PASS_LEN];
|
||||
INT port;
|
||||
time_t lasttry;
|
||||
RES_STAT *res_stat;
|
||||
CHAR host[HOST_LEN]; /* Hostname */
|
||||
CHAR ip[16]; /* IP-Adresse (von Resolver) */
|
||||
CHAR name[CLIENT_ID_LEN]; /* IRC-Client-ID */
|
||||
CHAR pwd[CLIENT_PASS_LEN]; /* Passwort */
|
||||
INT port; /* Server-Port */
|
||||
INT group; /* Gruppe des Servers */
|
||||
time_t lasttry; /* Letzter Connect-Versuch */
|
||||
RES_STAT *res_stat; /* Status des Resolver */
|
||||
} CONF_SERVER;
|
||||
|
||||
|
||||
/* Konfigurationsdatei */
|
||||
GLOBAL CHAR Conf_File[FNAME_LEN];
|
||||
|
||||
/* Name ("Nick") des Servers */
|
||||
GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN];
|
||||
|
||||
@@ -83,9 +56,13 @@ GLOBAL CHAR Conf_ServerPwd[CLIENT_PASS_LEN];
|
||||
GLOBAL CHAR Conf_MotdFile[FNAME_LEN];
|
||||
|
||||
/* Ports, auf denen der Server Verbindungen entgegen nimmt */
|
||||
GLOBAL INT Conf_ListenPorts[MAX_LISTEN_PORTS];
|
||||
GLOBAL UINT Conf_ListenPorts[MAX_LISTEN_PORTS];
|
||||
GLOBAL INT Conf_ListenPorts_Count;
|
||||
|
||||
/* User- und Group-ID, zu denen der Daemon wechseln soll */
|
||||
GLOBAL UINT Conf_UID;
|
||||
GLOBAL UINT Conf_GID;
|
||||
|
||||
/* Timeouts fuer PING und PONG */
|
||||
GLOBAL INT Conf_PingTimeout;
|
||||
GLOBAL INT Conf_PongTimeout;
|
||||
@@ -103,6 +80,7 @@ GLOBAL INT Conf_Server_Count;
|
||||
|
||||
|
||||
GLOBAL VOID Conf_Init( VOID );
|
||||
GLOBAL INT Conf_Test( VOID );
|
||||
GLOBAL VOID Conf_Exit( VOID );
|
||||
|
||||
|
||||
|
@@ -9,130 +9,15 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: conn.c,v 1.33 2002/01/06 15:18:14 alex Exp $
|
||||
* $Id: conn.c,v 1.60.2.1 2002/04/08 18:07:42 alex Exp $
|
||||
*
|
||||
* connect.h: Verwaltung aller Netz-Verbindungen ("connections")
|
||||
*
|
||||
* $Log: conn.c,v $
|
||||
* Revision 1.33 2002/01/06 15:18:14 alex
|
||||
* - Loglevel und Meldungen nochmals geaendert. Level passen nun besser.
|
||||
*
|
||||
* Revision 1.32 2002/01/05 23:25:25 alex
|
||||
* - Vorbereitungen fuer Ident-Abfragen bei neuen Client-Strukturen.
|
||||
*
|
||||
* Revision 1.31 2002/01/05 19:15:03 alex
|
||||
* - Fehlerpruefung bei select() in der "Hauptschleife" korrigiert.
|
||||
*
|
||||
* Revision 1.30 2002/01/05 15:56:23 alex
|
||||
* - "arpa/inet.h" wird nur noch includiert, wenn vorhanden.
|
||||
* - Ein Fehler bei select() fuerht nun zum Abbruch von ngIRCd.
|
||||
* - NO_ADDRESS durch NO_DATA ersetzt: ist wohl portabler.
|
||||
*
|
||||
* Revision 1.29 2002/01/04 01:36:40 alex
|
||||
* - Loglevel ein wenig angepasst.
|
||||
*
|
||||
* Revision 1.28 2002/01/04 01:20:23 alex
|
||||
* - Client-Strukruren werden nur noch ueber Funktionen angesprochen.
|
||||
*
|
||||
* Revision 1.27 2002/01/03 02:25:36 alex
|
||||
* - diverse Aenderungen und Umsetellungen fuer Server-Links.
|
||||
*
|
||||
* Revision 1.26 2002/01/02 02:50:47 alex
|
||||
* - Asyncroner Resolver Hostname->IP.
|
||||
* - Server-Links begonnen zu implementieren. Die Verbindung wird aufgebaut,
|
||||
* jedoch noch keine SERVER-Befehle verschickt.
|
||||
* - Diverse Bug-Fixes und kleinere Erweiterungen.
|
||||
*
|
||||
* Revision 1.24 2002/01/01 18:25:44 alex
|
||||
* - #include's fuer stdlib.h ergaenzt.
|
||||
*
|
||||
* Revision 1.23 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.22 2001/12/30 19:26:11 alex
|
||||
* - Unterstuetzung fuer die Konfigurationsdatei eingebaut.
|
||||
*
|
||||
* Revision 1.21 2001/12/29 22:33:36 alex
|
||||
* - bessere Dokumentation des Modules bzw. der Funktionen.
|
||||
*
|
||||
* Revision 1.20 2001/12/29 22:09:43 alex
|
||||
* - kleinere Aenderungen ("clean-ups") bei Logging (Resolver).
|
||||
*
|
||||
* Revision 1.19 2001/12/29 21:53:57 alex
|
||||
* - Da hatte ich mich wohl ein wenig verrannt; jetzt sollte der Resolver
|
||||
* aber tatsaechlich funktionieren.
|
||||
*
|
||||
* Revision 1.18 2001/12/29 20:17:25 alex
|
||||
* - asyncronen Resolver (IP->Name) implementiert, dadurch div. Aenderungen.
|
||||
*
|
||||
* Revision 1.17 2001/12/29 03:06:16 alex
|
||||
* - Loglevel (nochmal) angepasst.
|
||||
*
|
||||
* Revision 1.16 2001/12/27 19:32:44 alex
|
||||
* - bei "Null-Requests" wird nichts mehr geloggt. Uberfluessig, da normal.
|
||||
*
|
||||
* Revision 1.15 2001/12/27 16:35:04 alex
|
||||
* - vergessene Variable bei Ping-Timeout-Logmeldung ergaenzt. Opsa.
|
||||
*
|
||||
* Revision 1.14 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.13 2001/12/26 03:36:57 alex
|
||||
* - Verbindungen mit Lesefehlern werden nun korrekt terminiert.
|
||||
*
|
||||
* Revision 1.12 2001/12/26 03:20:53 alex
|
||||
* - PING/PONG-Timeout implementiert.
|
||||
*
|
||||
* Revision 1.11 2001/12/25 23:15:16 alex
|
||||
* - buffer werden nun periodisch geprueft, keine haengenden Clients mehr.
|
||||
*
|
||||
* Revision 1.10 2001/12/25 22:03:47 alex
|
||||
* - Conn_Close() eingefuehrt: war die lokale Funktion Close_Connection().
|
||||
*
|
||||
* Revision 1.9 2001/12/24 01:32:33 alex
|
||||
* - in Conn_WriteStr() wurde das CR+LF nicht angehaengt!
|
||||
* - Fehler-Ausgaben vereinheitlicht.
|
||||
*
|
||||
* Revision 1.8 2001/12/23 22:02:54 alex
|
||||
* - Conn_WriteStr() nimmt nun variable Parameter,
|
||||
* - diverse kleinere Aenderungen.
|
||||
*
|
||||
* Revision 1.7 2001/12/21 22:24:25 alex
|
||||
* - kleinere Aenderungen an den Log-Meldungen,
|
||||
* - Parse_Request() wird aufgerufen.
|
||||
*
|
||||
* Revision 1.6 2001/12/15 00:11:55 alex
|
||||
* - Lese- und Schreib-Puffer implementiert.
|
||||
* - einige neue (Unter-)Funktionen eingefuehrt.
|
||||
* - diverse weitere kleinere Aenderungen.
|
||||
*
|
||||
* Revision 1.5 2001/12/14 08:16:47 alex
|
||||
* - Begonnen, Client-spezifische Lesepuffer zu implementieren.
|
||||
* - Umstellung auf Datentyp "CONN_ID".
|
||||
*
|
||||
* Revision 1.4 2001/12/13 02:04:16 alex
|
||||
* - boesen "Speicherschiesser" in Log() gefixt.
|
||||
*
|
||||
* Revision 1.3 2001/12/13 01:33:09 alex
|
||||
* - Conn_Handler() unterstuetzt nun einen Timeout.
|
||||
* - fuer Verbindungen werden keine FILE-Handles mehr benutzt.
|
||||
* - kleinere "Code Cleanups" ;-)
|
||||
*
|
||||
* Revision 1.2 2001/12/12 23:32:02 alex
|
||||
* - diverse Erweiterungen und Verbesserungen (u.a. sind nun mehrere
|
||||
* Verbindungen und Listen-Sockets moeglich).
|
||||
*
|
||||
* Revision 1.1 2001/12/12 17:18:38 alex
|
||||
* - Modul zur Verwaltung aller Netzwerk-Verbindungen begonnen.
|
||||
*/
|
||||
|
||||
|
||||
#include <portab.h>
|
||||
#include "global.h"
|
||||
#include "portab.h"
|
||||
|
||||
#include <imp.h>
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
@@ -165,11 +50,11 @@
|
||||
#include "parse.h"
|
||||
#include "tool.h"
|
||||
|
||||
#include <exp.h>
|
||||
#include "exp.h"
|
||||
#include "conn.h"
|
||||
|
||||
|
||||
#define SERVER_WAIT NONE - 1
|
||||
#define SERVER_WAIT (NONE - 1)
|
||||
|
||||
|
||||
typedef struct _Connection
|
||||
@@ -199,6 +84,7 @@ LOCAL VOID Handle_Buffer( CONN_ID Idx );
|
||||
LOCAL VOID Check_Connections( VOID );
|
||||
LOCAL VOID Check_Servers( VOID );
|
||||
LOCAL VOID Init_Conn_Struct( INT Idx );
|
||||
LOCAL BOOLEAN Init_Socket( INT Sock );
|
||||
LOCAL VOID New_Server( INT Server, CONN_ID Idx );
|
||||
|
||||
LOCAL RES_STAT *ResolveAddr( struct sockaddr_in *Addr );
|
||||
@@ -212,6 +98,7 @@ LOCAL CHAR *Resolv_Error( INT H_Error );
|
||||
LOCAL fd_set My_Listeners;
|
||||
LOCAL fd_set My_Sockets;
|
||||
LOCAL fd_set My_Resolvers;
|
||||
LOCAL fd_set My_Connects;
|
||||
|
||||
LOCAL INT My_Max_Fd;
|
||||
|
||||
@@ -228,6 +115,7 @@ GLOBAL VOID Conn_Init( VOID )
|
||||
FD_ZERO( &My_Listeners );
|
||||
FD_ZERO( &My_Sockets );
|
||||
FD_ZERO( &My_Resolvers );
|
||||
FD_ZERO( &My_Connects );
|
||||
|
||||
My_Max_Fd = 0;
|
||||
|
||||
@@ -254,30 +142,35 @@ GLOBAL VOID Conn_Exit( VOID )
|
||||
{
|
||||
if( My_Connections[idx].sock == i ) break;
|
||||
}
|
||||
if( idx < MAX_CONNECTIONS ) Conn_Close( idx, NULL, "Server going down", TRUE );
|
||||
else if( FD_ISSET( i, &My_Listeners ))
|
||||
if( FD_ISSET( i, &My_Listeners ))
|
||||
{
|
||||
close( i );
|
||||
Log( LOG_DEBUG, "Listening socket %d closed.", i );
|
||||
}
|
||||
else
|
||||
else if( FD_ISSET( i, &My_Connects ))
|
||||
{
|
||||
close( i );
|
||||
Log( LOG_WARNING, "Unknown connection %d closed.", i );
|
||||
Log( LOG_DEBUG, "Connection %d closed during creation (socket %d).", idx, i );
|
||||
}
|
||||
else if( idx < MAX_CONNECTIONS ) Conn_Close( idx, NULL, "Server going down", TRUE );
|
||||
else
|
||||
{
|
||||
Log( LOG_WARNING, "Closing unknown connection %d ...", i );
|
||||
close( i );
|
||||
}
|
||||
}
|
||||
}
|
||||
} /* Conn_Exit */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Conn_NewListener( CONST INT Port )
|
||||
GLOBAL BOOLEAN Conn_NewListener( CONST UINT Port )
|
||||
{
|
||||
/* Neuen Listen-Socket erzeugen: der Server wartet dann auf
|
||||
* dem angegebenen Port auf Verbindungen. Kann der Listen-
|
||||
* Socket nicht erteugt werden, so wird NULL geliefert.*/
|
||||
|
||||
struct sockaddr_in addr;
|
||||
INT sock, on = 1;
|
||||
INT sock;
|
||||
|
||||
/* Server-"Listen"-Socket initialisieren */
|
||||
memset( &addr, 0, sizeof( addr ));
|
||||
@@ -293,18 +186,7 @@ GLOBAL BOOLEAN Conn_NewListener( CONST INT Port )
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Socket-Optionen setzen */
|
||||
if( fcntl( sock, F_SETFL, O_NONBLOCK ) != 0 )
|
||||
{
|
||||
Log( LOG_CRIT, "Can't enable non-blocking mode: %s!", strerror( errno ));
|
||||
close( sock );
|
||||
return FALSE;
|
||||
}
|
||||
if( setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, (socklen_t)sizeof( on )) != 0)
|
||||
{
|
||||
Log( LOG_ERR, "Can't set socket options: %s!", strerror( errno ));
|
||||
/* dieser Fehler kann ignoriert werden. */
|
||||
}
|
||||
if( ! Init_Socket( sock )) return FALSE;
|
||||
|
||||
/* an Port binden */
|
||||
if( bind( sock, (struct sockaddr *)&addr, (socklen_t)sizeof( addr )) != 0 )
|
||||
@@ -372,7 +254,7 @@ GLOBAL VOID Conn_Handler( INT Timeout )
|
||||
Handle_Buffer( i );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* noch volle Schreib-Puffer suchen */
|
||||
FD_ZERO( &write_sockets );
|
||||
for( i = 0; i < MAX_CONNECTIONS; i++ )
|
||||
@@ -383,6 +265,11 @@ GLOBAL VOID Conn_Handler( INT Timeout )
|
||||
FD_SET( My_Connections[i].sock, &write_sockets );
|
||||
}
|
||||
}
|
||||
/* Sockets mit im Aufbau befindlichen ausgehenden Verbindungen suchen */
|
||||
for( i = 0; i < MAX_CONNECTIONS; i++ )
|
||||
{
|
||||
if(( My_Connections[i].sock > NONE ) && ( FD_ISSET( My_Connections[i].sock, &My_Connects ))) FD_SET( My_Connections[i].sock, &write_sockets );
|
||||
}
|
||||
|
||||
/* von welchen Sockets koennte gelesen werden? */
|
||||
read_sockets = My_Sockets;
|
||||
@@ -393,6 +280,11 @@ GLOBAL VOID Conn_Handler( INT Timeout )
|
||||
/* Hier muss noch auf den Resolver Sub-Prozess gewartet werden */
|
||||
FD_CLR( My_Connections[i].sock, &read_sockets );
|
||||
}
|
||||
if(( My_Connections[i].sock > NONE ) && ( FD_ISSET( My_Connections[i].sock, &My_Connects )))
|
||||
{
|
||||
/* Hier laeuft noch ein asyncrones connect() */
|
||||
FD_CLR( My_Connections[i].sock, &read_sockets );
|
||||
}
|
||||
}
|
||||
for( i = 0; i < My_Max_Fd + 1; i++ )
|
||||
{
|
||||
@@ -440,6 +332,10 @@ GLOBAL BOOLEAN Conn_WriteStr( CONN_ID Idx, CHAR *Format, ... )
|
||||
BOOLEAN ok;
|
||||
va_list ap;
|
||||
|
||||
assert( Idx >= 0 );
|
||||
assert( My_Connections[Idx].sock > NONE );
|
||||
assert( Format != NULL );
|
||||
|
||||
va_start( ap, Format );
|
||||
if( vsnprintf( buffer, COMMAND_LEN - 2, Format, ap ) == COMMAND_LEN - 2 )
|
||||
{
|
||||
@@ -449,7 +345,7 @@ GLOBAL BOOLEAN Conn_WriteStr( CONN_ID Idx, CHAR *Format, ... )
|
||||
}
|
||||
|
||||
#ifdef SNIFFER
|
||||
Log( LOG_DEBUG, " -> connection %d: '%s'.", Idx, buffer );
|
||||
if( NGIRCd_Sniffer ) Log( LOG_DEBUG, " -> connection %d: '%s'.", Idx, buffer );
|
||||
#endif
|
||||
|
||||
strcat( buffer, "\r\n" );
|
||||
@@ -506,7 +402,7 @@ GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformC
|
||||
* Sub-Prozessen offene Pipes werden geschlossen. */
|
||||
|
||||
CLIENT *c;
|
||||
|
||||
|
||||
assert( Idx >= 0 );
|
||||
assert( My_Connections[Idx].sock > NONE );
|
||||
|
||||
@@ -527,7 +423,7 @@ GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformC
|
||||
}
|
||||
|
||||
c = Client_GetFromConn( Idx );
|
||||
if( c ) Client_Destroy( c, LogMsg, FwdMsg );
|
||||
if( c ) Client_Destroy( c, LogMsg, FwdMsg, TRUE );
|
||||
|
||||
if( My_Connections[Idx].res_stat )
|
||||
{
|
||||
@@ -538,10 +434,17 @@ GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformC
|
||||
free( My_Connections[Idx].res_stat );
|
||||
}
|
||||
|
||||
/* Bei Server-Verbindungen lasttry-Zeitpunkt auf "jetzt" setzen */
|
||||
if( My_Connections[Idx].our_server >= 0 ) Conf_Server[My_Connections[Idx].our_server].lasttry = time( NULL );
|
||||
/* Bei Server-Verbindungen lasttry-Zeitpunkt so setzen, dass
|
||||
* der naechste Verbindungsversuch in RECONNECT_DELAY Sekunden
|
||||
* gestartet wird. */
|
||||
if(( My_Connections[Idx].our_server >= 0 ) && ( Conf_Server[My_Connections[Idx].our_server].lasttry < time( NULL )))
|
||||
{
|
||||
/* Okay, die Verbindung stand schon "genuegend lange" */
|
||||
Conf_Server[My_Connections[Idx].our_server].lasttry = time( NULL ) - Conf_ConnectRetry + RECONNECT_DELAY;
|
||||
}
|
||||
|
||||
FD_CLR( My_Connections[Idx].sock, &My_Sockets );
|
||||
FD_CLR( My_Connections[Idx].sock, &My_Connects );
|
||||
My_Connections[Idx].sock = NONE;
|
||||
} /* Conn_Close */
|
||||
|
||||
@@ -555,7 +458,7 @@ GLOBAL VOID Conn_UpdateIdle( CONN_ID Idx )
|
||||
}
|
||||
|
||||
|
||||
GLOBAL INT32 Conn_GetIdle( CONN_ID Idx )
|
||||
GLOBAL time_t Conn_GetIdle( CONN_ID Idx )
|
||||
{
|
||||
/* Idle-Time einer Verbindung liefern (in Sekunden) */
|
||||
|
||||
@@ -564,6 +467,15 @@ GLOBAL INT32 Conn_GetIdle( CONN_ID Idx )
|
||||
} /* Conn_GetIdle */
|
||||
|
||||
|
||||
GLOBAL time_t Conn_LastPing( CONN_ID Idx )
|
||||
{
|
||||
/* Zeitpunkt des letzten PING liefern */
|
||||
|
||||
assert( Idx >= 0 );
|
||||
return My_Connections[Idx].lastping;
|
||||
} /* Conn_LastPing */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Try_Write( CONN_ID Idx )
|
||||
{
|
||||
/* Versuchen, Daten aus dem Schreib-Puffer in den
|
||||
@@ -603,7 +515,7 @@ LOCAL VOID Handle_Read( INT Sock )
|
||||
CONN_ID idx;
|
||||
|
||||
assert( Sock >= 0 );
|
||||
|
||||
|
||||
if( FD_ISSET( Sock, &My_Listeners ))
|
||||
{
|
||||
/* es ist einer unserer Listener-Sockets: es soll
|
||||
@@ -629,12 +541,51 @@ LOCAL VOID Handle_Read( INT Sock )
|
||||
|
||||
LOCAL BOOLEAN Handle_Write( CONN_ID Idx )
|
||||
{
|
||||
/* Daten aus Schreibpuffer versenden */
|
||||
/* Daten aus Schreibpuffer versenden bzw. Connection aufbauen */
|
||||
|
||||
INT len;
|
||||
INT len, res, err;
|
||||
|
||||
assert( Idx >= 0 );
|
||||
assert( My_Connections[Idx].sock > NONE );
|
||||
|
||||
if( FD_ISSET( My_Connections[Idx].sock, &My_Connects ))
|
||||
{
|
||||
/* es soll nichts geschrieben werden, sondern ein
|
||||
* connect() hat ein Ergebnis geliefert */
|
||||
|
||||
FD_CLR( My_Connections[Idx].sock, &My_Connects );
|
||||
|
||||
/* Ergebnis des connect() ermitteln */
|
||||
len = sizeof( err );
|
||||
res = getsockopt( My_Connections[Idx].sock, SOL_SOCKET, SO_ERROR, &err, &len );
|
||||
assert( len == sizeof( err ));
|
||||
|
||||
/* Fehler aufgetreten? */
|
||||
if(( res != 0 ) || ( err != 0 ))
|
||||
{
|
||||
/* Fehler! */
|
||||
if( res != 0 ) Log( LOG_CRIT, "getsockopt (connection %d): %s!", Idx, strerror( errno ));
|
||||
else Log( LOG_CRIT, "Can't connect socket to \"%s:%d\" (connection %d): %s!", My_Connections[Idx].host, Conf_Server[My_Connections[Idx].our_server].port, Idx, strerror( err ));
|
||||
|
||||
/* Socket etc. pp. aufraeumen */
|
||||
FD_CLR( My_Connections[Idx].sock, &My_Sockets );
|
||||
close( My_Connections[Idx].sock );
|
||||
Init_Conn_Struct( Idx );
|
||||
|
||||
/* Bei Server-Verbindungen lasttry-Zeitpunkt auf "jetzt" setzen */
|
||||
Conf_Server[My_Connections[Idx].our_server].lasttry = time( NULL );
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
Log( LOG_DEBUG, "Connection %d with \"%s:%d\" established, now sendig PASS and SERVER ...", Idx, My_Connections[Idx].host, Conf_Server[My_Connections[Idx].our_server].port );
|
||||
|
||||
/* PASS und SERVER verschicken */
|
||||
Conn_WriteStr( Idx, "PASS %s "PASSSERVERADD, Conf_Server[My_Connections[Idx].our_server].pwd );
|
||||
Conn_WriteStr( Idx, "SERVER %s :%s", Conf_ServerName, Conf_ServerInfo );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
assert( My_Connections[Idx].wdatalen > 0 );
|
||||
|
||||
/* Daten schreiben */
|
||||
@@ -664,7 +615,7 @@ LOCAL VOID New_Connection( INT Sock )
|
||||
INT new_sock, new_sock_len;
|
||||
RES_STAT *s;
|
||||
CONN_ID idx;
|
||||
|
||||
|
||||
assert( Sock >= 0 );
|
||||
|
||||
new_sock_len = sizeof( new_addr );
|
||||
@@ -757,7 +708,7 @@ LOCAL VOID Read_Request( CONN_ID Idx )
|
||||
{
|
||||
/* Socket wurde geschlossen */
|
||||
Log( LOG_INFO, "%s:%d is closing the connection ...", inet_ntoa( My_Connections[Idx].addr.sin_addr ), ntohs( My_Connections[Idx].addr.sin_port));
|
||||
Conn_Close( Idx, "Socket closed.", NULL, FALSE );
|
||||
Conn_Close( Idx, "Socket closed!", "Client closed connection", FALSE );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -765,7 +716,7 @@ LOCAL VOID Read_Request( CONN_ID Idx )
|
||||
{
|
||||
/* Fehler beim Lesen */
|
||||
Log( LOG_ERR, "Read error on connection %d: %s!", Idx, strerror( errno ));
|
||||
Conn_Close( Idx, "Read error!", NULL, FALSE );
|
||||
Conn_Close( Idx, "Read error!", "Client closed connection", FALSE );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -787,7 +738,7 @@ LOCAL VOID Handle_Buffer( CONN_ID Idx )
|
||||
|
||||
CHAR *ptr, *ptr1, *ptr2;
|
||||
INT len, delta;
|
||||
|
||||
|
||||
/* Eine komplette Anfrage muss mit CR+LF enden, vgl.
|
||||
* RFC 2812. Haben wir eine? */
|
||||
ptr = strstr( My_Connections[Idx].rbuf, "\r\n" );
|
||||
@@ -806,7 +757,7 @@ LOCAL VOID Handle_Buffer( CONN_ID Idx )
|
||||
else if( ptr2 ) ptr = ptr2;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
if( ptr )
|
||||
{
|
||||
/* Ende der Anfrage wurde gefunden */
|
||||
@@ -821,7 +772,7 @@ LOCAL VOID Handle_Buffer( CONN_ID Idx )
|
||||
Conn_Close( Idx, NULL, "Request too long", TRUE );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if( len > delta )
|
||||
{
|
||||
/* Es wurde ein Request gelesen */
|
||||
@@ -858,7 +809,7 @@ LOCAL VOID Check_Connections( VOID )
|
||||
if( My_Connections[i].lastping < time( NULL ) - Conf_PongTimeout )
|
||||
{
|
||||
/* Timeout */
|
||||
Log( LOG_DEBUG, "Connection %d: Ping timeout.", i );
|
||||
Log( LOG_DEBUG, "Connection %d: Ping timeout: %d seconds.", i, Conf_PongTimeout );
|
||||
Conn_Close( i, NULL, "Ping timeout", TRUE );
|
||||
}
|
||||
}
|
||||
@@ -876,8 +827,8 @@ LOCAL VOID Check_Connections( VOID )
|
||||
if( My_Connections[i].lastdata < time( NULL ) - Conf_PingTimeout )
|
||||
{
|
||||
/* Timeout */
|
||||
Log( LOG_INFO, "Connection %d: Timeout.", i );
|
||||
Conn_Close( i, NULL, "Timeout", TRUE );
|
||||
Log( LOG_DEBUG, "Connection %d timed out ...", i );
|
||||
Conn_Close( i, NULL, "Timeout", FALSE );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -891,16 +842,22 @@ LOCAL VOID Check_Servers( VOID )
|
||||
|
||||
INT idx, i, n;
|
||||
RES_STAT *s;
|
||||
|
||||
|
||||
/* Wenn "Passive-Mode" aktiv: nicht verbinden */
|
||||
if( NGIRCd_Passive ) return;
|
||||
|
||||
for( i = 0; i < Conf_Server_Count; i++ )
|
||||
{
|
||||
/* Ist ein Hostname und Port definiert? */
|
||||
if(( ! Conf_Server[i].host[0] ) || ( ! Conf_Server[i].port > 0 )) continue;
|
||||
|
||||
|
||||
/* Haben wir schon eine Verbindung? */
|
||||
for( n = 0; n < MAX_CONNECTIONS; n++ )
|
||||
{
|
||||
if(( My_Connections[n].sock != NONE ) && ( My_Connections[n].our_server == i ))
|
||||
if( My_Connections[n].sock == NONE ) continue;
|
||||
|
||||
/* Verbindung zu diesem Server? */
|
||||
if( My_Connections[n].our_server == i )
|
||||
{
|
||||
/* Komplett aufgebaute Verbindung? */
|
||||
if( My_Connections[n].sock > NONE ) break;
|
||||
@@ -908,9 +865,15 @@ LOCAL VOID Check_Servers( VOID )
|
||||
/* IP schon aufgeloest? */
|
||||
if( My_Connections[n].res_stat == NULL ) New_Server( i, n );
|
||||
}
|
||||
|
||||
/* Verbindung in dieser Server-Gruppe? */
|
||||
if(( My_Connections[n].our_server != NONE ) && ( Conf_Server[i].group != NONE ))
|
||||
{
|
||||
if( Conf_Server[My_Connections[n].our_server].group == Conf_Server[i].group ) break;
|
||||
}
|
||||
}
|
||||
if( n < MAX_CONNECTIONS ) continue;
|
||||
|
||||
|
||||
/* Wann war der letzte Connect-Versuch? */
|
||||
if( Conf_Server[i].lasttry > time( NULL ) - Conf_ConnectRetry ) continue;
|
||||
|
||||
@@ -930,7 +893,7 @@ LOCAL VOID Check_Servers( VOID )
|
||||
Init_Conn_Struct( idx );
|
||||
My_Connections[idx].sock = SERVER_WAIT;
|
||||
My_Connections[idx].our_server = i;
|
||||
|
||||
|
||||
/* Hostnamen in IP aufloesen */
|
||||
s = ResolveName( Conf_Server[i].host );
|
||||
if( s )
|
||||
@@ -967,8 +930,8 @@ LOCAL VOID New_Server( INT Server, CONN_ID Idx )
|
||||
Log( LOG_ERR, "Can't connect to \"%s\" (connection %d): ip address unknown!", Conf_Server[Server].host, Idx );
|
||||
return;
|
||||
}
|
||||
|
||||
Log( LOG_INFO, "Establishing connection to \"%s\", %s (connection %d) ... ", Conf_Server[Server].host, Conf_Server[Server].ip, Idx );
|
||||
|
||||
Log( LOG_INFO, "Establishing connection to \"%s\", %s, port %d (connection %d) ... ", Conf_Server[Server].host, Conf_Server[Server].ip, Conf_Server[Server].port, Idx );
|
||||
|
||||
if( inet_aton( Conf_Server[Server].ip, &inaddr ) == 0 )
|
||||
{
|
||||
@@ -990,8 +953,13 @@ LOCAL VOID New_Server( INT Server, CONN_ID Idx )
|
||||
Log( LOG_CRIT, "Can't create socket: %s!", strerror( errno ));
|
||||
return;
|
||||
}
|
||||
if( connect( new_sock, (struct sockaddr *)&new_addr, sizeof( new_addr )) < 0)
|
||||
|
||||
if( ! Init_Socket( new_sock )) return;
|
||||
|
||||
connect( new_sock, (struct sockaddr *)&new_addr, sizeof( new_addr ));
|
||||
if( errno != EINPROGRESS )
|
||||
{
|
||||
|
||||
close( new_sock );
|
||||
Init_Conn_Struct( Idx );
|
||||
Log( LOG_CRIT, "Can't connect socket: %s!", strerror( errno ));
|
||||
@@ -1008,7 +976,8 @@ LOCAL VOID New_Server( INT Server, CONN_ID Idx )
|
||||
return;
|
||||
}
|
||||
Client_SetIntroducer( c, c );
|
||||
|
||||
Client_SetToken( c, TOKEN_OUTBOUND );
|
||||
|
||||
/* Verbindung registrieren */
|
||||
My_Connections[Idx].sock = new_sock;
|
||||
My_Connections[Idx].addr = new_addr;
|
||||
@@ -1016,11 +985,8 @@ LOCAL VOID New_Server( INT Server, CONN_ID Idx )
|
||||
|
||||
/* Neuen Socket registrieren */
|
||||
FD_SET( new_sock, &My_Sockets );
|
||||
FD_SET( new_sock, &My_Connects );
|
||||
if( new_sock > My_Max_Fd ) My_Max_Fd = new_sock;
|
||||
|
||||
/* PASS und SERVER verschicken */
|
||||
Conn_WriteStr( Idx, "PASS %s "PROTOVER""PROTOSUFFIX" IRC|"PACKAGE"-"VERSION" P", Conf_Server[Server].pwd );
|
||||
Conn_WriteStr( Idx, "SERVER %s :%s", Conf_ServerName, Conf_ServerInfo );
|
||||
} /* New_Server */
|
||||
|
||||
|
||||
@@ -1035,13 +1001,37 @@ LOCAL VOID Init_Conn_Struct( INT Idx )
|
||||
My_Connections[Idx].rdatalen = 0;
|
||||
My_Connections[Idx].wbuf[0] = '\0';
|
||||
My_Connections[Idx].wdatalen = 0;
|
||||
My_Connections[Idx].our_server = -1;
|
||||
My_Connections[Idx].our_server = NONE;
|
||||
My_Connections[Idx].lastdata = time( NULL );
|
||||
My_Connections[Idx].lastping = 0;
|
||||
My_Connections[Idx].lastprivmsg = time( NULL );
|
||||
} /* Init_Conn_Struct */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Init_Socket( INT Sock )
|
||||
{
|
||||
/* Socket-Optionen setzen */
|
||||
|
||||
INT on = 1;
|
||||
|
||||
#ifdef O_NONBLOCK /* A/UX kennt das nicht? */
|
||||
if( fcntl( Sock, F_SETFL, O_NONBLOCK ) != 0 )
|
||||
{
|
||||
Log( LOG_CRIT, "Can't enable non-blocking mode: %s!", strerror( errno ));
|
||||
close( Sock );
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
if( setsockopt( Sock, SOL_SOCKET, SO_REUSEADDR, &on, (socklen_t)sizeof( on )) != 0)
|
||||
{
|
||||
Log( LOG_ERR, "Can't set socket options: %s!", strerror( errno ));
|
||||
/* dieser Fehler kann ignoriert werden. */
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
} /* Init_Socket */
|
||||
|
||||
|
||||
LOCAL RES_STAT *ResolveAddr( struct sockaddr_in *Addr )
|
||||
{
|
||||
/* IP (asyncron!) aufloesen. Bei Fehler, z.B. wenn der
|
||||
|
@@ -9,42 +9,9 @@
|
||||
* 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.10 2002/01/06 15:18:15 alex Exp $
|
||||
* $Id: conn.h,v 1.14 2002/03/29 22:54:35 alex Exp $
|
||||
*
|
||||
* conn.h: Verwaltung aller Netz-Verbindungen ("connections") (Header)
|
||||
*
|
||||
* $Log: conn.h,v $
|
||||
* Revision 1.10 2002/01/06 15:18:15 alex
|
||||
* - Loglevel und Meldungen nochmals geaendert. Level passen nun besser.
|
||||
*
|
||||
* Revision 1.9 2002/01/02 02:44:36 alex
|
||||
* - neue Defines fuer max. Anzahl Server und Operatoren.
|
||||
*
|
||||
* Revision 1.8 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.7 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.6 2001/12/25 22:03:47 alex
|
||||
* - Conn_Close() eingefuehrt: war die lokale Funktion Close_Connection().
|
||||
*
|
||||
* Revision 1.5 2001/12/23 21:57:48 alex
|
||||
* - Conn_WriteStr() unterstuetzt nun variable Parameter.
|
||||
*
|
||||
* Revision 1.4 2001/12/15 00:08:27 alex
|
||||
* - neue globale Funktionen: Conn_Write() und Conn_WriteStr().
|
||||
*
|
||||
* Revision 1.3 2001/12/14 08:15:45 alex
|
||||
* - CONN_ID wird definiert.
|
||||
*
|
||||
* Revision 1.2 2001/12/13 01:33:32 alex
|
||||
* - Conn_Handler() unterstuetzt nun einen Timeout (in Sekunden).
|
||||
*
|
||||
* Revision 1.1 2001/12/12 17:18:38 alex
|
||||
* - Modul zur Verwaltung aller Netzwerk-Verbindungen begonnen.
|
||||
*/
|
||||
|
||||
|
||||
@@ -52,6 +19,9 @@
|
||||
#define __conn_h__
|
||||
|
||||
|
||||
#include <time.h>
|
||||
|
||||
|
||||
typedef INT CONN_ID;
|
||||
|
||||
typedef struct _Res_Stat
|
||||
@@ -64,7 +34,7 @@ typedef struct _Res_Stat
|
||||
GLOBAL VOID Conn_Init( VOID );
|
||||
GLOBAL VOID Conn_Exit( VOID );
|
||||
|
||||
GLOBAL BOOLEAN Conn_NewListener( CONST INT Port );
|
||||
GLOBAL BOOLEAN Conn_NewListener( CONST UINT Port );
|
||||
|
||||
GLOBAL VOID Conn_Handler( INT Timeout );
|
||||
|
||||
@@ -74,7 +44,8 @@ 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 INT32 Conn_GetIdle( CONN_ID Idx );
|
||||
GLOBAL time_t Conn_GetIdle( CONN_ID Idx );
|
||||
GLOBAL time_t Conn_LastPing( CONN_ID Idx );
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -9,22 +9,9 @@
|
||||
* 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.3 2002/01/03 02:24:00 alex Exp $
|
||||
* $Id: defines.h,v 1.21.2.1 2002/04/08 18:07:42 alex Exp $
|
||||
*
|
||||
* defines.h: (globale) Konstanten
|
||||
*
|
||||
* $Log: defines.h,v $
|
||||
* Revision 1.3 2002/01/03 02:24:00 alex
|
||||
* - Protokollversion und Suffix definiert.
|
||||
*
|
||||
* Revision 1.2 2002/01/02 02:44:36 alex
|
||||
* - neue Defines fuer max. Anzahl Server und Operatoren.
|
||||
*
|
||||
* Revision 1.1 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __defines_h__
|
||||
@@ -41,14 +28,12 @@
|
||||
|
||||
#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_CONNECTIONS 100 /* max. Anzahl von Verbindungen an diesem Server */
|
||||
|
||||
#define MAX_CHANNELS 32 /* max. Anzahl Channels pro Nick */
|
||||
|
||||
#define CLIENT_ID_LEN 64 /* max. ID-Laenge; vgl. RFC 2812, 1.1 und 1.2.1 */
|
||||
#define CLIENT_NICK_LEN 10 /* max. Nick-Laenge; vgl. RFC 2812, 1.2.1 */
|
||||
#define CLIENT_PASS_LEN 9 /* max. Laenge des Passwortes */
|
||||
@@ -57,10 +42,13 @@
|
||||
#define CLIENT_HOST_LEN 64 /* max. Laenge des Hostname */
|
||||
#define CLIENT_MODE_LEN 8 /* max. Laenge der Client-Modes */
|
||||
#define CLIENT_INFO_LEN 64 /* max. Infotext-Laenge (Server) */
|
||||
|
||||
#define COMMAND_LEN 513 /* max. Laenge eines Befehls, vgl. RFC 2812, 3.2 */
|
||||
#define CLIENT_AWAY_LEN 128 /* max. Laenger der AWAY-Nachricht */
|
||||
|
||||
#define CHANNEL_NAME_LEN 51 /* max. Laenge eines Channel-Namens, vgl. RFC 2812, 1.3 */
|
||||
#define CHANNEL_MODE_LEN 8 /* max. Laenge der Channel-Modes */
|
||||
#define CHANNEL_TOPIC_LEN 128 /* max. Laenge eines Channel-Topics */
|
||||
|
||||
#define COMMAND_LEN 513 /* max. Laenge eines Befehls, vgl. RFC 2812, 3.2 */
|
||||
|
||||
#define READBUFFER_LEN 2 * COMMAND_LEN /* Laenge des Lesepuffers je Verbindung (Bytes) */
|
||||
#define WRITEBUFFER_LEN 4096 /* Laenge des Schreibpuffers je Verbindung (Bytes) */
|
||||
@@ -68,6 +56,27 @@
|
||||
#define PROTOVER "0210" /* implementierte Protokoll-Version (RFC 2813, 4.1.1) */
|
||||
#define PROTOSUFFIX "-ngIRCd" /* Protokoll-Suffix (RFC 2813, 4.1.1) */
|
||||
|
||||
#define PASSSERVERADD PROTOVER""PROTOSUFFIX" IRC|"PACKAGE"-"VERSION" P"
|
||||
|
||||
#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 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"
|
||||
#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
|
||||
|
||||
|
@@ -1,58 +0,0 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: global.h,v 1.6 2002/01/05 15:55:11 alex Exp $
|
||||
*
|
||||
* global.h: Globaler Header, wir in jedes(!) Modul eingebunden.
|
||||
*
|
||||
* $Log: global.h,v $
|
||||
* Revision 1.6 2002/01/05 15:55:11 alex
|
||||
* - Wrapper fuer inet_aton(): liefert immer Fehler.
|
||||
*
|
||||
* Revision 1.5 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.4 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.3 2001/12/14 08:14:34 alex
|
||||
* - NONE als -1 definiert. Macht den Source lesbarer ;-)
|
||||
*
|
||||
* Revision 1.2 2001/12/12 01:58:53 alex
|
||||
* - Test auf socklen_t verbessert.
|
||||
*
|
||||
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
* Imported sources to CVS.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __global_h__
|
||||
#define __global_h__
|
||||
|
||||
|
||||
#include "config.h"
|
||||
#include "defines.h"
|
||||
|
||||
#ifndef HAVE_socklen_t
|
||||
#define socklen_t int /* u.a. fuer Mac OS X */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_INET_ATON
|
||||
#define inet_aton( opt, bind ) 0
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
127
src/ngircd/hash.c
Normal file
127
src/ngircd/hash.c
Normal file
@@ -0,0 +1,127 @@
|
||||
/*
|
||||
* 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: hash.c,v 1.4 2002/03/25 19:11:01 alex Exp $
|
||||
*
|
||||
* hash.c: Hash-Werte berechnen
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "log.h"
|
||||
#include "tool.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "hash.h"
|
||||
|
||||
|
||||
LOCAL UINT32 jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval);
|
||||
|
||||
|
||||
GLOBAL UINT32 Hash( CHAR *String )
|
||||
{
|
||||
/* Hash-Wert ueber String berechnen */
|
||||
|
||||
CHAR buffer[LINE_LEN];
|
||||
|
||||
strncpy( buffer, String, LINE_LEN - 1 );
|
||||
buffer[LINE_LEN - 1] = '\0';
|
||||
|
||||
return jenkins_hash( (UINT8 *)ngt_LowerStr( buffer ), strlen( buffer ), 42 );
|
||||
} /* Hash */
|
||||
|
||||
|
||||
/*
|
||||
* Die hier verwendete Hash-Funktion stammt aus lookup2.c von Bob Jenkins
|
||||
* (URL: <http://burtleburtle.net/bob/c/lookup2.c>). Aus dem Header:
|
||||
* --------------------------------------------------------------------
|
||||
* lookup2.c, by Bob Jenkins, December 1996, Public Domain.
|
||||
* hash(), hash2(), hash3, and mix() are externally useful functions.
|
||||
* Routines to test the hash are included if SELF_TEST is defined.
|
||||
* You can use this free for any purpose. It has no warranty.
|
||||
* --------------------------------------------------------------------
|
||||
* nicht alle seiner Funktionen werden hier genutzt.
|
||||
*/
|
||||
|
||||
|
||||
#define hashsize(n) ((UINT32)1<<(n))
|
||||
#define hashmask(n) (hashsize(n)-1)
|
||||
|
||||
#define mix(a,b,c) \
|
||||
{ \
|
||||
a -= b; a -= c; a ^= (c>>13); \
|
||||
b -= c; b -= a; b ^= (a<<8); \
|
||||
c -= a; c -= b; c ^= (b>>13); \
|
||||
a -= b; a -= c; a ^= (c>>12); \
|
||||
b -= c; b -= a; b ^= (a<<16); \
|
||||
c -= a; c -= b; c ^= (b>>5); \
|
||||
a -= b; a -= c; a ^= (c>>3); \
|
||||
b -= c; b -= a; b ^= (a<<10); \
|
||||
c -= a; c -= b; c ^= (b>>15); \
|
||||
} /* mix */
|
||||
|
||||
|
||||
LOCAL UINT32 jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval)
|
||||
{
|
||||
/* k: the key
|
||||
* length: length of the key
|
||||
* initval: the previous hash, or an arbitrary value
|
||||
*/
|
||||
|
||||
register UINT32 a,b,c,len;
|
||||
|
||||
/* Set up the internal state */
|
||||
len = length;
|
||||
a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */
|
||||
c = initval; /* the previous hash value */
|
||||
|
||||
/* handle most of the key */
|
||||
while (len >= 12)
|
||||
{
|
||||
a += (k[0] +((UINT32)k[1]<<8) +((UINT32)k[2]<<16) +((UINT32)k[3]<<24));
|
||||
b += (k[4] +((UINT32)k[5]<<8) +((UINT32)k[6]<<16) +((UINT32)k[7]<<24));
|
||||
c += (k[8] +((UINT32)k[9]<<8) +((UINT32)k[10]<<16)+((UINT32)k[11]<<24));
|
||||
mix(a,b,c);
|
||||
k += 12; len -= 12;
|
||||
}
|
||||
|
||||
/* handle the last 11 bytes */
|
||||
c += length;
|
||||
switch(len) /* all the case statements fall through */
|
||||
{
|
||||
case 11: c+=((UINT32)k[10]<<24);
|
||||
case 10: c+=((UINT32)k[9]<<16);
|
||||
case 9 : c+=((UINT32)k[8]<<8);
|
||||
/* the first byte of c is reserved for the length */
|
||||
case 8 : b+=((UINT32)k[7]<<24);
|
||||
case 7 : b+=((UINT32)k[6]<<16);
|
||||
case 6 : b+=((UINT32)k[5]<<8);
|
||||
case 5 : b+=k[4];
|
||||
case 4 : a+=((UINT32)k[3]<<24);
|
||||
case 3 : a+=((UINT32)k[2]<<16);
|
||||
case 2 : a+=((UINT32)k[1]<<8);
|
||||
case 1 : a+=k[0];
|
||||
/* case 0: nothing left to add */
|
||||
}
|
||||
mix(a,b,c);
|
||||
|
||||
/* report the result */
|
||||
return c;
|
||||
} /* jenkins_hash */
|
||||
|
||||
|
||||
/* -eof- */
|
28
src/ngircd/hash.h
Normal file
28
src/ngircd/hash.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: hash.h,v 1.2 2002/03/14 15:49:36 alex Exp $
|
||||
*
|
||||
* hash.h: Hash-Werte berechnen (Header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __hash_h__
|
||||
#define __hash_h__
|
||||
|
||||
|
||||
GLOBAL UINT32 Hash( CHAR *String );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
262
src/ngircd/irc-channel.c
Normal file
262
src/ngircd/irc-channel.c
Normal file
@@ -0,0 +1,262 @@
|
||||
/*
|
||||
* 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-channel.c,v 1.3.2.1 2002/04/29 14:11:23 alex Exp $
|
||||
*
|
||||
* irc-channel.c: IRC-Channel-Befehle
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "defines.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 )
|
||||
{
|
||||
CHAR *channame, *flags, *topic, modes[8];
|
||||
BOOLEAN is_new_chan;
|
||||
CLIENT *target;
|
||||
CHANNEL *chan;
|
||||
|
||||
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 );
|
||||
|
||||
/* Wer ist der Absender? */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
|
||||
else target = Client;
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
|
||||
/* Channel-Namen durchgehen */
|
||||
channame = strtok( Req->argv[0], "," );
|
||||
while( channame )
|
||||
{
|
||||
/* wird der Channel neu angelegt? */
|
||||
flags = NULL;
|
||||
|
||||
if( Channel_Search( channame )) is_new_chan = FALSE;
|
||||
else is_new_chan = TRUE;
|
||||
|
||||
/* Hat ein Server Channel-User-Modes uebergeben? */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Channel-Flags extrahieren */
|
||||
flags = strchr( channame, 0x7 );
|
||||
if( flags ) *flags++ = '\0';
|
||||
}
|
||||
|
||||
/* neuer Channel udn lokaler Client? */
|
||||
if( is_new_chan && ( Client_Type( Client ) == CLIENT_USER ))
|
||||
{
|
||||
/* Dann soll der Client Channel-Operator werden! */
|
||||
flags = "o";
|
||||
}
|
||||
|
||||
/* Channel joinen (und ggf. anlegen) */
|
||||
if( ! Channel_Join( target, channame ))
|
||||
{
|
||||
/* naechsten Namen ermitteln */
|
||||
channame = strtok( NULL, "," );
|
||||
continue;
|
||||
}
|
||||
chan = Channel_Search( channame );
|
||||
assert( chan != NULL );
|
||||
|
||||
/* Modes setzen (wenn vorhanden) */
|
||||
while( flags && *flags )
|
||||
{
|
||||
Channel_UserModeAdd( chan, target, *flags );
|
||||
flags++;
|
||||
}
|
||||
|
||||
/* Muessen Modes an andere Server gemeldet werden? */
|
||||
strcpy( &modes[1], Channel_UserModes( chan, target ));
|
||||
if( modes[1] ) modes[0] = 0x7;
|
||||
else modes[0] = '\0';
|
||||
|
||||
/* An andere Server weiterleiten */
|
||||
IRC_WriteStrServersPrefix( Client, target, "JOIN :%s%s", channame, modes );
|
||||
|
||||
/* im Channel bekannt machen */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "JOIN :%s", channame );
|
||||
if( modes[1] )
|
||||
{
|
||||
/* Modes im Channel bekannt machen */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "MODE %s %s :%s", channame, modes, Client_ID( target ));
|
||||
}
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
{
|
||||
/* an Client bestaetigen */
|
||||
IRC_WriteStrClientPrefix( Client, target, "JOIN :%s", channame );
|
||||
|
||||
/* Topic an Client schicken */
|
||||
topic = Channel_Topic( chan );
|
||||
if( *topic ) IRC_WriteStrClient( Client, RPL_TOPIC_MSG, Client_ID( Client ), channame, topic );
|
||||
|
||||
/* Mitglieder an Client Melden */
|
||||
IRC_Send_NAMES( Client, chan );
|
||||
IRC_WriteStrClient( Client, RPL_ENDOFNAMES_MSG, Client_ID( Client ), Channel_Name( chan ));
|
||||
}
|
||||
|
||||
/* naechsten Namen ermitteln */
|
||||
channame = strtok( NULL, "," );
|
||||
}
|
||||
return CONNECTED;
|
||||
} /* IRC_JOIN */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PART( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target;
|
||||
CHAR *chan;
|
||||
|
||||
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 );
|
||||
|
||||
/* Wer ist der Absender? */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
|
||||
else target = Client;
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
|
||||
/* Channel-Namen durchgehen */
|
||||
chan = strtok( Req->argv[0], "," );
|
||||
while( chan )
|
||||
{
|
||||
if( ! Channel_Part( target, Client, chan, Req->argc > 1 ? Req->argv[1] : Client_ID( target )))
|
||||
{
|
||||
/* naechsten Namen ermitteln */
|
||||
chan = strtok( NULL, "," );
|
||||
continue;
|
||||
}
|
||||
|
||||
/* naechsten Namen ermitteln */
|
||||
chan = strtok( NULL, "," );
|
||||
}
|
||||
return CONNECTED;
|
||||
} /* IRC_PART */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHANNEL *chan;
|
||||
CLIENT *from;
|
||||
CHAR *topic;
|
||||
|
||||
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 ) || ( 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 );
|
||||
|
||||
/* Welcher Channel? */
|
||||
chan = Channel_Search( Req->argv[0] );
|
||||
if( ! chan ) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( from ), Req->argv[0] );
|
||||
|
||||
/* Ist der User Mitglied in dem Channel? */
|
||||
if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( from ), Req->argv[0] );
|
||||
|
||||
if( Req->argc == 1 )
|
||||
{
|
||||
/* Topic erfragen */
|
||||
topic = Channel_Topic( chan );
|
||||
if( *topic ) return IRC_WriteStrClient( from, RPL_TOPIC_MSG, Client_ID( from ), Channel_Name( chan ), topic );
|
||||
else return IRC_WriteStrClient( from, RPL_NOTOPIC_MSG, Client_ID( from ), Channel_Name( chan ));
|
||||
}
|
||||
|
||||
if( strchr( Channel_Modes( chan ), 't' ))
|
||||
{
|
||||
/* Topic Lock. Ist der User ein Channel Operator? */
|
||||
if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
|
||||
}
|
||||
|
||||
/* Topic setzen */
|
||||
Channel_SetTopic( chan, Req->argv[1] );
|
||||
Log( LOG_DEBUG, "User \"%s\" set topic on \"%s\": %s", Client_Mask( from ), Channel_Name( chan ), Req->argv[1][0] ? Req->argv[1] : "<none>" );
|
||||
|
||||
/* im Channel bekannt machen und an Server weiterleiten */
|
||||
IRC_WriteStrServersPrefix( Client, from, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
|
||||
IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_USER ) return IRC_WriteStrClientPrefix( Client, Client, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
|
||||
else return CONNECTED;
|
||||
} /* IRC_TOPIC */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_LIST( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR *pattern;
|
||||
CHANNEL *chan;
|
||||
|
||||
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 > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
if( Req->argc > 0 ) pattern = strtok( Req->argv[0], "," );
|
||||
else pattern = "*";
|
||||
|
||||
while( pattern )
|
||||
{
|
||||
/* alle Channel durchgehen */
|
||||
chan = Channel_First( );
|
||||
while( chan )
|
||||
{
|
||||
/* Passt die Suchmaske auf diesen Channel? Bisher werden hier
|
||||
* "regular expressions" aber noch nicht unterstuetzt ... */
|
||||
if(( strcasecmp( pattern, Channel_Name( chan )) == 0 ) || ( strcmp( pattern, "*" ) == 0 ))
|
||||
{
|
||||
/* Treffer! */
|
||||
if( ! IRC_WriteStrClient( Client, RPL_LIST_MSG, Client_ID( Client), Channel_Name( chan ), Channel_MemberCount( chan ), Channel_Topic( chan ))) return DISCONNECTED;
|
||||
}
|
||||
chan = Channel_Next( chan );
|
||||
}
|
||||
|
||||
/* naechsten Namen ermitteln */
|
||||
if( Req->argc > 0 ) pattern = strtok( NULL, "," );
|
||||
else pattern = NULL;
|
||||
}
|
||||
|
||||
return IRC_WriteStrClient( Client, RPL_LISTEND_MSG, Client_ID( Client ));
|
||||
} /* IRC_LIST */
|
||||
|
||||
|
||||
/* -eof- */
|
34
src/ngircd/irc-channel.h
Normal file
34
src/ngircd/irc-channel.h
Normal file
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* 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-channel.h,v 1.2.2.1 2002/04/29 14:11:23 alex Exp $
|
||||
*
|
||||
* irc-channel.h: IRC-Channel-Befehle (Header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __irc_channel_h__
|
||||
#define __irc_channel_h__
|
||||
|
||||
#include "parse.h"
|
||||
#include "client.h"
|
||||
|
||||
|
||||
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( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
414
src/ngircd/irc-login.c
Normal file
414
src/ngircd/irc-login.c
Normal file
@@ -0,0 +1,414 @@
|
||||
/*
|
||||
* 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-login.c,v 1.11.2.1 2002/04/08 18:07:42 alex Exp $
|
||||
*
|
||||
* irc-login.c: Anmeldung und Abmeldung im IRC
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "conf.h"
|
||||
#include "irc.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-login.h"
|
||||
|
||||
|
||||
LOCAL BOOLEAN Hello_User( CLIENT *Client );
|
||||
LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason );
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Fehler liefern, wenn kein lokaler Client */
|
||||
if( Client_Conn( Client ) <= NONE ) return IRC_WriteStrClient( Client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
if(( Client_Type( Client ) == CLIENT_UNKNOWN ) && ( Req->argc == 1))
|
||||
{
|
||||
/* noch nicht registrierte unbekannte Verbindung */
|
||||
Log( LOG_DEBUG, "Connection %d: got PASS command ...", Client_Conn( Client ));
|
||||
|
||||
/* Passwort speichern */
|
||||
Client_SetPassword( Client, Req->argv[0] );
|
||||
|
||||
Client_SetType( Client, CLIENT_GOTPASS );
|
||||
return CONNECTED;
|
||||
}
|
||||
else if((( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) && (( Req->argc == 3 ) || ( Req->argc == 4 )))
|
||||
{
|
||||
/* 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] );
|
||||
|
||||
Client_SetType( Client, CLIENT_GOTPASSSERVER );
|
||||
return CONNECTED;
|
||||
}
|
||||
else if(( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER ))
|
||||
{
|
||||
/* Falsche Anzahl Parameter? */
|
||||
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
}
|
||||
else return IRC_WriteStrClient( Client, ERR_ALREADYREGISTRED_MSG, Client_ID( Client ));
|
||||
} /* IRC_PASS */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *intr_c, *target, *c;
|
||||
CHAR *modes;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Zumindest BitchX sendet NICK-USER in der falschen Reihenfolge. */
|
||||
#ifndef STRICT_RFC
|
||||
if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTUSER || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
|
||||
#else
|
||||
if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
|
||||
#endif
|
||||
{
|
||||
/* User-Registrierung bzw. Nick-Aenderung */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* "Ziel-Client" ermitteln */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
target = Client_Search( Req->prefix );
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Ist der Client "restricted"? */
|
||||
if( Client_HasMode( Client, 'r' )) return IRC_WriteStrClient( Client, ERR_RESTRICTED_MSG, Client_ID( Client ));
|
||||
target = Client;
|
||||
}
|
||||
|
||||
#ifndef STRICT_RFC
|
||||
/* Wenn der Client zu seinem eigenen Nick wechseln will, so machen
|
||||
* wir nichts. So macht es das Original und mind. Snak hat probleme,
|
||||
* 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 :-) */
|
||||
if( strcasecmp( Client_ID( target ), Req->argv[0] ) != 0 )
|
||||
{
|
||||
if( ! Client_CheckNick( target, Req->argv[0] )) return CONNECTED;
|
||||
}
|
||||
|
||||
if(( Client_Type( target ) != CLIENT_USER ) && ( Client_Type( target ) != CLIENT_SERVER ))
|
||||
{
|
||||
/* Neuer Client */
|
||||
Log( LOG_DEBUG, "Connection %d: got valid NICK command ...", Client_Conn( Client ));
|
||||
|
||||
/* Client-Nick registrieren */
|
||||
Client_SetID( target, Req->argv[0] );
|
||||
|
||||
/* schon ein USER da? Dann registrieren! */
|
||||
if( Client_Type( Client ) == CLIENT_GOTUSER ) return Hello_User( Client );
|
||||
else Client_SetType( Client, CLIENT_GOTNICK );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Nick-Aenderung */
|
||||
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] );
|
||||
IRC_WriteStrServersPrefix( Client, target, "NICK :%s", Req->argv[0] );
|
||||
IRC_WriteStrRelatedPrefix( target, target, FALSE, "NICK :%s", Req->argv[0] );
|
||||
|
||||
/* neuen Client-Nick speichern */
|
||||
Client_SetID( target, Req->argv[0] );
|
||||
}
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Server fuehrt neuen Client ein */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 7 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Nick ueberpruefen */
|
||||
c = Client_Search( Req->argv[0] );
|
||||
if( c )
|
||||
{
|
||||
/* Der neue Nick ist auf diesem Server bereits registriert:
|
||||
* sowohl der neue, als auch der alte Client muessen nun
|
||||
* disconnectiert werden. */
|
||||
Log( LOG_ERR, "Server %s introduces already registered nick \"%s\"!", Client_ID( Client ), Req->argv[0] );
|
||||
Kill_Nick( Req->argv[0], "Nick collision" );
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
/* Server, zu dem der Client connectiert ist, suchen */
|
||||
intr_c = Client_GetFromToken( Client, atoi( Req->argv[4] ));
|
||||
if( ! intr_c )
|
||||
{
|
||||
Log( LOG_ERR, "Server %s introduces nick \"%s\" on unknown server!?", Client_ID( Client ), Req->argv[0] );
|
||||
Kill_Nick( Req->argv[0], "Unknown server" );
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
/* Neue Client-Struktur anlegen */
|
||||
c = Client_NewRemoteUser( intr_c, Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], atoi( Req->argv[4] ), Req->argv[5] + 1, Req->argv[6], TRUE );
|
||||
if( ! c )
|
||||
{
|
||||
/* Eine neue Client-Struktur konnte nicht angelegt werden.
|
||||
* Der Client muss disconnectiert werden, damit der Netz-
|
||||
* status konsistent bleibt. */
|
||||
Log( LOG_ALERT, "Can't create client structure! (on connection %d)", Client_Conn( Client ));
|
||||
Kill_Nick( Req->argv[0], "Server error" );
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
modes = Client_Modes( c );
|
||||
if( *modes ) Log( LOG_DEBUG, "User \"%s\" (+%s) registered (via %s, on %s, %d hop%s).", Client_Mask( c ), modes, Client_ID( Client ), Client_ID( intr_c ), Client_Hops( c ), Client_Hops( c ) > 1 ? "s": "" );
|
||||
else Log( LOG_DEBUG, "User \"%s\" registered (via %s, on %s, %d hop%s).", Client_Mask( c ), Client_ID( Client ), Client_ID( intr_c ), Client_Hops( c ), Client_Hops( c ) > 1 ? "s": "" );
|
||||
|
||||
/* Andere Server, ausser dem Introducer, informieren */
|
||||
IRC_WriteStrServersPrefix( Client, Client, "NICK %s %d %s %s %d %s :%s", Req->argv[0], atoi( Req->argv[1] ) + 1, Req->argv[2], Req->argv[3], Client_MyToken( intr_c ), Req->argv[5], Req->argv[6] );
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else return IRC_WriteStrClient( Client, ERR_ALREADYREGISTRED_MSG, Client_ID( Client ));
|
||||
} /* IRC_NICK */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
#ifndef STRICT_RFC
|
||||
if( Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_UNKNOWN )
|
||||
#else
|
||||
if( Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTPASS )
|
||||
#endif
|
||||
{
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 4 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
Client_SetUser( Client, Req->argv[0], FALSE );
|
||||
Client_SetInfo( Client, Req->argv[3] );
|
||||
|
||||
Log( LOG_DEBUG, "Connection %d: got valid USER command ...", Client_Conn( Client ));
|
||||
if( Client_Type( Client ) == CLIENT_GOTNICK ) return Hello_User( Client );
|
||||
else Client_SetType( Client, CLIENT_GOTUSER );
|
||||
return CONNECTED;
|
||||
}
|
||||
else if( Client_Type( Client ) == CLIENT_USER || Client_Type( Client ) == CLIENT_SERVER || Client_Type( Client ) == CLIENT_SERVICE )
|
||||
{
|
||||
return IRC_WriteStrClient( Client, ERR_ALREADYREGISTRED_MSG, Client_ID( Client ));
|
||||
}
|
||||
else return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
|
||||
} /* IRC_USER */
|
||||
|
||||
|
||||
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 )
|
||||
{
|
||||
/* Server */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
target = Client_Search( Req->prefix );
|
||||
if( ! target )
|
||||
{
|
||||
/* Den Client kennen wir nicht (mehr), also nichts zu tun. */
|
||||
Log( LOG_WARNING, "Got QUIT from %s for unknown client!?", Client_ID( Client ));
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
if( Req->argc == 0 ) Client_Destroy( target, "Got QUIT command.", NULL, TRUE );
|
||||
else Client_Destroy( target, "Got QUIT command.", Req->argv[0], TRUE );
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
|
||||
} /* IRC_QUIT */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *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 ));
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NOORIGIN_MSG, Client_ID( Client ));
|
||||
#ifdef STRICT_RFC
|
||||
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
#endif
|
||||
|
||||
if( Req->argc > 1 )
|
||||
{
|
||||
/* es wurde ein Ziel-Client angegeben */
|
||||
target = Client_Search( Req->argv[1] );
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
|
||||
if( target != Client_ThisServer( ))
|
||||
{
|
||||
/* ok, forwarden */
|
||||
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 );
|
||||
return IRC_WriteStrClientPrefix( target, from, "PING %s :%s", Client_ID( from ), Req->argv[1] );
|
||||
}
|
||||
}
|
||||
|
||||
Log( LOG_DEBUG, "Connection %d: got PING, sending PONG ...", Client_Conn( Client ));
|
||||
return IRC_WriteStrClient( Client, "PONG %s :%s", Client_ID( Client_ThisServer( )), Client_ID( Client ));
|
||||
} /* IRC_PING */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *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 ));
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NOORIGIN_MSG, Client_ID( Client ));
|
||||
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* forwarden? */
|
||||
if( Req->argc == 2 )
|
||||
{
|
||||
target = Client_Search( Req->argv[1] );
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
|
||||
if( target != Client_ThisServer( ))
|
||||
{
|
||||
/* ok, forwarden */
|
||||
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 );
|
||||
return IRC_WriteStrClientPrefix( target, from, "PONG %s :%s", Client_ID( from ), Req->argv[1] );
|
||||
}
|
||||
}
|
||||
|
||||
/* Der Connection-Timestamp wurde schon beim Lesen aus dem Socket
|
||||
* aktualisiert, daher muss das hier nicht mehr gemacht werden. */
|
||||
|
||||
if( Client_Conn( Client ) > NONE ) Log( LOG_DEBUG, "Connection %d: received PONG. Lag: %ld seconds.", Client_Conn( Client ), time( NULL ) - Conn_LastPing( Client_Conn( Client )));
|
||||
else Log( LOG_DEBUG, "Connection %d: received PONG.", Client_Conn( Client ));
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_PONG */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Hello_User( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
|
||||
/* Passwort ueberpruefen */
|
||||
if( strcmp( Client_Password( Client ), Conf_ServerPwd ) != 0 )
|
||||
{
|
||||
/* Falsches Passwort */
|
||||
Log( LOG_ERR, "User \"%s\" rejected (connection %d): Bad password!", Client_Mask( Client ), Client_Conn( Client ));
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Bad password", TRUE );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
Log( LOG_NOTICE, "User \"%s\" registered (connection %d).", Client_Mask( Client ), Client_Conn( Client ));
|
||||
|
||||
/* Andere Server informieren */
|
||||
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_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;
|
||||
|
||||
Client_SetType( Client, CLIENT_USER );
|
||||
|
||||
if( ! IRC_Send_LUSERS( Client )) return DISCONNECTED;
|
||||
if( ! IRC_Show_MOTD( Client )) return DISCONNECTED;
|
||||
|
||||
return CONNECTED;
|
||||
} /* Hello_User */
|
||||
|
||||
|
||||
LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason )
|
||||
{
|
||||
CLIENT *c;
|
||||
|
||||
assert( Nick != NULL );
|
||||
assert( Reason != NULL );
|
||||
|
||||
Log( LOG_ERR, "User(s) with nick \"%s\" will be disconnected: %s", Nick, Reason );
|
||||
|
||||
/* andere Server benachrichtigen */
|
||||
IRC_WriteStrServers( NULL, "KILL %s :%s", Nick, Reason );
|
||||
|
||||
/* Ggf. einen eigenen Client toeten */
|
||||
c = Client_Search( Nick );
|
||||
if( c && ( Client_Conn( c ) != NONE )) Conn_Close( Client_Conn( c ), NULL, Reason, TRUE );
|
||||
} /* Kill_Nick */
|
||||
|
||||
|
||||
/* -eof- */
|
36
src/ngircd/irc-login.h
Normal file
36
src/ngircd/irc-login.h
Normal file
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* 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-login.h,v 1.3 2002/03/12 14:37:52 alex Exp $
|
||||
*
|
||||
* irc-login.h: Anmeldung und Abmeldung im IRC (Header)
|
||||
*/
|
||||
|
||||
|
||||
#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 );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
393
src/ngircd/irc-mode.c
Normal file
393
src/ngircd/irc-mode.c
Normal file
@@ -0,0 +1,393 @@
|
||||
/*
|
||||
* 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-mode.c,v 1.4 2002/03/25 17:11:45 alex Exp $
|
||||
*
|
||||
* irc-mode.c: IRC-Befehle zur Mode-Aenderung (MODE, AWAY, ...)
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "channel.h"
|
||||
#include "defines.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-mode.h"
|
||||
|
||||
|
||||
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;
|
||||
CHANNEL *chan;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
cl = chan_cl = prefix = NULL;
|
||||
chan = NULL;
|
||||
|
||||
/* Valider Client? */
|
||||
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
|
||||
|
||||
/* Keine Parameter? */
|
||||
if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Ziel suchen: Client bzw. Channel */
|
||||
if( Client_IsValidNick( Req->argv[0] )) cl = Client_Search( Req->argv[0] );
|
||||
if( Channel_IsValidName( Req->argv[0] )) chan = Channel_Search( Req->argv[0] );
|
||||
|
||||
/* Kein Ziel gefunden? */
|
||||
if(( ! cl ) && ( ! chan )) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
|
||||
assert(( cl && chan ) != TRUE );
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
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 );
|
||||
|
||||
/* Client ermitteln, wenn bei Channel-Modes mit 3 Parametern */
|
||||
if(( chan ) && (Req->argc == 3 ))
|
||||
{
|
||||
chan_cl = Client_Search( Req->argv[2] );
|
||||
if( ! chan_cl ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
}
|
||||
|
||||
/* Wenn Anfragender ein User ist: Zugriff erlaubt? */
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
{
|
||||
if( cl )
|
||||
{
|
||||
/* MODE ist nur fuer sich selber zulaessig! */
|
||||
if( cl != Client ) return IRC_WriteStrClient( Client, ERR_USERSDONTMATCH_MSG, Client_ID( Client ));
|
||||
}
|
||||
if( chan )
|
||||
{
|
||||
/* Darf der User die Channel-Modes ermitteln? */
|
||||
}
|
||||
}
|
||||
|
||||
/* Werden die Modes "nur" erfragt? */
|
||||
if(( cl ) && ( Req->argc == 1 )) return IRC_WriteStrClient( Client, RPL_UMODEIS_MSG, Client_ID( Client ), Client_Modes( cl ));
|
||||
if(( chan ) && ( Req->argc == 1 )) return IRC_WriteStrClient( Client, RPL_CHANNELMODEIS_MSG, Client_ID( Client ), Channel_Name( chan ), Channel_Modes( chan ));
|
||||
|
||||
mode_ptr = Req->argv[1];
|
||||
|
||||
/* Sollen Modes gesetzt oder geloescht werden? */
|
||||
if( cl )
|
||||
{
|
||||
if( *mode_ptr == '+' ) set = TRUE;
|
||||
else if( *mode_ptr == '-' ) set = FALSE;
|
||||
else return IRC_WriteStrClient( Client, ERR_UMODEUNKNOWNFLAG_MSG, Client_ID( Client ));
|
||||
mode_ptr++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( *mode_ptr == '-' ) set = FALSE;
|
||||
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, "+" );
|
||||
else strcpy( the_modes, "-" );
|
||||
|
||||
ok = TRUE;
|
||||
x[1] = '\0';
|
||||
while( *mode_ptr )
|
||||
{
|
||||
x[0] = '\0';
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Befehl kommt von einem Server, daher
|
||||
* trauen wir ihm "unbesehen" ... */
|
||||
x[0] = *mode_ptr;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Modes validieren */
|
||||
if( cl )
|
||||
{
|
||||
/* User-Modes */
|
||||
switch( *mode_ptr )
|
||||
{
|
||||
case 'i':
|
||||
/* 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 )
|
||||
{
|
||||
Client_SetOperByMe( Client, FALSE );
|
||||
x[0] = 'o';
|
||||
}
|
||||
else ok = IRC_WriteStrClient( Client, ERR_UMODEUNKNOWNFLAG_MSG, Client_ID( Client ));
|
||||
break;
|
||||
case 's':
|
||||
/* server messages */
|
||||
x[0] = 's';
|
||||
break;
|
||||
default:
|
||||
Log( LOG_DEBUG, "Unknown mode \"%c%c\" from \"%s\"!?", set ? '+' : '-', *mode_ptr, Client_ID( Client ));
|
||||
ok = IRC_WriteStrClient( Client, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Client ), set ? '+' : '-', *mode_ptr );
|
||||
x[0] = '\0';
|
||||
}
|
||||
}
|
||||
if( chan )
|
||||
{
|
||||
/* Ist der User ein Channel Operator? */
|
||||
if( ! strchr( Channel_UserModes( chan, Client ), 'o' ))
|
||||
{
|
||||
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 ));
|
||||
break;
|
||||
}
|
||||
|
||||
/* Channel-Modes oder Channel-User-Modes */
|
||||
if( chan_cl )
|
||||
{
|
||||
/* Channel-User-Modes */
|
||||
switch( *mode_ptr )
|
||||
{
|
||||
case 'o':
|
||||
/* Channel Operator */
|
||||
x[0] = 'o';
|
||||
break;
|
||||
case 'v':
|
||||
/* Voice */
|
||||
x[0] = 'v';
|
||||
break;
|
||||
default:
|
||||
Log( LOG_DEBUG, "Unknown channel-user-mode \"%c%c\" from \"%s\" on \"%s\" at %s!?", set ? '+' : '-', *mode_ptr, Client_ID( Client ), Client_ID( chan_cl ), Channel_Name( chan ));
|
||||
ok = IRC_WriteStrClient( Client, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Client ), set ? '+' : '-', *mode_ptr );
|
||||
x[0] = '\0';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Channel-Modes */
|
||||
switch( *mode_ptr )
|
||||
{
|
||||
case 'a':
|
||||
/* Anonymous */
|
||||
x[0] = 'a';
|
||||
break;
|
||||
case 'm':
|
||||
/* Moderated */
|
||||
x[0] = 'm';
|
||||
break;
|
||||
case 'n':
|
||||
/* 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;
|
||||
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 );
|
||||
x[0] = '\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if( ! ok ) break;
|
||||
|
||||
mode_ptr++;
|
||||
if( ! x[0] ) continue;
|
||||
|
||||
/* Okay, gueltigen Mode gefunden */
|
||||
if( cl )
|
||||
{
|
||||
/* Es geht um User-Modes */
|
||||
if( set )
|
||||
{
|
||||
/* Mode setzen. Wenn der Client ihn noch nicht hatte: merken */
|
||||
if( Client_ModeAdd( cl, x[0] )) strcat( the_modes, x );
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Modes geloescht. Wenn der Client ihn hatte: merken */
|
||||
if( Client_ModeDel( cl, x[0] )) strcat( the_modes, x );
|
||||
}
|
||||
|
||||
/* "nachbearbeiten" */
|
||||
if( x[0] == 'a' )
|
||||
{
|
||||
/* away */
|
||||
if( set ) Client_SetAway( cl, DEFAULT_AWAY_MSG );
|
||||
else Client_SetAway( cl, NULL );
|
||||
}
|
||||
}
|
||||
if( chan )
|
||||
{
|
||||
/* Es geht um Channel-Modes oder Channel-User-Modes */
|
||||
if( chan_cl )
|
||||
{
|
||||
/* Channel-User-Modes */
|
||||
if( set )
|
||||
{
|
||||
/* Mode setzen. Wenn der Channel ihn noch nicht hatte: merken */
|
||||
if( Channel_UserModeAdd( chan, chan_cl, x[0] )) strcat( the_modes, x );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Mode setzen. Wenn der Channel ihn noch nicht hatte: merken */
|
||||
if( Channel_UserModeDel( chan, chan_cl, x[0] )) strcat( the_modes, x );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Channel-Mode */
|
||||
if( set )
|
||||
{
|
||||
/* Mode setzen. Wenn der Channel ihn noch nicht hatte: merken */
|
||||
if( Channel_ModeAdd( chan, x[0] )) strcat( the_modes, x );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Mode setzen. Wenn der Channel ihn noch nicht hatte: merken */
|
||||
if( Channel_ModeDel( chan, x[0] )) strcat( the_modes, x );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Wurden Modes geaendert? */
|
||||
if( the_modes[1] )
|
||||
{
|
||||
if( cl )
|
||||
{
|
||||
/* Client-Mode */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Modes an andere Server forwarden */
|
||||
IRC_WriteStrServersPrefix( Client, prefix, "MODE %s :%s", Client_ID( cl ), the_modes );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Bestaetigung an Client schicken & andere Server informieren */
|
||||
ok = IRC_WriteStrClientPrefix( Client, prefix, "MODE %s %s", Client_ID( cl ), the_modes );
|
||||
IRC_WriteStrServersPrefix( Client, prefix, "MODE %s :%s", Client_ID( cl ), the_modes );
|
||||
}
|
||||
Log( LOG_DEBUG, "User \"%s\": Mode change, now \"%s\".", Client_Mask( cl ), Client_Modes( cl ));
|
||||
}
|
||||
if( chan )
|
||||
{
|
||||
/* Channel-Modes oder Channel-User-Mode */
|
||||
if( chan_cl )
|
||||
{
|
||||
/* Channel-User-Mode */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Modes an andere Server und Channel-User forwarden */
|
||||
IRC_WriteStrServersPrefix( Client, prefix, "MODE %s %s :%s", Channel_Name( chan ), the_modes, Client_ID( chan_cl));
|
||||
IRC_WriteStrChannelPrefix( Client, chan, prefix, FALSE, "MODE %s %s %s", Channel_Name( chan ), the_modes, Client_ID( chan_cl));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Bestaetigung an Client schicken & andere Server sowie Channel-User informieren */
|
||||
ok = IRC_WriteStrClientPrefix( Client, prefix, "MODE %s %s %s", Channel_Name( chan ), the_modes, Client_ID( chan_cl));
|
||||
IRC_WriteStrServersPrefix( Client, prefix, "MODE %s %s :%s", Channel_Name( chan ), the_modes, Client_ID( chan_cl));
|
||||
IRC_WriteStrChannelPrefix( Client, chan, prefix, FALSE, "MODE %s %s %s", Channel_Name( chan ), the_modes, Client_ID( chan_cl));
|
||||
}
|
||||
Log( LOG_DEBUG, "User \"%s\" on %s: Mode change, now \"%s\".", Client_Mask( chan_cl), Channel_Name( chan ), Channel_UserModes( chan, chan_cl ));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Channel-Mode */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Modes an andere Server und Channel-User forwarden */
|
||||
IRC_WriteStrServersPrefix( Client, prefix, "MODE %s :%s", Channel_Name( chan ), the_modes );
|
||||
IRC_WriteStrChannelPrefix( Client, chan, prefix, FALSE, "MODE %s %s", Channel_Name( chan ), the_modes );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Bestaetigung an Client schicken & andere Server sowie Channel-User informieren */
|
||||
ok = IRC_WriteStrClientPrefix( Client, prefix, "MODE %s %s", Channel_Name( chan ), the_modes );
|
||||
IRC_WriteStrServersPrefix( Client, prefix, "MODE %s :%s", Channel_Name( chan ), the_modes );
|
||||
IRC_WriteStrChannelPrefix( Client, chan, prefix, FALSE, "MODE %s %s", Channel_Name( chan ), the_modes );
|
||||
}
|
||||
Log( LOG_DEBUG, "Channel \"%s\": Mode change, now \"%s\".", Channel_Name( chan ), Channel_Modes( chan ));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ok;
|
||||
} /* IRC_MODE */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_AWAY( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
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 > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
if(( Req->argc == 1 ) && (Req->argv[0][0] ))
|
||||
{
|
||||
/* AWAY setzen */
|
||||
Client_SetAway( Client, Req->argv[0] );
|
||||
IRC_WriteStrServersPrefix( Client, Client, "MODE %s :+a", Client_ID( Client ));
|
||||
return IRC_WriteStrClient( Client, RPL_NOWAWAY_MSG, Client_ID( Client ));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* AWAY loeschen */
|
||||
Client_SetAway( Client, NULL );
|
||||
IRC_WriteStrServersPrefix( Client, Client, "MODE %s :-a", Client_ID( Client ));
|
||||
return IRC_WriteStrClient( Client, RPL_UNAWAY_MSG, Client_ID( Client ));
|
||||
}
|
||||
} /* IRC_AWAY */
|
||||
|
||||
|
||||
/* -eof- */
|
32
src/ngircd/irc-mode.h
Normal file
32
src/ngircd/irc-mode.h
Normal file
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* 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-mode.h,v 1.2.2.1 2002/04/08 18:07:42 alex Exp $
|
||||
*
|
||||
* irc-mode.h: IRC-Befehle zur Mode-Aenderung (MODE, AWAY, ...) (Header)
|
||||
*/
|
||||
|
||||
|
||||
#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 );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
115
src/ngircd/irc-oper.c
Normal file
115
src/ngircd/irc-oper.c
Normal file
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* 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-oper.c,v 1.3.2.1 2002/04/08 18:07:42 alex Exp $
|
||||
*
|
||||
* irc-oper.c: IRC-Operator-Befehle
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "conf.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
|
||||
#include <exp.h>
|
||||
#include "irc-oper.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_OPER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
INT i;
|
||||
|
||||
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 != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Operator suchen */
|
||||
for( i = 0; i < Conf_Oper_Count; i++)
|
||||
{
|
||||
if( Conf_Oper[i].name[0] && Conf_Oper[i].pwd[0] && ( strcmp( Conf_Oper[i].name, Req->argv[0] ) == 0 )) break;
|
||||
}
|
||||
if( i >= Conf_Oper_Count )
|
||||
{
|
||||
Log( LOG_WARNING, "Got invalid OPER from \"%s\": Name \"%s\" not configured!", Client_Mask( Client ), Req->argv[0] );
|
||||
return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
|
||||
}
|
||||
|
||||
/* Stimmt das Passwort? */
|
||||
if( strcmp( Conf_Oper[i].pwd, Req->argv[1] ) != 0 )
|
||||
{
|
||||
Log( LOG_WARNING, "Got invalid OPER from \"%s\": Bad password for \"%s\"!", Client_Mask( Client ), Conf_Oper[i].name );
|
||||
return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
|
||||
}
|
||||
|
||||
if( ! Client_HasMode( Client, 'o' ))
|
||||
{
|
||||
/* noch kein o-Mode gesetzt */
|
||||
Client_ModeAdd( Client, 'o' );
|
||||
if( ! IRC_WriteStrClient( Client, "MODE %s :+o", Client_ID( Client ))) return DISCONNECTED;
|
||||
IRC_WriteStrServersPrefix( NULL, Client, "MODE %s :+o", Client_ID( Client ));
|
||||
}
|
||||
|
||||
if( ! Client_OperByMe( Client )) Log( LOG_NOTICE|LOG_snotice, "Got valid OPER from \"%s\", user is an IRC operator now.", Client_Mask( Client ));
|
||||
|
||||
Client_SetOperByMe( Client, TRUE );
|
||||
return IRC_WriteStrClient( Client, RPL_YOUREOPER_MSG, Client_ID( Client ));
|
||||
} /* IRC_OPER */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_DIE( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
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 DIE command from \"%s\", going down!", Client_Mask( Client ));
|
||||
NGIRCd_Quit = TRUE;
|
||||
return CONNECTED;
|
||||
} /* IRC_DIE */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_RESTART( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
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 RESTART command from \"%s\", going down!", Client_Mask( Client ));
|
||||
NGIRCd_Restart = TRUE;
|
||||
return CONNECTED;
|
||||
} /* IRC_RESTART */
|
||||
|
||||
|
||||
/* -eof- */
|
33
src/ngircd/irc-oper.h
Normal file
33
src/ngircd/irc-oper.h
Normal file
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* 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-oper.h,v 1.2 2002/03/12 14:37:52 alex Exp $
|
||||
*
|
||||
* irc-oper.h: IRC-Operator-Befehle (Header)
|
||||
*/
|
||||
|
||||
|
||||
#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 );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
355
src/ngircd/irc-server.c
Normal file
355
src/ngircd/irc-server.c
Normal file
@@ -0,0 +1,355 @@
|
||||
/*
|
||||
* 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-server.c,v 1.8.2.1 2002/04/08 18:07:42 alex Exp $
|
||||
*
|
||||
* irc-server.c: IRC-Befehle fuer Server-Links
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "conf.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-server.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR str[LINE_LEN], *ptr;
|
||||
CLIENT *from, *c, *cl;
|
||||
CL2CHAN *cl2chan;
|
||||
INT max_hops, i;
|
||||
CHANNEL *chan;
|
||||
BOOLEAN ok;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Fehler liefern, wenn kein lokaler Client */
|
||||
if( Client_Conn( Client ) <= NONE ) return IRC_WriteStrClient( Client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_GOTPASSSERVER )
|
||||
{
|
||||
/* Verbindung soll als Server-Server-Verbindung registriert werden */
|
||||
Log( LOG_DEBUG, "Connection %d: got SERVER command (new server link) ...", Client_Conn( Client ));
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if(( Req->argc != 2 ) && ( Req->argc != 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Ist dieser Server bei uns konfiguriert? */
|
||||
for( i = 0; i < Conf_Server_Count; i++ ) if( strcasecmp( Req->argv[0], Conf_Server[i].name ) == 0 ) break;
|
||||
if( i >= Conf_Server_Count )
|
||||
{
|
||||
/* Server ist nicht konfiguriert! */
|
||||
Log( LOG_ERR, "Connection %d: Server \"%s\" not configured here!", Client_Conn( Client ), Req->argv[0] );
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Server not configured here", TRUE );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
if( strcmp( Client_Password( Client ), Conf_Server[i].pwd ) != 0 )
|
||||
{
|
||||
/* Falsches Passwort */
|
||||
Log( LOG_ERR, "Connection %d: Bad password for server \"%s\"!", Client_Conn( Client ), Req->argv[0] );
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Bad password", TRUE );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Ist ein Server mit dieser ID bereits registriert? */
|
||||
if( ! Client_CheckID( Client, Req->argv[0] )) return DISCONNECTED;
|
||||
|
||||
/* Server-Strukturen fuellen ;-) */
|
||||
Client_SetID( Client, Req->argv[0] );
|
||||
Client_SetHops( Client, 1 );
|
||||
Client_SetInfo( Client, Req->argv[Req->argc - 1] );
|
||||
|
||||
/* 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 )
|
||||
{
|
||||
/* Eingehende Verbindung: Unseren SERVER- und PASS-Befehl senden */
|
||||
ok = TRUE;
|
||||
if( ! IRC_WriteStrClient( Client, "PASS %s "PASSSERVERADD, Conf_Server[i].pwd )) ok = FALSE;
|
||||
else ok = IRC_WriteStrClient( Client, "SERVER %s 1 :%s", Conf_ServerName, Conf_ServerInfo );
|
||||
if( ! ok )
|
||||
{
|
||||
Conn_Close( Client_Conn( Client ), "Unexpected server behavior!", NULL, FALSE );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
Client_SetIntroducer( Client, Client );
|
||||
Client_SetToken( Client, 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 ));
|
||||
|
||||
Client_SetType( Client, CLIENT_SERVER );
|
||||
|
||||
/* maximalen Hop Count ermitteln */
|
||||
max_hops = 0;
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if( Client_Hops( c ) > max_hops ) max_hops = Client_Hops( c );
|
||||
c = Client_Next( c );
|
||||
}
|
||||
|
||||
/* Alle bisherigen Server dem neuen Server bekannt machen,
|
||||
* die bisherigen Server ueber den neuen informierenn */
|
||||
for( i = 0; i < ( max_hops + 1 ); i++ )
|
||||
{
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if(( Client_Type( c ) == CLIENT_SERVER ) && ( c != Client ) && ( c != Client_ThisServer( )) && ( Client_Hops( c ) == i ))
|
||||
{
|
||||
if( Client_Conn( c ) > NONE )
|
||||
{
|
||||
/* Dem gefundenen Server gleich den neuen
|
||||
* Server bekannt machen */
|
||||
if( ! IRC_WriteStrClient( c, "SERVER %s %d %d :%s", Client_ID( Client ), Client_Hops( Client ) + 1, Client_MyToken( Client ), Client_Info( Client ))) return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Den neuen Server ueber den alten informieren */
|
||||
if( ! IRC_WriteStrClientPrefix( Client, Client_Hops( c ) == 1 ? Client_ThisServer( ) : Client_Introducer( c ), "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ))) return DISCONNECTED;
|
||||
}
|
||||
c = Client_Next( c );
|
||||
}
|
||||
}
|
||||
|
||||
/* alle User dem neuen Server bekannt machen */
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if( Client_Type( c ) == CLIENT_USER )
|
||||
{
|
||||
/* User an neuen Server melden */
|
||||
if( ! IRC_WriteStrClient( Client, "NICK %s %d %s %s %d +%s :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_User( c ), Client_Hostname( c ), Client_MyToken( Client_Introducer( c )), Client_Modes( c ), Client_Info( c ))) return DISCONNECTED;
|
||||
}
|
||||
c = Client_Next( c );
|
||||
}
|
||||
|
||||
/* Channels dem neuen Server bekannt machen */
|
||||
chan = Channel_First( );
|
||||
while( chan )
|
||||
{
|
||||
/* alle Member suchen */
|
||||
cl2chan = Channel_FirstMember( chan );
|
||||
sprintf( str, "NJOIN %s :", Channel_Name( chan ));
|
||||
while( cl2chan )
|
||||
{
|
||||
cl = Channel_GetClient( cl2chan );
|
||||
assert( cl != NULL );
|
||||
|
||||
/* Nick, ggf. mit Modes, anhaengen */
|
||||
if( str[strlen( str ) - 1] != ':' ) strcat( str, "," );
|
||||
if( strchr( Channel_UserModes( chan, cl ), 'v' )) strcat( str, "+" );
|
||||
if( strchr( Channel_UserModes( chan, cl ), 'o' )) strcat( str, "@" );
|
||||
strcat( str, Client_ID( cl ));
|
||||
|
||||
if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 8 ))
|
||||
{
|
||||
/* Zeile senden */
|
||||
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
|
||||
sprintf( str, "NJOIN %s :", Channel_Name( chan ));
|
||||
}
|
||||
|
||||
cl2chan = Channel_NextMember( chan, cl2chan );
|
||||
}
|
||||
|
||||
/* noch Daten da? */
|
||||
if( str[strlen( str ) - 1] != ':')
|
||||
{
|
||||
/* Ja; Also senden ... */
|
||||
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* naechsten Channel suchen */
|
||||
chan = Channel_Next( chan );
|
||||
}
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Neuer Server wird im Netz angekuendigt */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 4 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Ist ein Server mit dieser ID bereits registriert? */
|
||||
if( ! Client_CheckID( Client, Req->argv[0] )) return DISCONNECTED;
|
||||
|
||||
/* Ueberfluessige Hostnamen aus Info-Text entfernen */
|
||||
ptr = strchr( Req->argv[3] + 2, '[' );
|
||||
if( ! ptr ) ptr = Req->argv[3];
|
||||
|
||||
from = Client_Search( Req->prefix );
|
||||
if( ! from )
|
||||
{
|
||||
/* Hm, Server, der diesen einfuehrt, ist nicht bekannt!? */
|
||||
Log( LOG_ALERT, "Unknown ID in prefix of SERVER: \"%s\"! (on connection %d)", Req->prefix, Client_Conn( Client ));
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Unknown ID in prefix of SERVER", TRUE );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Neue Client-Struktur anlegen */
|
||||
c = Client_NewRemoteServer( Client, Req->argv[0], from, atoi( Req->argv[1] ), atoi( Req->argv[2] ), ptr, TRUE );
|
||||
if( ! c )
|
||||
{
|
||||
/* Neue Client-Struktur konnte nicht angelegt werden */
|
||||
Log( LOG_ALERT, "Can't create client structure for server! (on connection %d)", Client_Conn( Client ));
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Can't allocate client structure for remote server", TRUE );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Log-Meldung zusammenbauen und ausgeben */
|
||||
if(( Client_Hops( c ) > 1 ) && ( Req->prefix[0] )) sprintf( str, "connected to %s, ", Client_ID( from ));
|
||||
else strcpy( str, "" );
|
||||
Log( LOG_NOTICE|LOG_snotice, "Server \"%s\" registered (via %s, %s%d hop%s).", Client_ID( c ), Client_ID( Client ), str, Client_Hops( c ), Client_Hops( c ) > 1 ? "s": "" );
|
||||
|
||||
/* Andere Server informieren */
|
||||
IRC_WriteStrServersPrefix( Client, from, "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ));
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
} /* IRC_SERVER */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR *channame, *ptr, modes[8];
|
||||
BOOLEAN is_op, is_voiced;
|
||||
CHANNEL *chan;
|
||||
CLIENT *c;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
if( Client_Type( Client ) != CLIENT_SERVER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTEREDSERVER_MSG, Client_ID( Client ));
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
channame = Req->argv[0];
|
||||
ptr = strtok( Req->argv[1], "," );
|
||||
while( ptr )
|
||||
{
|
||||
is_op = is_voiced = FALSE;
|
||||
|
||||
/* Prefixe abschneiden */
|
||||
while(( *ptr == '@' ) || ( *ptr == '+' ))
|
||||
{
|
||||
if( *ptr == '@' ) is_op = TRUE;
|
||||
if( *ptr == '+' ) is_voiced = TRUE;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
c = Client_Search( ptr );
|
||||
if( c )
|
||||
{
|
||||
Channel_Join( c, channame );
|
||||
chan = Channel_Search( channame );
|
||||
assert( chan != NULL );
|
||||
|
||||
if( is_op ) Channel_UserModeAdd( chan, c, 'o' );
|
||||
if( is_voiced ) Channel_UserModeAdd( chan, c, 'v' );
|
||||
|
||||
/* im Channel bekannt machen */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, c, FALSE, "JOIN :%s", channame );
|
||||
|
||||
/* Channel-User-Modes setzen */
|
||||
strcpy( modes, Channel_UserModes( chan, c ));
|
||||
if( modes[0] )
|
||||
{
|
||||
/* Modes im Channel bekannt machen */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, Client, FALSE, "MODE %s +%s %s", channame, modes, Client_ID( c ));
|
||||
}
|
||||
}
|
||||
else Log( LOG_ERR, "Got NJOIN for unknown nick \"%s\" for channel \"%s\"!", ptr, channame );
|
||||
|
||||
/* naechsten Nick suchen */
|
||||
ptr = strtok( NULL, "," );
|
||||
}
|
||||
|
||||
/* an andere Server weiterleiten */
|
||||
IRC_WriteStrServersPrefix( Client, Client_ThisServer( ), "NJOIN %s :%s", Req->argv[0], Req->argv[1] );
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_NJOIN */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_SQUIT( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target;
|
||||
CHAR msg[LINE_LEN + 64];
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* SQUIT ist nur fuer Server erlaubt */
|
||||
if( 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 );
|
||||
|
||||
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 )
|
||||
{
|
||||
/* Den Server kennen wir nicht (mehr), also nichts zu tun. */
|
||||
Log( LOG_WARNING, "Got SQUIT from %s for unknown server \"%s\"!?", Client_ID( Client ), Req->argv[0] );
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
if( Req->argv[1][0] )
|
||||
{
|
||||
if( strlen( Req->argv[1] ) > LINE_LEN ) Req->argv[1][LINE_LEN] = '\0';
|
||||
sprintf( msg, "%s (SQUIT from %s).", Req->argv[1], Client_ID( Client ));
|
||||
}
|
||||
else sprintf( msg, "Got SQUIT from %s.", Client_ID( Client ));
|
||||
|
||||
if( Client_Conn( target ) > NONE )
|
||||
{
|
||||
/* dieser Server hat die Connection */
|
||||
if( Req->argv[1][0] ) Conn_Close( Client_Conn( target ), msg, Req->argv[1], TRUE );
|
||||
else Conn_Close( Client_Conn( target ), msg, NULL, TRUE );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Verbindung hielt anderer Server */
|
||||
Client_Destroy( target, msg, Req->argv[1], FALSE );
|
||||
return CONNECTED;
|
||||
}
|
||||
} /* IRC_SQUIT */
|
||||
|
||||
|
||||
/* -eof- */
|
33
src/ngircd/irc-server.h
Normal file
33
src/ngircd/irc-server.h
Normal file
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* 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-server.h,v 1.2 2002/03/12 14:37:52 alex Exp $
|
||||
*
|
||||
* irc-server.h: IRC-Befehle fuer Server-Links (Header)
|
||||
*/
|
||||
|
||||
|
||||
#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 );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
271
src/ngircd/irc-write.c
Normal file
271
src/ngircd/irc-write.c
Normal file
@@ -0,0 +1,271 @@
|
||||
/*
|
||||
* 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-write.c,v 1.3 2002/03/25 17:13:07 alex Exp $
|
||||
*
|
||||
* irc-write.c: IRC-Texte und Befehle ueber Netzwerk versenden
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "defines.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-write.h"
|
||||
|
||||
|
||||
LOCAL CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client );
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... )
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
BOOLEAN ok = CONNECTED;
|
||||
va_list ap;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
va_start( ap, Format );
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
/* an den Client selber */
|
||||
ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), buffer );
|
||||
|
||||
return ok;
|
||||
} /* IRC_WriteStrClient */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... )
|
||||
{
|
||||
/* Text an Clients, lokal bzw. remote, senden. */
|
||||
|
||||
CHAR buffer[1000];
|
||||
va_list ap;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Format != NULL );
|
||||
assert( Prefix != NULL );
|
||||
|
||||
va_start( ap, Format );
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
return Conn_WriteStr( Client_Conn( Client_NextHop( Client )), ":%s %s", Get_Prefix( Client_NextHop( Client ), Prefix ), buffer );
|
||||
} /* IRC_WriteStrClientPrefix */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... )
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
va_list ap;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
va_start( ap, Format );
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, buffer );
|
||||
} /* IRC_WriteStrChannel */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
|
||||
{
|
||||
BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
|
||||
CHAR buffer[1000];
|
||||
CL2CHAN *cl2chan;
|
||||
CLIENT *c;
|
||||
INT s, i;
|
||||
va_list ap;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Chan != NULL );
|
||||
assert( Prefix != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
va_start( ap, Format );
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
for( i = 0; i < MAX_CONNECTIONS; i++ ) sock[i] = FALSE;
|
||||
|
||||
/* An alle Clients, die in den selben Channels sind.
|
||||
* Dabei aber nur einmal je Remote-Server */
|
||||
cl2chan = Channel_FirstMember( Chan );
|
||||
while( cl2chan )
|
||||
{
|
||||
c = Channel_GetClient( cl2chan );
|
||||
if( ! Remote )
|
||||
{
|
||||
if( Client_Conn( c ) <= NONE ) c = NULL;
|
||||
else if( Client_Type( c ) == CLIENT_SERVER ) c = NULL;
|
||||
}
|
||||
if( c ) c = Client_NextHop( c );
|
||||
|
||||
if( c && ( c != Client ))
|
||||
{
|
||||
/* Ok, anderer Client */
|
||||
s = Client_Conn( c );
|
||||
assert( s >= 0 );
|
||||
assert( s < MAX_CONNECTIONS );
|
||||
sock[s] = TRUE;
|
||||
if( Client_Type( c ) == CLIENT_SERVER ) is_server[s] = TRUE;
|
||||
else is_server[s] = FALSE;
|
||||
}
|
||||
cl2chan = Channel_NextMember( Chan, cl2chan );
|
||||
}
|
||||
|
||||
/* Senden ... */
|
||||
for( i = 0; i < MAX_CONNECTIONS; i++ )
|
||||
{
|
||||
if( sock[i] )
|
||||
{
|
||||
if( is_server[i] ) ok = Conn_WriteStr( i, ":%s %s", Client_ID( Prefix ), buffer );
|
||||
else ok = Conn_WriteStr( i, ":%s %s", Client_Mask( Prefix ), buffer );
|
||||
if( ! ok ) break;
|
||||
}
|
||||
}
|
||||
return ok;
|
||||
} /* IRC_WriteStrChannelPrefix */
|
||||
|
||||
|
||||
GLOBAL VOID IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... )
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
|
||||
va_start( ap, Format );
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
/* an den Client selber */
|
||||
return IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), buffer );
|
||||
} /* IRC_WriteStrServers */
|
||||
|
||||
|
||||
GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... )
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
CLIENT *c;
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
assert( Prefix != NULL );
|
||||
|
||||
va_start( ap, Format );
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if(( Client_Type( c ) == CLIENT_SERVER ) && ( Client_Conn( c ) > NONE ) && ( c != Client_ThisServer( )) && ( c != ExceptOf ))
|
||||
{
|
||||
/* Ziel-Server gefunden */
|
||||
IRC_WriteStrClientPrefix( c, Prefix, buffer );
|
||||
}
|
||||
c = Client_Next( c );
|
||||
}
|
||||
} /* IRC_WriteStrServersPrefix */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
|
||||
{
|
||||
BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
|
||||
CL2CHAN *chan_cl2chan, *cl2chan;
|
||||
CHAR buffer[1000];
|
||||
CHANNEL *chan;
|
||||
va_list ap;
|
||||
CLIENT *c;
|
||||
INT i, s;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Prefix != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
va_start( ap, Format );
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
/* initialisieren */
|
||||
for( i = 0; i < MAX_CONNECTIONS; i++ ) sock[i] = FALSE;
|
||||
|
||||
/* An alle Clients, die in einem Channel mit dem "Ausloeser" sind,
|
||||
* den Text schicken. An Remote-Server aber jeweils nur einmal. */
|
||||
chan_cl2chan = Channel_FirstChannelOf( Client );
|
||||
while( chan_cl2chan )
|
||||
{
|
||||
/* Channel des Users durchsuchen */
|
||||
chan = Channel_GetChannel( chan_cl2chan );
|
||||
cl2chan = Channel_FirstMember( chan );
|
||||
while( cl2chan )
|
||||
{
|
||||
c = Channel_GetClient( cl2chan );
|
||||
if( ! Remote )
|
||||
{
|
||||
if( Client_Conn( c ) <= NONE ) c = NULL;
|
||||
else if( Client_Type( c ) == CLIENT_SERVER ) c = NULL;
|
||||
}
|
||||
if( c ) c = Client_NextHop( c );
|
||||
|
||||
if( c && ( c != Client ))
|
||||
{
|
||||
/* Ok, anderer Client */
|
||||
s = Client_Conn( c );
|
||||
assert( s >= 0 );
|
||||
assert( s < MAX_CONNECTIONS );
|
||||
sock[s] = TRUE;
|
||||
if( Client_Type( c ) == CLIENT_SERVER ) is_server[s] = TRUE;
|
||||
else is_server[s] = FALSE;
|
||||
}
|
||||
cl2chan = Channel_NextMember( chan, cl2chan );
|
||||
}
|
||||
|
||||
/* naechsten Channel */
|
||||
chan_cl2chan = Channel_NextChannelOf( Client, chan_cl2chan );
|
||||
}
|
||||
|
||||
/* Senden ... */
|
||||
for( i = 0; i < MAX_CONNECTIONS; i++ )
|
||||
{
|
||||
if( sock[i] )
|
||||
{
|
||||
if( is_server[i] ) ok = Conn_WriteStr( i, ":%s %s", Client_ID( Prefix ), buffer );
|
||||
else ok = Conn_WriteStr( i, ":%s %s", Client_Mask( Prefix ), buffer );
|
||||
if( ! ok ) break;
|
||||
}
|
||||
}
|
||||
return ok;
|
||||
} /* IRC_WriteStrRelatedPrefix */
|
||||
|
||||
|
||||
LOCAL CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client )
|
||||
{
|
||||
assert( Target != NULL );
|
||||
assert( Client != NULL );
|
||||
|
||||
if( Client_Type( Target ) == CLIENT_SERVER ) return Client_ID( Client );
|
||||
else return Client_Mask( Client );
|
||||
} /* Get_Prefix */
|
||||
|
||||
|
||||
/* -eof- */
|
39
src/ngircd/irc-write.h
Normal file
39
src/ngircd/irc-write.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* 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-write.h,v 1.2 2002/03/12 14:37:52 alex Exp $
|
||||
*
|
||||
* irc-write.h: IRC-Texte und Befehle ueber Netzwerk versenden (Header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __irc_write_h__
|
||||
#define __irc_write_h__
|
||||
|
||||
#include "channel.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... );
|
||||
GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, 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( CLIENT *ExceptOf, CHAR *Format, ... );
|
||||
GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... );
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
1363
src/ngircd/irc.c
1363
src/ngircd/irc.c
File diff suppressed because it is too large
Load Diff
@@ -9,62 +9,9 @@
|
||||
* 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.16 2002/01/05 19:15:03 alex Exp $
|
||||
* $Id: irc.h,v 1.30 2002/03/12 14:37:52 alex Exp $
|
||||
*
|
||||
* irc.h: IRC-Befehle (Header)
|
||||
*
|
||||
* $Log: irc.h,v $
|
||||
* Revision 1.16 2002/01/05 19:15:03 alex
|
||||
* - Fehlerpruefung bei select() in der "Hauptschleife" korrigiert.
|
||||
*
|
||||
* Revision 1.15 2002/01/04 17:58:21 alex
|
||||
* - IRC_WriteStrXXX()-Funktionen angepasst; neuer Befehl SQUIT.
|
||||
*
|
||||
* Revision 1.14 2002/01/03 02:26:07 alex
|
||||
* - neue Befehle SERVER und NJOIN begonnen.
|
||||
*
|
||||
* Revision 1.13 2002/01/02 02:51:39 alex
|
||||
* - Copyright-Texte angepasst.
|
||||
* - neuer Befehl "ERROR".
|
||||
*
|
||||
* Revision 1.11 2001/12/31 15:33:13 alex
|
||||
* - neuer Befehl NAMES, kleinere Bugfixes.
|
||||
* - Bug bei PING behoben: war zu restriktiv implementiert :-)
|
||||
*
|
||||
* Revision 1.10 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.9 2001/12/29 03:09:31 alex
|
||||
* - Neue Funktion IRC_MODE() implementiert.
|
||||
*
|
||||
* Revision 1.8 2001/12/27 19:17:26 alex
|
||||
* - neue Befehle PRIVMSG, NOTICE, PING.
|
||||
*
|
||||
* Revision 1.7 2001/12/27 16:55:41 alex
|
||||
* - neu: IRC_WriteStrRelated(), Aenderungen auch in IRC_WriteStrClient().
|
||||
*
|
||||
* Revision 1.6 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.5 2001/12/26 03:21:46 alex
|
||||
* - PING/PONG-Befehle implementiert,
|
||||
* - Meldungen ueberarbeitet: enthalten nun (fast) immer den Nick.
|
||||
*
|
||||
* Revision 1.4 2001/12/25 22:02:42 alex
|
||||
* - neuer IRC-Befehl "/QUIT". Verbessertes Logging & Debug-Ausgaben.
|
||||
*
|
||||
* Revision 1.3 2001/12/25 19:19:30 alex
|
||||
* - bessere Fehler-Abfragen, diverse Bugfixes.
|
||||
* - Nicks werden nur einmal vergeben :-)
|
||||
* - /MOTD wird unterstuetzt.
|
||||
*
|
||||
* Revision 1.2 2001/12/23 21:57:16 alex
|
||||
* - erste IRC-Befehle zu implementieren begonnen.
|
||||
*
|
||||
* Revision 1.1 2001/12/14 08:13:43 alex
|
||||
* - neues Modul begonnen :-)
|
||||
*/
|
||||
|
||||
|
||||
@@ -72,44 +19,31 @@
|
||||
#define __irc_h__
|
||||
|
||||
#include "parse.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
|
||||
|
||||
GLOBAL VOID IRC_Init( VOID );
|
||||
GLOBAL VOID IRC_Exit( VOID );
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... );
|
||||
GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... );
|
||||
GLOBAL BOOLEAN IRC_WriteStrRelated( CLIENT *Client, CHAR *Format, ... );
|
||||
GLOBAL VOID IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... );
|
||||
GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... );
|
||||
|
||||
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_SERVER( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_NJOIN( 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_SQUIT( 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( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
GLOBAL BOOLEAN IRC_MODE( 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_OPER( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_DIE( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_RESTART( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_WHO( 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 );
|
||||
|
||||
|
||||
#endif
|
||||
|
235
src/ngircd/log.c
235
src/ngircd/log.c
@@ -9,151 +9,176 @@
|
||||
* 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.16 2002/01/05 15:54:40 alex Exp $
|
||||
* $Id: log.c,v 1.32 2002/03/31 16:46:15 alex Exp $
|
||||
*
|
||||
* log.c: Logging-Funktionen
|
||||
*
|
||||
* $Log: log.c,v $
|
||||
* Revision 1.16 2002/01/05 15:54:40 alex
|
||||
* - syslog() etc. wurde verwendet, auch wenn USE_SYSLOG nicht definiert war.
|
||||
*
|
||||
* Revision 1.15 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.14 2002/01/01 18:01:43 alex
|
||||
* - Architektur und Betriebssystem in Start-Meldung aufgenommen.
|
||||
*
|
||||
* Revision 1.13 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.12 2001/12/29 20:16:31 alex
|
||||
* - Log-Funktionen fuer Resolver-Sub-Prozess implementiert.
|
||||
*
|
||||
* Revision 1.11 2001/12/29 03:08:49 alex
|
||||
* - neue configure-Option "--enable-strict-rfc".
|
||||
*
|
||||
* Revision 1.10 2001/12/27 01:44:49 alex
|
||||
* - die Verwendung von syslog kann nun abgeschaltet werden.
|
||||
*
|
||||
* Revision 1.9 2001/12/26 03:22:16 alex
|
||||
* - string.h wird nun includiert.
|
||||
*
|
||||
* Revision 1.8 2001/12/25 23:13:00 alex
|
||||
* - Versionsstring bei Programmstart verbessert.
|
||||
*
|
||||
* Revision 1.7 2001/12/25 22:04:26 alex
|
||||
* - Aenderungen an den Debug- und Logging-Funktionen.
|
||||
*
|
||||
* Revision 1.6 2001/12/25 19:20:39 alex
|
||||
* - es wird nun die Facility LOG_LOCAL5 zum Loggen verwendet.
|
||||
*
|
||||
* Revision 1.5 2001/12/15 00:07:56 alex
|
||||
* - Log-Level der Start- und Stop-Meldungen angehoben.
|
||||
*
|
||||
* Revision 1.4 2001/12/13 02:04:16 alex
|
||||
* - boesen "Speicherschiesser" in Log() gefixt.
|
||||
*
|
||||
* Revision 1.3 2001/12/12 23:31:24 alex
|
||||
* - Zum Loggen wird nun auch syslog verwendet.
|
||||
*
|
||||
* Revision 1.2 2001/12/12 17:19:12 alex
|
||||
* - in Log-Meldungen wird nun auch der Level der Meldung ausgegeben.
|
||||
*
|
||||
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
* - Imported sources to CVS.
|
||||
*/
|
||||
|
||||
|
||||
#define MAX_LOG_MSG_LEN 256
|
||||
#include "portab.h"
|
||||
|
||||
|
||||
#include <portab.h>
|
||||
#include "global.h"
|
||||
|
||||
#include <imp.h>
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef USE_SYSLOG
|
||||
#include <syslog.h>
|
||||
#endif
|
||||
|
||||
#include <exp.h>
|
||||
#include "ngircd.h"
|
||||
#include "client.h"
|
||||
#include "defines.h"
|
||||
#include "irc-write.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "log.h"
|
||||
|
||||
|
||||
LOCAL CHAR Error_File[FNAME_LEN];
|
||||
LOCAL CHAR Init_Txt[127];
|
||||
|
||||
|
||||
LOCAL VOID Wall_ServerNotice( CHAR *Msg );
|
||||
|
||||
|
||||
GLOBAL VOID Log_Init( VOID )
|
||||
{
|
||||
CHAR txt[64];
|
||||
|
||||
strcpy( txt, "" );
|
||||
|
||||
#ifdef USE_SYSLOG
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
else strcat( txt, "-" );
|
||||
strcat( txt, "SYSLOG" );
|
||||
#endif
|
||||
#ifdef STRICT_RFC
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
else strcat( txt, "-" );
|
||||
strcat( txt, "RFC" );
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
else strcat( txt, "-" );
|
||||
strcat( txt, "DEBUG" );
|
||||
#endif
|
||||
#ifdef SNIFFER
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
else strcat( txt, "-" );
|
||||
strcat( txt, "SNIFFER" );
|
||||
#endif
|
||||
|
||||
#ifdef USE_SYSLOG
|
||||
/* Syslog initialisieren */
|
||||
openlog( PACKAGE, LOG_CONS|LOG_PID, LOG_LOCAL5 );
|
||||
#endif
|
||||
Log( LOG_NOTICE, PACKAGE" version "VERSION"%s-"P_OSNAME"/"P_ARCHNAME" started.", txt );
|
||||
|
||||
/* Hello World! */
|
||||
Log( LOG_NOTICE, "%s started.", NGIRCd_Version( ));
|
||||
|
||||
/* Informationen uebern den "Operation Mode" */
|
||||
strcpy( Init_Txt, "" );
|
||||
#ifdef DEBUG
|
||||
if( NGIRCd_Debug )
|
||||
{
|
||||
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
|
||||
strcat( Init_Txt, "debug-mode" );
|
||||
}
|
||||
#endif
|
||||
if( NGIRCd_NoDaemon )
|
||||
{
|
||||
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
|
||||
strcat( Init_Txt, "no-daemon-mode" );
|
||||
}
|
||||
if( NGIRCd_Passive )
|
||||
{
|
||||
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
|
||||
strcat( Init_Txt, "passive-mode" );
|
||||
}
|
||||
#ifdef SNIFFER
|
||||
if( NGIRCd_Sniffer )
|
||||
{
|
||||
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
|
||||
strcat( Init_Txt, "network sniffer" );
|
||||
}
|
||||
#endif
|
||||
if( Init_Txt[0] ) Log( LOG_INFO, "Activating: %s.", Init_Txt );
|
||||
} /* Log_Init */
|
||||
|
||||
|
||||
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( ));
|
||||
|
||||
/* stderr umlenken */
|
||||
fflush( stderr );
|
||||
if( ! freopen( Error_File, "w", stderr ))
|
||||
{
|
||||
Log( LOG_ERR, "Can't reopen stderr (\"%s\"): %s", Error_File, strerror( errno ));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Einige Infos in das Error-File schreiben */
|
||||
fputs( ctime( &NGIRCd_Start ), stderr );
|
||||
fprintf( stderr, "%s started.\n", NGIRCd_Version( ));
|
||||
fprintf( stderr, "Activating: %s\n\n", Init_Txt[0] ? Init_Txt : "-" );
|
||||
fflush( stderr );
|
||||
|
||||
Log( LOG_DEBUG, "Redirected stderr to \"%s\".", Error_File );
|
||||
} /* Log_InitErrfile */
|
||||
|
||||
|
||||
GLOBAL VOID Log_Exit( VOID )
|
||||
{
|
||||
/* Good Bye! */
|
||||
Log( LOG_NOTICE, PACKAGE" done.");
|
||||
|
||||
/* Error-File (stderr) loeschen */
|
||||
if( unlink( Error_File ) != 0 ) Log( LOG_ERR, "Can't delete \"%s\": %s", Error_File, strerror( errno ));
|
||||
|
||||
#ifdef USE_SYSLOG
|
||||
/* syslog abmelden */
|
||||
closelog( );
|
||||
#endif
|
||||
} /* Log_Exit */
|
||||
|
||||
|
||||
GLOBAL VOID Log( CONST INT Level, CONST CHAR *Format, ... )
|
||||
GLOBAL VOID Log( INT Level, CONST CHAR *Format, ... )
|
||||
{
|
||||
/* Eintrag in Logfile(s) schreiben */
|
||||
|
||||
CHAR msg[MAX_LOG_MSG_LEN];
|
||||
BOOLEAN snotice;
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
|
||||
#ifndef DEBUG
|
||||
if( Level & LOG_snotice )
|
||||
{
|
||||
/* Notice an User mit "s" Mode */
|
||||
snotice = TRUE;
|
||||
Level &= ~LOG_snotice;
|
||||
}
|
||||
else snotice = FALSE;
|
||||
|
||||
#ifdef DEBUG
|
||||
if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return;
|
||||
#else
|
||||
if( Level == LOG_DEBUG ) return;
|
||||
#endif
|
||||
|
||||
/* String mit variablen Argumenten zusammenbauen ... */
|
||||
va_start( ap, Format );
|
||||
vsnprintf( msg, MAX_LOG_MSG_LEN - 1, Format, ap );
|
||||
msg[MAX_LOG_MSG_LEN - 1] = '\0';
|
||||
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
if( NGIRCd_NoDaemon )
|
||||
{
|
||||
/* auf Konsole ausgeben */
|
||||
printf( "[%d] %s\n", Level, msg );
|
||||
}
|
||||
|
||||
if( Level <= LOG_CRIT )
|
||||
{
|
||||
/* Kritische Meldungen in Error-File (stderr) */
|
||||
fprintf( stderr, "%s\n", msg );
|
||||
fflush( stderr );
|
||||
}
|
||||
|
||||
/* ... und ausgeben */
|
||||
printf( "[%d] %s\n", Level, msg );
|
||||
#ifdef USE_SYSLOG
|
||||
/* Syslog */
|
||||
syslog( Level, msg );
|
||||
#endif
|
||||
|
||||
va_end( ap );
|
||||
if( snotice )
|
||||
{
|
||||
/* NOTICE an lokale User mit "s"-Mode */
|
||||
Wall_ServerNotice( msg );
|
||||
}
|
||||
} /* Log */
|
||||
|
||||
|
||||
@@ -186,21 +211,39 @@ GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... )
|
||||
|
||||
assert( Format != NULL );
|
||||
|
||||
#ifndef DEBUG
|
||||
#ifdef DEBUG
|
||||
if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return;
|
||||
#else
|
||||
if( Level == LOG_DEBUG ) return;
|
||||
#endif
|
||||
|
||||
/* String mit variablen Argumenten zusammenbauen ... */
|
||||
va_start( ap, Format );
|
||||
vsnprintf( msg, MAX_LOG_MSG_LEN - 1, Format, ap );
|
||||
msg[MAX_LOG_MSG_LEN - 1] = '\0';
|
||||
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
/* ... und ausgeben */
|
||||
syslog( Level, msg );
|
||||
|
||||
va_end( ap );
|
||||
#endif
|
||||
} /* Log_Resolver */
|
||||
|
||||
|
||||
LOCAL VOID Wall_ServerNotice( CHAR *Msg )
|
||||
{
|
||||
/* Server-Notice an entsprechende User verschicken */
|
||||
|
||||
CLIENT *c;
|
||||
|
||||
assert( Msg != NULL );
|
||||
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if(( Client_Conn( c ) > NONE ) && ( Client_HasMode( c, 's' ))) IRC_WriteStrClient( c, "NOTICE %s :%s", Client_ThisServer( ), Msg );
|
||||
c = Client_Next( c );
|
||||
}
|
||||
} /* Wall_ServerNotice */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
|
@@ -9,33 +9,9 @@
|
||||
* 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.7 2002/01/02 02:42:58 alex Exp $
|
||||
* $Id: log.h,v 1.11 2002/03/29 23:33:42 alex Exp $
|
||||
*
|
||||
* log.h: Logging-Funktionen (Header)
|
||||
*
|
||||
* $Log: log.h,v $
|
||||
* Revision 1.7 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.6 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.5 2001/12/29 20:16:31 alex
|
||||
* - Log-Funktionen fuer Resolver-Sub-Prozess implementiert.
|
||||
*
|
||||
* Revision 1.4 2001/12/27 01:44:49 alex
|
||||
* - die Verwendung von syslog kann nun abgeschaltet werden.
|
||||
*
|
||||
* Revision 1.3 2001/12/12 23:31:24 alex
|
||||
* - Zum Loggen wird nun auch syslog verwendet.
|
||||
*
|
||||
* Revision 1.2 2001/12/12 17:19:29 alex
|
||||
* - LOG_ERR heisst nun LOG_ERROR.
|
||||
*
|
||||
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
* - Imported sources to CVS.
|
||||
*/
|
||||
|
||||
|
||||
@@ -57,10 +33,14 @@
|
||||
#endif
|
||||
|
||||
|
||||
#define LOG_snotice 1024
|
||||
|
||||
|
||||
GLOBAL VOID Log_Init( VOID );
|
||||
GLOBAL VOID Log_Exit( VOID );
|
||||
|
||||
GLOBAL VOID Log( CONST INT Level, CONST CHAR *Format, ... );
|
||||
GLOBAL VOID Log_InitErrorfile( VOID );
|
||||
GLOBAL VOID Log( INT Level, CONST CHAR *Format, ... );
|
||||
|
||||
GLOBAL VOID Log_Init_Resolver( VOID );
|
||||
GLOBAL VOID Log_Exit_Resolver( VOID );
|
||||
|
@@ -9,67 +9,9 @@
|
||||
* 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.17 2002/01/05 23:23:44 alex Exp $
|
||||
* $Id: messages.h,v 1.37.2.1 2002/04/29 14:11:23 alex Exp $
|
||||
*
|
||||
* irc.h: IRC-Befehle (Header)
|
||||
*
|
||||
* $Log: messages.h,v $
|
||||
* Revision 1.17 2002/01/05 23:23:44 alex
|
||||
* - neue Nachricht ERR_NOSUCHSERVER_MSG definiert.
|
||||
*
|
||||
* Revision 1.16 2002/01/03 02:24:21 alex
|
||||
* - neue Message ERR_NOTREGISTEREDSERVER_MSG.
|
||||
*
|
||||
* Revision 1.15 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.14 2001/12/31 16:00:57 alex
|
||||
* - "o" zu den unterstuetzten Modes hinzugefuegt.
|
||||
*
|
||||
* Revision 1.13 2001/12/31 15:33:13 alex
|
||||
* - neuer Befehl NAMES, kleinere Bugfixes.
|
||||
* - Bug bei PING behoben: war zu restriktiv implementiert :-)
|
||||
*
|
||||
* Revision 1.12 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.11 2001/12/30 19:25:39 alex
|
||||
* - RPL_MYINFO_MSG um unterstuetzte User-Modes ergaengz.
|
||||
*
|
||||
* Revision 1.10 2001/12/30 11:42:00 alex
|
||||
* - der Server meldet nun eine ordentliche "Start-Zeit".
|
||||
*
|
||||
* Revision 1.9 2001/12/29 03:06:56 alex
|
||||
* - Texte ergaenzt, einige Bugs behoben (Leerzeichen falsch gesetzt, z.B.)
|
||||
*
|
||||
* Revision 1.8 2001/12/27 19:17:26 alex
|
||||
* - neue Befehle PRIVMSG, NOTICE, PING.
|
||||
*
|
||||
* Revision 1.7 2001/12/27 16:56:06 alex
|
||||
* - RPL_WELCOME an Client_GetID() angepasst.
|
||||
*
|
||||
* Revision 1.6 2001/12/26 22:48:53 alex
|
||||
* - MOTD-Datei ist nun konfigurierbar und wird gelesen.
|
||||
*
|
||||
* Revision 1.5 2001/12/26 03:51:13 alex
|
||||
* - in ERR_NOTREGISTERED_MSG fehlte ein "%s" - jetzt steht auch hier der Nick.
|
||||
*
|
||||
* Revision 1.4 2001/12/26 03:22:40 alex
|
||||
* - Format der Meldungen ueberarbeitet: fast immer ist nun der Nick enthalten.
|
||||
*
|
||||
* Revision 1.3 2001/12/25 19:20:11 alex
|
||||
* - neue Message: ERR_NICKNAMEINUSE[_MSG].
|
||||
*
|
||||
* Revision 1.2 2001/12/24 01:30:46 alex
|
||||
* - einige Messages korrigiert, andere ergaenzt (u.a. fuer MOTD).
|
||||
*
|
||||
* Revision 1.1 2001/12/23 21:53:32 alex
|
||||
* - Ich habe diesen Header begonnen.
|
||||
*
|
||||
* Revision 1.1 2001/12/14 08:13:43 alex
|
||||
* - neues Modul begonnen :-)
|
||||
*/
|
||||
|
||||
|
||||
@@ -81,25 +23,50 @@
|
||||
#define RPL_WELCOME_MSG RPL_WELCOME" %s :Welcome to the Internet Relay Network %s"
|
||||
|
||||
#define RPL_YOURHOST "002"
|
||||
#define RPL_YOURHOST_MSG RPL_YOURHOST" %s :Your host is %s, running ngircd "VERSION"-"P_OSNAME"/"P_ARCHNAME
|
||||
#define RPL_YOURHOST_MSG RPL_YOURHOST" %s :Your host is %s, running ngircd "VERSION"-"TARGET_CPU"/"TARGET_VENDOR"/"TARGET_OS
|
||||
|
||||
#define RPL_CREATED "003"
|
||||
#define RPL_CREATED_MSG RPL_CREATED" %s :This server was started %s"
|
||||
|
||||
#define RPL_MYINFO "004"
|
||||
#define RPL_MYINFO_MSG RPL_MYINFO" %s %s ngircd-"VERSION" ior +"
|
||||
#define RPL_MYINFO_MSG RPL_MYINFO" %s :%s ngircd-"VERSION" "USERMODES" "CHANMODES
|
||||
|
||||
#define RPL_MOTDSTART "375"
|
||||
#define RPL_MOTDSTART_MSG RPL_MOTDSTART" %s :- %s message of the day"
|
||||
#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_UMODEIS "211"
|
||||
#define RPL_UMODEIS_MSG RPL_UMODEIS" %s +%s"
|
||||
#define RPL_AWAY "301"
|
||||
#define RPL_AWAY_MSG RPL_AWAY" %s %s :%s"
|
||||
|
||||
#define RPL_USERHOST "302"
|
||||
#define RPL_USERHOST_MSG RPL_USERHOST" %s :"
|
||||
@@ -116,6 +83,9 @@
|
||||
#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"
|
||||
|
||||
@@ -123,10 +93,37 @@
|
||||
#define RPL_ENDOFWHOIS_MSG RPL_ENDOFWHOIS" %s %s :End of WHOIS list"
|
||||
|
||||
#define RPL_WHOISCHANNELS "319"
|
||||
#define RPL_WHOISCHANNELS_MSG RPL_WHOISCHANNELS" %s :"
|
||||
#define RPL_WHOISCHANNELS_MSG RPL_WHOISCHANNELS" %s %s :"
|
||||
|
||||
#define RPL_LIST "322"
|
||||
#define RPL_LIST_MSG RPL_LIST" %s %s %d :%s"
|
||||
|
||||
#define RPL_LISTEND "323"
|
||||
#define RPL_LISTEND_MSG RPL_LISTEND" %s :End of LIST"
|
||||
|
||||
#define RPL_CHANNELMODEIS "324"
|
||||
#define RPL_CHANNELMODEIS_MSG RPL_CHANNELMODEIS" %s %s +%s"
|
||||
|
||||
#define RPL_NOTOPIC "331"
|
||||
#define RPL_NOTOPIC_MSG RPL_NOTOPIC" %s %s :No topic is set"
|
||||
|
||||
#define RPL_TOPIC "332"
|
||||
#define RPL_TOPIC_MSG RPL_TOPIC" %s %s :%s"
|
||||
|
||||
#define RPL_VERSION "351"
|
||||
#define RPL_VERSION_MSG RPL_VERSION" %s "PACKAGE"-"VERSION".%s %s :%s"
|
||||
|
||||
#define RPL_WHOREPLY "352"
|
||||
#define RPL_WHOREPLY_MSG RPL_WHOREPLY" %s %s %s %s %s %s %s :%d %s"
|
||||
|
||||
#define RPL_NAMREPLY "353"
|
||||
#define RPL_NAMREPLY_MSG RPL_NAMREPLY" %s %s %s :%s"
|
||||
#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"
|
||||
@@ -141,6 +138,12 @@
|
||||
#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"
|
||||
|
||||
@@ -162,6 +165,13 @@
|
||||
#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"
|
||||
|
||||
@@ -171,21 +181,22 @@
|
||||
#define ERR_PASSWDMISMATCH "464"
|
||||
#define ERR_PASSWDMISMATCH_MSG ERR_PASSWDMISMATCH" %s: Invalid password"
|
||||
|
||||
#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_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 flag"
|
||||
#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"
|
||||
|
@@ -9,79 +9,22 @@
|
||||
* 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.17 2002/01/02 02:51:16 alex Exp $
|
||||
* $Id: ngircd.c,v 1.41.2.2 2002/04/08 18:07:42 alex Exp $
|
||||
*
|
||||
* ngircd.c: Hier beginnt alles ;-)
|
||||
*
|
||||
* $Log: ngircd.c,v $
|
||||
* Revision 1.17 2002/01/02 02:51:16 alex
|
||||
* - Signal-Handler fuer SIGCHLD: so sollten Zombies nicht mehr vorkommen.
|
||||
*
|
||||
* Revision 1.15 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.14 2001/12/30 19:26:12 alex
|
||||
* - Unterstuetzung fuer die Konfigurationsdatei eingebaut.
|
||||
*
|
||||
* Revision 1.13 2001/12/30 11:42:00 alex
|
||||
* - der Server meldet nun eine ordentliche "Start-Zeit".
|
||||
*
|
||||
* Revision 1.12 2001/12/29 03:07:36 alex
|
||||
* - einige Loglevel geaendert.
|
||||
*
|
||||
* Revision 1.11 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.10 2001/12/24 01:34:38 alex
|
||||
* - Signal-Handler aufgeraeumt; u.a. SIGPIPE wird nun korrekt ignoriert.
|
||||
*
|
||||
* Revision 1.9 2001/12/21 22:24:50 alex
|
||||
* - neues Modul "parse" wird initialisiert und abgemeldet.
|
||||
*
|
||||
* Revision 1.8 2001/12/14 08:15:26 alex
|
||||
* - neue Module (irc, client, channel) werden an- und abgemeldet.
|
||||
* - zweiter Listen-Socket wird zu Testzwecken konfiguriert.
|
||||
*
|
||||
* Revision 1.7 2001/12/13 01:31:46 alex
|
||||
* - Conn_Handler() wird nun mit einem Timeout aufgerufen.
|
||||
*
|
||||
* Revision 1.6 2001/12/12 23:30:42 alex
|
||||
* - Log-Meldungen an syslog angepasst.
|
||||
* - NGIRCd_Quit ist nun das Flag zum Beenden des ngircd.
|
||||
*
|
||||
* Revision 1.5 2001/12/12 17:21:21 alex
|
||||
* - mehr Unterfunktionen eingebaut, Modul besser strukturiert & dokumentiert.
|
||||
* - Anpassungen an neue Module.
|
||||
*
|
||||
* Revision 1.4 2001/12/12 01:58:53 alex
|
||||
* - Test auf socklen_t verbessert.
|
||||
*
|
||||
* Revision 1.3 2001/12/12 01:40:39 alex
|
||||
* - ein paar mehr Kommentare; Variablennamen verstaendlicher gemacht.
|
||||
* - fehlenden Header <arpa/inet.h> ergaenz.
|
||||
* - SIGINT und SIGQUIT werden nun ebenfalls behandelt.
|
||||
*
|
||||
* Revision 1.2 2001/12/11 22:04:21 alex
|
||||
* - Test auf stdint.h (HAVE_STDINT_H) hinzugefuegt.
|
||||
*
|
||||
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
* - Imported sources to CVS.
|
||||
*/
|
||||
|
||||
|
||||
#define PORTAB_CHECK_TYPES /* Prueffunktion einbinden, s.u. */
|
||||
|
||||
|
||||
#include <portab.h>
|
||||
#include "global.h"
|
||||
|
||||
#include <imp.h>
|
||||
#include "portab.h"
|
||||
|
||||
#include "imp.h"
|
||||
#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/wait.h>
|
||||
#include <time.h>
|
||||
@@ -90,11 +33,12 @@
|
||||
#include "client.h"
|
||||
#include "conf.h"
|
||||
#include "conn.h"
|
||||
#include "defines.h"
|
||||
#include "irc.h"
|
||||
#include "log.h"
|
||||
#include "parse.h"
|
||||
|
||||
#include <exp.h>
|
||||
#include "exp.h"
|
||||
#include "ngircd.h"
|
||||
|
||||
|
||||
@@ -103,29 +47,226 @@ LOCAL VOID Signal_Handler( INT Signal );
|
||||
|
||||
LOCAL VOID Initialize_Listen_Ports( VOID );
|
||||
|
||||
LOCAL VOID Show_Version( VOID );
|
||||
LOCAL VOID Show_Help( VOID );
|
||||
|
||||
GLOBAL INT main( INT argc, CONST CHAR *argv[] )
|
||||
|
||||
GLOBAL int main( int argc, const char *argv[] )
|
||||
{
|
||||
/* Datentypen der portab-Library ueberpruefen */
|
||||
portab_check_types( );
|
||||
BOOLEAN ok, configtest = FALSE;
|
||||
INT32 pid, n;
|
||||
INT i;
|
||||
|
||||
NGIRCd_Restart = FALSE;
|
||||
NGIRCd_Quit = FALSE;
|
||||
NGIRCd_NoDaemon = FALSE;
|
||||
NGIRCd_Passive = FALSE;
|
||||
#ifdef DEBUG
|
||||
NGIRCd_Debug = FALSE;
|
||||
#endif
|
||||
#ifdef SNIFFER
|
||||
NGIRCd_Sniffer = FALSE;
|
||||
#endif
|
||||
strcpy( NGIRCd_ConfFile, CONFIG_FILE );
|
||||
|
||||
/* Kommandozeile parsen */
|
||||
for( i = 1; i < argc; i++ )
|
||||
{
|
||||
ok = FALSE;
|
||||
if(( argv[i][0] == '-' ) && ( argv[i][1] == '-' ))
|
||||
{
|
||||
/* Lange Option */
|
||||
|
||||
if( strcmp( argv[i], "--config" ) == 0 )
|
||||
{
|
||||
if( i + 1 < argc )
|
||||
{
|
||||
/* Ok, danach kommt noch ein Parameter */
|
||||
strncpy( NGIRCd_ConfFile, argv[i + 1], FNAME_LEN - 1 );
|
||||
NGIRCd_ConfFile[FNAME_LEN - 1] = '\0';
|
||||
|
||||
/* zum uebernaechsten Parameter */
|
||||
i++; ok = TRUE;
|
||||
}
|
||||
}
|
||||
if( strcmp( argv[i], "--configtest" ) == 0 )
|
||||
{
|
||||
configtest = TRUE;
|
||||
ok = TRUE;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
if( strcmp( argv[i], "--debug" ) == 0 )
|
||||
{
|
||||
NGIRCd_Debug = TRUE;
|
||||
ok = TRUE;
|
||||
}
|
||||
#endif
|
||||
if( strcmp( argv[i], "--help" ) == 0 )
|
||||
{
|
||||
Show_Version( );
|
||||
puts( "" ); Show_Help( ); puts( "" );
|
||||
exit( 1 );
|
||||
}
|
||||
if( strcmp( argv[i], "--nodaemon" ) == 0 )
|
||||
{
|
||||
NGIRCd_NoDaemon = TRUE;
|
||||
ok = TRUE;
|
||||
}
|
||||
if( strcmp( argv[i], "--passive" ) == 0 )
|
||||
{
|
||||
NGIRCd_Passive = TRUE;
|
||||
ok = TRUE;
|
||||
}
|
||||
#ifdef SNIFFER
|
||||
if( strcmp( argv[i], "--sniffer" ) == 0 )
|
||||
{
|
||||
NGIRCd_Sniffer = TRUE;
|
||||
ok = TRUE;
|
||||
}
|
||||
#endif
|
||||
if( strcmp( argv[i], "--version" ) == 0 )
|
||||
{
|
||||
Show_Version( );
|
||||
exit( 1 );
|
||||
}
|
||||
}
|
||||
else if(( argv[i][0] == '-' ) && ( argv[i][1] != '-' ))
|
||||
{
|
||||
/* Kurze Option */
|
||||
|
||||
for( n = 1; n < (INT32)strlen( argv[i] ); n++ )
|
||||
{
|
||||
ok = FALSE;
|
||||
#ifdef DEBUG
|
||||
if( argv[i][n] == 'd' )
|
||||
{
|
||||
NGIRCd_Debug = TRUE;
|
||||
ok = TRUE;
|
||||
}
|
||||
#endif
|
||||
if( argv[i][n] == 'f' )
|
||||
{
|
||||
if(( ! argv[i][n + 1] ) && ( i + 1 < argc ))
|
||||
{
|
||||
/* Ok, danach kommt ein Leerzeichen */
|
||||
strncpy( NGIRCd_ConfFile, argv[i + 1], FNAME_LEN - 1 );
|
||||
NGIRCd_ConfFile[FNAME_LEN - 1] = '\0';
|
||||
|
||||
/* zum uebernaechsten Parameter */
|
||||
i++; n = strlen( argv[i] );
|
||||
ok = TRUE;
|
||||
}
|
||||
}
|
||||
if( argv[i][n] == 'n' )
|
||||
{
|
||||
NGIRCd_NoDaemon = TRUE;
|
||||
ok = TRUE;
|
||||
}
|
||||
if( argv[i][n] == 'p' )
|
||||
{
|
||||
NGIRCd_Passive = TRUE;
|
||||
ok = TRUE;
|
||||
}
|
||||
#ifdef SNIFFER
|
||||
if( argv[i][n] == 's' )
|
||||
{
|
||||
NGIRCd_Sniffer = TRUE;
|
||||
ok = TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
if( ! ok )
|
||||
{
|
||||
printf( PACKAGE": invalid option \"-%c\"!\n", argv[i][n] );
|
||||
puts( "Try \""PACKAGE" --help\" for more information." );
|
||||
exit( 1 );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if( ! ok )
|
||||
{
|
||||
printf( PACKAGE": invalid option \"%s\"!\n", argv[i] );
|
||||
puts( "Try \""PACKAGE" --help\" for more information." );
|
||||
exit( 1 );
|
||||
}
|
||||
}
|
||||
|
||||
/* Debug-Level (fuer IRC-Befehl "VERSION") ermitteln */
|
||||
strcpy( NGIRCd_DebugLevel, "" );
|
||||
#ifdef DEBUG
|
||||
if( NGIRCd_Debug ) strcpy( NGIRCd_DebugLevel, "1" );
|
||||
#endif
|
||||
#ifdef SNIFFER
|
||||
if( NGIRCd_Sniffer ) strcpy( NGIRCd_DebugLevel, "2" );
|
||||
#endif
|
||||
|
||||
/* Soll nur die Konfigurations ueberprueft und ausgegeben werden? */
|
||||
if( configtest )
|
||||
{
|
||||
Show_Version( ); puts( "" );
|
||||
exit( Conf_Test( ));
|
||||
}
|
||||
|
||||
while( ! NGIRCd_Quit )
|
||||
{
|
||||
/* In der Regel wird ein Sub-Prozess ge-fork()'t, der
|
||||
* nicht mehr mit dem Terminal verbunden ist. Mit der
|
||||
* Option "--nodaemon" kann dies (z.B. zum Debuggen)
|
||||
* verhindert werden. */
|
||||
if( ! NGIRCd_NoDaemon )
|
||||
{
|
||||
/* Daemon im Hintergrund erzeugen */
|
||||
pid = (INT32)fork( );
|
||||
if( pid > 0 )
|
||||
{
|
||||
/* "alter" Prozess */
|
||||
exit( 0 );
|
||||
}
|
||||
if( pid < 0 )
|
||||
{
|
||||
/* Fehler */
|
||||
printf( PACKAGE": Can't fork: %s!\nFatal error, exiting now ...", strerror( errno ));
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
/* Child-Prozess initialisieren */
|
||||
(VOID)setsid( );
|
||||
chdir( "/" );
|
||||
}
|
||||
|
||||
/* Globale Variablen initialisieren */
|
||||
NGIRCd_Start = time( NULL );
|
||||
strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start ));
|
||||
(VOID)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start ));
|
||||
NGIRCd_Restart = FALSE;
|
||||
NGIRCd_Quit = FALSE;
|
||||
|
||||
/* Module initialisieren */
|
||||
Log_Init( );
|
||||
Conf_Init( );
|
||||
Parse_Init( );
|
||||
IRC_Init( );
|
||||
Channel_Init( );
|
||||
Client_Init( );
|
||||
Conn_Init( );
|
||||
|
||||
/* Wenn als root ausgefuehrt und eine andere UID
|
||||
* konfiguriert ist, jetzt zu dieser wechseln */
|
||||
if( getuid( ) == 0 )
|
||||
{
|
||||
if( Conf_GID != 0 )
|
||||
{
|
||||
/* Neue Group-ID setzen */
|
||||
if( setgid( Conf_GID ) != 0 ) Log( LOG_ERR, "Can't change Group-ID to %u: %s", Conf_GID, strerror( errno ));
|
||||
}
|
||||
if( Conf_UID != 0 )
|
||||
{
|
||||
/* Neue User-ID setzen */
|
||||
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( ));
|
||||
|
||||
Log_InitErrorfile( );
|
||||
|
||||
/* Signal-Handler initialisieren */
|
||||
Initialize_Signal_Handler( );
|
||||
|
||||
@@ -143,35 +284,96 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
|
||||
Conn_Exit( );
|
||||
Client_Exit( );
|
||||
Channel_Exit( );
|
||||
IRC_Exit( );
|
||||
Parse_Exit( );
|
||||
Conf_Exit( );
|
||||
Log_Exit( );
|
||||
}
|
||||
|
||||
return 0;
|
||||
} /* main */
|
||||
|
||||
|
||||
GLOBAL CHAR *NGIRCd_Version( VOID )
|
||||
{
|
||||
STATIC CHAR version[126];
|
||||
|
||||
sprintf( version, PACKAGE" version "VERSION"-%s", NGIRCd_VersionAddition( ));
|
||||
return version;
|
||||
} /* NGIRCd_Version */
|
||||
|
||||
|
||||
GLOBAL CHAR *NGIRCd_VersionAddition( VOID )
|
||||
{
|
||||
STATIC CHAR txt[64];
|
||||
|
||||
strcpy( txt, "" );
|
||||
|
||||
#ifdef USE_SYSLOG
|
||||
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" );
|
||||
#endif
|
||||
#ifdef SNIFFER
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
strcat( txt, "SNIFFER" );
|
||||
#endif
|
||||
|
||||
if( txt[0] ) strcat( txt, "-" );
|
||||
strcat( txt, TARGET_CPU"/"TARGET_VENDOR"/"TARGET_OS );
|
||||
|
||||
return txt;
|
||||
} /* NGIRCd_VersionAddition */
|
||||
|
||||
|
||||
LOCAL VOID Initialize_Signal_Handler( VOID )
|
||||
{
|
||||
/* Signal-Handler initialisieren: einige Signale
|
||||
* werden ignoriert, andere speziell behandelt. */
|
||||
|
||||
#ifdef HAVE_SIGACTION
|
||||
/* sigaction() ist vorhanden */
|
||||
|
||||
struct sigaction saction;
|
||||
|
||||
/* Signal-Struktur initialisieren */
|
||||
memset( &saction, 0, sizeof( saction ));
|
||||
saction.sa_handler = Signal_Handler;
|
||||
#ifdef SA_RESTART
|
||||
saction.sa_flags |= SA_RESTART;
|
||||
#endif
|
||||
#ifdef SA_NOCLDWAIT
|
||||
saction.sa_flags |= SA_NOCLDWAIT;
|
||||
#endif
|
||||
|
||||
/* Signal-Handler einhaengen */
|
||||
saction.sa_handler = Signal_Handler;
|
||||
sigaction( SIGINT, &saction, NULL );
|
||||
sigaction( SIGQUIT, &saction, NULL );
|
||||
sigaction( SIGTERM, &saction, NULL);
|
||||
sigaction( SIGHUP, &saction, NULL);
|
||||
sigaction( SIGCHLD, &saction, NULL);
|
||||
|
||||
/* einige Signale ignorieren */
|
||||
saction.sa_handler = SIG_IGN;
|
||||
sigaction( SIGPIPE, &saction, NULL );
|
||||
#else
|
||||
/* kein sigaction() vorhanden */
|
||||
|
||||
/* Signal-Handler einhaengen */
|
||||
signal( SIGINT, Signal_Handler );
|
||||
signal( SIGQUIT, Signal_Handler );
|
||||
signal( SIGTERM, Signal_Handler );
|
||||
signal( SIGHUP, Signal_Handler );
|
||||
signal( SIGCHLD, Signal_Handler );
|
||||
|
||||
/* einige Signale ignorieren */
|
||||
signal( SIGPIPE, SIG_IGN );
|
||||
#endif
|
||||
} /* Initialize_Signal_Handler */
|
||||
|
||||
|
||||
@@ -187,9 +389,16 @@ LOCAL VOID Signal_Handler( INT Signal )
|
||||
case SIGINT:
|
||||
case SIGQUIT:
|
||||
/* wir soll(t)en uns wohl beenden ... */
|
||||
Log( LOG_WARNING, "Got signal %d, terminating now ...", Signal );
|
||||
if( Signal == SIGTERM ) Log( LOG_WARNING, "Got TERM signal, terminating now ..." );
|
||||
else if( Signal == SIGINT ) Log( LOG_WARNING, "Got INT signal, terminating now ..." );
|
||||
else if( Signal == SIGQUIT ) Log( LOG_WARNING, "Got QUIT signal, terminating now ..." );
|
||||
NGIRCd_Quit = TRUE;
|
||||
break;
|
||||
case SIGHUP:
|
||||
/* neu starten */
|
||||
Log( LOG_WARNING, "Got HUP signal, restarting now ..." );
|
||||
NGIRCd_Restart = TRUE;
|
||||
break;
|
||||
case SIGCHLD:
|
||||
/* Child-Prozess wurde beendet. Zombies vermeiden: */
|
||||
while( waitpid( -1, NULL, WNOHANG ) > 0);
|
||||
@@ -206,13 +415,13 @@ LOCAL VOID Initialize_Listen_Ports( VOID )
|
||||
/* Ports, auf denen der Server Verbindungen entgegennehmen
|
||||
* soll, initialisieren */
|
||||
|
||||
INT created, i;
|
||||
UINT created, i;
|
||||
|
||||
created = 0;
|
||||
for( i = 0; i < Conf_ListenPorts_Count; i++ )
|
||||
{
|
||||
if( Conn_NewListener( Conf_ListenPorts[i] )) created++;
|
||||
else Log( LOG_ERR, "Can't listen on port %d!", Conf_ListenPorts[i] );
|
||||
else Log( LOG_ERR, "Can't listen on port %u!", Conf_ListenPorts[i] );
|
||||
}
|
||||
|
||||
if( created < 1 )
|
||||
@@ -223,4 +432,32 @@ LOCAL VOID Initialize_Listen_Ports( VOID )
|
||||
}
|
||||
} /* Initialize_Listen_Ports */
|
||||
|
||||
|
||||
LOCAL VOID Show_Version( VOID )
|
||||
{
|
||||
puts( NGIRCd_Version( ));
|
||||
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 )
|
||||
{
|
||||
#ifdef DEBUG
|
||||
puts( " -d, --debug log extra debug messages" );
|
||||
#endif
|
||||
puts( " -f, --config <f> use file <f> as configuration file" );
|
||||
puts( " -n, --nodaemon don't fork and don't detatch from controlling terminal" );
|
||||
puts( " -p, --passive disable automatic connections to other servers" );
|
||||
#ifdef SNIFFER
|
||||
puts( " -s, --sniffer enable network sniffer and display all IRC traffic" );
|
||||
#endif
|
||||
puts( " --configtest read, validate and display configuration; then exit" );
|
||||
puts( " --version output version information and exit" );
|
||||
puts( " --help display this help and exit" );
|
||||
} /* Show_Help */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
|
@@ -9,30 +9,9 @@
|
||||
* 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.6 2002/01/02 02:44:37 alex Exp $
|
||||
* $Id: ngircd.h,v 1.12 2002/03/27 16:40:31 alex Exp $
|
||||
*
|
||||
* ngircd.h: Prototypen aus dem "Haupt-Modul"
|
||||
*
|
||||
* $Log: ngircd.h,v $
|
||||
* Revision 1.6 2002/01/02 02:44:37 alex
|
||||
* - neue Defines fuer max. Anzahl Server und Operatoren.
|
||||
*
|
||||
* Revision 1.5 2001/12/31 03:06:03 alex
|
||||
* - das #include fuer time.h hat noch gefehlt.
|
||||
*
|
||||
* Revision 1.4 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.3 2001/12/30 11:42:00 alex
|
||||
* - der Server meldet nun eine ordentliche "Start-Zeit".
|
||||
*
|
||||
* Revision 1.2 2001/12/12 23:30:01 alex
|
||||
* - NGIRCd_Quit ist nun das globale Flag zum Beenden des ngircd.
|
||||
*
|
||||
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
* - Imported sources to CVS.
|
||||
*/
|
||||
|
||||
|
||||
@@ -41,13 +20,34 @@
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#include "defines.h"
|
||||
|
||||
|
||||
GLOBAL time_t NGIRCd_Start; /* Startzeitpunkt des Daemon */
|
||||
GLOBAL CHAR NGIRCd_StartStr[64];
|
||||
|
||||
#ifdef DEBUG
|
||||
GLOBAL BOOLEAN NGIRCd_Debug; /* Debug-Modus aktivieren */
|
||||
#endif
|
||||
|
||||
#ifdef SNIFFER
|
||||
GLOBAL BOOLEAN NGIRCd_Sniffer; /* Sniffer aktivieren */
|
||||
#endif
|
||||
|
||||
GLOBAL BOOLEAN NGIRCd_NoDaemon; /* nicht im Hintergrund laufen */
|
||||
|
||||
GLOBAL BOOLEAN NGIRCd_Passive; /* nicht zu anderen Servern connecten */
|
||||
|
||||
GLOBAL BOOLEAN NGIRCd_Quit; /* TRUE: ngIRCd beenden */
|
||||
GLOBAL BOOLEAN NGIRCd_Restart; /* TRUE: neu starten */
|
||||
|
||||
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 );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -9,87 +9,36 @@
|
||||
* 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.16 2002/01/05 23:23:20 alex Exp $
|
||||
* $Id: parse.c,v 1.31.2.1 2002/04/29 14:11:23 alex Exp $
|
||||
*
|
||||
* parse.c: Parsen der Client-Anfragen
|
||||
*
|
||||
* $Log: parse.c,v $
|
||||
* Revision 1.16 2002/01/05 23:23:20 alex
|
||||
* - generisches Forwarding von Zahlen-Statuscodes implementiert.
|
||||
*
|
||||
* Revision 1.15 2002/01/05 01:42:08 alex
|
||||
* - an Server werden keine ERRORS mehr wegen unbekannter Befehle geschickt.
|
||||
*
|
||||
* Revision 1.14 2002/01/04 17:56:45 alex
|
||||
* - neuer Befehl SQUIT.
|
||||
*
|
||||
* Revision 1.13 2002/01/04 01:20:02 alex
|
||||
* - Client-Strukruren werden nur noch ueber Funktionen angesprochen.
|
||||
*
|
||||
* Revision 1.12 2002/01/03 02:24:49 alex
|
||||
* - neue Befehle NJOIN und SERVER begonnen.
|
||||
*
|
||||
* Revision 1.11 2002/01/02 02:43:22 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
* - neuer Befehl ERROR.
|
||||
*
|
||||
* Revision 1.10 2001/12/31 15:33:13 alex
|
||||
* - neuer Befehl NAMES, kleinere Bugfixes.
|
||||
* - Bug bei PING behoben: war zu restriktiv implementiert :-)
|
||||
*
|
||||
* Revision 1.9 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.8 2001/12/29 03:08:19 alex
|
||||
* - Fuehrende und folgende Leerzeichen etc. in Requests werden geloescht.
|
||||
* - Logmeldungen (mal wieder) ein wenig angepasst.
|
||||
*
|
||||
* Revision 1.7 2001/12/27 19:13:21 alex
|
||||
* - neue Befehle NOTICE und PRIVMSG.
|
||||
* - Debug-Logging ein wenig reduziert.
|
||||
*
|
||||
* Revision 1.6 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.5 2001/12/26 03:23:03 alex
|
||||
* - PING/PONG-Befehle implementiert.
|
||||
*
|
||||
* Revision 1.4 2001/12/25 22:04:26 alex
|
||||
* - Aenderungen an den Debug- und Logging-Funktionen.
|
||||
*
|
||||
* Revision 1.3 2001/12/25 19:18:36 alex
|
||||
* - Gross- und Kleinschreibung der IRC-Befehle wird ignoriert.
|
||||
* - bessere Debug-Ausgaben.
|
||||
*
|
||||
* Revision 1.2 2001/12/23 21:56:47 alex
|
||||
* - bessere Debug-Ausgaben,
|
||||
* - Bug im Parameter-Parser behoben (bei "langem" Parameter)
|
||||
* - erste IRC-Befehle werden erkannt :-)
|
||||
*
|
||||
* Revision 1.1 2001/12/21 23:53:16 alex
|
||||
* - Modul zum Parsen von Client-Requests begonnen.
|
||||
*/
|
||||
|
||||
|
||||
#include <portab.h>
|
||||
#include "global.h"
|
||||
#include "portab.h"
|
||||
|
||||
#include <imp.h>
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#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 "log.h"
|
||||
#include "messages.h"
|
||||
#include "tool.h"
|
||||
|
||||
#include <exp.h>
|
||||
#include "exp.h"
|
||||
#include "parse.h"
|
||||
|
||||
|
||||
@@ -104,16 +53,6 @@ LOCAL BOOLEAN Validate_Args( REQUEST *Req );
|
||||
LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req );
|
||||
|
||||
|
||||
GLOBAL VOID Parse_Init( VOID )
|
||||
{
|
||||
} /* Parse_Init */
|
||||
|
||||
|
||||
GLOBAL VOID Parse_Exit( VOID )
|
||||
{
|
||||
} /* Parse_Exit */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
{
|
||||
/* Client-Request parsen. Bei einem schwerwiegenden Fehler wird
|
||||
@@ -127,7 +66,7 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
assert( Request != NULL );
|
||||
|
||||
#ifdef SNIFFER
|
||||
Log( LOG_DEBUG, " <- connection %d: '%s'.", Idx, Request );
|
||||
if( NGIRCd_Sniffer ) Log( LOG_DEBUG, " <- connection %d: '%s'.", Idx, Request );
|
||||
#endif
|
||||
|
||||
Init_Request( &req );
|
||||
@@ -143,6 +82,11 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
ptr = strchr( Request, ' ' );
|
||||
if( ! ptr ) return Parse_Error( Idx, "Prefix without command!?" );
|
||||
*ptr = '\0';
|
||||
#ifndef STRICT_RFC
|
||||
/* multiple Leerzeichen als Trenner zwischen
|
||||
* Prefix und Befehl ignorieren */
|
||||
while( *(ptr + 1) == ' ' ) ptr++;
|
||||
#endif
|
||||
start = ptr + 1;
|
||||
}
|
||||
else start = Request;
|
||||
@@ -151,7 +95,15 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
|
||||
/* Befehl */
|
||||
ptr = strchr( start, ' ' );
|
||||
if( ptr ) *ptr = '\0';
|
||||
if( ptr )
|
||||
{
|
||||
*ptr = '\0';
|
||||
#ifndef STRICT_RFC
|
||||
/* multiple Leerzeichen als Trenner vor
|
||||
*Parametertrennern ignorieren */
|
||||
while( *(ptr + 1) == ' ' ) ptr++;
|
||||
#endif
|
||||
}
|
||||
req.command = start;
|
||||
|
||||
if( ! Validate_Command( &req )) return Parse_Error( Idx, "Invalid command" );
|
||||
@@ -173,7 +125,15 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
{
|
||||
req.argv[req.argc] = start;
|
||||
ptr = strchr( start, ' ' );
|
||||
if( ptr ) *ptr = '\0';
|
||||
if( ptr )
|
||||
{
|
||||
*ptr = '\0';
|
||||
#ifndef STRICT_RFC
|
||||
/* multiple Leerzeichen als
|
||||
* Parametertrenner ignorieren */
|
||||
while( *(ptr + 1) == ' ' ) ptr++;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
req.argc++;
|
||||
@@ -264,14 +224,32 @@ LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req )
|
||||
/* Befehl ist ein Statuscode */
|
||||
|
||||
/* Zielserver ermitteln */
|
||||
if(( Client_Type( client ) == CLIENT_SERVER ) && ( Req->argc > 0 )) target = Client_GetFromID( Req->argv[0] );
|
||||
if(( Client_Type( client ) == CLIENT_SERVER ) && ( Req->argc > 0 )) target = Client_Search( Req->argv[0] );
|
||||
else target = NULL;
|
||||
if( ! target ) return TRUE;
|
||||
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!" );
|
||||
return TRUE;
|
||||
}
|
||||
if( target == Client_ThisServer( ))
|
||||
{
|
||||
Log( LOG_DEBUG, "Ignored status code %s from \"%s\".", Req->command, Client_ID( client ));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Quell-Client ermitteln */
|
||||
if( ! Req->prefix[0] ) return TRUE;
|
||||
else prefix = Client_GetFromID( Req->prefix );
|
||||
if( ! prefix ) return TRUE;
|
||||
if( ! Req->prefix[0] )
|
||||
{
|
||||
Log( LOG_WARNING, "Got status code without prefix!?" );
|
||||
return TRUE;
|
||||
}
|
||||
else prefix = Client_Search( Req->prefix );
|
||||
if( ! prefix )
|
||||
{
|
||||
Log( LOG_WARNING, "Got status code from unknown source: \"%s\"", Req->prefix );
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Statuscode weiterleiten */
|
||||
strcpy( str, Req->command );
|
||||
@@ -305,9 +283,19 @@ LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req )
|
||||
else if( strcasecmp( Req->command, "DIE" ) == 0 ) return IRC_DIE( client, Req );
|
||||
else if( strcasecmp( Req->command, "RESTART" ) == 0 ) return IRC_RESTART( client, Req );
|
||||
else if( strcasecmp( Req->command, "ERROR" ) == 0 ) return IRC_ERROR( client, Req );
|
||||
else if( strcasecmp( Req->command, "LUSERS" ) == 0 ) return IRC_LUSERS( client, Req );
|
||||
else if( strcasecmp( Req->command, "LINKS" ) == 0 ) return IRC_LINKS( client, Req );
|
||||
else if( strcasecmp( Req->command, "JOIN" ) == 0 ) return IRC_JOIN( client, Req );
|
||||
else if( strcasecmp( Req->command, "PART" ) == 0 ) return IRC_PART( client, Req );
|
||||
else if( strcasecmp( Req->command, "VERSION" ) == 0 ) return IRC_VERSION( client, Req );
|
||||
else if( strcasecmp( Req->command, "KILL" ) == 0 ) return IRC_KILL( client, 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 );
|
||||
|
||||
/* Unbekannter Befehl */
|
||||
if( Client_Type( client ) != CLIENT_SERVER ) IRC_WriteStrClient( client, Client_ThisServer( ), ERR_UNKNOWNCOMMAND_MSG, Client_ID( client ), Req->command );
|
||||
if( Client_Type( client ) != CLIENT_SERVER ) IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( client ), Req->command );
|
||||
Log( LOG_DEBUG, "Connection %d: Unknown command \"%s\", %d %s,%s prefix.", Client_Conn( client ), Req->command, Req->argc, Req->argc == 1 ? "parameter" : "parameters", Req->prefix ? "" : " no" );
|
||||
|
||||
return TRUE;
|
||||
|
@@ -9,24 +9,9 @@
|
||||
* 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.4 2002/01/02 02:43:50 alex Exp $
|
||||
* $Id: parse.h,v 1.6 2002/03/12 14:37:52 alex Exp $
|
||||
*
|
||||
* parse.h: Parsen der Client-Anfragen (Header)
|
||||
*
|
||||
* $Log: parse.h,v $
|
||||
* Revision 1.4 2002/01/02 02:43:50 alex
|
||||
* - Copyright-Text ergaenzt bzw. aktualisiert.
|
||||
*
|
||||
* Revision 1.3 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.2 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.1 2001/12/21 23:53:16 alex
|
||||
* - Modul zum Parsen von Client-Requests begonnen.
|
||||
*/
|
||||
|
||||
|
||||
@@ -45,9 +30,6 @@ typedef struct _REQUEST /* vgl. RFC 2812, 2.3 */
|
||||
} REQUEST;
|
||||
|
||||
|
||||
GLOBAL VOID Parse_Init( VOID );
|
||||
GLOBAL VOID Parse_Exit( VOID );
|
||||
|
||||
GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request );
|
||||
|
||||
|
||||
|
@@ -9,43 +9,21 @@
|
||||
* 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.6 2002/01/02 02:42:58 alex Exp $
|
||||
* $Id: tool.c,v 1.8 2002/03/22 00:17:27 alex Exp $
|
||||
*
|
||||
* tool.c: Hilfsfunktionen, ggf. Platformabhaengig
|
||||
*
|
||||
* $Log: tool.c,v $
|
||||
* Revision 1.6 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.5 2001/12/31 02:44:36 alex
|
||||
* - ngt_TrimStr() hatte noch einen boesen Bug: evtl. wurde ueber den Start
|
||||
* des Strings nach vorne(!) hinaus gelesen. Hopsa!
|
||||
*
|
||||
* Revision 1.4 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.3 2001/12/29 03:05:34 alex
|
||||
* - Funktionsnamen etwas konsequenter umbenannt :-)
|
||||
*
|
||||
* Revision 1.2 2001/12/12 17:20:33 alex
|
||||
* - Tool-Funktionen haben nun das Praefix "ngt_".
|
||||
*
|
||||
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
* - Imported sources to CVS.
|
||||
*/
|
||||
|
||||
|
||||
#include <portab.h>
|
||||
#include "global.h"
|
||||
#include "portab.h"
|
||||
|
||||
#include <imp.h>
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <exp.h>
|
||||
#include "exp.h"
|
||||
#include "tool.h"
|
||||
|
||||
|
||||
@@ -73,4 +51,26 @@ GLOBAL VOID ngt_TrimStr( CHAR *String )
|
||||
} /* ngt_TrimStr */
|
||||
|
||||
|
||||
GLOBAL CHAR *ngt_LowerStr( CHAR *String )
|
||||
{
|
||||
/* String in Kleinbuchstaben konvertieren. Der uebergebene
|
||||
* Speicherbereich wird durch das Ergebnis ersetzt, zusaetzlich
|
||||
* wird dieser auch als Pointer geliefert. */
|
||||
|
||||
CHAR *ptr;
|
||||
|
||||
assert( String != NULL );
|
||||
|
||||
/* Zeichen konvertieren */
|
||||
ptr = String;
|
||||
while( *ptr )
|
||||
{
|
||||
*ptr = tolower( *ptr );
|
||||
ptr++;
|
||||
}
|
||||
|
||||
return String;
|
||||
} /* ngt_LowerStr */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
|
@@ -9,27 +9,9 @@
|
||||
* 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.5 2002/01/02 02:42:58 alex Exp $
|
||||
* $Id: tool.h,v 1.7 2002/03/22 00:17:27 alex Exp $
|
||||
*
|
||||
* log.h: Hilfsfunktionen (Header)
|
||||
*
|
||||
* $Log: tool.h,v $
|
||||
* Revision 1.5 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.4 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.3 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.2 2001/12/12 17:20:33 alex
|
||||
* - Tool-Funktionen haben nun das Praefix "ngt_".
|
||||
*
|
||||
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
* - Imported sources to CVS.
|
||||
*/
|
||||
|
||||
|
||||
@@ -39,6 +21,8 @@
|
||||
|
||||
GLOBAL VOID ngt_TrimStr( CHAR *String );
|
||||
|
||||
GLOBAL CHAR *ngt_LowerStr( CHAR *String );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
26
src/portab/Makefile.am
Normal file
26
src/portab/Makefile.am
Normal file
@@ -0,0 +1,26 @@
|
||||
#
|
||||
# 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.2 2002/03/15 15:41:55 alex Exp $
|
||||
#
|
||||
|
||||
check_PROGRAMS = portabtest
|
||||
|
||||
portabtest_SOURCES = portabtest.c
|
||||
|
||||
noinst_HEADERS = imp.h exp.h portab.h
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
||||
TESTS = portabtest
|
||||
|
||||
# -eof-
|
22
src/portab/exp.h
Normal file
22
src/portab/exp.h
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: exp.h,v 1.1 2002/03/12 14:36:44 alex Exp $
|
||||
*
|
||||
* exp.h: "Export Header"
|
||||
*/
|
||||
|
||||
|
||||
#undef GLOBAL
|
||||
#define GLOBAL
|
||||
|
||||
|
||||
/* -eof- */
|
22
src/portab/imp.h
Normal file
22
src/portab/imp.h
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: imp.h,v 1.1 2002/03/12 14:36:44 alex Exp $
|
||||
*
|
||||
* imp.h: "Import Header"
|
||||
*/
|
||||
|
||||
|
||||
#undef GLOBAL
|
||||
#define GLOBAL extern
|
||||
|
||||
|
||||
/* -eof- */
|
107
src/portab/portab.h
Normal file
107
src/portab/portab.h
Normal file
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* 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: portab.h,v 1.3 2002/03/25 19:13:19 alex Exp $
|
||||
*
|
||||
* portab.h: "Portabilitaets-Definitionen"
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __PORTAB__
|
||||
#define __PORTAB__
|
||||
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
||||
/* Keywords */
|
||||
|
||||
#define EXTERN extern
|
||||
#define STATIC static
|
||||
#define LOCAL static
|
||||
#define CONST const
|
||||
|
||||
|
||||
/* Datatentypen */
|
||||
|
||||
typedef void VOID;
|
||||
typedef void POINTER;
|
||||
|
||||
typedef signed int INT;
|
||||
typedef unsigned int UINT;
|
||||
typedef signed char INT8;
|
||||
typedef unsigned char UINT8;
|
||||
typedef signed short INT16;
|
||||
typedef unsigned short UINT16;
|
||||
typedef signed long INT32;
|
||||
typedef unsigned long UINT32;
|
||||
|
||||
typedef float FLOAT;
|
||||
|
||||
typedef char CHAR;
|
||||
|
||||
typedef UINT8 BOOLEAN;
|
||||
|
||||
#undef TRUE
|
||||
#define TRUE (BOOLEAN)1
|
||||
|
||||
#undef FALSE
|
||||
#define FALSE (BOOLEAN)0
|
||||
|
||||
#undef NULL
|
||||
#define NULL (VOID *)0
|
||||
|
||||
#undef GLOBAL
|
||||
#define GLOBAL
|
||||
|
||||
|
||||
/* SPLint */
|
||||
|
||||
|
||||
#ifdef S_SPLINT_S
|
||||
#include "splint.h"
|
||||
#endif
|
||||
|
||||
|
||||
/* configure-Optionen */
|
||||
|
||||
#ifndef HAVE_socklen_t
|
||||
#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
|
||||
|
||||
|
||||
/* Konstanten */
|
||||
|
||||
#ifndef TARGET_OS
|
||||
#define TARGET_OS "unknown"
|
||||
#endif
|
||||
|
||||
#ifndef TARGET_CPU
|
||||
#define TARGET_CPU "unknown"
|
||||
#endif
|
||||
|
||||
#ifndef TARGET_VENDOR
|
||||
#define TARGET_VENDOR "unknown"
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
61
src/portab/portabtest.c
Normal file
61
src/portab/portabtest.c
Normal file
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* 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: portabtest.c,v 1.3 2002/03/12 21:47:40 alex Exp $
|
||||
*
|
||||
* portabtest.c: Testprogramm fuer portab.h
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
#include "imp.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#include "exp.h"
|
||||
|
||||
|
||||
LOCAL BOOLEAN portab_check_types( 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;
|
||||
} /* portab_check_types */
|
||||
|
||||
|
||||
/* -eof- */
|
43
src/portab/splint.h
Normal file
43
src/portab/splint.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: splint.h,v 1.1 2002/03/25 19:13:19 alex Exp $
|
||||
*
|
||||
* splint.h: spezieller Header fuer SPLint Code-Check
|
||||
*
|
||||
* Dieser Header wird von portab.h nur dann includiert, wenn ein Code-Check
|
||||
* mit SPLint laeufr (d.h. S_SPLINT_S definiert ist).
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __splint__
|
||||
#define __splint__
|
||||
|
||||
|
||||
#define SYSCONFDIR "/"
|
||||
#define LOCALSTATEDIR "/"
|
||||
|
||||
#define LOG_EMERG 0
|
||||
#define LOG_ALERT 1
|
||||
#define LOG_CRIT 2
|
||||
#define LOG_ERR 3
|
||||
#define LOG_WARNING 4
|
||||
#define LOG_NOTICE 5
|
||||
#define LOG_INFO 6
|
||||
#define LOG_DEBUG 7
|
||||
|
||||
#define WNOHANG 0
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
Reference in New Issue
Block a user