1
0
mirror of https://github.com/osmarks/ngircd.git synced 2025-09-25 05:24:04 +00:00

Compare commits

...

134 Commits

Author SHA1 Message Date
Alexander Barton
a0318e8d0b - Version 0.4.3 2002-06-11 20:29:44 +00:00
Alexander Barton
d0084cfae2 - IRC_PRIVMSG() und IRC_NOTICE() haben nicht ueberprueft, ob der Ziel-Client
ein User ist; wenn nicht, so hat sich der Server mit einem assert() beendet.
2002-06-11 17:52:23 +00:00
Alexander Barton
880d35f82b - Dokumentation aktualisiert. 2002-05-08 15:47:06 +00:00
Alexander Barton
83e49bf74b - Backports aus CVS HEAD-Tree. 2002-04-29 14:44:24 +00:00
Alexander Barton
b6f53b6f82 - Backports aus CVS HEAD-Tree. 2002-04-29 14:11:23 +00:00
Alexander Barton
ab52d2b818 - Version 0.4.2. 2002-04-29 14:11:09 +00:00
Alexander Barton
aaf42ae77b - Dokumentation aktualisiert. 2002-04-29 14:10:59 +00:00
Alexander Barton
fa30f2a0d2 - Version auf 0.4.1 angehoben. 2002-04-08 18:26:16 +00:00
Alexander Barton
1fa46bedbe - Dokumentation aktualisiert. 2002-04-08 18:25:43 +00:00
Alexander Barton
d772acf9d6 - Backports aus CVS HEAD-Tree. 2002-04-08 18:07:42 +00:00
Alexander Barton
15f380592d - Version 0.4.0 2002-04-01 17:18:03 +00:00
Alexander Barton
54b9381dd0 - URL der Homepage zu Info-Text bei --version hinzugefuegt. 2002-04-01 17:05:00 +00:00
Alexander Barton
889b7ef48f - Dokumentation aktualisiert. 2002-03-31 23:31:27 +00:00
Alexander Barton
31c8078706 - Dokumentation aktualisiert. 2002-03-31 17:22:28 +00:00
Alexander Barton
34eb2528d0 - Versionsnummer auf 0.4.0-pre1 angehoben. 2002-03-31 17:22:15 +00:00
Alexander Barton
b58ab32b9f - im Debug-Modus wird nun der Name der "Error-Datei" ausgegeben. 2002-03-31 16:46:15 +00:00
Alexander Barton
85aad86906 - Kommandozeilen-Option "-f" wurde falsch geparsed. 2002-03-31 13:20:42 +00:00
Alexander Barton
d79b2f0a35 - unter A/UX wird nun _POSIX_SOURCE definiert. 2002-03-30 18:02:39 +00:00
Alexander Barton
c5eaea7161 - Test auf ngircd.conf in -f geaendert: das test von A/UX kennt kein -e. 2002-03-30 15:33:14 +00:00
Alexander Barton
e506ae44e0 - falschen Patch rueckgaengig gemacht ... 2002-03-30 13:40:56 +00:00
Alexander Barton
bebf0383d0 - in das "Error-File" werden wieder "kritische" Meldungen geschrieben. 2002-03-30 13:37:12 +00:00
Alexander Barton
1c99b8377f - wenn kein ListenPort definiert ist, so wird nun 6667 als Default verwendet. 2002-03-30 13:08:10 +00:00
Alexander Barton
c9e8d4bbad - Dokumentation aktualisiert. 2002-03-30 13:03:12 +00:00
Alexander Barton
d68fb7a320 - in das Error-Log wurde eine nicht-initialisierte Start-Zeit geschrieben. 2002-03-29 23:58:10 +00:00
Alexander Barton
7efefd30f1 - Dokumentation aktualisiert. 2002-03-29 23:41:23 +00:00
Alexander Barton
fe06f6e990 - Error-Log wird nach User-Wechsel mit Log_InitErrorfile() initialisiert.
- Einige Tippfehler korrigiert ...
2002-03-29 23:34:18 +00:00
Alexander Barton
3d74a9c323 - Error-Log wird nach User-Wechsel initialisiert: Log_InitErrorfile(). 2002-03-29 23:33:42 +00:00
Alexander Barton
1c2d0ae5de - neue Konfigurations-Variablen ServerUID und ServerGID. 2002-03-29 23:33:05 +00:00
Alexander Barton
07c3e62e11 - der Daemon kann nun seine UID und GID wechseln. 2002-03-29 22:56:40 +00:00
Alexander Barton
773d886df6 - Handling des "Error-File" (stderr) geaendert. 2002-03-29 22:55:42 +00:00
Alexander Barton
d47f88427d - ERROR_DIR auf "/tmp" geaendert: dort darf i.d.R. jeder schreiben. 2002-03-29 22:55:02 +00:00
Alexander Barton
95d55c56c6 - Conn_NewListener() erwartet den Port nun als "unsigned int". 2002-03-29 22:54:35 +00:00
Alexander Barton
4cdc98154c - Conf_ListenPorts[] ist nun unsigned.
- Neue Konfigurations-Variablen Conf_UID und Conf_GID.
2002-03-29 22:53:59 +00:00
Alexander Barton
d4a9ceae75 - das "localstatedir" wird nicht mehr erzeugt, da nicht mehr benoetigt. 2002-03-29 22:52:12 +00:00
Alexander Barton
6fbb2b7a67 - LOCALSTATEDIR wird nicht mehr benoetigt. 2002-03-29 22:51:28 +00:00
Alexander Barton
1c00ddffec - das Error-File wird nun komplett durch das Log-Modul verwaltet, der
Dateiname enthaelt nun die PID: so koennen mehrere Instanzen laufen.
2002-03-29 20:59:22 +00:00
Alexander Barton
f4b23bfc96 - ERROR_FILE wurde durch ERROR_DIR ersetzt. 2002-03-29 20:58:36 +00:00
Alexander Barton
72accd4ee5 - neuer Kommandozeilen-Parameter "--config"/"-f". 2002-03-28 14:15:33 +00:00
Alexander Barton
d7ecb84847 - Dokumentation aktualisiert. 2002-03-28 14:15:19 +00:00
Alexander Barton
da8da1ce7d - Hmpf. NOTICE von Server Notices wurde ohne Absender verschickt :-/ 2002-03-27 21:03:09 +00:00
Alexander Barton
20a2ffef88 - Server Notices (User-Mode "s") implementiert. 2002-03-27 20:53:30 +00:00
Alexander Barton
6b58ab8427 - einige Log-Meldungen werden nun auch als Server Notice verschickt. 2002-03-27 20:52:58 +00:00
Alexander Barton
e9b98fefc6 - Dokumentation aktualisiert. 2002-03-27 20:51:45 +00:00
Alexander Barton
95be386e9d - Dokumentation aktualisiert. 2002-03-27 19:01:40 +00:00
Alexander Barton
a89dc54690 - neuer Kommandozeilen-Parameter "--configtest": gibt die verwendete Server-
Konfiguration aus. Diesbezuegliche Ausgaben bei "--help" sind entfallen.
2002-03-27 16:41:25 +00:00
Alexander Barton
e8668cf593 - NGIRCd_ConfFile definiert. 2002-03-27 16:40:31 +00:00
Alexander Barton
bdf53a6d29 - MAX_LOG_MSG_LEN ist nun global in defines.h definiert. 2002-03-27 16:40:06 +00:00
Alexander Barton
d09dfb3e36 - neues #define: MAX_LOG_MSG_LEN. 2002-03-27 16:39:50 +00:00
Alexander Barton
f86083a057 - neue Funktion Conf_Test() zum Testen der Konfiguration.
- Conf_File ist entfallen, ist nun NGIRCd_ConfFile.
2002-03-27 16:39:22 +00:00
Alexander Barton
bcc5138518 - Kommentar korrekt eingerueckt. Wow ;-) 2002-03-26 23:58:34 +00:00
Alexander Barton
e39925af9b - Ping-Timeouts geben als Debug-Meldung den konfigurierten Timeout mit aus. 2002-03-26 23:47:45 +00:00
Alexander Barton
d58fe2f185 - lint-Target in Haupt-Makefile aufgenommen. 2002-03-25 19:39:48 +00:00
Alexander Barton
b79ba679a1 - SPLint in Makefiles als Target "lint" eingebunden. 2002-03-25 19:38:16 +00:00
Alexander Barton
8d79f26721 - neuer Header splint.h fuer Code-Check mit SPLint. 2002-03-25 19:13:19 +00:00
Alexander Barton
95a4b1b158 - einige Anpassungen nach Code-Check mit SPLint ;-) 2002-03-25 19:11:01 +00:00
Alexander Barton
c0ef984273 - ChangeLog aktualisiert. 2002-03-25 17:24:03 +00:00
Alexander Barton
a323186926 - neue Konstante fuer "Server Messages" (User-Mode "s"). 2002-03-25 17:17:08 +00:00
Alexander Barton
117c1df65a - bei Get_Prefix() fehlte das "LOCAL". 2002-03-25 17:13:07 +00:00
Alexander Barton
d4fca86ae8 - alle Client_GetFromID() durch Client_Search() ersetzt.
- neuer Mode "s": Server Messages.
2002-03-25 17:11:45 +00:00
Alexander Barton
bc4ed22635 - alle Client_GetFromID() durch Client_Search() ersetzt. 2002-03-25 17:08:54 +00:00
Alexander Barton
c74083645a - alle Client_GetFromID() durch Client_Search() ersetzt.
- IRC_PRIVMSG() ruft nun intern Channel_Write() auf.
2002-03-25 17:04:02 +00:00
Alexander Barton
0ac6151be9 - Client_GetFromID() ist entfallen: Client_Search() benutzen!
- Client-Struktur um Hash-Wert ueber ID/Nick ergaenzt.
2002-03-25 17:01:07 +00:00
Alexander Barton
b5c16c228b - Client_SetID() berechnet Hash-Wert ueber ID/Nick.
- Client_GetFromID() heisst nun Client_Search(), zudem wird via Hash gesucht.
- Client_CheckNick() sucht nicht mehr selber.
- altes Client_Search() ist entfallen (s.o.).
2002-03-25 16:59:36 +00:00
Alexander Barton
cec0e2a4d7 - Channel-Struktur um Hash-Wert ueber Namen ergaenzt.
- Neue Funktion Channel_Write().
2002-03-25 16:55:14 +00:00
Alexander Barton
0e38d10bcd - New_Chan() berechnet Hash-Werte ueber den Namen.
- Channel_Search() verwendet nun Hash-Werte.
- Neue Funktion Channel_Write().
2002-03-25 16:54:26 +00:00
Alexander Barton
7bb2c6b012 - portabtest als neues Target im ProjectBuilder eingefuehrt. 2002-03-25 16:40:02 +00:00
Alexander Barton
281d8e454d - Default PONG-Timeout auf 20 Sekunden verdoppelt. 2002-03-25 16:14:15 +00:00
Alexander Barton
8e5a56cea7 - Dateien umsortiert. 2002-03-22 00:22:44 +00:00
Alexander Barton
0df6a76103 - Hast wird immer ueber in Kleinbuchstaben gewandelten String berechnet. 2002-03-22 00:21:51 +00:00
Alexander Barton
fdf23efef4 - neue Funktion ngt_LowerStr(). 2002-03-22 00:17:27 +00:00
Alexander Barton
d7d2ab3d7f - README aktualisiert. 2002-03-21 23:25:15 +00:00
Alexander Barton
b9a2c4a8ec - Meldungen im Error-File werden nun mit Zeitangabe versehen. 2002-03-21 12:00:23 +00:00
Alexander Barton
69f683070a - Nick-Aenderungen: Log-Eintrag nur noch im Debug-Modus bzw. fuer lokale User. 2002-03-19 16:38:37 +00:00
Alexander Barton
31015c8306 - portabtest wird nur noch compiliert, wenn benoetigt (z.B. "make check") 2002-03-15 15:41:55 +00:00
Alexander Barton
b422b11865 - API fuer Hash() definiert. 2002-03-14 15:49:36 +00:00
Alexander Barton
8a45b177ce - Implementation einer Hash-Funktion begonnen. 2002-03-14 15:31:22 +00:00
Alexander Barton
28c5a21fa0 - einige assert()-Pruefungen in Conn_WriteStr() ergaenzt. 2002-03-14 13:42:33 +00:00
Alexander Barton
239727b411 - A/UX kennt O_NONBLOCK nicht? Oder in einem anderen Header? ...? 2002-03-13 00:15:55 +00:00
Alexander Barton
34d5434478 - Test, ob bereits ein Server einer Gruppe aktiv ist, korrigiert. 2002-03-12 23:45:30 +00:00
Alexander Barton
03c3f3c990 - Netz-Split-Nachricht war so falsch. Nun ist sie korrekt aber nicht schoen. 2002-03-12 23:43:56 +00:00
Alexander Barton
9146fa2534 - Projektdatei an neue Quellcode-Struktur angepasst. 2002-03-12 23:42:59 +00:00
Alexander Barton
882c91280e - Versions-String um "Vendor" erweitert. 2002-03-12 22:08:24 +00:00
Alexander Barton
e298b83b92 - Informationen um "Vendor" ergaenzt. 2002-03-12 21:47:40 +00:00
Alexander Barton
c46f623d6f - Beispiel-Konfiguration besser dokumentiert (Kommentar-Zeichen). 2002-03-12 16:08:31 +00:00
Alexander Barton
27d131a177 - Dokumentation aktualisiert. 2002-03-12 15:35:55 +00:00
Alexander Barton
7049b60af4 - der System-Typ wird nun wieder korrekt ermittelt und verwendet. 2002-03-12 15:19:12 +00:00
Alexander Barton
7633e2f8c3 - config.sub und congfig.guess zu ngIRCd-Distribution hinzugefuegt. 2002-03-12 14:39:35 +00:00
Alexander Barton
ca33cbda05 - externe portab-Header werden nicht mehr benoetigt/benutzt, dadurch
einige Aenderungen an diversen Source-Dateien und Headern.
- Dateien enthalten keine CVS-History mehr.
2002-03-12 14:37:51 +00:00
Alexander Barton
d18ca0b85d - externe portab-Header werden nicht mehr benoetigt. Notwendige Teile sind
nun im ngIRCd-Source-Tree enthalten.
2002-03-12 14:36:44 +00:00
Alexander Barton
fbfb343176 - Datei ist faelschlicherweise in das CVS "geschliddert" ... ,-) 2002-03-11 22:08:26 +00:00
Alexander Barton
f7a0ff1f65 - SQUIT, QUIT: Loglevel bei unbekannten Clients wieder auf WARNING erhoeht. 2002-03-11 22:06:32 +00:00
Alexander Barton
50ec7a56a4 - Client_Destroy() hat neuen Paramter: QUITs fuer Clients verschicken? 2002-03-11 22:04:10 +00:00
Alexander Barton
92793d3114 - Log-Level von SQUIT und QUIT bei unbekannten Clients auf DEBUG herabgesetzt.... 2002-03-11 17:33:52 +00:00
Alexander Barton
9fc7e66f66 - Log-Level von SQUIT und QUIT bei unbekannten Clients auf DEBUG herabgesetzt. 2002-03-11 17:33:40 +00:00
Alexander Barton
590f2a3f0c - ein sofortiger Re-Connect wird nur dann versucht, wenn die Vernindung
"lange genug" bereits bestanden hatte.
2002-03-11 00:04:48 +00:00
Alexander Barton
221058009c - ChangeLog aktualisiert. 2002-03-10 22:41:52 +00:00
Alexander Barton
5fa05dcea8 - IRC_PING() ist, wenn nicht im "strict RFC"-Mode, toleranter und akzptiert
beliebig viele Parameter: z.B. BitchX sendet soetwas.
2002-03-10 22:40:22 +00:00
Alexander Barton
dce77559fa - Netz-Splits werden nun als soche ausgegeben. 2002-03-10 22:03:20 +00:00
Alexander Barton
df09e7afd3 *** empty log message *** 2002-03-10 18:47:02 +00:00
Alexander Barton
2464556a7d - Dokumentation aktualisiert. 2002-03-10 18:46:46 +00:00
Alexander Barton
a8aab6bfdd - Beispiel-Konfigurationsdatei besser dokumentiert und erweitert. 2002-03-10 18:46:31 +00:00
Alexander Barton
23add79c3e - bei WHO, WHOIS und NAMES wird nun nur noch der Status "Operator" oder
"voiced" geliefert -- nicht mehr beides.
2002-03-10 18:16:51 +00:00
Alexander Barton
e6faca1337 - ChangeLog aktualisiert. 2002-03-10 17:51:29 +00:00
Alexander Barton
d67d94ea04 - Handling von "--version" und "--help" nochmal geaendert ... 2002-03-10 17:50:48 +00:00
Alexander Barton
0777bca325 - ChangeLog aktualisiert. 2002-03-10 17:46:22 +00:00
Alexander Barton
0903e7763c - bei "ngircd --version" werden nun die eincompilierten Pfade angezeigt. 2002-03-10 17:45:41 +00:00
Alexander Barton
89f9522e22 - Dokumentation aktualisiert. 2002-03-10 17:19:29 +00:00
Alexander Barton
965855756b - der Bindestrich ("-") ist nun auch in Nicknames erlaubt. 2002-03-10 17:15:20 +00:00
Alexander Barton
5bd4734a88 - die Pfade der Konfigurationsdatei, des MOTD und das Error-Files werden
nun aus den Vorgaben von configure ermittelt.
2002-03-10 17:07:41 +00:00
Alexander Barton
37c7087c6f - das "localstatedir" wird fur "ngircd.err" angelegt. 2002-03-10 17:06:27 +00:00
Alexander Barton
317941d840 - die Beispiel-Konfigurationsdatei wird als ngircd.conf installiert,
wenn noch keine "echte" Konfigurationsdatei vorhanden ist.
2002-03-10 17:05:23 +00:00
Alexander Barton
652a003ef5 - es werden nun die Konstanten SYSCONFDIR und LOCALSTATEDIR definiert. 2002-03-10 17:03:18 +00:00
Alexander Barton
81889df4b7 - Anpassungen an neues GNU automake/autoconf: acconfig.h entfaellt nun. 2002-03-10 15:40:26 +00:00
Alexander Barton
0e092b3f06 - kleine Code-Umstellungen. 2002-03-06 15:50:14 +00:00
Alexander Barton
2006b6195e - Dokumentation aktualisiert. 2002-03-06 15:39:17 +00:00
Alexander Barton
fe2bc90e45 - stderr wird nun in eine Datei umgelenkt (ngircd.err). Wenn der Server
nicht im Debug-Modus laeuft, so wird diese bei Programmende geloescht.
2002-03-06 15:36:04 +00:00
Alexander Barton
10aa35cc91 - Dateinamen und Pfad sind nun in Konstanten definiert. 2002-03-06 15:35:19 +00:00
Alexander Barton
c68c092ce3 - ein paar assert()-Tests ergaenzt. 2002-03-06 14:30:43 +00:00
Alexander Barton
0a13ff41ea - kleinere Umstellungen. 2002-03-06 14:30:22 +00:00
Alexander Barton
ae6ab2c3e0 - Logging geaendert: detaillierter im Syslog, "allgemeiner" fuer Clients. 2002-03-04 23:16:23 +00:00
Alexander Barton
b3a64f5e08 - der WHO-Befehl (ohne Argumente) gat teilweise Channel-Names vergessen. 2002-03-04 01:43:20 +00:00
Alexander Barton
802a17b11d - der AWAY-Mode wurde nicht ueber mehrere Server-Links weitergegeben. 2002-03-04 01:06:24 +00:00
Alexander Barton
2b6309719f - ChangeLog aktualisiert. 2002-03-04 01:06:03 +00:00
Alexander Barton
5562f411c4 - neue Konstante DEFAULT_AWAY_MSG fuer die Default-Away-Meldung. 2002-03-04 01:05:10 +00:00
Alexander Barton
a1a3e67de6 - neuen Clients mit Mode "a" wird nun auch der Default-Away-Text gesetzt. 2002-03-04 01:04:46 +00:00
Alexander Barton
7de4683506 - WHO implementiert (bisher ohne Unterstuetzung von Masks) 2002-03-03 19:44:30 +00:00
Alexander Barton
360bddd600 - Aktualisierungen. 2002-03-03 19:41:59 +00:00
Alexander Barton
9d5551ba6d - neue Konstanten RPL_ENDOFWHO_MSG und RPL_WHOREPLY_MSG definiert. 2002-03-03 19:41:46 +00:00
Alexander Barton
14aba7c1b2 - Sourcen auf weitere Module fuer IRC-Befehle aufgesplitted.
- IRC-Befehl WHO implementiert.
2002-03-03 17:17:38 +00:00
Alexander Barton
10363b398e - strncpy() und vsnprintf() kopieren nun etwas "optimierter" (1 Byte weniger) :-) 2002-03-03 17:17:01 +00:00
Alexander Barton
2ee05c9a68 - Source in weitere Module fuer IRC-Befehle aufgesplitted. 2002-03-03 17:15:11 +00:00
Alexander Barton
8dd92fbcd8 - README aktualisiert. 2002-03-03 13:08:33 +00:00
Alexander Barton
e7214c151f - Dokumentation aktualisiert. 2002-03-03 13:07:01 +00:00
Alexander Barton
829f741ccd - Versionsnummer auf 0.3.0-CVS angehoben. 2002-03-02 03:57:56 +00:00
60 changed files with 5629 additions and 2615 deletions

View File

@@ -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.

View File

@@ -10,7 +10,66 @@
-- ChangeLog / Aenderungen --
ngIRCd 0.2.x, xx.xx.2002
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.
@@ -139,4 +198,4 @@ ngIRCd 0.0.1, 31.12.2001
--
$Id: ChangeLog,v 1.39 2002/03/02 01:36:35 alex Exp $
$Id: ChangeLog,v 1.54.2.6 2002/06/11 20:29:44 alex Exp $

113
INSTALL
View File

@@ -8,36 +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. Voraussetzungen
~~~~~~~~~~~~~~~~~~
ngIRCd benoetigt "Alex' Portability Headers" (portab.h). Diese koennen von
der Homepage heruntergeladen werden:
<http://arthur.ath.cx/~alex/ngircd/#download>
Vor dem configure-Lauf des ngIRCd muessen dies Header auf dem System in-
stalliert sein, anonsten bricht configure ab.
II. Quick Start
~~~~~~~~~~~~~~~
In der Regel sind folgende Schritte ausreichend:
1) ./autogen.sh [nur erforderlich, wenn ueber CVS bezogen]
2) ./configure
3) make
zu 1) autogen.sh:
zu 3): "autogen.sh"
Der erste Schritt, autogen.sh, ist nur notwendig, wenn das configure-Script
noch nicht vorhanden ist. Dies ist nie bei offiziellen ("stabilen") Versionen
@@ -54,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.
@@ -64,10 +57,22 @@ 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.
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
@@ -85,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 $

View File

@@ -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

View File

@@ -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

View File

@@ -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,
@@ -131,6 +129,13 @@
F51DBB15022D95E801A85B04,
F51DBB19022D995501A85B04,
F51DBB1D022D9D8F01A85B04,
F57C88870232853501A85B04,
F57C888B0232884501A85B04,
F57C888F02328D7201A85B04,
F5F18138023EC63701A85B04,
F5F18139023EC63701A85B04,
F5F1813A023EC63701A85B04,
F55047BC0240F6E501A85B04,
);
isa = PBXHeadersBuildPhase;
name = Headers;
@@ -150,6 +155,10 @@
F51DBB16022D95E801A85B04,
F51DBB1A022D995501A85B04,
F51DBB1E022D9D8F01A85B04,
F57C88880232853501A85B04,
F57C888C0232884501A85B04,
F57C889002328D7201A85B04,
F55047BD0240F6E501A85B04,
);
isa = PBXSourcesBuildPhase;
name = Sources;
@@ -181,6 +190,7 @@
1AB674ADFE9D54B511CA2CBB = {
children = (
034768E8FF38A79811DB9C8B,
F538241D024F89BC01A85B04,
);
isa = PBXGroup;
name = Products;
@@ -372,6 +382,7 @@
F52162B801C7B904012300F4,
F52162D801C7BAAE012300F4,
F52162B901C7B904012300F4,
F5F18132023EC61E01A85B04,
);
isa = PBXGroup;
name = src;
@@ -386,7 +397,6 @@
F52162B901C7B904012300F4 = {
children = (
F52162BD01C7B904012300F4,
F52162BA01C7B904012300F4,
F52162BE01C7B904012300F4,
F52162BF01C7B904012300F4,
F51D180001C8FDD001E11C2E,
@@ -397,12 +407,20 @@
F52162E301C7C77B012300F4,
F52162DA01C7BCDC012300F4,
F52162DB01C7BCDC012300F4,
F55047BA0240F6E501A85B04,
F55047BB0240F6E501A85B04,
F51D180201C8FDD001E11C2E,
F51D180301C8FDD001E11C2E,
F57C888D02328D7201A85B04,
F57C888E02328D7201A85B04,
F51DBB1B022D9D8F01A85B04,
F51DBB1C022D9D8F01A85B04,
F51DBB17022D995501A85B04,
F51DBB18022D995501A85B04,
F57C88850232853501A85B04,
F57C88860232853501A85B04,
F57C88890232884501A85B04,
F57C888A0232884501A85B04,
F51DBB13022D95E801A85B04,
F51DBB14022D95E801A85B04,
F52162BB01C7B904012300F4,
@@ -418,11 +436,6 @@
path = ngircd;
refType = 4;
};
F52162BA01C7B904012300F4 = {
isa = PBXFileReference;
path = global.h;
refType = 4;
};
F52162BB01C7B904012300F4 = {
isa = PBXFileReference;
path = log.c;
@@ -458,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;
@@ -518,18 +525,6 @@
path = ../README;
refType = 2;
};
F52162CC01C7B904012300F4 = {
fileRef = F52162C201C7B904012300F4;
isa = PBXBuildFile;
settings = {
};
};
F52162CD01C7B904012300F4 = {
fileRef = F52162BA01C7B904012300F4;
isa = PBXBuildFile;
settings = {
};
};
F52162CE01C7B904012300F4 = {
fileRef = F52162BC01C7B904012300F4;
isa = PBXBuildFile;
@@ -638,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,
@@ -700,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;
}

View File

@@ -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-

24
NEWS
View File

@@ -10,7 +10,27 @@
-- NEWS / Neuigkeiten --
ngIRCd 0.2.x, xx.xx.2002
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.
@@ -65,4 +85,4 @@ ngIRCd 0.0.1, 31.12.2001
--
$Id: NEWS,v 1.16 2002/03/02 01:36:35 alex Exp $
$Id: NEWS,v 1.25.2.3 2002/04/01 17:18:03 alex Exp $

45
README
View File

@@ -10,21 +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.
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, ERROR, ISON, JOIN, LINKS, LUSERS, MODE, MOTD, NAMES, NICK, NOTICE, NJOIN,
OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, RESTART, SERVER, SQUIT, 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! :-))
@@ -32,8 +37,6 @@ 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.
@@ -41,5 +44,25 @@ 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.5 2002/02/15 15:15:48 anonymous Exp $
$Id: README,v 1.8 2002/03/21 23:25:15 alex Exp $

View File

@@ -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- */

View File

@@ -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

File diff suppressed because it is too large Load Diff

1443
config.sub vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -9,115 +9,29 @@
# 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.32 2002/03/02 03:36:14 alex Exp $
#
# $Log: configure.in,v $
# Revision 1.32 2002/03/02 03:36:14 alex
# - Version 0.3.0
#
# Revision 1.31 2002/02/25 11:45:28 alex
# - es wird auf sigaction() geprueft (u.a. fuer A/UX, welches das nicht kennt).
#
# Revision 1.30 2002/02/25 11:41:43 alex
# - es werden ein paar Funktionen mehr getestet: u.a. vsnprintf() und setsockopt().
# - libUTIL wird eingebunden, so vorhanden (unter A/UX notwendig!)
#
# Revision 1.29 2002/02/19 02:11:26 alex
# - auf die "libbe" wird nur noch getestet, wenn syslog ueberhaupt verwendet wird.
#
# Revision 1.28 2002/02/17 22:17:33 alex
# - Versionsnummer im CVS auf 0.2.2-pre angehoben ...
#
# Revision 1.27 2002/02/17 21:50:38 alex
# - Version 0.2.1.
#
# Revision 1.26 2002/02/17 18:47:26 alex
# - Tests auf netdb.h, stdlib.h, sys/wait.h, gethostbyaddr, gethostbyname,
# strftime und die "libbe" unter BeOS (fuer syslog) ergaenzt.
#
# Revision 1.25 2002/02/15 14:57:21 alex
# - Version auf 0.2.1-pre im CVS angehoben ...
#
# Revision 1.24 2002/02/15 14:35:55 alex
# - Version 0.2.0
#
# Revision 1.23 2002/01/29 01:07:15 alex
# - Version auf 0.1.1-pre im CVS angehoben.
#
# Revision 1.22 2002/01/29 00:24:17 alex
# - Version 0.1.0
#
# Revision 1.21 2002/01/16 23:06:16 alex
# - Version auf 0.0.4-pre im CVS angehoben.
#
# Revision 1.20 2002/01/16 22:55:45 alex
# - Version 0.0.3
#
# 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.3.0)
AC_CANONICAL_TARGET
AC_CONFIG_SRCDIR(src/config.h.in)
AM_INIT_AUTOMAKE(ngircd,0.4.3)
AM_CONFIG_HEADER(src/config.h)
# -- 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 --
AC_PROG_CC
@@ -137,31 +51,6 @@ 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([ \
@@ -251,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([ \
@@ -265,6 +168,7 @@ AC_OUTPUT([ \
MacOSX/Makefile \
MacOSX/ngircd.pbproj/Makefile \
src/Makefile \
src/portab/Makefile \
src/ngircd/Makefile \
])

View File

@@ -9,20 +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.4 2002/02/25 14:10:38 alex Exp $
#
# $Log: Makefile.am,v $
# Revision 1.4 2002/02/25 14:10:38 alex
# - die neuen Texte werden nun auch in Archive ("make dist") aufgenommen ;-)
#
# 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 = CC-Speed.txt CVS.txt FAQ.txt README-AUX.txt README-BeOS.txt \
@@ -31,4 +18,10 @@ EXTRA_DIST = CC-Speed.txt CVS.txt FAQ.txt README-AUX.txt README-BeOS.txt \
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-

View File

@@ -18,7 +18,7 @@ Folgende Software wird jedoch benoetigt:
- GNU C Compiler (gcc)
Bezugsquellen:
http://www.rezepte-im-web.de/appleux/gcc281.tar.gz
ftp://arthur.ath.cx/pub/AUX/Software/Development/gcc281.tar.gz
ftp://arthur.ath.cx/pub/AUX/Software/Development/gcc-2.8.1-auxbin.tar.gz
- GNU make
Bezugsquellen:
@@ -30,6 +30,13 @@ Folgende Software wird jedoch benoetigt:
http://www.rezepte-im-web.de/appleux/sed-3.02.tar.gz
ftp://arthur.ath.cx/pub/AUX/Software/Tools/sed-3.02.tar.gz
- install (z.B. aus den GNU fileutils)
Ein install, welches entweder so "broken" ist, dass configure das eigene
Shell-Script waehlt, oder eines, das funktioniert. Leider ist mindestens
ein Binary im Umlauf, das Probleme macht.
Bezugsquelle:
ftp://arthur.ath.cx/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz
- libUTIL.a
Bezugsquellen:
http://ftp.mayn.de/pub/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz
@@ -39,9 +46,26 @@ Nachdem diese Pakete entsprechend installiert sind, reicht ein ganz normales
"./configure" und "make" aus, um den ngIRCd unter A/UX zu compilieren.
Noch ein paar Hinweise, wenn es doch (noch) nicht klappt:
- auf dem System muss entweder ein install vorhanden sein, welches so
"broken" ist, dass configure das eigene Shell-Skript waehlt, oder eben
eines, welches funktioniert. Leider ist mindestens ein Binary im Um-
lauf, welches Probleme verursacht. Das Binary aus folgenden GNU
fileutils funktioniert hier aber z.B.:
ftp://arthur.ath.cx/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz
- das sich im Umlauf befindende vorcompilierte Binary der alten Bash sollte
unbedingt ausserhalb von /bin (z.B. unter /usr/local/bin) installiert
werden. Ansonsten waehlt es das configure-Script als Shell aus, leider
funktioniert das aber nicht.
Das config.status-Script sollte mit der ksh als Interpreter erstellt
worden sein (siehe erste Zeile davon!).
Hier die Zeiten von Alex System (Macintosh SE/30, 32 MB, A/UX 3.0.1):
configure: 7:33, make: 12:02
--
$Id: README-AUX.txt,v 1.1 2002/02/25 14:02:32 alex Exp $
$Id: README-AUX.txt,v 1.1.2.2 2002/04/29 14:44:24 alex Exp $

View File

@@ -1,27 +1,108 @@
# $Id: sample-ngircd.conf,v 1.3 2002/02/17 17:34:50 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 = connect-to-host.the.net
; Name = irc2.the.net
; Port = 6666
; Password = ThePwd1
[Server]
; Host = wait-for-host.the.net
; Name = irc3.the.net
; Password = ThePwd2
#
# 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-

View File

@@ -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

View File

@@ -9,62 +9,26 @@
# 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.13 2002/02/27 23:22:09 alex Exp $
#
# $Log: Makefile.am,v $
# Revision 1.13 2002/02/27 23:22:09 alex
# - einige Header umgestellt, neue Source-Dateien irc-xxx.c
#
# Revision 1.12 2002/02/21 18:47:49 alex
# - die Rechte der check-Scripts wurde nicht gesetzt.
#
# Revision 1.11 2002/02/21 17:25:16 alex
# - "check"-Target f<>r "make check" und "make distcheck" begonnen ...
#
# 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 \
irc-login.c irc-mode.c irc-write.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 \
irc-login.h irc-mode.h irc-write.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
rm -f check-version check-help lint.out
maintainer-clean-local:
rm -f Makefile Makefile.in
@@ -79,6 +43,17 @@ check-help: Makefile
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-

View File

@@ -9,87 +9,29 @@
* 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.17 2002/03/02 01:35:50 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.17 2002/03/02 01:35:50 alex
* - Channel- und Nicknames werden nun ordentlich validiert.
*
* Revision 1.16 2002/02/27 23:23:53 alex
* - Includes fuer einige Header bereinigt.
*
* Revision 1.15 2002/02/27 20:32:10 alex
* - neue Funktionen Channel_Topic() und Channel_SetTopic().
*
* Revision 1.14 2002/02/27 15:21:21 alex
* - neue Funktion Channel_IsMemberOf() implementiert.
*
* Revision 1.13 2002/02/11 01:00:12 alex
* - neue Funktionen Channel_ModeAdd(), Channel_ModeDel(), Channel_UserModes(),
* Channel_UserModeAdd(), Channel_UserModeDel().
* - Modes in CL2CHAN-Struktur werden nun korrekt initialisiert.
*
* Revision 1.12 2002/02/06 16:48:48 alex
* - neue Funktion Channel_Modes() und Channel_IsValidName().
* - Channel-Namen werden (besser) validiert.
*
* Revision 1.11 2002/01/29 00:11:10 alex
* - neue Funktionen Channel_FirstChannelOf() und Channel_NextChannelOf().
*
* Revision 1.10 2002/01/28 01:16:15 alex
* - neue Funktionen Channel_Name(), Channel_First() und Channel_Next().
*
* Revision 1.9 2002/01/27 22:47:11 alex
* - PART wird nicht mehr an den Server verschickt, von dem es empfangen wurde.
*
* Revision 1.8 2002/01/27 21:56:54 alex
* - weitere Anpassungen an Chennals, v.a. ueber Server-Links.
*
* Revision 1.7 2002/01/27 17:14:33 alex
* - diverse Aenderungen fuer Channels ueber mehrere Server.
*
* Revision 1.6 2002/01/26 18:41:55 alex
* - CHANNEL- und CL2CHAN-Strukturen in Header verlegt,
* - einige neue Funktionen (Channel_GetChannel(), Channel_FirstMember(), ...)
*
* Revision 1.5 2002/01/21 00:12:29 alex
* - begonnen, Channels zu implementieren :-)
*
* Revision 1.4 2002/01/16 22:09:07 alex
* - neue Funktion Channel_Count().
*
* 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 :-)
*/
#define __channel_c__
#include <portab.h>
#include "global.h"
#include "portab.h"
#include <imp.h>
#include "imp.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include "client.h"
#include "hash.h"
#include "irc-write.h"
#include "log.h"
#include "messages.h"
#include <exp.h>
#include "exp.h"
#include "channel.h"
@@ -229,6 +171,24 @@ GLOBAL INT Channel_Count( VOID )
} /* 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 );
@@ -261,12 +221,19 @@ 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( strcasecmp( Name, c->name ) == 0 ) return c;
if( search_hash == c->hash )
{
/* lt. Hash-Wert: Treffer! */
if( strcasecmp( Name, c->name ) == 0 ) return c;
}
c = c->next;
}
return NULL;
@@ -480,15 +447,42 @@ GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic )
assert( Chan != NULL );
assert( Topic != NULL );
strncpy( Chan->topic, Topic, CHANNEL_TOPIC_LEN );
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 );
@@ -500,10 +494,11 @@ LOCAL CHANNEL *New_Chan( CHAR *Name )
return NULL;
}
c->next = NULL;
strncpy( c->name, Name, CHANNEL_NAME_LEN );
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 );

View File

@@ -9,54 +9,9 @@
* 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.13 2002/02/27 20:32:10 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.13 2002/02/27 20:32:10 alex
* - neue Funktionen Channel_Topic() und Channel_SetTopic().
*
* Revision 1.12 2002/02/27 15:21:21 alex
* - neue Funktion Channel_IsMemberOf() implementiert.
*
* Revision 1.11 2002/02/11 01:00:22 alex
* - neue Funktionen Channel_ModeAdd(), Channel_ModeDel(), Channel_UserModes(),
* Channel_UserModeAdd(), Channel_UserModeDel().
*
* Revision 1.10 2002/02/06 16:49:10 alex
* - neue Funktionen Channel_Modes() und Channel_IsValidName().
*
* Revision 1.9 2002/01/29 00:11:19 alex
* - neue Funktionen Channel_FirstChannelOf() und Channel_NextChannelOf().
*
* Revision 1.8 2002/01/28 01:16:15 alex
* - neue Funktionen Channel_Name(), Channel_First() und Channel_Next().
*
* Revision 1.7 2002/01/26 18:41:55 alex
* - CHANNEL- und CL2CHAN-Strukturen in Header verlegt,
* - einige neue Funktionen (Channel_GetChannel(), Channel_FirstMember(), ...)
*
* Revision 1.6 2002/01/21 00:11:59 alex
* - Definition der CHANNEL-Struktur aus Header entfernt,
* - neue Funktionen Channel_Join(), Channel_Part() und Channel_RemoveClient().
*
* Revision 1.5 2002/01/16 22:09:07 alex
* - neue Funktion Channel_Count().
*
* 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 :-)
*/
@@ -66,12 +21,15 @@
#include "client.h"
#ifdef __channel_c__
#if defined(__channel_c__) | defined(S_SPLINT_S)
#include "defines.h"
typedef struct _CHANNEL
{
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;
@@ -101,6 +59,7 @@ GLOBAL BOOLEAN Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *R
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 );
@@ -132,6 +91,8 @@ 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

View File

@@ -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.41 2002/03/02 01:35:50 alex Exp $
* $Id: client.c,v 1.53.2.1 2002/04/29 14:11:23 alex Exp $
*
* client.c: Management aller Clients
*
@@ -19,147 +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.41 2002/03/02 01:35:50 alex
* - Channel- und Nicknames werden nun ordentlich validiert.
*
* Revision 1.40 2002/02/27 23:23:53 alex
* - Includes fuer einige Header bereinigt.
*
* Revision 1.39 2002/02/27 18:22:09 alex
* - neue Funktion Client_SetAway() und Client_Away() implementiert.
*
* Revision 1.38 2002/02/27 14:47:53 alex
* - Logging beim Abmelden von Clients (erneut) geaendert: nun ist's aber gut ;-)
*
* Revision 1.37 2002/02/17 19:02:49 alex
* - Client_CheckNick() und Client_CheckID() lieferten u.U. falsche Ergebnisse.
*
* Revision 1.36 2002/02/06 16:49:41 alex
* - neue Funktion Client_IsValidNick(), Nicknames werden besser validiert.
*
* Revision 1.35 2002/01/29 00:14:49 alex
* - neue Funktion Client_TopServer(), Client_NewXXX() angepasst.
*
* Revision 1.34 2002/01/27 22:07:36 alex
* - Client_GetFromID() besser dokumentiert, kleinere Aenderungen.
*
* Revision 1.33 2002/01/27 21:56:54 alex
* - weitere Anpassungen an Chennals, v.a. ueber Server-Links.
*
* Revision 1.32 2002/01/27 18:27:12 alex
* - Client_GetFromID() kommt nun auch mit Host-Masken zurecht.
*
* Revision 1.31 2002/01/21 00:08:50 alex
* - wird ein Client entfernt, so wird er auch aus allen Channels geloescht.
*
* Revision 1.30 2002/01/18 15:32:01 alex
* - bei Client_SetModes() wurde das NULL-Byte falsch gesetzt. Opsa.
*
* Revision 1.29 2002/01/16 22:10:35 alex
* - neue Funktionen Client_xxxCount().
*
* Revision 1.28 2002/01/11 23:50:40 alex
* - Hop-Count fuer den Server selber (0) wird korrekt initialisiert.
*
* Revision 1.27 2002/01/09 01:08:08 alex
* - wird ein Server abgemeldet, so wird anderen Server ein SQUIT geschickt.
*
* Revision 1.26 2002/01/07 23:42:12 alex
* - Es werden fuer alle Server eigene Token generiert,
* - QUIT von einem Server fuer einen User wird an andere Server geforwarded,
* - ebenso NICK-Befehle, die "fremde" User einfuehren.
*
* Revision 1.25 2002/01/07 15:31:00 alex
* - Bei Log-Meldungen ueber Clients wird nun immer die "Client Mask" verwendet.
*
* 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>
@@ -167,7 +35,7 @@
#include <string.h>
#include <netdb.h>
#include <exp.h>
#include "exp.h"
#include "client.h"
#include <imp.h>
@@ -175,6 +43,7 @@
#include "channel.h"
#include "conf.h"
#include "conn.h"
#include "hash.h"
#include "irc-write.h"
#include "log.h"
#include "messages.h"
@@ -217,8 +86,8 @@ GLOBAL VOID Client_Init( VOID )
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 */
@@ -229,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;
}
@@ -296,20 +165,23 @@ GLOBAL CLIENT *Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, I
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 );
@@ -317,41 +189,55 @@ 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. Alle andere Server informieren! */
/* 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
{
/* Remote User. 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. */
/* Remote User */
Log( LOG_DEBUG, "User \"%s\" unregistered: %s", Client_Mask( c ), txt );
if( FwdMsg ) IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "QUIT :%s", FwdMsg );
else IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "QUIT :" );
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 );
}
@@ -359,8 +245,8 @@ GLOBAL VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg )
{
if( c != This_Server )
{
if( c->conn_id != NONE ) Log( LOG_NOTICE, "Server \"%s\" unregistered (connection %d): %s", c->id, c->conn_id, txt );
else Log( LOG_NOTICE, "Server \"%s\" unregistered: %s", c->id, txt );
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 */
@@ -388,7 +274,7 @@ GLOBAL VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg )
break;
}
last = c;
c = c->next;
c = (CLIENT *)c->next;
}
} /* Client_Destroy */
@@ -398,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 */
@@ -418,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 */
@@ -433,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 */
@@ -443,7 +340,9 @@ GLOBAL VOID Client_SetModes( CLIENT *Client, CHAR *Modes )
/* Hostname eines Clients setzen */
assert( Client != NULL );
strncpy( Client->modes, Modes, CLIENT_MODE_LEN );
assert( Modes != NULL );
strncpy( Client->modes, Modes, CLIENT_MODE_LEN - 1 );
Client->modes[CLIENT_MODE_LEN - 1] = '\0';
} /* Client_SetModes */
@@ -453,7 +352,9 @@ 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 */
@@ -467,7 +368,7 @@ GLOBAL VOID Client_SetAway( CLIENT *Client, CHAR *Txt )
if( Txt )
{
/* Client AWAY setzen */
strncpy( Client->away, Txt, CLIENT_AWAY_LEN );
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 );
@@ -506,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 */
@@ -576,36 +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. */
CHAR n[CLIENT_ID_LEN + 1], *ptr;
CHAR search_id[CLIENT_ID_LEN], *ptr;
CLIENT *c = NULL;
UINT32 search_hash;
assert( Nick != NULL );
/* Nick kopieren und ggf. Host-Mask abschneiden */
strncpy( n, Nick, CLIENT_ID_LEN );
n[CLIENT_ID_LEN] = '\0';
ptr = strchr( n, '!' );
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, n ) == 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 )
@@ -623,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 */
@@ -647,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 */
@@ -662,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 */
@@ -776,8 +689,6 @@ GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick )
{
/* Nick ueberpruefen */
CLIENT *c;
assert( Client != NULL );
assert( Nick != NULL );
@@ -789,16 +700,11 @@ GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick )
}
/* 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;
@@ -835,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. */
@@ -875,7 +762,7 @@ GLOBAL CLIENT *Client_Next( CLIENT *c )
* so wird NULL geliefert. */
assert( c != NULL );
return c->next;
return (CLIENT *)c->next;
} /* Client_Next */
@@ -911,7 +798,17 @@ GLOBAL INT Client_MyServiceCount( VOID )
GLOBAL INT Client_MyServerCount( VOID )
{
return MyCount( CLIENT_SERVER );
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 */
@@ -925,7 +822,7 @@ GLOBAL INT Client_OperCount( VOID )
while( c )
{
if( c && ( c->type == CLIENT_USER ) && ( strchr( c->modes, 'o' ))) cnt++;
c = c->next;
c = (CLIENT *)c->next;
}
return cnt;
} /* Client_OperCount */
@@ -941,7 +838,7 @@ GLOBAL INT Client_UnknownCount( VOID )
while( c )
{
if( c && ( c->type != CLIENT_USER ) && ( c->type != CLIENT_SERVICE ) && ( c->type != CLIENT_SERVER )) cnt++;
c = c->next;
c = (CLIENT *)c->next;
}
return cnt;
} /* Client_UnknownCount */
@@ -951,7 +848,7 @@ GLOBAL BOOLEAN Client_IsValidNick( CHAR *Nick )
{
/* Ist der Nick gueltig? */
CHAR *ptr, goodchars[] = ";0123456789";
CHAR *ptr, goodchars[] = ";0123456789-";
assert( Nick != NULL );
@@ -980,8 +877,8 @@ LOCAL INT Count( CLIENT_TYPE Type )
c = My_Clients;
while( c )
{
if( c && ( c->type == Type )) cnt++;
c = c->next;
if( c->type == Type ) cnt++;
c = (CLIENT *)c->next;
}
return cnt;
} /* Count */
@@ -996,8 +893,8 @@ LOCAL INT MyCount( CLIENT_TYPE Type )
c = My_Clients;
while( c )
{
if( c && ( c->introducer == This_Server ) && ( c->type == Type )) cnt++;
c = c->next;
if(( c->introducer == This_Server ) && ( c->type == Type )) cnt++;
c = (CLIENT *)c->next;
}
return cnt;
} /* MyCount */
@@ -1017,6 +914,7 @@ LOCAL CLIENT *New_Client_Struct( VOID )
}
c->next = NULL;
c->hash = 0;
c->type = CLIENT_UNKNOWN;
c->conn_id = NONE;
c->introducer = NULL;
@@ -1053,7 +951,7 @@ LOCAL VOID Generate_MyToken( CLIENT *Client )
c = My_Clients;
continue;
}
else c = c->next;
else c = (CLIENT *)c->next;
}
Client->mytoken = token;
Log( LOG_DEBUG, "Assigned token %d to server \"%s\".", token, Client->id );

View File

@@ -9,86 +9,9 @@
* 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.23 2002/02/27 18:22:09 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.23 2002/02/27 18:22:09 alex
* - neue Funktion Client_SetAway() und Client_Away() implementiert.
*
* Revision 1.22 2002/02/06 16:49:56 alex
* - neue Funktion Client_IsValidNick().
*
* Revision 1.21 2002/01/29 00:14:49 alex
* - neue Funktion Client_TopServer(), Client_NewXXX() angepasst.
*
* Revision 1.20 2002/01/21 00:06:49 alex
* - Channel-Pointer aus Client-Struktur entfernt. Wird nun dynamisch verwaltet :-)
*
* Revision 1.19 2002/01/16 22:10:35 alex
* - neue Funktionen Client_xxxCount().
*
* Revision 1.18 2002/01/07 23:42:12 alex
* - Es werden fuer alle Server eigene Token generiert,
* - QUIT von einem Server fuer einen User wird an andere Server geforwarded,
* - ebenso NICK-Befehle, die "fremde" User einfuehren.
*
* 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 :-)
*/
@@ -112,10 +35,14 @@ 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) */
@@ -130,8 +57,11 @@ typedef struct _CLIENT
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
@@ -143,12 +73,11 @@ GLOBAL CLIENT *Client_NewRemoteServer( CLIENT *Introducer, CHAR *Hostname, CLIEN
GLOBAL CLIENT *Client_NewRemoteUser( CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR *Hostname, INT Token, CHAR *Modes, CHAR *Info, BOOLEAN Idented );
GLOBAL CLIENT *Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented );
GLOBAL 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 );

View File

@@ -9,115 +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.13 2002/01/18 15:51:44 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.13 2002/01/18 15:51:44 alex
* - Server-Verbinungen werden beim Start erst nach kurzer Pause aufgebaut.
*
* 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. */
@@ -126,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 );
}
@@ -153,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 */
@@ -165,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 */
@@ -174,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].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;
@@ -189,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';
@@ -199,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 );
@@ -218,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;
}
@@ -245,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, "," );
}
@@ -258,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 */
@@ -284,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 */
@@ -298,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 );
@@ -325,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;
}
@@ -347,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 */
@@ -363,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- */

View File

@@ -9,40 +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.10 2002/02/27 23:23:53 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.10 2002/02/27 23:23:53 alex
* - Includes fuer einige Header bereinigt.
*
* 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.
*/
@@ -52,29 +21,28 @@
#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];
@@ -88,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;
@@ -108,6 +80,7 @@ GLOBAL INT Conf_Server_Count;
GLOBAL VOID Conf_Init( VOID );
GLOBAL INT Conf_Test( VOID );
GLOBAL VOID Conf_Exit( VOID );

View File

@@ -9,174 +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.46 2002/03/02 03:32:08 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.46 2002/03/02 03:32:08 alex
* - Aenderung des Idle-Verhalten revidiert: das war ein Schnellschuss :-/
*
* Revision 1.45 2002/03/02 02:44:01 alex
* - Timeouts ausgehender Verbindungen werden besser erkannt (z.B. unter Cygwin).
* - Idle-Time der Hauptschleife [Conn_Handle()] erhoeht: weniger Last.
*
* Revision 1.44 2002/03/02 00:43:31 alex
* - bei abgebrochene ausgehende Server-Verbindungen wird der naechste Ver-
* bindungsversuch in RECONNECT_DELAY Sekunden (3) unternommen und nicht
* mehr "ConnectRetry" Sekunden gewartet.
*
* Revision 1.43 2002/03/02 00:29:11 alex
* - der Wert der Konfigurations-Variable "ConnectRetry" wird besser beachtet.
*
* Revision 1.42 2002/03/02 00:23:32 alex
* - ausgehende Verbindungen werden nun asyncron connectiert und blockieren
* nicht mehr den Server. Dadurch waren einige Aenderungen noetig.
* - diverse Log-Meldungen ueberarbeitet.
*
* Revision 1.41 2002/02/27 14:47:04 alex
* - Logging bei Timeout von Verbindungen geaendert.
*
* Revision 1.40 2002/02/27 02:26:23 alex
* - an Conn_Close() werden zwei weitere Fehlermeldungen zum Forwarden uebergeben.
*
* Revision 1.39 2002/02/23 00:03:54 alex
* - Ergebnistyp von Conn_GetIdle() und Conn_LastPing() auf "time_t" geaendert.
*
* Revision 1.38 2002/02/19 20:34:31 alex
* - Bei ausgehenden Verbindungen wird der Ziel-Port ins Log geschrieben.
*
* Revision 1.37 2002/02/19 20:05:37 alex
* - "Passive-Mode" implementiert: kein Auto-Conect zu anderen Servern.
*
* Revision 1.36 2002/02/11 01:00:50 alex
* - neue Funktion Conn_LastPing().
*
* Revision 1.35 2002/01/18 11:12:11 alex
* - der Sniffer wird nun nur noch aktiviert, wenn auf Kommandozeile angegeben.
*
* Revision 1.34 2002/01/07 15:29:52 alex
* - PASSSERVERADD definiert, wird beim PASS-Befehl an Server verwendet.
*
* 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>
@@ -209,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
@@ -322,7 +163,7 @@ GLOBAL VOID Conn_Exit( VOID )
} /* 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-
@@ -413,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++ )
@@ -491,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 )
{
@@ -557,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 );
@@ -578,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 )
{
@@ -591,8 +436,12 @@ GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformC
/* 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 ) - Conf_ConnectRetry + RECONNECT_DELAY;
* 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 );
@@ -666,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
@@ -766,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 );
@@ -859,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, NULL, "Client closed connection.", FALSE );
Conn_Close( Idx, "Socket closed!", "Client closed connection", FALSE );
return;
}
@@ -867,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, NULL, "Read error!", FALSE );
Conn_Close( Idx, "Read error!", "Client closed connection", FALSE );
return;
}
@@ -889,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" );
@@ -908,7 +757,7 @@ LOCAL VOID Handle_Buffer( CONN_ID Idx )
else if( ptr2 ) ptr = ptr2;
}
#endif
if( ptr )
{
/* Ende der Anfrage wurde gefunden */
@@ -923,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 */
@@ -960,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 );
}
}
@@ -996,16 +845,19 @@ LOCAL VOID Check_Servers( VOID )
/* 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;
@@ -1013,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;
@@ -1035,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 )
@@ -1072,7 +930,7 @@ 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, 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 )
@@ -1101,7 +959,7 @@ LOCAL VOID New_Server( INT Server, CONN_ID Idx )
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 ));
@@ -1118,6 +976,7 @@ 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;
@@ -1142,7 +1001,7 @@ 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 );
@@ -1155,12 +1014,14 @@ LOCAL BOOLEAN Init_Socket( INT Sock )
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 ));

View File

@@ -9,48 +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.12 2002/02/23 00:03:54 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.12 2002/02/23 00:03:54 alex
* - Ergebnistyp von Conn_GetIdle() und Conn_LastPing() auf "time_t" geaendert.
*
* Revision 1.11 2002/02/11 01:00:50 alex
* - neue Funktion Conn_LastPing().
*
* 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.
*/
@@ -73,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 );

View File

@@ -9,53 +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.13 2002/03/02 00:43:31 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.13 2002/03/02 00:43:31 alex
* - bei abgebrochene ausgehende Server-Verbindungen wird der naechste Ver-
* bindungsversuch in RECONNECT_DELAY Sekunden (3) unternommen und nicht
* mehr "ConnectRetry" Sekunden gewartet.
*
* Revision 1.12 2002/02/27 23:24:58 alex
* - CONNECTED und DISCONNECTED fuer die irc-xxx-Module wird nun hier definiert.
*
* Revision 1.11 2002/02/27 20:32:34 alex
* - neue Konstante: CHANNEL_TOPIC_LEN
*
* Revision 1.10 2002/02/27 18:22:45 alex
* - Mode "a" (away) in USERMODES aufgenommen.
*
* Revision 1.9 2002/02/13 23:04:27 alex
* - CHANMODES um Operator (o) und Voiced User (v) ergaenzt.
*
* Revision 1.8 2002/02/13 17:45:57 alex
* - unterstuetzte User- und Channel-Modes stehen nun in Konstanten.
*
* Revision 1.7 2002/01/22 17:15:39 alex
* - die Fehlermeldung "interrupted system call" sollte nicht mehr auftreten.
*
* Revision 1.6 2002/01/21 00:03:16 alex
* - neue Konstante CHANNEL_MODE_LEN.
*
* Revision 1.5 2002/01/18 15:51:44 alex
* - Server-Verbinungen werden beim Start erst nach kurzer Pause aufgebaut.
*
* Revision 1.4 2002/01/07 15:29:53 alex
* - PASSSERVERADD definiert, wird beim PASS-Befehl an Server verwendet.
*
* 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__
@@ -72,9 +28,9 @@
#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 */
@@ -105,12 +61,22 @@
#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 "aio" /* unterstuetzte User-Modes */
#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

View File

@@ -1,65 +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.7 2002/02/25 11:42:15 alex Exp $
*
* global.h: Globaler Header, wir in jedes(!) Modul eingebunden.
*
* $Log: global.h,v $
* Revision 1.7 2002/02/25 11:42:15 alex
* - unter A/UX wird _POSIX_SOURCE definiert: fuer Systemheader notwendig.
*
* 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"
#if OS_UNIX_AUX
#define _POSIX_SOURCE /* muss unter A/UX definiert sein */
#endif
#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
#endif
/* -eof- */

127
src/ngircd/hash.c Normal file
View 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
View 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
View 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
View 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- */

View File

@@ -9,25 +9,15 @@
* 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.2 2002/03/02 00:49:11 alex Exp $
* $Id: irc-login.c,v 1.11.2.1 2002/04/08 18:07:42 alex Exp $
*
* irc-login.c: Anmeldung und Abmeldung im IRC
*
* $Log: irc-login.c,v $
* Revision 1.2 2002/03/02 00:49:11 alex
* - Bei der USER-Registrierung wird NICK nicht mehr sofort geforwarded,
* sondern erst dann, wenn auch ein gueltiges USER empfangen wurde.
*
* Revision 1.1 2002/02/27 23:26:21 alex
* - Modul aus irc.c bzw. irc.h ausgegliedert.
*
*/
#include <portab.h>
#include "global.h"
#include "portab.h"
#include <imp.h>
#include "imp.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
@@ -40,7 +30,7 @@
#include "log.h"
#include "messages.h"
#include <exp.h>
#include "exp.h"
#include "irc-login.h"
@@ -87,271 +77,6 @@ GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req )
} /* IRC_PASS */
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? */
if( Req->argc == 2 )
{
/* 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 Client_SetToken( Client, atoi( Req->argv[1] ));
Log( LOG_NOTICE, "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 )
{
sprintf( str, "NJOIN %s :", Channel_Name( chan ));
/* alle Member suchen */
cl2chan = Channel_FirstMember( 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 - 4 ))
{
/* 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_GetFromID( 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, "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_GetFromID( 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_NICK( CLIENT *Client, REQUEST *Req )
{
CLIENT *intr_c, *target, *c;
@@ -375,7 +100,7 @@ GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
/* "Ziel-Client" ermitteln */
if( Client_Type( Client ) == CLIENT_SERVER )
{
target = Client_GetFromID( Req->prefix );
target = Client_Search( Req->prefix );
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
}
else
@@ -391,7 +116,7 @@ GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
* wenn wir es nicht so machen. Ob es so okay ist? Hm ... */
if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 ) return CONNECTED;
#endif
/* pruefen, ob Nick bereits vergeben. Speziallfall: der Client
* will nur die Gross- und Kleinschreibung aendern. Das darf
* er natuerlich machen :-) */
@@ -415,7 +140,16 @@ GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
else
{
/* Nick-Aenderung */
Log( LOG_INFO, "User \"%s\" changed nick: \"%s\" -> \"%s\".", Client_Mask( target ), Client_ID( target ), Req->argv[0] );
if( Client_Conn( target ) > NONE )
{
/* lokaler Client */
Log( LOG_INFO, "User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".", Client_Mask( target ), Client_Conn( target ), Client_ID( target ), Req->argv[0] );
}
else
{
/* Remote-Client */
Log( LOG_DEBUG, "User \"%s\" changed nick: \"%s\" -> \"%s\".", Client_Mask( target ), Client_ID( target ), Req->argv[0] );
}
/* alle betroffenen User und Server ueber Nick-Aenderung informieren */
if( Client_Type( Client ) == CLIENT_USER ) IRC_WriteStrClientPrefix( Client, Client, "NICK :%s", Req->argv[0] );
@@ -436,7 +170,7 @@ GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
if( Req->argc != 7 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Nick ueberpruefen */
c = Client_GetFromID( Req->argv[0] );
c = Client_Search( Req->argv[0] );
if( c )
{
/* Der neue Nick ist auf diesem Server bereits registriert:
@@ -540,12 +274,13 @@ GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req )
target = Client_Search( Req->prefix );
if( ! target )
{
Log( LOG_ERR, "Got QUIT from %s for unknown client!?", Client_ID( Client ));
/* 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 );
else Client_Destroy( target, "Got QUIT command.", Req->argv[0] );
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;
}
@@ -553,55 +288,6 @@ GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req )
} /* IRC_QUIT */
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_GetFromID( Req->argv[0] );
if( ! target )
{
Log( LOG_ERR, "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] );
return CONNECTED;
}
} /* IRC_SQUIT */
GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *from;
@@ -613,17 +299,19 @@ GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req )
/* 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 == 2 )
if( Req->argc > 1 )
{
/* es wurde ein Ziel-Client angegeben */
target = Client_GetFromID( Req->argv[1] );
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_GetFromID( Req->prefix );
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] );
@@ -651,12 +339,12 @@ GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
/* forwarden? */
if( Req->argc == 2 )
{
target = Client_GetFromID( Req->argv[1] );
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_GetFromID( Req->prefix );
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] );
@@ -664,7 +352,7 @@ GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
}
/* Der Connection-Timestamp wurde schon beim Lesen aus dem Socket
* aktualisiert, daher muss das hier nicht mehr gemacht werden. */
* 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 ));
@@ -718,7 +406,7 @@ LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason )
IRC_WriteStrServers( NULL, "KILL %s :%s", Nick, Reason );
/* Ggf. einen eigenen Client toeten */
c = Client_GetFromID( Nick );
c = Client_Search( Nick );
if( c && ( Client_Conn( c ) != NONE )) Conn_Close( Client_Conn( c ), NULL, Reason, TRUE );
} /* Kill_Nick */

View File

@@ -9,14 +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-login.h,v 1.1 2002/02/27 23:26:21 alex Exp $
* $Id: irc-login.h,v 1.3 2002/03/12 14:37:52 alex Exp $
*
* irc-login.h: Anmeldung und Abmeldung im IRC (Header)
*
* $Log: irc-login.h,v $
* Revision 1.1 2002/02/27 23:26:21 alex
* - Modul aus irc.c bzw. irc.h ausgegliedert.
*
*/
@@ -30,12 +25,9 @@
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 );
#endif

View File

@@ -9,30 +9,25 @@
* 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.1 2002/02/27 23:26:21 alex Exp $
* $Id: irc-mode.c,v 1.4 2002/03/25 17:11:45 alex Exp $
*
* irc-mode.c: IRC-Befehle zur Mode-Aenderung (MODE, AWAY, ...)
*
* $Log: irc-mode.c,v $
* Revision 1.1 2002/02/27 23:26:21 alex
* - Modul aus irc.c bzw. irc.h ausgegliedert.
*
*/
#include <portab.h>
#include "global.h"
#include "portab.h"
#include <imp.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 "exp.h"
#include "irc-mode.h"
@@ -113,7 +108,7 @@ GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
/* Prefix fuer Antworten etc. ermitteln */
if( Client_Type( Client ) == CLIENT_SERVER )
{
prefix = Client_GetFromID( Req->prefix );
prefix = Client_Search( Req->prefix );
if( ! prefix ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
}
else prefix = Client;
@@ -132,14 +127,6 @@ GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
/* Befehl kommt von einem Server, daher
* trauen wir ihm "unbesehen" ... */
x[0] = *mode_ptr;
if(( cl ) && ( x[0] == 'a' ))
{
/* away */
if( set ) Client_SetAway( cl, "Away" );
else Client_SetAway( cl, NULL );
}
}
else
{
@@ -167,6 +154,10 @@ GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
}
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 );
@@ -257,12 +248,21 @@ GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
{
/* 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 )
{

View File

@@ -9,14 +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-mode.h,v 1.1 2002/02/27 23:26:21 alex Exp $
* $Id: irc-mode.h,v 1.2.2.1 2002/04/08 18:07:42 alex Exp $
*
* irc-mode.h: IRC-Befehle zur Mode-Aenderung (MODE, AWAY, ...) (Header)
*
* $Log: irc-mode.h,v $
* Revision 1.1 2002/02/27 23:26:21 alex
* - Modul aus irc.c bzw. irc.h ausgegliedert.
*
*/
@@ -34,4 +29,4 @@ GLOBAL BOOLEAN IRC_AWAY( CLIENT *Client, REQUEST *Req );
#endif
/* -eof- */
/* -eof- */

115
src/ngircd/irc-oper.c Normal file
View 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
View 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
View 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
View 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- */

View File

@@ -9,30 +9,26 @@
* 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.1 2002/02/27 23:26:21 alex Exp $
* $Id: irc-write.c,v 1.3 2002/03/25 17:13:07 alex Exp $
*
* irc-write.c: IRC-Texte und Befehle ueber Netzwerk versenden
*
* $Log: irc-write.c,v $
* Revision 1.1 2002/02/27 23:26:21 alex
* - Modul aus irc.c bzw. irc.h ausgegliedert.
*
*/
#include <portab.h>
#include "global.h"
#include "portab.h"
#include <imp.h>
#include "imp.h"
#include <assert.h>
#include <stdarg.h>
#include <stdio.h>
#include <exp.h>
#include "defines.h"
#include "exp.h"
#include "irc-write.h"
CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client );
LOCAL CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client );
GLOBAL BOOLEAN IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... )
@@ -262,7 +258,7 @@ GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEA
} /* IRC_WriteStrRelatedPrefix */
CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client )
LOCAL CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client )
{
assert( Target != NULL );
assert( Client != NULL );

View File

@@ -9,14 +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-write.h,v 1.1 2002/02/27 23:26:21 alex Exp $
* $Id: irc-write.h,v 1.2 2002/03/12 14:37:52 alex Exp $
*
* irc-write.h: IRC-Texte und Befehle ueber Netzwerk versenden (Header)
*
* $Log: irc-write.h,v $
* Revision 1.1 2002/02/27 23:26:21 alex
* - Modul aus irc.c bzw. irc.h ausgegliedert.
*
*/

View File

@@ -9,61 +9,15 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: irc.c,v 1.83 2002/02/28 00:48:26 alex Exp $
* $Id: irc.c,v 1.89.2.1 2002/06/11 17:52:23 alex Exp $
*
* irc.c: IRC-Befehle
*
* $Log: irc.c,v $
* Revision 1.83 2002/02/28 00:48:26 alex
* - Forwarding von TOPIC an andere Server gefixed. Hoffentlich ;-)
*
* Revision 1.82 2002/02/27 23:26:36 alex
* - einige Funktionen in irc-xxx-Module ausgegliedert.
*
* Revision 1.81 2002/02/27 20:55:44 alex
* - Channel-Topics werden nun auch korrekt von anderen Server angenommen.
*
* Revision 1.80 2002/02/27 20:33:13 alex
* - Channel-Topics implementiert.
*
* Revision 1.79 2002/02/27 18:57:21 alex
* - PRIVMSG zeugt nun bei Texten an User an, wenn diese "away" sind.
*
* Revision 1.78 2002/02/27 18:23:45 alex
* - IRC-Befehl "AWAY" implementert.
*
* Revision 1.77 2002/02/27 17:05:41 alex
* - PRIVMSG beachtet nun die Channel-Modes "n" und "m".
*
* Revision 1.76 2002/02/27 16:04:14 alex
* - Bug bei belegtem Nickname bei User-Registrierung (NICK-Befehl) behoben.
*
* Revision 1.75 2002/02/27 15:23:27 alex
* - NAMES beachtet nun das "invisible" Flag ("i") von Usern.
*
* Revision 1.74 2002/02/27 03:44:53 alex
* - gerade eben in SQUIT eingefuehrten Bug behoben: entfernte Server werden nun
* nur noch geloescht, die Verbindung, von der SQUIT kam, bleibt wieder offen.
*
* Revision 1.73 2002/02/27 03:08:05 alex
* - Log-Meldungen bei SQUIT erneut ueberarbeitet ...
*
* Revision 1.72 2002/02/27 02:26:58 alex
* - SQUIT wird auf jeden Fall geforwarded, zudem besseres Logging.
*
* Revision 1.71 2002/02/27 00:50:05 alex
* - einige unnoetige Client_NextHop()-Aufrufe entfernt.
* - NAMES korrigiert und komplett implementiert.
*
* Revision 1.70 2002/02/26 22:06:40 alex
* - Nick-Aenderungen werden nun wieder korrekt ins Logfile geschrieben.
*/
#include <portab.h>
#include "global.h"
#include "portab.h"
#include <imp.h>
#include "imp.h"
#include <assert.h>
#include <errno.h>
#include <stdio.h>
@@ -80,7 +34,7 @@
#include "messages.h"
#include "tool.h"
#include <exp.h>
#include "exp.h"
#include "irc.h"
@@ -100,7 +54,6 @@ GLOBAL BOOLEAN IRC_MOTD( CLIENT *Client, REQUEST *Req )
GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
{
BOOLEAN is_member, has_voice, is_op, ok;
CLIENT *cl, *from;
CHANNEL *chan;
@@ -114,13 +67,16 @@ GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
if( Req->argc == 1 ) return IRC_WriteStrClient( Client, ERR_NOTEXTTOSEND_MSG, Client_ID( Client ));
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix );
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 );
cl = Client_Search( Req->argv[0] );
if( cl )
{
/* Okay, Ziel ist ein Client. Aber ist es auch ein User? */
if( Client_Type( cl ) != CLIENT_USER ) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( from ), Req->argv[0] );
/* Okay, Ziel ist ein User */
if(( Client_Type( Client ) != CLIENT_SERVER ) && ( strchr( Client_Modes( cl ), 'a' )))
{
@@ -134,28 +90,7 @@ GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
}
chan = Channel_Search( Req->argv[0] );
if( chan )
{
/* 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 ), Req->argv[0] );
/* Text senden */
if( Client_Conn( from ) > NONE ) Conn_UpdateIdle( Client_Conn( from ));
return IRC_WriteStrChannelPrefix( Client, chan, from, TRUE, "PRIVMSG %s :%s", Req->argv[0], Req->argv[1] );
}
if( chan ) return Channel_Write( chan, from, Client, Req->argv[1] );
return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( from ), Req->argv[0] );
} /* IRC_PRIVMSG */
@@ -173,12 +108,12 @@ GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req )
/* Falsche Anzahl Parameter? */
if( Req->argc != 2 ) return CONNECTED;
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix );
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 );
to = Client_Search( Req->argv[0] );
if( to )
if(( to ) && ( Client_Type( to ) == CLIENT_USER ))
{
/* Okay, Ziel ist ein User */
return IRC_WriteStrClientPrefix( to, from, "NOTICE %s :%s", Client_ID( to ), Req->argv[1] );
@@ -187,87 +122,6 @@ GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req )
} /* IRC_NOTICE */
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, "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, "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, "Got RESTART command from \"%s\", going down!", Client_Mask( Client ));
NGIRCd_Restart = TRUE;
return CONNECTED;
} /* IRC_RESTART */
GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req )
{
CHAR rpl[COMMAND_LEN], *ptr;
@@ -283,14 +137,14 @@ GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req )
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* From aus Prefix ermitteln */
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix );
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
if( Req->argc == 2 )
{
/* an anderen Server forwarden */
target = Client_GetFromID( Req->argv[1] );
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( ))
@@ -385,7 +239,7 @@ GLOBAL BOOLEAN IRC_ISON( CLIENT *Client, REQUEST *Req )
while( ptr )
{
ngt_TrimStr( ptr );
c = Client_GetFromID( ptr );
c = Client_Search( ptr );
if( c && ( Client_Type( c ) == CLIENT_USER ))
{
/* Dieser Nick ist "online" */
@@ -417,11 +271,11 @@ GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req )
if(( Req->argc < 1 ) || ( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Client suchen */
c = Client_GetFromID( Req->argv[Req->argc - 1] );
c = Client_Search( Req->argv[Req->argc - 1] );
if(( ! c ) || ( Client_Type( c ) != CLIENT_USER )) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[Req->argc - 1] );
/* Empfaenger des WHOIS suchen */
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix );
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 );
@@ -429,7 +283,7 @@ GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req )
if( Req->argc > 1 )
{
/* angegebenen Ziel-Server suchen */
target = Client_GetFromID( Req->argv[1] );
target = Client_Search( Req->argv[1] );
if( ! target ) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( from ), Req->argv[1] );
ptr = Req->argv[1];
}
@@ -455,8 +309,8 @@ GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req )
/* Channel-Name anhaengen */
if( str[strlen( str ) - 1] != ':' ) strcat( str, " " );
if( strchr( Channel_UserModes( chan, c ), 'v' )) strcat( str, "+" );
if( strchr( Channel_UserModes( chan, c ), 'o' )) strcat( str, "@" );
else if( strchr( Channel_UserModes( chan, c ), 'v' )) strcat( str, "+" );
strcat( str, Channel_Name( chan ));
if( strlen( str ) > ( LINE_LEN - CHANNEL_NAME_LEN - 4 ))
@@ -498,6 +352,83 @@ GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req )
} /* IRC_WHOIS */
GLOBAL BOOLEAN IRC_WHO( CLIENT *Client, REQUEST *Req )
{
BOOLEAN ok, only_ops;
CHAR flags[8], *ptr;
CL2CHAN *cl2chan;
CHANNEL *chan;
CLIENT *c;
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 );
only_ops = FALSE;
chan = NULL;
if( Req->argc == 2 )
{
/* Nur OPs anzeigen? */
if( strcmp( Req->argv[1], "o" ) == 0 ) only_ops = TRUE;
#ifdef STRICT_RFC
else return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
#endif
}
if( Req->argc >= 1 )
{
/* wurde ein Channel oder Nick-Mask angegeben? */
chan = Channel_Search( Req->argv[0] );
}
if( chan )
{
/* User eines Channels ausgeben */
if( ! IRC_Send_WHO( Client, chan, only_ops )) return DISCONNECTED;
}
c = Client_First( );
while( c )
{
if(( Client_Type( c ) == CLIENT_USER ) && ( ! strchr( Client_Modes( c ), 'i' )))
{
ok = FALSE;
if( Req->argc == 0 ) ok = TRUE;
else
{
if( strcasecmp( Req->argv[0], Client_ID( c )) == 0 ) ok = TRUE;
else if( strcmp( Req->argv[0], "0" ) == 0 ) ok = TRUE;
}
if( ok && (( ! only_ops ) || ( strchr( Client_Modes( c ), 'o' ))))
{
/* Flags zusammenbasteln */
strcpy( flags, "H" );
if( strchr( Client_Modes( c ), 'o' )) strcat( flags, "*" );
/* ausgeben */
cl2chan = Channel_FirstChannelOf( c );
if( cl2chan ) ptr = Channel_Name( Channel_GetChannel( cl2chan ));
else ptr = "*";
if( ! IRC_WriteStrClient( Client, RPL_WHOREPLY_MSG, Client_ID( Client ), ptr, Client_User( c ), Client_Hostname( c ), Client_ID( Client_Introducer( c )), Client_ID( c ), flags, Client_Hops( c ), Client_Info( c ))) return DISCONNECTED;
}
}
/* naechster Client */
c = Client_Next( c );
}
if( chan ) return IRC_WriteStrClient( Client, RPL_ENDOFWHO_MSG, Client_ID( Client ), Channel_Name( chan ));
else if( Req->argc == 0 ) return IRC_WriteStrClient( Client, RPL_ENDOFWHO_MSG, Client_ID( Client ), "*" );
else return IRC_WriteStrClient( Client, RPL_ENDOFWHO_MSG, Client_ID( Client ), Req->argv[0] );
} /* IRC_WHO */
GLOBAL BOOLEAN IRC_USERHOST( CLIENT *Client, REQUEST *Req )
{
CHAR rpl[COMMAND_LEN];
@@ -518,7 +449,7 @@ GLOBAL BOOLEAN IRC_USERHOST( CLIENT *Client, REQUEST *Req )
strcpy( rpl, RPL_USERHOST_MSG );
for( i = 0; i < max; i++ )
{
c = Client_GetFromID( Req->argv[i] );
c = Client_Search( Req->argv[i] );
if( c && ( Client_Type( c ) == CLIENT_USER ))
{
/* Dieser Nick ist "online" */
@@ -564,20 +495,20 @@ GLOBAL BOOLEAN IRC_LUSERS( CLIENT *Client, REQUEST *Req )
if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Absender ermitteln */
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix );
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 );
/* An anderen Server forwarden? */
if( Req->argc == 2 )
{
target = Client_GetFromID( Req->argv[1] );
target = Client_Search( Req->argv[1] );
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
else if( target != Client_ThisServer( )) return IRC_WriteStrClientPrefix( target, from, "LUSERS %s %s", Req->argv[0], Req->argv[1] );
}
/* Wer ist der Absender? */
if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_GetFromID( Req->prefix );
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 );
@@ -605,20 +536,20 @@ GLOBAL BOOLEAN IRC_LINKS( CLIENT *Client, REQUEST *Req )
else mask = "*";
/* Absender ermitteln */
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix );
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 );
/* An anderen Server forwarden? */
if( Req->argc == 2 )
{
target = Client_GetFromID( Req->argv[0] );
target = Client_Search( Req->argv[0] );
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
else if( target != Client_ThisServer( )) return IRC_WriteStrClientPrefix( target, from, "LINKS %s %s", Req->argv[0], Req->argv[1] );
}
/* Wer ist der Absender? */
if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_GetFromID( Req->prefix );
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 );
@@ -636,193 +567,6 @@ GLOBAL BOOLEAN IRC_LINKS( CLIENT *Client, REQUEST *Req )
} /* IRC_LINKS */
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_GetFromID( 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_GetFromID( 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_GetFromID( 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_VERSION( CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *prefix;
@@ -834,11 +578,11 @@ GLOBAL BOOLEAN IRC_VERSION( CLIENT *Client, REQUEST *Req )
if(( Req->argc > 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Ziel suchen */
if( Req->argc == 1 ) target = Client_GetFromID( Req->argv[0] );
if( Req->argc == 1 ) target = Client_Search( Req->argv[0] );
else target = Client_ThisServer( );
/* Prefix ermitteln */
if( Client_Type( Client ) == CLIENT_SERVER ) prefix = Client_GetFromID( Req->prefix );
if( Client_Type( Client ) == CLIENT_SERVER ) prefix = Client_Search( Req->prefix );
else prefix = Client;
if( ! prefix ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
@@ -869,7 +613,7 @@ GLOBAL BOOLEAN IRC_KILL( CLIENT *Client, REQUEST *Req )
/* Falsche Anzahl Parameter? */
if(( Req->argc != 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
prefix = Client_GetFromID( Req->prefix );
prefix = Client_Search( Req->prefix );
if( ! prefix )
{
Log( LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!", Req->prefix );
@@ -882,7 +626,7 @@ GLOBAL BOOLEAN IRC_KILL( CLIENT *Client, REQUEST *Req )
IRC_WriteStrServersPrefix( Client, prefix, "KILL %s :%s", Req->argv[0], Req->argv[1] );
/* haben wir selber einen solchen Client? */
c = Client_GetFromID( Req->argv[0] );
c = Client_Search( Req->argv[0] );
if( c && ( Client_Conn( c ) != NONE )) Conn_Close( Client_Conn( c ), NULL, Req->argv[1], TRUE );
return CONNECTED;
@@ -950,8 +694,8 @@ GLOBAL BOOLEAN IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
{
/* Nick 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, "@" );
else if( strchr( Channel_UserModes( Chan, cl ), 'v' )) strcat( str, "+" );
strcat( str, Client_ID( cl ));
if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 ))
@@ -975,6 +719,50 @@ GLOBAL BOOLEAN IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
} /* IRC_Send_NAMES */
GLOBAL BOOLEAN IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )
{
BOOLEAN is_visible, is_member;
CL2CHAN *cl2chan;
CHAR flags[8];
CLIENT *c;
assert( Client != NULL );
assert( Chan != NULL );
if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE;
else is_member = FALSE;
/* Alle Mitglieder suchen */
cl2chan = Channel_FirstMember( Chan );
while( cl2chan )
{
c = Channel_GetClient( cl2chan );
if( strchr( Client_Modes( c ), 'i' )) is_visible = FALSE;
else is_visible = TRUE;
if( is_member || is_visible )
{
/* Flags zusammenbasteln */
strcpy( flags, "H" );
if( strchr( Client_Modes( c ), 'o' )) strcat( flags, "*" );
if( strchr( Channel_UserModes( Chan, c ), 'o' )) strcat( flags, "@" );
else if( strchr( Channel_UserModes( Chan, c ), 'v' )) strcat( flags, "+" );
/* ausgeben */
if(( ! OnlyOps ) || ( strchr( Client_Modes( c ), 'o' )))
{
if( ! IRC_WriteStrClient( Client, RPL_WHOREPLY_MSG, Client_ID( Client ), Channel_Name( Chan ), Client_User( c ), Client_Hostname( c ), Client_ID( Client_Introducer( c )), Client_ID( c ), flags, Client_Hops( c ), Client_Info( c ))) return DISCONNECTED;
}
}
/* naechstes Mitglied suchen */
cl2chan = Channel_NextMember( Chan, cl2chan );
}
return CONNECTED;
} /* IRC_Send_WHO */
GLOBAL BOOLEAN IRC_Send_LUSERS( CLIENT *Client )
{
INT cnt;

View File

@@ -9,25 +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.27 2002/02/27 23:26:36 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.27 2002/02/27 23:26:36 alex
* - einige Funktionen in irc-xxx-Module ausgegliedert.
*
* Revision 1.26 2002/02/27 20:33:13 alex
* - Channel-Topics implementiert.
*
* Revision 1.25 2002/02/27 18:23:46 alex
* - IRC-Befehl "AWAY" implementert.
*
* Revision 1.24 2002/02/23 21:39:48 alex
* - IRC-Befehl KILL sowie Kills bei Nick Collsisions implementiert.
*
* Revision 1.23 2002/02/17 23:38:58 alex
* - neuer IRC-Befehl VERSION implementiert: IRC_VERSION().
*/
@@ -51,21 +35,15 @@ 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_JOIN( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_PART( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_TOPIC( 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

View File

@@ -9,96 +9,45 @@
* 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.18 2002/02/19 20:07:13 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.18 2002/02/19 20:07:13 alex
* - direkt nach dem Start werden die aktiven "Modes" ins Log geschrieben.
*
* Revision 1.17 2002/01/11 14:45:37 alex
* - Anpassungen an neue Kommandozeilen-Optionen "--debug" und "--nodaemon".
*
* 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 "global.h"
#include "ngircd.h"
#include "client.h"
#include "defines.h"
#include "irc-write.h"
#include <exp.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[127];
#ifdef USE_SYSLOG
/* Syslog initialisieren */
openlog( PACKAGE, LOG_CONS|LOG_PID, LOG_LOCAL5 );
@@ -106,42 +55,71 @@ GLOBAL VOID Log_Init( VOID )
/* Hello World! */
Log( LOG_NOTICE, "%s started.", NGIRCd_Version( ));
/* Informationen uebern den "Operation Mode" */
strcpy( txt, "" );
strcpy( Init_Txt, "" );
#ifdef DEBUG
if( NGIRCd_Debug )
{
if( txt[0] ) strcat( txt, ", " );
strcat( txt, "debug-mode" );
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
strcat( Init_Txt, "debug-mode" );
}
#endif
if( NGIRCd_NoDaemon )
{
if( txt[0] ) strcat( txt, ", " );
strcat( txt, "no-daemon-mode" );
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
strcat( Init_Txt, "no-daemon-mode" );
}
if( NGIRCd_Passive )
{
if( txt[0] ) strcat( txt, ", " );
strcat( txt, "passive-mode" );
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
strcat( Init_Txt, "passive-mode" );
}
#ifdef SNIFFER
if( NGIRCd_Sniffer )
{
if( txt[0] ) strcat( txt, ", " );
strcat( txt, "network sniffer" );
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
strcat( Init_Txt, "network sniffer" );
}
#endif
if( txt[0] ) Log( LOG_INFO, "Activating: %s.", txt );
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( );
@@ -149,15 +127,24 @@ GLOBAL VOID Log_Exit( VOID )
} /* 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 );
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
@@ -166,16 +153,32 @@ GLOBAL VOID Log( CONST INT Level, CONST CHAR *Format, ... )
/* 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 */
if( NGIRCd_NoDaemon ) 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 */
@@ -216,15 +219,31 @@ GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... )
/* 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- */

View File

@@ -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 );

View File

@@ -9,115 +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.33 2002/02/27 20:33:01 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.33 2002/02/27 20:33:01 alex
* - neue Text-Konstante: ERR_NOTONCHANNEL_MSG
*
* Revision 1.32 2002/02/27 18:23:24 alex
* - neue Text-Konstanten RPL_UNAWAY_MSG und RPL_NOWAWAY_MSG.
*
* Revision 1.31 2002/02/27 17:05:13 alex
* - neue Text-Konstante ERR_CANNOTSENDTOCHAN_MSG eingefuehrt.
*
* Revision 1.30 2002/02/17 23:39:24 alex
* - Konstanten sortiert, neue Konstante RPL_VERSION und RPL_VERSION_MSG.
*
* Revision 1.29 2002/02/17 17:42:53 alex
* - neue Text-Konstante ERR_UMODEUNKNOWNFLAG2_MSG.
*
* Revision 1.28 2002/02/13 23:04:50 alex
* - RPL_MYINFO_MSG korrigiert.
*
* Revision 1.27 2002/02/13 17:45:57 alex
* - unterstuetzte User- und Channel-Modes stehen nun in Konstanten.
*
* Revision 1.26 2002/02/11 23:33:12 alex
* - neue Message ERR_CHANOPRIVSNEEDED_MSG definiert.
*
* Revision 1.25 2002/02/11 15:48:39 alex
* - neue Nachricht RPL_CHANNELMODEIS definiert.
*
* Revision 1.24 2002/02/06 16:51:39 alex
* - neue Text-Konstante RPL_UMODEISCHAN_MSG.
*
* Revision 1.23 2002/01/29 00:14:05 alex
* - RPL_WHOISCHANNELS_MSG korrigiert.
*
* Revision 1.22 2002/01/28 13:06:19 alex
* - RPL_NAMREPLY_MSG an tatsaechliche Implementierung angepasst ;-)
*
* Revision 1.21 2002/01/27 17:13:37 alex
* - neue Defines fuer RPL_TOPIC und RPL_NOTOPIC.
*
* Revision 1.20 2002/01/21 00:02:34 alex
* - ERR_NOSUCHCHANNEL hinzugefuegt.
*
* Revision 1.19 2002/01/16 22:09:52 alex
* - RPL_LUSERME_MSG erweitert, kleinere Aenderungen.
*
* Revision 1.18 2002/01/11 23:50:55 alex
* - LINKS implementiert, LUSERS begonnen.
*
* 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 :-)
*/
@@ -129,7 +23,7 @@
#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"
@@ -189,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"
@@ -198,6 +95,12 @@
#define RPL_WHOISCHANNELS "319"
#define RPL_WHOISCHANNELS_MSG RPL_WHOISCHANNELS" %s %s :"
#define RPL_LIST "322"
#define RPL_LIST_MSG RPL_LIST" %s %s %d :%s"
#define RPL_LISTEND "323"
#define RPL_LISTEND_MSG RPL_LISTEND" %s :End of LIST"
#define RPL_CHANNELMODEIS "324"
#define RPL_CHANNELMODEIS_MSG RPL_CHANNELMODEIS" %s %s +%s"
@@ -210,6 +113,9 @@
#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 :"

View File

@@ -9,113 +9,19 @@
* 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.28 2002/02/27 23:24:29 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.28 2002/02/27 23:24:29 alex
* - ueberfluessige Init- und Exit-Funktionen entfernt.
*
* Revision 1.27 2002/02/25 11:42:47 alex
* - wenn ein System sigaction() nicht kennt, so wird nun signal() verwendet.
*
* Revision 1.26 2002/02/23 19:06:47 alex
* - fuer SIGCHLD wird nun auch SA_NOCLDWAIT gesetzt, wenn vorhanden.
*
* Revision 1.25 2002/02/19 20:30:47 alex
* - SA_RESTART wird fuer Signale nur noch gesetzt, wenn es definiert ist.
*
* Revision 1.24 2002/02/19 20:08:24 alex
* - "Passive-Mode" implementiert: kein Auto-Conect zu anderen Servern.
* - NGIRCd_DebugLevel wird (fuer VERSION-Befehl) ermittelt.
*
* Revision 1.23 2002/02/17 23:40:21 alex
* - neue Funktion NGIRCd_VersionAddition(). NGIRCd_Version() aufgespaltet.
*
* Revision 1.22 2002/01/22 17:15:39 alex
* - die Fehlermeldung "interrupted system call" sollte nicht mehr auftreten.
*
* Revision 1.21 2002/01/21 00:02:11 alex
* - Hilfetexte korrigiert und ergaenzt (Sniffer).
*
* Revision 1.20 2002/01/18 11:12:11 alex
* - der Sniffer wird nun nur noch aktiviert, wenn auf Kommandozeile angegeben.
*
* Revision 1.19 2002/01/12 00:17:28 alex
* - ngIRCd wandelt sich nun selber in einen Daemon (Hintergrundprozess) um.
*
* Revision 1.18 2002/01/11 14:45:18 alex
* - Kommandozeilen-Parser implementiert: Debug- und No-Daemon-Modus, Hilfe.
*
* 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>
@@ -127,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"
@@ -144,13 +51,11 @@ 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[] )
{
BOOLEAN ok;
INT pid, i, n;
/* Datentypen der portab-Library ueberpruefen */
portab_check_types( );
BOOLEAN ok, configtest = FALSE;
INT32 pid, n;
INT i;
NGIRCd_Restart = FALSE;
NGIRCd_Quit = FALSE;
@@ -162,6 +67,7 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
#ifdef SNIFFER
NGIRCd_Sniffer = FALSE;
#endif
strcpy( NGIRCd_ConfFile, CONFIG_FILE );
/* Kommandozeile parsen */
for( i = 1; i < argc; i++ )
@@ -171,6 +77,23 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
{
/* 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 )
{
@@ -180,8 +103,8 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
#endif
if( strcmp( argv[i], "--help" ) == 0 )
{
Show_Version( ); puts( "" );
Show_Help( ); puts( "" );
Show_Version( );
puts( "" ); Show_Help( ); puts( "" );
exit( 1 );
}
if( strcmp( argv[i], "--nodaemon" ) == 0 )
@@ -211,7 +134,7 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
{
/* Kurze Option */
for( n = 1; n < strlen( argv[i] ); n++ )
for( n = 1; n < (INT32)strlen( argv[i] ); n++ )
{
ok = FALSE;
#ifdef DEBUG
@@ -221,6 +144,19 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
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;
@@ -264,6 +200,13 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
#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 )
{
@@ -274,7 +217,7 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
if( ! NGIRCd_NoDaemon )
{
/* Daemon im Hintergrund erzeugen */
pid = fork( );
pid = (INT32)fork( );
if( pid > 0 )
{
/* "alter" Prozess */
@@ -286,13 +229,15 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
printf( PACKAGE": Can't fork: %s!\nFatal error, exiting now ...", strerror( errno ));
exit( 1 );
}
setsid( );
/* 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;
@@ -303,6 +248,25 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
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( );
@@ -323,6 +287,7 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
Conf_Exit( );
Log_Exit( );
}
return 0;
} /* main */
@@ -360,7 +325,7 @@ GLOBAL CHAR *NGIRCd_VersionAddition( VOID )
#endif
if( txt[0] ) strcat( txt, "-" );
strcat( txt, P_OSNAME"/"P_ARCHNAME );
strcat( txt, TARGET_CPU"/"TARGET_VENDOR"/"TARGET_OS );
return txt;
} /* NGIRCd_VersionAddition */
@@ -450,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 )
@@ -471,7 +436,8 @@ LOCAL VOID Initialize_Listen_Ports( VOID )
LOCAL VOID Show_Version( VOID )
{
puts( NGIRCd_Version( ));
puts( "Copyright (c)2001,2002 by Alexander Barton (alex@barton.de).\n" );
puts( "Copyright (c)2001,2002 by Alexander Barton (<alex@barton.de>)." );
puts( "Homepage: <http://arthur.ath.cx/~alex/ngircd/>\n" );
puts( "This is free software; see the source for copying conditions. There is NO" );
puts( "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." );
} /* Show_Version */
@@ -480,15 +446,17 @@ LOCAL VOID Show_Version( VOID )
LOCAL VOID Show_Help( VOID )
{
#ifdef DEBUG
puts( " -d, --debug log extra debug messages" );
puts( " -d, --debug log extra debug messages" );
#endif
puts( " -n, --nodaemon don't fork and don't detatch from controlling terminal" );
puts( " -p, --passive disable automatic connections to other servers" );
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" );
puts( " -s, --sniffer enable network sniffer and display all IRC traffic" );
#endif
puts( " --version output version information and exit" );
puts( " --help display this help and exit" );
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 */

View File

@@ -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: ngircd.h,v 1.10 2002/02/19 20:07:48 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.10 2002/02/19 20:07:48 alex
* - Neue Variablen NGIRCd_DebugVersion und NGIRCd_Passive.
*
* Revision 1.9 2002/02/17 23:40:32 alex
* - Neue Funktion NGIRCd_VersionAddition().
*
* Revision 1.8 2002/01/18 11:12:11 alex
* - der Sniffer wird nun nur noch aktiviert, wenn auf Kommandozeile angegeben.
*
* Revision 1.7 2002/01/11 14:45:18 alex
* - Kommandozeilen-Parser implementiert: Debug- und No-Daemon-Modus, Hilfe.
*
* 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.
*/
@@ -53,6 +20,8 @@
#include <time.h>
#include "defines.h"
GLOBAL time_t NGIRCd_Start; /* Startzeitpunkt des Daemon */
GLOBAL CHAR NGIRCd_StartStr[64];
@@ -74,6 +43,8 @@ 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 );

View File

@@ -9,110 +9,15 @@
* 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.28 2002/02/27 23:25:31 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.28 2002/02/27 23:25:31 alex
* - Anpassungen an Aufteilung von irc.d, Init- und Exit-Funktionen entfernt.
*
* Revision 1.27 2002/02/27 20:33:13 alex
* - Channel-Topics implementiert.
*
* Revision 1.26 2002/02/27 18:23:46 alex
* - IRC-Befehl "AWAY" implementert.
*
* Revision 1.25 2002/02/26 20:52:15 alex
* - Fehler bei Fehlermeldung wg. unbekanntem Prefix behoben.
*
* Revision 1.24 2002/02/23 21:39:48 alex
* - IRC-Befehl KILL sowie Kills bei Nick Collsisions implementiert.
*
* Revision 1.23 2002/02/17 23:38:58 alex
* - neuer IRC-Befehl VERSION implementiert: IRC_VERSION().
*
* Revision 1.22 2002/01/21 00:01:37 alex
* - neue Befehle JOIN und PART.
*
* Revision 1.21 2002/01/18 11:12:11 alex
* - der Sniffer wird nun nur noch aktiviert, wenn auf Kommandozeile angegeben.
*
* Revision 1.20 2002/01/11 23:50:55 alex
* - LINKS implementiert, LUSERS begonnen.
*
* Revision 1.19 2002/01/09 01:08:42 alex
* - Parses handhabt Leerzeichen zw. Parametern nun etwas "lockerer".
*
* Revision 1.18 2002/01/07 15:29:11 alex
* - Status-Codes an den Server selber werden ignoriert, besseres Logging.
*
* Revision 1.17 2002/01/06 17:41:44 alex
* - die Fehlermeldung "unbekannter Befehl" hatte ein falsches Format.
*
* 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>
@@ -121,15 +26,19 @@
#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"
@@ -315,7 +224,7 @@ 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 )
{
@@ -335,7 +244,7 @@ LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req )
Log( LOG_WARNING, "Got status code without prefix!?" );
return TRUE;
}
else prefix = Client_GetFromID( Req->prefix );
else prefix = Client_Search( Req->prefix );
if( ! prefix )
{
Log( LOG_WARNING, "Got status code from unknown source: \"%s\"", Req->prefix );
@@ -382,6 +291,8 @@ LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *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, ERR_UNKNOWNCOMMAND_MSG, Client_ID( client ), Req->command );

View File

@@ -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: parse.h,v 1.5 2002/02/27 23:24:29 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.5 2002/02/27 23:24:29 alex
* - ueberfluessige Init- und Exit-Funktionen entfernt.
*
* 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.
*/

View File

@@ -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- */

View File

@@ -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
View 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
View 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
View 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
View 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
View 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
View 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- */