mirror of
https://github.com/osmarks/ngircd.git
synced 2026-06-26 14:48:52 +00:00
Compare commits
235 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 880d35f82b | |||
| 83e49bf74b | |||
| b6f53b6f82 | |||
| ab52d2b818 | |||
| aaf42ae77b | |||
| fa30f2a0d2 | |||
| 1fa46bedbe | |||
| d772acf9d6 | |||
| 15f380592d | |||
| 54b9381dd0 | |||
| 889b7ef48f | |||
| 31c8078706 | |||
| 34eb2528d0 | |||
| b58ab32b9f | |||
| 85aad86906 | |||
| d79b2f0a35 | |||
| c5eaea7161 | |||
| e506ae44e0 | |||
| bebf0383d0 | |||
| 1c99b8377f | |||
| c9e8d4bbad | |||
| d68fb7a320 | |||
| 7efefd30f1 | |||
| fe06f6e990 | |||
| 3d74a9c323 | |||
| 1c2d0ae5de | |||
| 07c3e62e11 | |||
| 773d886df6 | |||
| d47f88427d | |||
| 95d55c56c6 | |||
| 4cdc98154c | |||
| d4a9ceae75 | |||
| 6fbb2b7a67 | |||
| 1c00ddffec | |||
| f4b23bfc96 | |||
| 72accd4ee5 | |||
| d7ecb84847 | |||
| da8da1ce7d | |||
| 20a2ffef88 | |||
| 6b58ab8427 | |||
| e9b98fefc6 | |||
| 95be386e9d | |||
| a89dc54690 | |||
| e8668cf593 | |||
| bdf53a6d29 | |||
| d09dfb3e36 | |||
| f86083a057 | |||
| bcc5138518 | |||
| e39925af9b | |||
| d58fe2f185 | |||
| b79ba679a1 | |||
| 8d79f26721 | |||
| 95a4b1b158 | |||
| c0ef984273 | |||
| a323186926 | |||
| 117c1df65a | |||
| d4fca86ae8 | |||
| bc4ed22635 | |||
| c74083645a | |||
| 0ac6151be9 | |||
| b5c16c228b | |||
| cec0e2a4d7 | |||
| 0e38d10bcd | |||
| 7bb2c6b012 | |||
| 281d8e454d | |||
| 8e5a56cea7 | |||
| 0df6a76103 | |||
| fdf23efef4 | |||
| d7d2ab3d7f | |||
| b9a2c4a8ec | |||
| 69f683070a | |||
| 31015c8306 | |||
| b422b11865 | |||
| 8a45b177ce | |||
| 28c5a21fa0 | |||
| 239727b411 | |||
| 34d5434478 | |||
| 03c3f3c990 | |||
| 9146fa2534 | |||
| 882c91280e | |||
| e298b83b92 | |||
| c46f623d6f | |||
| 27d131a177 | |||
| 7049b60af4 | |||
| 7633e2f8c3 | |||
| ca33cbda05 | |||
| d18ca0b85d | |||
| fbfb343176 | |||
| f7a0ff1f65 | |||
| 50ec7a56a4 | |||
| 92793d3114 | |||
| 9fc7e66f66 | |||
| 590f2a3f0c | |||
| 221058009c | |||
| 5fa05dcea8 | |||
| dce77559fa | |||
| df09e7afd3 | |||
| 2464556a7d | |||
| a8aab6bfdd | |||
| 23add79c3e | |||
| e6faca1337 | |||
| d67d94ea04 | |||
| 0777bca325 | |||
| 0903e7763c | |||
| 89f9522e22 | |||
| 965855756b | |||
| 5bd4734a88 | |||
| 37c7087c6f | |||
| 317941d840 | |||
| 652a003ef5 | |||
| 81889df4b7 | |||
| 0e092b3f06 | |||
| 2006b6195e | |||
| fe2bc90e45 | |||
| 10aa35cc91 | |||
| c68c092ce3 | |||
| 0a13ff41ea | |||
| ae6ab2c3e0 | |||
| b3a64f5e08 | |||
| 802a17b11d | |||
| 2b6309719f | |||
| 5562f411c4 | |||
| a1a3e67de6 | |||
| 7de4683506 | |||
| 360bddd600 | |||
| 9d5551ba6d | |||
| 14aba7c1b2 | |||
| 10363b398e | |||
| 2ee05c9a68 | |||
| 8dd92fbcd8 | |||
| e7214c151f | |||
| 829f741ccd | |||
| 6878d25d04 | |||
| 250ef1ab55 | |||
| 7b8b542396 | |||
| 5457e0788a | |||
| 09da2c9afd | |||
| 7157d93651 | |||
| 0370c4843f | |||
| a3ee1a9a26 | |||
| cbce54e0fc | |||
| 5facc989c5 | |||
| 02f394f0ce | |||
| 6da91c34b4 | |||
| 40f07f2f5c | |||
| ef7f7a90f4 | |||
| c23199d971 | |||
| b56eb4d8d4 | |||
| d022c1bf4e | |||
| fc186d77c1 | |||
| ff54198f43 | |||
| a22a3d5f29 | |||
| 070da48826 | |||
| 9780ed1f21 | |||
| d59f029043 | |||
| d58e22a3ea | |||
| 8975c7a204 | |||
| 52548bd3e3 | |||
| caf41e5bba | |||
| 3c01ac4e33 | |||
| 949977e878 | |||
| 83177581e4 | |||
| 18d881876d | |||
| c48501245e | |||
| b53b5728a6 | |||
| cd6e40493c | |||
| 82da6d2ff1 | |||
| f99a8ed18f | |||
| a7bbcef6e0 | |||
| c147ebef0d | |||
| 153aa0aac8 | |||
| 28d5898617 | |||
| 140d1aa505 | |||
| d360137d94 | |||
| 805096d173 | |||
| 70e3c6b50a | |||
| b181f1bd3c | |||
| 1575e30d77 | |||
| e4754c3447 | |||
| 180095be32 | |||
| 93a52dfab8 | |||
| 08d43d5f67 | |||
| 1ff2fceb22 | |||
| 8c956d5989 | |||
| 6817e293c5 | |||
| 67295c48ca | |||
| b7a6bf27cc | |||
| abe6a2c107 | |||
| c90cf7c9ed | |||
| ed1dac585d | |||
| a809fe36c7 | |||
| 62266a8d46 | |||
| 498e6e0d22 | |||
| 5d306a1dc9 | |||
| aaa682fb24 | |||
| 6f955d2a34 | |||
| 8465653c6e | |||
| 2a69ee905a | |||
| 3c233aa9c5 | |||
| 0253bcc8af | |||
| 367657fd36 | |||
| 944352717a | |||
| 1b30228caa | |||
| 9919f38dae | |||
| 2617d21336 | |||
| c66702c6d4 | |||
| eea1a88b24 | |||
| d1382fab5c | |||
| fcb47ae64b | |||
| 1fe8355fcf | |||
| 26ffbc7850 | |||
| b0482db966 | |||
| 0470cdfdcc | |||
| b80fc259d8 | |||
| efe152336c | |||
| 3fbbfe44ed | |||
| 5a8a789511 | |||
| 458174ffb0 | |||
| 00529c8fbd | |||
| 71fa0781d4 | |||
| 8fdb46361d | |||
| 3232c7d245 | |||
| 2c0a42e935 | |||
| a233adfbd8 | |||
| 9f3a9df24a | |||
| 44b396d9a5 | |||
| 25e1e8b690 | |||
| b60f369266 | |||
| 1b1b718e7e | |||
| ce2738c984 | |||
| bec7783ec9 | |||
| db7ea9c4b3 | |||
| 2d87beed3d | |||
| 05a493e1d0 | |||
| 825711973a |
@@ -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.
|
||||
|
||||
|
||||
@@ -10,6 +10,103 @@
|
||||
-- ChangeLog / Aenderungen --
|
||||
|
||||
|
||||
ngIRCd 0.4.2, 29.04.2002
|
||||
|
||||
- LUSERS verzaehlt sich bei eigenen Server-Links nicht mehr.
|
||||
- QUIT wird nun auch von noch nicht registrierten Clients akzeptiert.
|
||||
- IRC-Funktion LIST implementiert; bisher werden allerdings noch keine
|
||||
Regular Expressions (bis auf "*") unterstuetzt.
|
||||
|
||||
ngIRCd 0.4.1, 08.04.2002
|
||||
|
||||
- Bei Server-Links wird nicht mehr an Hand der Anzahl der Parameter
|
||||
eines empfangenen SERVER-Befehls, sondern "intern" erkannt, ob es
|
||||
sich um eine ein- oder ausgehende Verbindung handelt und somit das
|
||||
eigene PASS-SERVER-Paar gesendet werden muss oder nicht. Da sich
|
||||
verschiedene Versionen des Original-ircd's anders verhalten, schlug
|
||||
die Anmeldung je nach Gehenseite evtl. fehl.
|
||||
- Bei einem NICK-Befehl eines lokalen Client konnte der Server ab-
|
||||
stuerzen, da ein Format-String einer Log-Meldung fehlerhaft war.
|
||||
|
||||
ngIRCd 0.4.0, 01.04.2002
|
||||
|
||||
- IRC-Befehle nochmal auf weitere Source-Dateien aufgespalten.
|
||||
- WHO implementiert (bisher ohne komplette Unterstuetzung von Masks).
|
||||
- Der AWAY-Mode wurde nicht ueber mehrere Server-Links weitergegeben.
|
||||
- stderr wird nun in eine Datei umgelenkt (/tmp/ngircd-<PID>.err).
|
||||
Laeuft der Server nicht im Debug-Modus, so wird diese bei Programm-
|
||||
ende geloescht. Sollte der Server abstuerzen, finden sich hier evtl.
|
||||
zusaetzliche Informationen.
|
||||
- In Nicknames wird das Zeichen "-" nun als zulaessig erkannt.
|
||||
- die Beispiel-Konfigurationsdatei (doc/sample-ngircd.conf) wird als
|
||||
ngircd.conf installiert, wenn noch keine "echte" Konfigurationsdatei
|
||||
vorhanden ist.
|
||||
- bei WHO, WHOIS und NAMES wird nun nur noch der Status "Operator" oder
|
||||
"voiced" geliefert -- nicht mehr beides.
|
||||
- Server-Gruppen implementiert: es wird immer nur zu einem Server in
|
||||
einer Gruppe eine Verbindung aufgebaut, klappt es beim ersten Server
|
||||
nicht, so wird der naechste probiert (Variable "Group" in der Kon-
|
||||
figurationsdatei, Sektion [Server]).
|
||||
- IRC_PING() ist, wenn nicht im "strict RFC"-Mode, toleranter und ak-
|
||||
zeptiert beliebig viele Parameter (z.B. BitchX sendet soetwas).
|
||||
- die "Portab-Header" werden nicht mehr benoetigt, die System-Erkennung
|
||||
wird nun ausschliesslich vom configure-Script durchgefuehrt. System-
|
||||
abhaengige Definitionen finden sich nun unter src/portrab/.
|
||||
- Clients und Channels werden nicht mehr ueber ihren Namen, sondern
|
||||
einen Hash-Wert gesucht: sollte deutlich schneller sein.
|
||||
- neuer Kommandozeilen-Parameter "--configtest": die Konfiguration wird
|
||||
gelesen und dann die verwendeten Werte angezeigt.
|
||||
- Client-Mode "s" (Server Notices) implementiert.
|
||||
- mit dem neuen Kommandozeilen-Parameter "--config"/"-f" kann eine
|
||||
alternative Konfigurationsdatei angegeben werden.
|
||||
- nach dem Start kann der ngIRCd, wenn er mit root-Rechten laeuft,
|
||||
zu einer anderen User-ID und Group-ID wechseln.
|
||||
- URL der Homepage wird u.a. bei "--version" mit angezeigt.
|
||||
|
||||
ngIRCd 0.3.0, 02.03.2002
|
||||
|
||||
- bekommt der Server ein HUP-Signal, so startet er neu -- genau so, wie
|
||||
er auf den IRC-Befehl RESTART reagiert.
|
||||
- FAQ um Hinweise auf den Bugtracker erweitert.
|
||||
- neuer Kommandozeilen-Schalter "--passive" (-p): wird er angegeben, so
|
||||
verbindet sich der ngIRCd nicht mehr automatisch zu anderen Servern.
|
||||
Zum Debuggen manchmal ganz praktisch :-)
|
||||
- direkt nach dem Start schreibt der ngIRCd nun die aktiven Kommando-
|
||||
zeilenschalter in's Logfile (Passive, Debug, Sniffer ...).
|
||||
- das Signal-Flag SA_RESTART wird nur noch gesetzt, wenn es auf dem
|
||||
jeweiligen System auch definiert ist.
|
||||
- bei ausgehenden Verbindungen wird nun der Ziel-Port protokolliert.
|
||||
- neue Befehle VERSION und KILL implementiert.
|
||||
- make-Target "check" (und "distcheck") mit Sinn erfuellt :-)
|
||||
(die Tests sind aber bisher nicht all zu tiefgehend ...)
|
||||
- Durch einen Ueberlauf konnte die Idle-Time bei WHOIS negativ werden ...
|
||||
- Anpassungen an A/UX: gehoert nun auch zu den unterstuetzten Platformen.
|
||||
- WHOIS wird nicht mehr automatisch an den "Original-Server" weiterge-
|
||||
leitet: war eh nicht RFC-konform und machte mit Clients Probleme.
|
||||
- an User wird nun immer ein "komplettes" Prefix (mit Host-Mask) ver-
|
||||
schickt, Server bekommen nach wie vor kurze: das "Original" hat bei
|
||||
bestimmten Befehlen (PRIVMSG) ansonsten evtl. Probleme ...
|
||||
- NAMES korrigiert und vollstaendig implementiert.
|
||||
- SQUIT wird auf jeden Fall geforwarded, zudem besseres Logging.
|
||||
- Ist ein Nick bei der User-Registrierung bereits belegt, nimmt der
|
||||
Server nun korrekt weitere NICK-Befehle an und verwendet diese.
|
||||
- PRIVMSG beachtet nun die Channel-Modes "n" und "m".
|
||||
- AWAY implementiert. PRIVMSG, MODE, USERHOST und WHOIS angepasst.
|
||||
- der ngIRCd unterstuetzt nun Channel-Topics (TOPIC-Befehl).
|
||||
- ausgehende Server-Verbindungen werden nun asyncron connectiert und
|
||||
blockieren nicht mehr den ganzen Server, wenn die Gegenseite nicht
|
||||
erreicht werden kann (bis zum Timeout konnten Minuten vergehen!).
|
||||
- Wert der Konfigurations-Variable "ConnectRetry" wird besser beachtet.
|
||||
- Channel- und Nicknames werden nun ordentlich validiert.
|
||||
|
||||
ngIRCd 0.2.1, 17.02.2002
|
||||
|
||||
- NICK korrigiert: es werden nun auch alle "betroffenen" User informiert.
|
||||
- configure-Script erweitert, u.a. bessere Anpassung an BeOS: dort wird
|
||||
nun die "libbe" zum ngIRCd gelinkt, somit funktioniert auch syslog.
|
||||
- Fehlerhafte bzw. noch nicht verstandene Modes werden nun ausfuehrlicher
|
||||
an den Client geliefert.
|
||||
|
||||
ngIRCd 0.2.0, 15.02.2002
|
||||
|
||||
- Nicknames und Channel-Namen werden etwas besser auf Gueltigkeit ueber-
|
||||
@@ -95,4 +192,4 @@ ngIRCd 0.0.1, 31.12.2001
|
||||
|
||||
|
||||
--
|
||||
$Id: ChangeLog,v 1.17 2002/02/15 14:35:55 alex Exp $
|
||||
$Id: ChangeLog,v 1.54.2.5 2002/04/29 14:10:59 alex Exp $
|
||||
|
||||
@@ -8,24 +8,29 @@
|
||||
der GNU General Public License.
|
||||
|
||||
-- INSTALL / Installation --
|
||||
|
||||
Ilja Osthoff, <ilja@glide.ath.cx>
|
||||
|
||||
|
||||
ngIRCd ist fuer UNIXoide-Systeme konzipiert. Dieser Text beschreibt den
|
||||
"Standardfall": ein UNIX bzw. UNIX-aehnliches System, das von GNU automake
|
||||
und GNU autoconf ("configure") unterstuetzt wird.
|
||||
I. Standard-Installation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
ngIRCd ist fuer UNIXoide-Systeme konzipiert worden, das bedeutet, dass die
|
||||
Installation auf einem modernen UNIX-aehnlichen System kein Problem dar-
|
||||
stellen sollte. Das System muss nur von GNU automake und GNU autoconf
|
||||
("configure") unterstuetzt werden.
|
||||
|
||||
Die Standard-Installation sieht so aus:
|
||||
|
||||
1) tar xzf ngircd-<Version>.tar.gz
|
||||
2) cd ngircd-<Version>
|
||||
3) ./autogen.sh [nur erforderlich, wenn ueber CVS bezogen]
|
||||
4) ./configure
|
||||
5) make
|
||||
6) make install
|
||||
|
||||
|
||||
I. Quick Start
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
In der Regel sind folgende Schritte ausreichend:
|
||||
|
||||
1) ./autogen.sh [nur erforderlich, wenn ueber CVS bezogen]
|
||||
2) ./configure
|
||||
3) make
|
||||
|
||||
|
||||
zu 1) autogen.sh:
|
||||
zu 3): "autogen.sh"
|
||||
|
||||
Der erste Schritt, autogen.sh, ist nur notwendig, wenn das configure-Script
|
||||
noch nicht vorhanden ist. Dies ist nie bei offiziellen ("stabilen") Versionen
|
||||
@@ -42,7 +47,7 @@ Versionen!) benoetigt.
|
||||
(nochmal: "Endanwender" mussen diesen Schritt i.d.R. nicht ausfuehren!)
|
||||
|
||||
|
||||
zu 2) ./configure:
|
||||
zu 4): "./configure"
|
||||
|
||||
Mit dem configure-Script wird ngIRCd, wie GNU Software meistens, an das
|
||||
lokale System angepasst und die erforderlichen Makefile's erzeugt.
|
||||
@@ -52,14 +57,26 @@ erkennen und entsprechend reagieren. Sollte dies einmal nicht der Fall sein,
|
||||
so zeigt "./configure --help" moegliche Optionen.
|
||||
|
||||
|
||||
zu 3) make:
|
||||
zu 5): "make"
|
||||
|
||||
Der make-Befehl bearbeitet die vom configure-Script erzeugten Makefile's und
|
||||
uebersetzt die comBase-Library und die Testprogramme.
|
||||
uebersetzt den ngIRCd.
|
||||
|
||||
|
||||
II. Nuetzliche make-Targets
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
zu 6): "make install"
|
||||
|
||||
Mit "make install" wird der Server und ggf. eine Beispiels-Konfiguration
|
||||
im System installiert; hierzu sind in der Regel root-Rechte erforderlich.
|
||||
Eine bereits vorhandene Konfigurationsdatei wird nie ueberschrieben.
|
||||
|
||||
Folgende Dateien werden installiert:
|
||||
|
||||
- /usr/local/sbin/ngircd: ausfuehrbarer Server
|
||||
- /usr/local/etc/ngircd.conf: Beispiel-Konfiguration, wenn nicht vorhanden
|
||||
|
||||
|
||||
III. Nuetzliche make-Targets
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Die vom configure-Script erzeugten Makefile's enthalten immer die folgenden
|
||||
nuetzlichen Targets:
|
||||
@@ -73,3 +90,53 @@ nuetzlichen Targets:
|
||||
- maintainer-clean: alle automat. erzeugten Dateien loeschen.
|
||||
Naechster Schritt: -> ./autogen.sh
|
||||
|
||||
|
||||
|
||||
IV. Konfigurationsdatei ngircd.conf
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
In der Konfigurationsdatei werden Kommentare durch "#" oder durch ";"
|
||||
eingeleitet. Dieses dient nur der besseren Lesbarkeit.
|
||||
|
||||
Die Datei ist in drei Abschnitte unterteilt: [Global], [Operator] und
|
||||
[Server]. Im [Global]-Teil werden die grundlegenden Einstellungen vor-
|
||||
genommen, z.B. der Server-Name und die Ports, auf denen er Verbindungen
|
||||
annehmen soll. In [Operator]-Abschnitten werden Server-Operatoren fest-
|
||||
gelegt und unter [Server] werden die Einstellungen fuer die Verbindung
|
||||
mit anderen Servern konfiguriert.
|
||||
|
||||
Die Bedeutung der einzelnen Variablen ist in der Beispiel-Konfiguration
|
||||
"doc/sample-ngircd.conf" erklaert, die bei "make install" auch als
|
||||
"ngircd.conf" in /usr/local/etc installiert wird, wenn dort noch keine
|
||||
Konfigurationsdatei vorhanden ist.
|
||||
|
||||
|
||||
V. Kommandozeilen-Optionen
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Folgende Parameter koennen dem ngIRCd u.a. uebergeben werden:
|
||||
|
||||
-f, --config <file>
|
||||
Der Daemon wird angewiesen, statt der Standard-Konfigurationsdatei
|
||||
/usr/local/etc/ngircd.conf die Datei <file> einzulesen.
|
||||
|
||||
-n, --nodaemon
|
||||
ngIRCd soll im Fordergrund laufen; alle Meldungen werden zusaetzlich
|
||||
zum Syslog auch auf der Konsole ausgegeben.
|
||||
|
||||
-p, --passive
|
||||
Verbindungen zu anderen Servern (wie in der Konfigurationsdatei in
|
||||
[Server]-Abschnitten definiert) werden nicht automatisch hergestellt.
|
||||
|
||||
--configtest
|
||||
Die Konfigurationsdatei wird eingelesen, ueberprueft und so aus-
|
||||
gegeben, wie sie vom ngIRCd interpretiert wurde. Danach beendet
|
||||
sich der Server wieder.
|
||||
|
||||
Mit dem Parameter "--help" werden alle unterstuetzten Parameter angezeigt,
|
||||
mit "--version" die Versionsnummer. Bei beiden Parametern beendet sich der
|
||||
Server nach der Ausgabe wieder.
|
||||
|
||||
|
||||
--
|
||||
$Id: INSTALL,v 1.6.2.1 2002/05/08 15:47:06 alex Exp $
|
||||
|
||||
+1
-12
@@ -9,18 +9,7 @@
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.3 2002/01/02 02:40:15 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.3 2002/01/02 02:40:15 alex
|
||||
# - Copyright-Texte ergaenzt und aktualisiert,
|
||||
# - fehlende Dateien in Projekt aufgenommen.
|
||||
#
|
||||
# Revision 1.2 2001/12/31 16:02:12 alex
|
||||
# - Projektdateien von Mac OS X werden nun auch in die Distribution aufgenommen.
|
||||
#
|
||||
# Revision 1.1 2001/12/12 17:21:58 alex
|
||||
# - Projektdatei fuer den Mac OS X Project Builder erstellt.
|
||||
# $Id: Makefile.am,v 1.4 2002/03/12 14:37:51 alex Exp $
|
||||
#
|
||||
|
||||
SUBDIRS = ngircd.pbproj
|
||||
|
||||
@@ -9,15 +9,7 @@
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.2 2002/01/02 02:40:15 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.2 2002/01/02 02:40:15 alex
|
||||
# - Copyright-Texte ergaenzt und aktualisiert,
|
||||
# - fehlende Dateien in Projekt aufgenommen.
|
||||
#
|
||||
# Revision 1.1 2001/12/31 16:02:12 alex
|
||||
# - Projektdateien von Mac OS X werden nun auch in die Distribution aufgenommen.
|
||||
# $Id: Makefile.am,v 1.3 2002/03/12 14:37:51 alex Exp $
|
||||
#
|
||||
|
||||
EXTRA_DIST = project.pbxproj
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
projectDirPath = "";
|
||||
targets = (
|
||||
08FB779FFE84155DC02AAC07,
|
||||
F538241E024F89BC01A85B04,
|
||||
);
|
||||
};
|
||||
08FB7794FE84155DC02AAC07 = {
|
||||
@@ -67,7 +68,6 @@
|
||||
F51F791401DFD0DE01D13771,
|
||||
F56D8B9E01E0BFA00155ADA7,
|
||||
F52162B301C7B904012300F4,
|
||||
F52162C201C7B904012300F4,
|
||||
F52162C301C7B904012300F4,
|
||||
F52162C401C7B904012300F4,
|
||||
F52162C501C7B904012300F4,
|
||||
@@ -94,13 +94,13 @@
|
||||
HEADER_SEARCH_PATHS = "";
|
||||
INSTALL_PATH = "$(HOME)/bin";
|
||||
LIBRARY_SEARCH_PATHS = "";
|
||||
OTHER_CFLAGS = "";
|
||||
OTHER_CFLAGS = "-DLOCALSTATEDIR=\\\\\\\"/usr/local/var\\\\\\\" -DSYSCONFDIR=\\\\\\\"/usr/local/etc\\\\\\\"";
|
||||
OTHER_LDFLAGS = "";
|
||||
OTHER_REZFLAGS = "";
|
||||
PRODUCT_NAME = ngircd;
|
||||
REZ_EXECUTABLE = YES;
|
||||
SECTORDER_FLAGS = "";
|
||||
WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
|
||||
WARNING_CFLAGS = "-Wall";
|
||||
};
|
||||
dependencies = (
|
||||
);
|
||||
@@ -114,8 +114,6 @@
|
||||
08FB77A0FE84155DC02AAC07 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
F52162CC01C7B904012300F4,
|
||||
F52162CD01C7B904012300F4,
|
||||
F52162CE01C7B904012300F4,
|
||||
F52162CF01C7B904012300F4,
|
||||
F52162D001C7B904012300F4,
|
||||
@@ -128,6 +126,16 @@
|
||||
F576ABFC01D5E77301A85B03,
|
||||
F576ABFF01D61D7401A85B03,
|
||||
F51F791301DFC95301D13771,
|
||||
F51DBB15022D95E801A85B04,
|
||||
F51DBB19022D995501A85B04,
|
||||
F51DBB1D022D9D8F01A85B04,
|
||||
F57C88870232853501A85B04,
|
||||
F57C888B0232884501A85B04,
|
||||
F57C888F02328D7201A85B04,
|
||||
F5F18138023EC63701A85B04,
|
||||
F5F18139023EC63701A85B04,
|
||||
F5F1813A023EC63701A85B04,
|
||||
F55047BC0240F6E501A85B04,
|
||||
);
|
||||
isa = PBXHeadersBuildPhase;
|
||||
name = Headers;
|
||||
@@ -144,6 +152,13 @@
|
||||
F51D180701C8FDD001E11C2E,
|
||||
F576ABFD01D5E77301A85B03,
|
||||
F5263AEE01E263D201CE8F8F,
|
||||
F51DBB16022D95E801A85B04,
|
||||
F51DBB1A022D995501A85B04,
|
||||
F51DBB1E022D9D8F01A85B04,
|
||||
F57C88880232853501A85B04,
|
||||
F57C888C0232884501A85B04,
|
||||
F57C889002328D7201A85B04,
|
||||
F55047BD0240F6E501A85B04,
|
||||
);
|
||||
isa = PBXSourcesBuildPhase;
|
||||
name = Sources;
|
||||
@@ -175,6 +190,7 @@
|
||||
1AB674ADFE9D54B511CA2CBB = {
|
||||
children = (
|
||||
034768E8FF38A79811DB9C8B,
|
||||
F538241D024F89BC01A85B04,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
name = Products;
|
||||
@@ -256,6 +272,72 @@
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB13022D95E801A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-write.c";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB14022D95E801A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-write.h";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB15022D95E801A85B04 = {
|
||||
fileRef = F51DBB14022D95E801A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB16022D95E801A85B04 = {
|
||||
fileRef = F51DBB13022D95E801A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB17022D995501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-mode.c";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB18022D995501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-mode.h";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB19022D995501A85B04 = {
|
||||
fileRef = F51DBB18022D995501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB1A022D995501A85B04 = {
|
||||
fileRef = F51DBB17022D995501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB1B022D9D8F01A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-login.c";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB1C022D9D8F01A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-login.h";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB1D022D9D8F01A85B04 = {
|
||||
fileRef = F51DBB1C022D9D8F01A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB1E022D9D8F01A85B04 = {
|
||||
fileRef = F51DBB1B022D9D8F01A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51F791201DFC95301D13771 = {
|
||||
isa = PBXFileReference;
|
||||
name = defines.h;
|
||||
@@ -300,6 +382,7 @@
|
||||
F52162B801C7B904012300F4,
|
||||
F52162D801C7BAAE012300F4,
|
||||
F52162B901C7B904012300F4,
|
||||
F5F18132023EC61E01A85B04,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
name = src;
|
||||
@@ -314,7 +397,6 @@
|
||||
F52162B901C7B904012300F4 = {
|
||||
children = (
|
||||
F52162BD01C7B904012300F4,
|
||||
F52162BA01C7B904012300F4,
|
||||
F52162BE01C7B904012300F4,
|
||||
F52162BF01C7B904012300F4,
|
||||
F51D180001C8FDD001E11C2E,
|
||||
@@ -325,8 +407,22 @@
|
||||
F52162E301C7C77B012300F4,
|
||||
F52162DA01C7BCDC012300F4,
|
||||
F52162DB01C7BCDC012300F4,
|
||||
F55047BA0240F6E501A85B04,
|
||||
F55047BB0240F6E501A85B04,
|
||||
F51D180201C8FDD001E11C2E,
|
||||
F51D180301C8FDD001E11C2E,
|
||||
F57C888D02328D7201A85B04,
|
||||
F57C888E02328D7201A85B04,
|
||||
F51DBB1B022D9D8F01A85B04,
|
||||
F51DBB1C022D9D8F01A85B04,
|
||||
F51DBB17022D995501A85B04,
|
||||
F51DBB18022D995501A85B04,
|
||||
F57C88850232853501A85B04,
|
||||
F57C88860232853501A85B04,
|
||||
F57C88890232884501A85B04,
|
||||
F57C888A0232884501A85B04,
|
||||
F51DBB13022D95E801A85B04,
|
||||
F51DBB14022D95E801A85B04,
|
||||
F52162BB01C7B904012300F4,
|
||||
F52162BC01C7B904012300F4,
|
||||
F576ABFA01D5E77301A85B03,
|
||||
@@ -340,11 +436,6 @@
|
||||
path = ngircd;
|
||||
refType = 4;
|
||||
};
|
||||
F52162BA01C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
path = global.h;
|
||||
refType = 4;
|
||||
};
|
||||
F52162BB01C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
path = log.c;
|
||||
@@ -380,12 +471,6 @@
|
||||
path = tool.h;
|
||||
refType = 4;
|
||||
};
|
||||
F52162C201C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = acconfig.h;
|
||||
path = ../acconfig.h;
|
||||
refType = 2;
|
||||
};
|
||||
F52162C301C7B904012300F4 = {
|
||||
isa = PBXExecutableFileReference;
|
||||
name = autogen.sh;
|
||||
@@ -440,18 +525,6 @@
|
||||
path = ../README;
|
||||
refType = 2;
|
||||
};
|
||||
F52162CC01C7B904012300F4 = {
|
||||
fileRef = F52162C201C7B904012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162CD01C7B904012300F4 = {
|
||||
fileRef = F52162BA01C7B904012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162CE01C7B904012300F4 = {
|
||||
fileRef = F52162BC01C7B904012300F4;
|
||||
isa = PBXBuildFile;
|
||||
@@ -560,6 +633,114 @@
|
||||
path = ../doc/Makefile.am;
|
||||
refType = 2;
|
||||
};
|
||||
F538241D024F89BC01A85B04 = {
|
||||
isa = PBXExecutableFileReference;
|
||||
path = portabtest;
|
||||
refType = 3;
|
||||
};
|
||||
F538241E024F89BC01A85B04 = {
|
||||
buildPhases = (
|
||||
F538241F024F89BC01A85B04,
|
||||
F5382423024F89BC01A85B04,
|
||||
F5382425024F89BC01A85B04,
|
||||
F5382426024F89BC01A85B04,
|
||||
);
|
||||
buildSettings = {
|
||||
OTHER_CFLAGS = "";
|
||||
OTHER_LDFLAGS = "";
|
||||
OTHER_REZFLAGS = "";
|
||||
PRODUCT_NAME = portabtest;
|
||||
REZ_EXECUTABLE = YES;
|
||||
SECTORDER_FLAGS = "";
|
||||
WARNING_CFLAGS = "-Wall";
|
||||
};
|
||||
dependencies = (
|
||||
);
|
||||
isa = PBXToolTarget;
|
||||
name = portabtest;
|
||||
productInstallPath = /usr/local/bin;
|
||||
productName = portabtest;
|
||||
productReference = F538241D024F89BC01A85B04;
|
||||
shouldUseHeadermap = 0;
|
||||
};
|
||||
F538241F024F89BC01A85B04 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
F5382420024F89BC01A85B04,
|
||||
F5382421024F89BC01A85B04,
|
||||
F5382422024F89BC01A85B04,
|
||||
);
|
||||
isa = PBXHeadersBuildPhase;
|
||||
name = Headers;
|
||||
};
|
||||
F5382420024F89BC01A85B04 = {
|
||||
fileRef = F5F18134023EC63701A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5382421024F89BC01A85B04 = {
|
||||
fileRef = F5F18135023EC63701A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5382422024F89BC01A85B04 = {
|
||||
fileRef = F5F18136023EC63701A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5382423024F89BC01A85B04 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
F5382424024F89BC01A85B04,
|
||||
);
|
||||
isa = PBXSourcesBuildPhase;
|
||||
name = Sources;
|
||||
};
|
||||
F5382424024F89BC01A85B04 = {
|
||||
fileRef = F5F18137023EC63701A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5382425024F89BC01A85B04 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
name = "Frameworks & Libraries";
|
||||
};
|
||||
F5382426024F89BC01A85B04 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
isa = PBXRezBuildPhase;
|
||||
name = "ResourceManager Resources";
|
||||
};
|
||||
F55047BA0240F6E501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = hash.c;
|
||||
refType = 4;
|
||||
};
|
||||
F55047BB0240F6E501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = hash.h;
|
||||
refType = 4;
|
||||
};
|
||||
F55047BC0240F6E501A85B04 = {
|
||||
fileRef = F55047BB0240F6E501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F55047BD0240F6E501A85B04 = {
|
||||
fileRef = F55047BA0240F6E501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F56D8B9E01E0BFA00155ADA7 = {
|
||||
children = (
|
||||
F56D8B9F01E0BFA00155ADA7,
|
||||
@@ -622,6 +803,133 @@
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F57C88850232853501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-oper.c";
|
||||
refType = 4;
|
||||
};
|
||||
F57C88860232853501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-oper.h";
|
||||
refType = 4;
|
||||
};
|
||||
F57C88870232853501A85B04 = {
|
||||
fileRef = F57C88860232853501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F57C88880232853501A85B04 = {
|
||||
fileRef = F57C88850232853501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F57C88890232884501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-server.c";
|
||||
refType = 4;
|
||||
};
|
||||
F57C888A0232884501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-server.h";
|
||||
refType = 4;
|
||||
};
|
||||
F57C888B0232884501A85B04 = {
|
||||
fileRef = F57C888A0232884501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F57C888C0232884501A85B04 = {
|
||||
fileRef = F57C88890232884501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F57C888D02328D7201A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-channel.c";
|
||||
refType = 4;
|
||||
};
|
||||
F57C888E02328D7201A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-channel.h";
|
||||
refType = 4;
|
||||
};
|
||||
F57C888F02328D7201A85B04 = {
|
||||
fileRef = F57C888E02328D7201A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F57C889002328D7201A85B04 = {
|
||||
fileRef = F57C888D02328D7201A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5F18132023EC61E01A85B04 = {
|
||||
children = (
|
||||
F5F18133023EC63701A85B04,
|
||||
F5F18134023EC63701A85B04,
|
||||
F5F18135023EC63701A85B04,
|
||||
F5F18136023EC63701A85B04,
|
||||
F5F18137023EC63701A85B04,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
name = portab;
|
||||
path = /Users/alex/Develop/ngircd/src;
|
||||
refType = 0;
|
||||
};
|
||||
F5F18133023EC63701A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
name = Makefile.am;
|
||||
path = portab/Makefile.am;
|
||||
refType = 4;
|
||||
};
|
||||
F5F18134023EC63701A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
name = exp.h;
|
||||
path = portab/exp.h;
|
||||
refType = 4;
|
||||
};
|
||||
F5F18135023EC63701A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
name = imp.h;
|
||||
path = portab/imp.h;
|
||||
refType = 4;
|
||||
};
|
||||
F5F18136023EC63701A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
name = portab.h;
|
||||
path = portab/portab.h;
|
||||
refType = 4;
|
||||
};
|
||||
F5F18137023EC63701A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
name = portabtest.c;
|
||||
path = portab/portabtest.c;
|
||||
refType = 4;
|
||||
};
|
||||
F5F18138023EC63701A85B04 = {
|
||||
fileRef = F5F18134023EC63701A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5F18139023EC63701A85B04 = {
|
||||
fileRef = F5F18135023EC63701A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5F1813A023EC63701A85B04 = {
|
||||
fileRef = F5F18136023EC63701A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
};
|
||||
rootObject = 08FB7793FE84155DC02AAC07;
|
||||
}
|
||||
|
||||
+5
-19
@@ -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-
|
||||
|
||||
@@ -10,6 +10,39 @@
|
||||
-- NEWS / Neuigkeiten --
|
||||
|
||||
|
||||
ngIRCd 0.4.0, 01.04.2002
|
||||
|
||||
- WHO implementiert (bisher ohne komplette Unterstuetzung von Masks).
|
||||
- stderr wird nun in eine Datei umgelenkt (/ngircd-<PID>.err).
|
||||
Laeuft der Server nicht im Debug-Modus, so wird diese bei Programm-
|
||||
ende geloescht. Sollte der Server abstuerzen, finden sich hier evtl.
|
||||
zusaetzliche Informationen.
|
||||
- Server-Gruppen implementiert: es wird immer nur zu einem Server in
|
||||
einer Gruppe eine Verbindung aufgebaut, klappt es beim ersten Server
|
||||
nicht, so wird der naechste probiert.
|
||||
- Clients und Channels werden nicht mehr ueber ihren Namen, sondern
|
||||
einen Hash-Wert gesucht: sollte deutlich schneller sein.
|
||||
- neuer Kommandozeilen-Parameter "--configtest": die Konfiguration wird
|
||||
gelesen und die dann verwendeten Werte angezeigt.
|
||||
- Client-Mode "s" (Server Notices) implementiert.
|
||||
- mit dem neuen Kommandozeilen-Parameter "--config"/"-f" kann eine
|
||||
alternative Konfigurationsdatei angegeben werden.
|
||||
- nach dem Start kann der ngIRCd, wenn er mit root-Rechten laeuft,
|
||||
zu einer anderen User-ID und Group-ID wechseln.
|
||||
|
||||
ngIRCd 0.3.0, 02.03.2002
|
||||
|
||||
- bekommt der Server ein HUP-Signal, so startet er neu -- genau so, wie
|
||||
er auf den IRC-Befehl RESTART reagiert.
|
||||
- neuer Kommandozeilen-Schalter "--passive" (-p): wird er angegeben, so
|
||||
verbindet sich der ngIRCd nicht mehr automatisch zu anderen Servern.
|
||||
Zum Debuggen manchmal ganz praktisch :-)
|
||||
- neue Befehle VERSION und KILL implementiert. NAMES korrigiert.
|
||||
- Anpassungen an A/UX: gehoert nun auch zu den unterstuetzten Platformen.
|
||||
- AWAY (und der User-Mode 'a') ist nun implementiert.
|
||||
- der ngIRCd unterstuetzt nun Channel-Topics (TOPIC-Befehl).
|
||||
- Channel- und Nicknames werden nun ordentlich validiert.
|
||||
|
||||
ngIRCd 0.2.0, 15.02.2002
|
||||
|
||||
- Begonnen Channel-Modes und User-Channel-Modes zu implementieren: der
|
||||
@@ -52,4 +85,4 @@ ngIRCd 0.0.1, 31.12.2001
|
||||
|
||||
|
||||
--
|
||||
$Id: NEWS,v 1.10 2002/02/15 14:35:55 alex Exp $
|
||||
$Id: NEWS,v 1.25.2.3 2002/04/01 17:18:03 alex Exp $
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
@@ -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.4 2002/01/29 00:17:39 alex Exp $
|
||||
$Id: README,v 1.8 2002/03/21 23:25:15 alex Exp $
|
||||
|
||||
-49
@@ -1,49 +0,0 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: acconfig.h,v 1.7 2002/01/02 02:52:09 alex Exp $
|
||||
*
|
||||
* $Log: acconfig.h,v $
|
||||
* Revision 1.7 2002/01/02 02:52:09 alex
|
||||
* - Copyright-Texte angepasst ;-)
|
||||
*
|
||||
* Revision 1.6 2001/12/31 02:21:00 alex
|
||||
* - "doc"-Unterverzeichnis aufgenommen.
|
||||
*
|
||||
* Revision 1.5 2001/12/29 03:04:35 alex
|
||||
* - neue configure-Option "--enable-strict-rfc", #define STRICT_RFC.
|
||||
*
|
||||
* Revision 1.4 2001/12/27 01:44:49 alex
|
||||
* - die Verwendung von syslog kann nun abgeschaltet werden.
|
||||
*
|
||||
* Revision 1.3 2001/12/25 22:01:47 alex
|
||||
* - neue configure-Option "--enable-sniffer".
|
||||
*
|
||||
* Revision 1.2 2001/12/21 23:54:15 alex
|
||||
* - zusaetzliche Debug-Ausgaben koennen eingeschaltet werden.
|
||||
*
|
||||
* Revision 1.1 2001/12/12 01:58:52 alex
|
||||
* - Test auf socklen_t verbessert.
|
||||
*/
|
||||
|
||||
|
||||
#undef HAVE_socklen_t
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#undef SNIFFER
|
||||
|
||||
#undef USE_SYSLOG
|
||||
|
||||
#undef STRICT_RFC
|
||||
|
||||
|
||||
/* -eof- */
|
||||
+1
-8
@@ -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
|
||||
|
||||
Vendored
+1321
File diff suppressed because it is too large
Load Diff
Vendored
+1443
File diff suppressed because it is too large
Load Diff
+53
-111
@@ -9,90 +9,28 @@
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
#
|
||||
# $Id: configure.in,v 1.24 2002/02/15 14:35:55 alex Exp $
|
||||
#
|
||||
# $Log: configure.in,v $
|
||||
# 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.4 2002/04/29 14:11:09 alex Exp $
|
||||
#
|
||||
|
||||
# -- Initialisierung --
|
||||
|
||||
AC_INIT
|
||||
AC_CONFIG_SRCDIR(src/ngircd/ngircd.c)
|
||||
AM_INIT_AUTOMAKE(ngircd,0.2.0)
|
||||
AC_CANONICAL_TARGET
|
||||
AC_CONFIG_SRCDIR(src/config.h.in)
|
||||
AM_INIT_AUTOMAKE(ngircd,0.4.2)
|
||||
AM_CONFIG_HEADER(src/config.h)
|
||||
|
||||
# -- Variablen --
|
||||
# -- Templates fuer config.h --
|
||||
|
||||
AH_TEMPLATE([DEBUG], [Define if debug-mode should be enabled])
|
||||
AH_TEMPLATE([HAVE_socklen_t], [Define if socklen_t exists])
|
||||
AH_TEMPLATE([SNIFFER], [Define if IRC sniffer should be enabled])
|
||||
AH_TEMPLATE([STRICT_RFC], [Define if ngIRCd should behave strict RFC compliant])
|
||||
AH_TEMPLATE([USE_SYSLOG], [Define if syslog should be used for logging])
|
||||
|
||||
AH_TEMPLATE([TARGET_OS], [Target operating system name])
|
||||
AH_TEMPLATE([TARGET_VENDOR], [Target system vendor])
|
||||
AH_TEMPLATE([TARGET_CPU], [Target CPU name])
|
||||
|
||||
# -- C Compiler --
|
||||
|
||||
@@ -113,38 +51,13 @@ AC_HEADER_STDC
|
||||
|
||||
AC_HEADER_TIME
|
||||
|
||||
AC_ARG_WITH(portab,
|
||||
[ --with-portab=DIR search the "portab headers" in DIR],
|
||||
[ if test "x$withval" != "xno"; then
|
||||
CFLAGS="$CFLAGS -I${withval}"
|
||||
if test -f ${withval}/portab.h; then
|
||||
AC_MSG_RESULT([searching "portab headers" in ${withval}...])
|
||||
else
|
||||
AC_MSG_ERROR([${withval}/portab.h not found!])
|
||||
fi
|
||||
else
|
||||
AC_MSG_ERROR([Can't disable Alex \"portability headers\"!])
|
||||
fi
|
||||
],
|
||||
[ AC_CHECK_HEADER(portab.h,[
|
||||
AC_CHECK_HEADER(imp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
|
||||
AC_CHECK_HEADER(exp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
|
||||
],[
|
||||
AC_CHECK_HEADER(/usr/local/include/portab.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
|
||||
AC_CHECK_HEADER(/usr/local/include/imp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
|
||||
AC_CHECK_HEADER(/usr/local/include/exp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
|
||||
CFLAGS="$CFLAGS -I/usr/local/include"
|
||||
])
|
||||
]
|
||||
)
|
||||
AC_CHECK_HEADERS(arpa/inet.h)
|
||||
|
||||
AC_CHECK_HEADERS([ \
|
||||
errno.h fcntl.h netinet/in.h string.h \
|
||||
sys/socket.h sys/time.h unistd.h \
|
||||
errno.h fcntl.h netdb.h netinet/in.h stdlib.h string.h \
|
||||
sys/socket.h sys/time.h sys/wait.h unistd.h \
|
||||
],,AC_MSG_ERROR([required C header missing!]))
|
||||
|
||||
AC_CHECK_HEADERS(arpa/inet.h)
|
||||
|
||||
# -- Datentypen --
|
||||
|
||||
AC_MSG_CHECKING(whether socklen_t exists)
|
||||
@@ -160,30 +73,44 @@ AC_TRY_COMPILE([
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
|
||||
# -- Libraries --
|
||||
|
||||
AC_CHECK_LIB(UTIL,memmove)
|
||||
|
||||
# -- Funktionen --
|
||||
|
||||
AC_FUNC_MALLOC
|
||||
|
||||
AC_CHECK_FUNCS([ \
|
||||
gethostname inet_ntoa memmove memset select \
|
||||
socket strcasecmp strchr strerror strstr waitpid \
|
||||
bind gethostbyaddr gethostbyname gethostname inet_ntoa memmove \
|
||||
memset select setsockopt socket strcasecmp strchr strerror strftime \
|
||||
strstr vsnprintf waitpid \
|
||||
],,AC_MSG_ERROR([required function missing!]))
|
||||
|
||||
AC_CHECK_FUNCS(inet_aton)
|
||||
|
||||
# -- Libraries --
|
||||
AC_CHECK_FUNCS(sigaction)
|
||||
|
||||
# -- Konfigurationsoptionen --
|
||||
|
||||
AC_ARG_ENABLE(syslog,
|
||||
[ --disable-syslog disable syslog (autodetected by default)],
|
||||
[ if test "$enableval" = "yes"; then
|
||||
AC_CHECK_HEADER(syslog.h,AC_DEFINE(USE_SYSLOG, 1),AC_MSG_ERROR([Can't enable syslog: syslog.h not found!]))
|
||||
AC_CHECK_HEADER(syslog.h,
|
||||
[ AC_DEFINE(USE_SYSLOG, 1)
|
||||
AC_CHECK_LIB(be,syslog)
|
||||
],
|
||||
AC_MSG_ERROR([Can't enable syslog: syslog.h not found!])
|
||||
)
|
||||
else
|
||||
AC_MSG_RESULT([disabling syslog])
|
||||
fi
|
||||
],
|
||||
[ AC_CHECK_HEADER(syslog.h,AC_DEFINE(USE_SYSLOG, 1))
|
||||
[ AC_CHECK_HEADER(syslog.h,
|
||||
[ AC_DEFINE(USE_SYSLOG, 1)
|
||||
AC_CHECK_LIB(be,syslog)
|
||||
]
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
@@ -213,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([ \
|
||||
@@ -227,6 +168,7 @@ AC_OUTPUT([ \
|
||||
MacOSX/Makefile \
|
||||
MacOSX/ngircd.pbproj/Makefile \
|
||||
src/Makefile \
|
||||
src/portab/Makefile \
|
||||
src/ngircd/Makefile \
|
||||
])
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd ist freie Software und steht unter
|
||||
der GNU General Public License.
|
||||
|
||||
-- CC-Speed.txt --
|
||||
|
||||
|
||||
ngIRCd-0.2.1-pre (2002-02-25):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
[nach make-Zeiten sortiert]
|
||||
|
||||
Intel PIII, 1 GHz, 256 MB Ram, FreeBSD 4.4: configure: 00:10, make: 00:05
|
||||
Intel PIII, 1 GHz, 256 MB Ram, Linux 2.4.10: configure: 00:06, make: 00:06
|
||||
Intel PIII, 1 GHz, 256 MB Ram, BeOS R5: configure: 00:19, make: 00:07
|
||||
Intel PIII, 1 GHz, 256 MB Ram, Win2k+CygWin: configure: 00:27, make: 00:08
|
||||
AMD K6/2, 400 Mhz, 256 MB Ram, Linux 2.4.12: configure: 00:14, make: 00:12
|
||||
PowerMac G4, 400 Mhz, 768 MB Ram, Mac OS X 10.1.2: configure: 00:32, make: 00:19
|
||||
Macintosh SE/30, 68030 16 MHz, 32 MB, A/UX 3.0.1: configure: 07:33, make: 12:02
|
||||
|
||||
|
||||
--
|
||||
$Id: CC-Speed.txt,v 1.1 2002/02/25 14:02:32 alex Exp $
|
||||
+44
-5
@@ -14,12 +14,51 @@ Die Sourcen des ngIRCd werden mit dem "Concurrent Versions System" (CVS)
|
||||
verwaltet. Somit koennen ohne Probleme mehrere Leute gleichzeitig die Sourcen
|
||||
bearbeitet.
|
||||
|
||||
Dieser Text soll in Zukunft die Grundlagen beschreiben. Tut er aber leider
|
||||
noch nicht, also frage einfach Alex direkt (siehe AUTHORS-Text), wenn du
|
||||
daran interessiert bist, Zugriff auf den Quellcode via CVS zu bekommen!
|
||||
|
||||
[ ... more to come ... ]
|
||||
I. Anonymer "Nur-Lesen"-Zugang
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Anonymer Zugriff auf die CVS-Repository von ngIRCd ist im "nur-lesen"-Modus
|
||||
moeglich. Dazu sind folgende Schritte noetig:
|
||||
|
||||
Beim CVS-Server anmelden
|
||||
|
||||
$ cvs -d:pserver:anonymous@arthur.ath.cx:/usr/local/CVS/ngircd login
|
||||
|
||||
Als Benutzername wird "anonymous" mit einem leeren Passwort verwendet.
|
||||
Nun ein "Check-Out" der Quellcodes durchfuehren:
|
||||
|
||||
$ cvs -d:pserver:anonymous@arthur.ath.cx:/usr/local/CVS/ngircd checkout ngircd
|
||||
|
||||
Dadurch wird im aktuellen Verzeichnis der neue Ordner "ngircd" mit allen
|
||||
Quell-Dateien des ngIRCd erzeugt.
|
||||
|
||||
Dieses ist der "Arbeitsordner", alle CVS-Befehle werden in Zukunft aus
|
||||
diesem Ordner bzw. einem Unterordner davon ausgefuehrt.
|
||||
|
||||
Wichtig: wenn ngIRCd "frisch" aus dem CVS compiliert werden soll, so
|
||||
existiert das configure-Script noch nicht. Dieses muss zunaechst mit dem
|
||||
Script "autogen.sh" erzeugt werden. Letzteres setzt ein installiertes GNU
|
||||
automake und GNU autoconf voraus!
|
||||
|
||||
CVS-Tree aktualisieren:
|
||||
|
||||
$ cvs update
|
||||
|
||||
Dieser Befehl aktualisiert alle Dateien im aktuellen Verzeichnis sowie allen
|
||||
Unterverzeichnissen.
|
||||
|
||||
$ cvs update <filename>
|
||||
|
||||
So kann eine einzelne Datei aktualisiert werden (auch dann, wenn sie lokal
|
||||
z.B. geloescht wurde -- praktisch, um eigene "Experimente" rueckgaengig zu
|
||||
machen ;-))
|
||||
|
||||
|
||||
III. Schreibzugriff
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
Wer Schreibzugriff auf die CVS-Repository wuenscht, der moege sich bitte
|
||||
mit Alex Barton, <alex@barton.de> in Verbindung setzen.
|
||||
|
||||
|
||||
--
|
||||
$Id: CVS.txt,v 1.4 2002/01/23 18:20:04 alex Exp $
|
||||
$Id: CVS.txt,v 1.5 2002/02/15 15:15:22 alex Exp $
|
||||
|
||||
+16
-1
@@ -42,5 +42,20 @@ A: Auf dem System ist eine zu alte Version von GNU autoconf installiert.
|
||||
mit dem Befehl "rpm -e autoconf").
|
||||
|
||||
|
||||
III. Bugs!?
|
||||
~~~~~~~~~~~
|
||||
Q: Gibt es eine Liste der bekannten Bugs bzw. Feature-Wuensche?
|
||||
A: Ja. Es existiert ein Bug-Tracking-System fuer den ngIRCd (Bugzilla):
|
||||
URL: <http://arthur.ath.cx/bugzilla/ngircd/>. Dort koennen Bugs ge-
|
||||
meldet und Feature-Wunsche kundgetan werden. Bekannte Bugs koennen in
|
||||
der Datenbank gesucht und aufgelistet werden.
|
||||
Einen Account zum Suchen und Melden von Bugs bzw. Feature-Wuenschen
|
||||
kannst du dir dort selber anlegen.
|
||||
|
||||
Q: Was mache ich, wenn ich einen Bug gefunden habe?
|
||||
A: Am besten traegst du ihn in das Bug-Tracking-System des ngIRCd ein:
|
||||
URL: <http://arthur.ath.cx/bugzilla/ngircd/>
|
||||
|
||||
|
||||
--
|
||||
$Id: FAQ.txt,v 1.1 2002/01/23 14:05:20 alex Exp $
|
||||
$Id: FAQ.txt,v 1.2 2002/02/19 20:05:02 alex Exp $
|
||||
|
||||
+9
-12
@@ -9,22 +9,19 @@
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.3 2002/01/02 02:40:31 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.3 2002/01/02 02:40:31 alex
|
||||
# - Copyright-Text ergaenzt.
|
||||
#
|
||||
# Revision 1.2 2001/12/31 02:45:24 alex
|
||||
# - nun werden alle generierten Dateien bei "maintainer-clean" geloescht.
|
||||
#
|
||||
# Revision 1.1 2001/12/31 02:22:29 alex
|
||||
# - Makefile.am fuer das "doc"-Verzeichnis begonnen.
|
||||
# $Id: Makefile.am,v 1.7 2002/03/30 15:33:14 alex Exp $
|
||||
#
|
||||
|
||||
EXTRA_DIST = CVS.txt RFC.txt sample-ngircd.conf
|
||||
EXTRA_DIST = CC-Speed.txt CVS.txt FAQ.txt README-AUX.txt README-BeOS.txt \
|
||||
RFC.txt sample-ngircd.conf
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
||||
install-data-hook:
|
||||
$(mkinstalldirs) $(DESTDIR)$(sysconfdir)
|
||||
if [ ! -f $(DESTDIR)$(sysconfdir)/ngircd.conf ]; then \
|
||||
$(INSTALL) -m 600 -c $(srcdir)/sample-ngircd.conf $(DESTDIR)$(sysconfdir)/ngircd.conf; \
|
||||
fi
|
||||
|
||||
# -eof-
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd ist freie Software und steht unter
|
||||
der GNU General Public License.
|
||||
|
||||
-- README-AUX.txt --
|
||||
|
||||
|
||||
Seit Version 0.2.2-pre gehoert Apple A/UX zu den offiziell unterstuetzten
|
||||
Platformen. Er ist im vollen Funktionsumfang nutzbar.
|
||||
|
||||
Folgende Software wird jedoch benoetigt:
|
||||
|
||||
- GNU C Compiler (gcc)
|
||||
Bezugsquellen:
|
||||
http://www.rezepte-im-web.de/appleux/gcc281.tar.gz
|
||||
ftp://arthur.ath.cx/pub/AUX/Software/Development/gcc-2.8.1-auxbin.tar.gz
|
||||
|
||||
- GNU make
|
||||
Bezugsquellen:
|
||||
http://www.rezepte-im-web.de/appleux/make-3.79.tar.gz
|
||||
ftp://arthur.ath.cx/pub/AUX/Software/Development/make-3.79.tar.gz
|
||||
|
||||
- GNU sed
|
||||
Bezugsquellen:
|
||||
http://www.rezepte-im-web.de/appleux/sed-3.02.tar.gz
|
||||
ftp://arthur.ath.cx/pub/AUX/Software/Tools/sed-3.02.tar.gz
|
||||
|
||||
- install (z.B. aus den GNU fileutils)
|
||||
Ein install, welches entweder so "broken" ist, dass configure das eigene
|
||||
Shell-Script waehlt, oder eines, das funktioniert. Leider ist mindestens
|
||||
ein Binary im Umlauf, das Probleme macht.
|
||||
Bezugsquelle:
|
||||
ftp://arthur.ath.cx/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz
|
||||
|
||||
- libUTIL.a
|
||||
Bezugsquellen:
|
||||
http://ftp.mayn.de/pub/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz
|
||||
ftp://arthur.ath.cx/pub/AUX/Software/Libraries/libUTIL-2.1.tar.gz
|
||||
|
||||
Nachdem diese Pakete entsprechend installiert sind, reicht ein ganz normales
|
||||
"./configure" und "make" aus, um den ngIRCd unter A/UX zu compilieren.
|
||||
|
||||
|
||||
Noch ein paar Hinweise, wenn es doch (noch) nicht klappt:
|
||||
|
||||
- auf dem System muss entweder ein install vorhanden sein, welches so
|
||||
"broken" ist, dass configure das eigene Shell-Skript waehlt, oder eben
|
||||
eines, welches funktioniert. Leider ist mindestens ein Binary im Um-
|
||||
lauf, welches Probleme verursacht. Das Binary aus folgenden GNU
|
||||
fileutils funktioniert hier aber z.B.:
|
||||
ftp://arthur.ath.cx/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz
|
||||
|
||||
- das sich im Umlauf befindende vorcompilierte Binary der alten Bash sollte
|
||||
unbedingt ausserhalb von /bin (z.B. unter /usr/local/bin) installiert
|
||||
werden. Ansonsten waehlt es das configure-Script als Shell aus, leider
|
||||
funktioniert das aber nicht.
|
||||
Das config.status-Script sollte mit der ksh als Interpreter erstellt
|
||||
worden sein (siehe erste Zeile davon!).
|
||||
|
||||
|
||||
Hier die Zeiten von Alex System (Macintosh SE/30, 32 MB, A/UX 3.0.1):
|
||||
configure: 7:33, make: 12:02
|
||||
|
||||
|
||||
--
|
||||
$Id: README-AUX.txt,v 1.1.2.2 2002/04/29 14:44:24 alex Exp $
|
||||
@@ -0,0 +1,36 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd ist freie Software und steht unter
|
||||
der GNU General Public License.
|
||||
|
||||
-- README-BeOS.txt --
|
||||
|
||||
|
||||
BeOS gehoert im Moment (noch?) nicht zu den offiziell unterstuetzten Plat-
|
||||
formen: der ngIRCd enthaelt zwar bereits einige Anpassungen an BeOS und
|
||||
compiliert auch, jedoch bricht er bei jedem Connect-Versuch eines Clients
|
||||
mit diesem Fehler ab:
|
||||
|
||||
select(): Bad file descriptor!
|
||||
|
||||
Es sieht leider so aus, als ob das select() von BeOS nicht mit File-Handles
|
||||
von Pipes verschiedener Prozesse umgehen kann: sobald der Resolver asyncron
|
||||
gestartet wird, also Pipe-Handles im select() vorhanden sind, fuehrt das zu
|
||||
obiger Meldung.
|
||||
|
||||
Theoretische "Lösung"/Workaround:
|
||||
Den Resolver unter BeOS nicht verwenden, sondern mit IP-Adressen arbeiten.
|
||||
Nachteil: der ngIRCd koennte sich nicht zu Servern verbinden, die dynamische
|
||||
Adressen benutzen -- dazu muesste er den Namen aufloesen. Ansonsten sollte
|
||||
es eigentlich zu keinen Beeintraechtigungen kommen ...
|
||||
|
||||
Also: wenn es jemand implementieren will ... ;-))
|
||||
|
||||
Vielleicht mache ich es auch irgendwann mal selber. Mal sehen.
|
||||
|
||||
--
|
||||
$Id: README-BeOS.txt,v 1.1 2002/02/25 14:02:32 alex Exp $
|
||||
+98
-12
@@ -1,22 +1,108 @@
|
||||
# $Id: sample-ngircd.conf,v 1.2 2002/01/06 16:54:05 alex Exp $
|
||||
# $Id: sample-ngircd.conf,v 1.8 2002/03/30 13:03:12 alex Exp $
|
||||
|
||||
#
|
||||
# Das ist eine Beispiel-Konfiguration fuer den ngIRCd, die an die
|
||||
# jeweiligen Beduerfnisse angepasst werden kann/muss.
|
||||
#
|
||||
# Kommentare werden mit "#" oder ";" eingeleitet.
|
||||
#
|
||||
|
||||
[Global]
|
||||
|
||||
#
|
||||
# Im [Global]-Abschnitt der Konfigurationsdatei wird der Server
|
||||
# "an sich" konfiguriert. Notwendig ist nur die Variable "Name",
|
||||
# Info ist in der Regel ebengalls anzupassen. Fuer alle uebrigen
|
||||
# Variablen koennen oft die Defaults benutzt werden.
|
||||
#
|
||||
|
||||
# Servername im IRC-Netz
|
||||
Name = irc.the.net
|
||||
|
||||
# Info-Text des Servers
|
||||
Info = Server Info Text
|
||||
Ports = 6667, 6668, 6669
|
||||
MotdFile = /usr/local/etc/ngircd.motd
|
||||
PingTimeout = 120
|
||||
PongTimeout = 10
|
||||
ConnectRetry = 60
|
||||
|
||||
# Ports, auf denen Verbindungen angenommen werden sollen. Es koennen
|
||||
# mehrere Ports mit "," getrennt angegeben werden. (Default: 6667)
|
||||
;Ports = 6667, 6668, 6669
|
||||
|
||||
# Textdatei mit der "Message of the Day" (MOTD)
|
||||
;MotdFile = /usr/local/etc/ngircd.motd
|
||||
|
||||
# User-ID, unter der der Daemon laufen soll (dazu muss der Server
|
||||
# jedoch mit root-Rechten gestartet werden).
|
||||
# ACHTUNG: Die Konfigurations- und MOTD-Datei muessen fuer diesen
|
||||
# Benutzer lesbar sein, ansonsten schlaegt ein RESTART fehl!
|
||||
;ServerUID = 65534
|
||||
|
||||
# Group-ID, zu der der Daemon wechseln soll (hierzu muss der Server
|
||||
# jedoch mit root-Rechten gestartet werden)
|
||||
;ServerGID = 65534
|
||||
|
||||
# Nach <PingTimeout> Sekunden verschickt der Server bei Inaktivitaet
|
||||
# von einem Client diesem ein PING.
|
||||
;PingTimeout = 120
|
||||
|
||||
# Antwortet ein Client, der ein PING bekam, nicht innerhalb von
|
||||
# <PongTimeout> Sekunden mit einem PONG, so wird er disconnectiert.
|
||||
;PongTimeout = 20
|
||||
|
||||
# Der Server versucht alle <ConnectRetry> Sekunden, noch nicht bzw.
|
||||
# nicht mehr connectierte Server-Links aufzubauen.
|
||||
;ConnectRetry = 60
|
||||
|
||||
|
||||
[Operator]
|
||||
; Name = TheOper
|
||||
; Password = ThePwd
|
||||
|
||||
#
|
||||
# Mit einem [Operator]-Block wird der Name und das Passwort eines
|
||||
# IRC-Operators konfiguriert. Es darf mehrere [Operator]-Bloecke
|
||||
# geben (fuer jeden Operator einen).
|
||||
#
|
||||
|
||||
# ID des IRC-Operators (muss nicht mit dem Nick identisch sein).
|
||||
;Name = TheOper
|
||||
|
||||
# Passwort des IRC-Operators
|
||||
;Password = ThePwd
|
||||
|
||||
|
||||
[Server]
|
||||
; Host = host2.the.net
|
||||
; Name = irc2.the.net
|
||||
; Port = 6666
|
||||
; Password = ThePwd
|
||||
|
||||
#
|
||||
# In [Server]-Bloecken werden Server konfiguriert, zu denen dieser
|
||||
# Server sich verbinden soll bzw. von denen Verbindungen angekommen
|
||||
# werden duerfen.
|
||||
# Es koennen mehrere Server konfiguriert werden, d.h. [Server]-
|
||||
# Bloecke koennen mehrfach vorkommen.
|
||||
# Ist fuer einen Server ein Port konfiguriert, so versucht dieser
|
||||
# Server die Gegenseite zu connectieren. Ist kein Port vorgegeben,
|
||||
# so wartet dieser Server auf eine Verbindung der Gegenseite.
|
||||
#
|
||||
# Server-Gruppen:
|
||||
# Fuer jeden Server kann (optinal!) eine Gruppe konfiguriert werden,
|
||||
# zu der er gehoert (wird nur beachtet, wenn ein Port konfiguriert
|
||||
# ist!): eine solche Server-Gruppe wird quasi als ein Server ange-
|
||||
# sehen, der ngIRCd baut also nur eine Verbindung auf. Schlaegt die
|
||||
# Verbindung zu einem Server in einer Gruppe fehl, so wird der
|
||||
# naechste Server in der Gruppe probiert.
|
||||
#
|
||||
|
||||
# Hostname des Servers
|
||||
;Host = connect-to-host.the.net
|
||||
|
||||
# IRC-Name des Servers
|
||||
;Name = irc2.the.net
|
||||
|
||||
# Port, zu dem dieser Server eine Verbindung herstellen soll. Wird
|
||||
# kein Port angegeben, so wird auf eine Verbindung der Gegenseite
|
||||
# gewartet.
|
||||
;Port = 6666
|
||||
|
||||
# Passwort fuer diese Verbindung
|
||||
;Password = ThePwd1
|
||||
|
||||
# Gruppe, zu der dieser Server gehoert (optional).
|
||||
;Group = 123
|
||||
|
||||
# -eof-
|
||||
|
||||
+2
-9
@@ -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
|
||||
|
||||
+38
-38
@@ -9,51 +9,51 @@
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.10 2002/01/02 02:43:50 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.10 2002/01/02 02:43:50 alex
|
||||
# - Copyright-Text ergaenzt bzw. aktualisiert.
|
||||
#
|
||||
# Revision 1.9 2001/12/31 02:18:51 alex
|
||||
# - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
# - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
# - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
#
|
||||
# Revision 1.8 2001/12/30 19:25:03 alex
|
||||
# - in "noinst_HEADERS" waren einige Dateien als .c anstelle .h aufgefuehrt.
|
||||
#
|
||||
# Revision 1.7 2001/12/27 00:37:07 alex
|
||||
# - Erkennung der "portab header" geaendert, CFLAGS werden nun anders gesetzt.
|
||||
#
|
||||
# Revision 1.6 2001/12/23 21:53:54 alex
|
||||
# - Header messages.h eingefuegt.
|
||||
#
|
||||
# Revision 1.5 2001/12/21 22:25:30 alex
|
||||
# - neues Modul "parse" eingebunden.
|
||||
#
|
||||
# Revision 1.4 2001/12/14 08:14:03 alex
|
||||
# - neue Module (irc, client, channel) aufgenommen.
|
||||
#
|
||||
# Revision 1.3 2001/12/13 02:03:33 alex
|
||||
# - beim Compilieren werden nun Informationen fuer den Debugger erzeugt.
|
||||
#
|
||||
# Revision 1.2 2001/12/12 17:20:02 alex
|
||||
# - neue Sourcefiles und Header ergaenzt.
|
||||
#
|
||||
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
# - Imported sources to CVS.
|
||||
# $Id: Makefile.am,v 1.19 2002/03/29 22:52:12 alex Exp $
|
||||
#
|
||||
|
||||
AM_CFLAGS = -I$(srcdir)/../portab
|
||||
|
||||
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN
|
||||
|
||||
sbin_PROGRAMS = ngircd
|
||||
|
||||
ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c irc.c log.c \
|
||||
parse.c tool.c
|
||||
ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c hash.c irc.c \
|
||||
irc-channel.c irc-login.c irc-mode.c irc-oper.c irc-server.c \
|
||||
irc-write.c log.c parse.c tool.c
|
||||
|
||||
noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h irc.h log.h \
|
||||
parse.h tool.h global.h messages.h defines.h
|
||||
noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h hash.h irc.h \
|
||||
irc-channel.h irc-login.h irc-mode.h irc-oper.h irc-server.h \
|
||||
irc-write.h log.h parse.h tool.h \
|
||||
messages.h defines.h
|
||||
|
||||
clean-local:
|
||||
rm -f check-version check-help lint.out
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
||||
check-version: Makefile
|
||||
echo "#!/bin/sh" > check-version
|
||||
echo "./ngircd --version | grep version > /dev/null 2>&1" >> check-version
|
||||
chmod 755 check-version
|
||||
|
||||
check-help: Makefile
|
||||
echo "#!/bin/sh" > check-help
|
||||
echo "./ngircd --help | grep help > /dev/null 2>&1" >> check-help
|
||||
chmod 755 check-help
|
||||
|
||||
lint:
|
||||
rm -f lint.out
|
||||
for f in *.c; do \
|
||||
echo "checking $$f ..."; \
|
||||
splint $$f $(LINTARGS) -I./.. $(AM_CFLAGS) > lint.out 2>&1; \
|
||||
grep "no warnings" lint.out > /dev/null 2>&1; \
|
||||
if [ $$? -ne 0 ]; then \
|
||||
echo; cat lint.out; echo; \
|
||||
fi; \
|
||||
done;
|
||||
|
||||
TESTS = check-version check-help
|
||||
|
||||
# -eof-
|
||||
|
||||
+102
-55
@@ -9,75 +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.13 2002/02/11 01:00:12 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.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 "irc.h"
|
||||
#include "hash.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
|
||||
#include <exp.h>
|
||||
#include "exp.h"
|
||||
#include "channel.h"
|
||||
|
||||
|
||||
@@ -217,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 );
|
||||
@@ -249,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;
|
||||
@@ -308,10 +287,20 @@ GLOBAL CHANNEL *Channel_GetChannel( CL2CHAN *Cl2Chan )
|
||||
GLOBAL BOOLEAN Channel_IsValidName( CHAR *Name )
|
||||
{
|
||||
/* PrŸfen, ob Name als Channelname gueltig */
|
||||
|
||||
CHAR *ptr, badchars[] = " ,:\x07";
|
||||
|
||||
assert( Name != NULL );
|
||||
|
||||
if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return FALSE;
|
||||
|
||||
ptr = Name;
|
||||
while( *ptr )
|
||||
{
|
||||
if( strchr( badchars, *ptr )) return FALSE;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
} /* Channel_IsValidName */
|
||||
|
||||
@@ -434,10 +423,66 @@ GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
|
||||
} /* Channel_UserModes */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
|
||||
{
|
||||
/* Pruefen, ob Client Mitglied in Channel ist */
|
||||
|
||||
assert( Chan != NULL );
|
||||
assert( Client != NULL );
|
||||
|
||||
if( Get_Cl2Chan( Chan, Client )) return TRUE;
|
||||
else return FALSE;
|
||||
} /* Channel_IsMemberOf */
|
||||
|
||||
|
||||
GLOBAL CHAR *Channel_Topic( CHANNEL *Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Chan->topic;
|
||||
} /* Channel_Topic */
|
||||
|
||||
|
||||
GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
assert( Topic != NULL );
|
||||
|
||||
strncpy( Chan->topic, Topic, CHANNEL_TOPIC_LEN - 1 );
|
||||
Chan->topic[CHANNEL_TOPIC_LEN - 1] = '\0';
|
||||
} /* Channel_SetTopic */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text )
|
||||
{
|
||||
BOOLEAN is_member, has_voice, is_op, ok;
|
||||
|
||||
/* Okay, Ziel ist ein Channel */
|
||||
is_member = has_voice = is_op = FALSE;
|
||||
if( Channel_IsMemberOf( Chan, From ))
|
||||
{
|
||||
is_member = TRUE;
|
||||
if( strchr( Channel_UserModes( Chan, From ), 'v' )) has_voice = TRUE;
|
||||
if( strchr( Channel_UserModes( Chan, From ), 'o' )) is_op = TRUE;
|
||||
}
|
||||
|
||||
/* pruefen, ob Client in Channel schreiben darf */
|
||||
ok = TRUE;
|
||||
if( strchr( Channel_Modes( Chan ), 'n' ) && ( ! is_member )) ok = FALSE;
|
||||
if( strchr( Channel_Modes( Chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = FALSE;
|
||||
|
||||
if( ! ok ) return IRC_WriteStrClient( From, ERR_CANNOTSENDTOCHAN_MSG, Client_ID( From ), Channel_Name( Chan ));
|
||||
|
||||
/* Text senden */
|
||||
if( Client_Conn( From ) > NONE ) Conn_UpdateIdle( Client_Conn( From ));
|
||||
return IRC_WriteStrChannelPrefix( Client, Chan, From, TRUE, "PRIVMSG %s :%s", Channel_Name( Chan ), Text );
|
||||
} /* Channel_Write */
|
||||
|
||||
|
||||
|
||||
LOCAL CHANNEL *New_Chan( CHAR *Name )
|
||||
{
|
||||
/* Neue Channel-Struktur anlegen */
|
||||
|
||||
|
||||
CHANNEL *c;
|
||||
|
||||
assert( Name != NULL );
|
||||
@@ -449,9 +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 );
|
||||
|
||||
|
||||
+14
-41
@@ -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: channel.h,v 1.11 2002/02/11 01:00:22 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.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 :-)
|
||||
*/
|
||||
|
||||
|
||||
@@ -60,13 +21,17 @@
|
||||
#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;
|
||||
|
||||
typedef struct _CLIENT2CHAN
|
||||
@@ -94,9 +59,13 @@ 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 );
|
||||
GLOBAL CHAR *Channel_Topic( CHANNEL *Chan );
|
||||
|
||||
GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic );
|
||||
|
||||
GLOBAL CHANNEL *Channel_Search( CHAR *Name );
|
||||
|
||||
@@ -120,6 +89,10 @@ GLOBAL BOOLEAN Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode );
|
||||
GLOBAL BOOLEAN Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode );
|
||||
GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client );
|
||||
|
||||
GLOBAL BOOLEAN Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client );
|
||||
|
||||
GLOBAL BOOLEAN Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+189
-207
@@ -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.36 2002/02/06 16:49:41 alex Exp $
|
||||
* $Id: client.c,v 1.53.2.1 2002/04/29 14:11:23 alex Exp $
|
||||
*
|
||||
* client.c: Management aller Clients
|
||||
*
|
||||
@@ -19,132 +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.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>
|
||||
@@ -152,7 +35,7 @@
|
||||
#include <string.h>
|
||||
#include <netdb.h>
|
||||
|
||||
#include <exp.h>
|
||||
#include "exp.h"
|
||||
#include "client.h"
|
||||
|
||||
#include <imp.h>
|
||||
@@ -160,7 +43,8 @@
|
||||
#include "channel.h"
|
||||
#include "conf.h"
|
||||
#include "conn.h"
|
||||
#include "irc.h"
|
||||
#include "hash.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
|
||||
@@ -202,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 */
|
||||
@@ -214,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;
|
||||
}
|
||||
@@ -281,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 );
|
||||
|
||||
@@ -302,47 +189,65 @@ 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 );
|
||||
}
|
||||
else if( c->type == CLIENT_SERVER )
|
||||
{
|
||||
if( c != This_Server ) Log( LOG_NOTICE, "Server \"%s\" unregistered: %s", c->id, txt );
|
||||
if( c != This_Server )
|
||||
{
|
||||
if( c->conn_id != NONE ) Log( LOG_NOTICE|LOG_snotice, "Server \"%s\" unregistered (connection %d): %s", c->id, c->conn_id, txt );
|
||||
else Log( LOG_NOTICE|LOG_snotice, "Server \"%s\" unregistered: %s", c->id, txt );
|
||||
}
|
||||
|
||||
/* andere Server informieren */
|
||||
if( ! NGIRCd_Quit )
|
||||
@@ -351,13 +256,25 @@ GLOBAL VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg )
|
||||
else IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "SQUIT %s :", c->id );
|
||||
}
|
||||
}
|
||||
else Log( LOG_NOTICE, "Unknown client \"%s\" unregistered: %s", c->id, txt );
|
||||
else
|
||||
{
|
||||
if( c->conn_id != NONE )
|
||||
{
|
||||
if( c->id[0] ) Log( LOG_NOTICE, "Client \"%s\" unregistered (connection %d): %s", c->id, c->conn_id, txt );
|
||||
else Log( LOG_NOTICE, "Client unregistered (connection %d): %s", c->conn_id, txt );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( c->id[0] ) Log( LOG_WARNING, "Unregistered unknown client \"%s\": %s", c->id, txt );
|
||||
else Log( LOG_WARNING, "Unregistered unknown client: %s", c->id, txt );
|
||||
}
|
||||
}
|
||||
|
||||
free( c );
|
||||
break;
|
||||
}
|
||||
last = c;
|
||||
c = c->next;
|
||||
c = (CLIENT *)c->next;
|
||||
}
|
||||
} /* Client_Destroy */
|
||||
|
||||
@@ -367,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 */
|
||||
|
||||
|
||||
@@ -387,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 */
|
||||
@@ -402,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 */
|
||||
|
||||
@@ -412,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 */
|
||||
|
||||
@@ -422,11 +352,36 @@ GLOBAL VOID Client_SetPassword( CLIENT *Client, CHAR *Pwd )
|
||||
/* Von einem Client geliefertes Passwort */
|
||||
|
||||
assert( Client != NULL );
|
||||
strncpy( Client->pwd, Pwd, CLIENT_PASS_LEN );
|
||||
assert( Pwd != NULL );
|
||||
|
||||
strncpy( Client->pwd, Pwd, CLIENT_PASS_LEN - 1 );
|
||||
Client->pwd[CLIENT_PASS_LEN - 1] = '\0';
|
||||
} /* Client_SetPassword */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetAway( CLIENT *Client, CHAR *Txt )
|
||||
{
|
||||
/* Von einem Client gelieferte AWAY-Nachricht */
|
||||
|
||||
assert( Client != NULL );
|
||||
|
||||
if( Txt )
|
||||
{
|
||||
/* Client AWAY setzen */
|
||||
strncpy( Client->away, Txt, CLIENT_AWAY_LEN - 1 );
|
||||
Client->away[CLIENT_AWAY_LEN - 1] = '\0';
|
||||
Client_ModeAdd( Client, 'a' );
|
||||
Log( LOG_DEBUG, "User \"%s\" is away: %s", Client_Mask( Client ), Txt );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* AWAY loeschen */
|
||||
Client_ModeDel( Client, 'a' );
|
||||
Log( LOG_DEBUG, "User \"%s\" is no longer away.", Client_Mask( Client ));
|
||||
}
|
||||
} /* Client_SetAway */
|
||||
|
||||
|
||||
GLOBAL VOID Client_SetType( CLIENT *Client, INT Type )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
@@ -452,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 */
|
||||
|
||||
@@ -522,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 )
|
||||
@@ -569,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 */
|
||||
@@ -593,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 */
|
||||
@@ -608,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 */
|
||||
|
||||
@@ -709,29 +676,35 @@ GLOBAL BOOLEAN Client_HasMode( CLIENT *Client, CHAR Mode )
|
||||
} /* Client_HasMode */
|
||||
|
||||
|
||||
GLOBAL CHAR *Client_Away( CLIENT *Client )
|
||||
{
|
||||
/* AWAY-Text liefern */
|
||||
|
||||
assert( Client != NULL );
|
||||
return Client->away;
|
||||
} /* Client_Away */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick )
|
||||
{
|
||||
/* Nick ueberpruefen */
|
||||
|
||||
CLIENT *c;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Nick != NULL );
|
||||
|
||||
/* Nick ungueltig? */
|
||||
if( ! Client_IsValidNick( Nick )) return IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), Nick );
|
||||
if( ! Client_IsValidNick( Nick ))
|
||||
{
|
||||
IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), Nick );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Nick bereits vergeben? */
|
||||
c = My_Clients;
|
||||
while( c )
|
||||
if( Client_Search( Nick ))
|
||||
{
|
||||
if( strcasecmp( c->id, Nick ) == 0 )
|
||||
{
|
||||
/* den Nick gibt es bereits */
|
||||
IRC_WriteStrClient( Client, ERR_NICKNAMEINUSE_MSG, Client_ID( Client ), Nick );
|
||||
return FALSE;
|
||||
}
|
||||
c = c->next;
|
||||
/* den Nick gibt es bereits */
|
||||
IRC_WriteStrClient( Client, ERR_NICKNAMEINUSE_MSG, Client_ID( Client ), Nick );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
@@ -750,7 +723,11 @@ GLOBAL BOOLEAN Client_CheckID( CLIENT *Client, CHAR *ID )
|
||||
assert( ID != NULL );
|
||||
|
||||
/* Nick zu lang? */
|
||||
if( strlen( ID ) > CLIENT_ID_LEN ) return IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), ID );
|
||||
if( strlen( ID ) > CLIENT_ID_LEN )
|
||||
{
|
||||
IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), ID );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* ID bereits vergeben? */
|
||||
c = My_Clients;
|
||||
@@ -764,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. */
|
||||
@@ -804,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 */
|
||||
|
||||
|
||||
@@ -840,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 */
|
||||
|
||||
|
||||
@@ -854,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 */
|
||||
@@ -870,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 */
|
||||
@@ -879,11 +847,23 @@ GLOBAL INT Client_UnknownCount( VOID )
|
||||
GLOBAL BOOLEAN Client_IsValidNick( CHAR *Nick )
|
||||
{
|
||||
/* Ist der Nick gueltig? */
|
||||
|
||||
CHAR *ptr, goodchars[] = ";0123456789-";
|
||||
|
||||
assert( Nick != NULL );
|
||||
|
||||
if( Nick[0] == '#' ) return FALSE;
|
||||
if( strlen( Nick ) > CLIENT_NICK_LEN ) return FALSE;
|
||||
if( strchr( goodchars, Nick[0] )) return FALSE;
|
||||
if( strlen( Nick ) >= CLIENT_NICK_LEN ) return FALSE;
|
||||
|
||||
ptr = Nick;
|
||||
while( *ptr )
|
||||
{
|
||||
if(( *ptr < 'A' ) && ( ! strchr( goodchars, *ptr ))) return FALSE;
|
||||
if(( *ptr > '}' ) && ( ! strchr( goodchars, *ptr ))) return FALSE;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
} /* Client_IsValidNick */
|
||||
|
||||
@@ -897,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 */
|
||||
@@ -913,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 */
|
||||
@@ -934,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;
|
||||
@@ -948,6 +929,7 @@ LOCAL CLIENT *New_Client_Struct( VOID )
|
||||
c->hops = -1;
|
||||
c->token = -1;
|
||||
c->mytoken = -1;
|
||||
strcpy( c->away, "" );
|
||||
|
||||
return c;
|
||||
} /* New_Client */
|
||||
@@ -969,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 );
|
||||
|
||||
+13
-78
@@ -9,83 +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.22 2002/02/06 16:49:56 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.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 :-)
|
||||
*/
|
||||
|
||||
|
||||
@@ -109,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) */
|
||||
@@ -125,9 +55,13 @@ typedef struct _CLIENT
|
||||
CHAR modes[CLIENT_MODE_LEN]; /* Client Modes */
|
||||
INT hops, token, mytoken; /* "Hops" und "Token" (-> SERVER-Befehl) */
|
||||
BOOLEAN oper_by_me; /* IRC-Operator-Status durch diesen Server? */
|
||||
CHAR away[CLIENT_AWAY_LEN]; /* AWAY-Text, wenn Mode 'a' gesetzt */
|
||||
} CLIENT;
|
||||
|
||||
#else
|
||||
|
||||
typedef POINTER CLIENT;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -139,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 );
|
||||
@@ -167,6 +100,7 @@ GLOBAL INT Client_Token( CLIENT *Client );
|
||||
GLOBAL INT Client_MyToken( CLIENT *Client );
|
||||
GLOBAL CLIENT *Client_TopServer( CLIENT *Client );
|
||||
GLOBAL CLIENT *Client_NextHop( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_Away( CLIENT *Client );
|
||||
|
||||
GLOBAL BOOLEAN Client_HasMode( CLIENT *Client, CHAR Mode );
|
||||
|
||||
@@ -181,6 +115,7 @@ GLOBAL VOID Client_SetToken( CLIENT *Client, INT Token );
|
||||
GLOBAL VOID Client_SetOperByMe( CLIENT *Client, BOOLEAN OperByMe );
|
||||
GLOBAL VOID Client_SetModes( CLIENT *Client, CHAR *Modes );
|
||||
GLOBAL VOID Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer );
|
||||
GLOBAL VOID Client_SetAway( CLIENT *Client, CHAR *Txt );
|
||||
|
||||
GLOBAL BOOLEAN Client_ModeAdd( CLIENT *Client, CHAR Mode );
|
||||
GLOBAL BOOLEAN Client_ModeDel( CLIENT *Client, CHAR Mode );
|
||||
|
||||
+181
-99
@@ -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- */
|
||||
|
||||
+20
-42
@@ -9,37 +9,9 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: conf.h,v 1.9 2002/01/03 02:27:20 alex Exp $
|
||||
* $Id: conf.h,v 1.15 2002/03/29 22:53:59 alex Exp $
|
||||
*
|
||||
* conf.h: Konfiguration des ngircd (Header)
|
||||
*
|
||||
* $Log: conf.h,v $
|
||||
* Revision 1.9 2002/01/03 02:27:20 alex
|
||||
* - das Server-Passwort kann nun konfiguriert werden.
|
||||
*
|
||||
* Revision 1.8 2002/01/02 02:49:16 alex
|
||||
* - Konfigurationsdatei "Samba like" umgestellt.
|
||||
* - es koennen nun mehrere Server und Oprtatoren konfiguriert werden.
|
||||
*
|
||||
* Revision 1.6 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.5 2001/12/30 19:26:11 alex
|
||||
* - Unterstuetzung fuer die Konfigurationsdatei eingebaut.
|
||||
*
|
||||
* Revision 1.4 2001/12/26 22:48:53 alex
|
||||
* - MOTD-Datei ist nun konfigurierbar und wird gelesen.
|
||||
*
|
||||
* Revision 1.3 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.2 2001/12/26 03:19:57 alex
|
||||
* - erste Konfigurations-Variablen definiert: PING/PONG-Timeout.
|
||||
*
|
||||
* Revision 1.1 2001/12/12 17:18:20 alex
|
||||
* - Modul fuer Server-Konfiguration begonnen.
|
||||
*/
|
||||
|
||||
|
||||
@@ -48,28 +20,29 @@
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#include "conn.h"
|
||||
#include "defines.h"
|
||||
|
||||
|
||||
typedef struct _Conf_Oper
|
||||
{
|
||||
CHAR name[CLIENT_PASS_LEN];
|
||||
CHAR pwd[CLIENT_PASS_LEN];
|
||||
CHAR name[CLIENT_PASS_LEN]; /* Name (ID) des IRC-OPs */
|
||||
CHAR pwd[CLIENT_PASS_LEN]; /* Passwort */
|
||||
} CONF_OPER;
|
||||
|
||||
typedef struct _Conf_Server
|
||||
{
|
||||
CHAR host[HOST_LEN];
|
||||
CHAR ip[16];
|
||||
CHAR name[CLIENT_ID_LEN];
|
||||
CHAR pwd[CLIENT_PASS_LEN];
|
||||
INT port;
|
||||
time_t lasttry;
|
||||
RES_STAT *res_stat;
|
||||
CHAR host[HOST_LEN]; /* Hostname */
|
||||
CHAR ip[16]; /* IP-Adresse (von Resolver) */
|
||||
CHAR name[CLIENT_ID_LEN]; /* IRC-Client-ID */
|
||||
CHAR pwd[CLIENT_PASS_LEN]; /* Passwort */
|
||||
INT port; /* Server-Port */
|
||||
INT group; /* Gruppe des Servers */
|
||||
time_t lasttry; /* Letzter Connect-Versuch */
|
||||
RES_STAT *res_stat; /* Status des Resolver */
|
||||
} CONF_SERVER;
|
||||
|
||||
|
||||
/* Konfigurationsdatei */
|
||||
GLOBAL CHAR Conf_File[FNAME_LEN];
|
||||
|
||||
/* Name ("Nick") des Servers */
|
||||
GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN];
|
||||
|
||||
@@ -83,9 +56,13 @@ GLOBAL CHAR Conf_ServerPwd[CLIENT_PASS_LEN];
|
||||
GLOBAL CHAR Conf_MotdFile[FNAME_LEN];
|
||||
|
||||
/* Ports, auf denen der Server Verbindungen entgegen nimmt */
|
||||
GLOBAL INT Conf_ListenPorts[MAX_LISTEN_PORTS];
|
||||
GLOBAL UINT Conf_ListenPorts[MAX_LISTEN_PORTS];
|
||||
GLOBAL INT Conf_ListenPorts_Count;
|
||||
|
||||
/* User- und Group-ID, zu denen der Daemon wechseln soll */
|
||||
GLOBAL UINT Conf_UID;
|
||||
GLOBAL UINT Conf_GID;
|
||||
|
||||
/* Timeouts fuer PING und PONG */
|
||||
GLOBAL INT Conf_PingTimeout;
|
||||
GLOBAL INT Conf_PongTimeout;
|
||||
@@ -103,6 +80,7 @@ GLOBAL INT Conf_Server_Count;
|
||||
|
||||
|
||||
GLOBAL VOID Conf_Init( VOID );
|
||||
GLOBAL INT Conf_Test( VOID );
|
||||
GLOBAL VOID Conf_Exit( VOID );
|
||||
|
||||
|
||||
|
||||
+152
-180
@@ -9,139 +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.36 2002/02/11 01:00:50 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.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>
|
||||
@@ -174,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
|
||||
@@ -208,6 +84,7 @@ LOCAL VOID Handle_Buffer( CONN_ID Idx );
|
||||
LOCAL VOID Check_Connections( VOID );
|
||||
LOCAL VOID Check_Servers( VOID );
|
||||
LOCAL VOID Init_Conn_Struct( INT Idx );
|
||||
LOCAL BOOLEAN Init_Socket( INT Sock );
|
||||
LOCAL VOID New_Server( INT Server, CONN_ID Idx );
|
||||
|
||||
LOCAL RES_STAT *ResolveAddr( struct sockaddr_in *Addr );
|
||||
@@ -221,6 +98,7 @@ LOCAL CHAR *Resolv_Error( INT H_Error );
|
||||
LOCAL fd_set My_Listeners;
|
||||
LOCAL fd_set My_Sockets;
|
||||
LOCAL fd_set My_Resolvers;
|
||||
LOCAL fd_set My_Connects;
|
||||
|
||||
LOCAL INT My_Max_Fd;
|
||||
|
||||
@@ -237,6 +115,7 @@ GLOBAL VOID Conn_Init( VOID )
|
||||
FD_ZERO( &My_Listeners );
|
||||
FD_ZERO( &My_Sockets );
|
||||
FD_ZERO( &My_Resolvers );
|
||||
FD_ZERO( &My_Connects );
|
||||
|
||||
My_Max_Fd = 0;
|
||||
|
||||
@@ -263,30 +142,35 @@ GLOBAL VOID Conn_Exit( VOID )
|
||||
{
|
||||
if( My_Connections[idx].sock == i ) break;
|
||||
}
|
||||
if( idx < MAX_CONNECTIONS ) Conn_Close( idx, NULL, "Server going down", TRUE );
|
||||
else if( FD_ISSET( i, &My_Listeners ))
|
||||
if( FD_ISSET( i, &My_Listeners ))
|
||||
{
|
||||
close( i );
|
||||
Log( LOG_DEBUG, "Listening socket %d closed.", i );
|
||||
}
|
||||
else
|
||||
else if( FD_ISSET( i, &My_Connects ))
|
||||
{
|
||||
close( i );
|
||||
Log( LOG_WARNING, "Unknown connection %d closed.", i );
|
||||
Log( LOG_DEBUG, "Connection %d closed during creation (socket %d).", idx, i );
|
||||
}
|
||||
else if( idx < MAX_CONNECTIONS ) Conn_Close( idx, NULL, "Server going down", TRUE );
|
||||
else
|
||||
{
|
||||
Log( LOG_WARNING, "Closing unknown connection %d ...", i );
|
||||
close( i );
|
||||
}
|
||||
}
|
||||
}
|
||||
} /* Conn_Exit */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Conn_NewListener( CONST INT Port )
|
||||
GLOBAL BOOLEAN Conn_NewListener( CONST UINT Port )
|
||||
{
|
||||
/* Neuen Listen-Socket erzeugen: der Server wartet dann auf
|
||||
* dem angegebenen Port auf Verbindungen. Kann der Listen-
|
||||
* Socket nicht erteugt werden, so wird NULL geliefert.*/
|
||||
|
||||
struct sockaddr_in addr;
|
||||
INT sock, on = 1;
|
||||
INT sock;
|
||||
|
||||
/* Server-"Listen"-Socket initialisieren */
|
||||
memset( &addr, 0, sizeof( addr ));
|
||||
@@ -302,18 +186,7 @@ GLOBAL BOOLEAN Conn_NewListener( CONST INT Port )
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Socket-Optionen setzen */
|
||||
if( fcntl( sock, F_SETFL, O_NONBLOCK ) != 0 )
|
||||
{
|
||||
Log( LOG_CRIT, "Can't enable non-blocking mode: %s!", strerror( errno ));
|
||||
close( sock );
|
||||
return FALSE;
|
||||
}
|
||||
if( setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, (socklen_t)sizeof( on )) != 0)
|
||||
{
|
||||
Log( LOG_ERR, "Can't set socket options: %s!", strerror( errno ));
|
||||
/* dieser Fehler kann ignoriert werden. */
|
||||
}
|
||||
if( ! Init_Socket( sock )) return FALSE;
|
||||
|
||||
/* an Port binden */
|
||||
if( bind( sock, (struct sockaddr *)&addr, (socklen_t)sizeof( addr )) != 0 )
|
||||
@@ -381,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++ )
|
||||
@@ -392,6 +265,11 @@ GLOBAL VOID Conn_Handler( INT Timeout )
|
||||
FD_SET( My_Connections[i].sock, &write_sockets );
|
||||
}
|
||||
}
|
||||
/* Sockets mit im Aufbau befindlichen ausgehenden Verbindungen suchen */
|
||||
for( i = 0; i < MAX_CONNECTIONS; i++ )
|
||||
{
|
||||
if(( My_Connections[i].sock > NONE ) && ( FD_ISSET( My_Connections[i].sock, &My_Connects ))) FD_SET( My_Connections[i].sock, &write_sockets );
|
||||
}
|
||||
|
||||
/* von welchen Sockets koennte gelesen werden? */
|
||||
read_sockets = My_Sockets;
|
||||
@@ -402,6 +280,11 @@ GLOBAL VOID Conn_Handler( INT Timeout )
|
||||
/* Hier muss noch auf den Resolver Sub-Prozess gewartet werden */
|
||||
FD_CLR( My_Connections[i].sock, &read_sockets );
|
||||
}
|
||||
if(( My_Connections[i].sock > NONE ) && ( FD_ISSET( My_Connections[i].sock, &My_Connects )))
|
||||
{
|
||||
/* Hier laeuft noch ein asyncrones connect() */
|
||||
FD_CLR( My_Connections[i].sock, &read_sockets );
|
||||
}
|
||||
}
|
||||
for( i = 0; i < My_Max_Fd + 1; i++ )
|
||||
{
|
||||
@@ -449,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 )
|
||||
{
|
||||
@@ -515,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 );
|
||||
|
||||
@@ -536,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 )
|
||||
{
|
||||
@@ -547,10 +434,17 @@ GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformC
|
||||
free( My_Connections[Idx].res_stat );
|
||||
}
|
||||
|
||||
/* Bei Server-Verbindungen lasttry-Zeitpunkt auf "jetzt" setzen */
|
||||
if( My_Connections[Idx].our_server >= 0 ) Conf_Server[My_Connections[Idx].our_server].lasttry = time( NULL );
|
||||
/* Bei Server-Verbindungen lasttry-Zeitpunkt so setzen, dass
|
||||
* der naechste Verbindungsversuch in RECONNECT_DELAY Sekunden
|
||||
* gestartet wird. */
|
||||
if(( My_Connections[Idx].our_server >= 0 ) && ( Conf_Server[My_Connections[Idx].our_server].lasttry < time( NULL )))
|
||||
{
|
||||
/* Okay, die Verbindung stand schon "genuegend lange" */
|
||||
Conf_Server[My_Connections[Idx].our_server].lasttry = time( NULL ) - Conf_ConnectRetry + RECONNECT_DELAY;
|
||||
}
|
||||
|
||||
FD_CLR( My_Connections[Idx].sock, &My_Sockets );
|
||||
FD_CLR( My_Connections[Idx].sock, &My_Connects );
|
||||
My_Connections[Idx].sock = NONE;
|
||||
} /* Conn_Close */
|
||||
|
||||
@@ -564,7 +458,7 @@ GLOBAL VOID Conn_UpdateIdle( CONN_ID Idx )
|
||||
}
|
||||
|
||||
|
||||
GLOBAL INT32 Conn_GetIdle( CONN_ID Idx )
|
||||
GLOBAL time_t Conn_GetIdle( CONN_ID Idx )
|
||||
{
|
||||
/* Idle-Time einer Verbindung liefern (in Sekunden) */
|
||||
|
||||
@@ -573,7 +467,7 @@ GLOBAL INT32 Conn_GetIdle( CONN_ID Idx )
|
||||
} /* Conn_GetIdle */
|
||||
|
||||
|
||||
GLOBAL INT32 Conn_LastPing( CONN_ID Idx )
|
||||
GLOBAL time_t Conn_LastPing( CONN_ID Idx )
|
||||
{
|
||||
/* Zeitpunkt des letzten PING liefern */
|
||||
|
||||
@@ -621,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
|
||||
@@ -647,12 +541,51 @@ LOCAL VOID Handle_Read( INT Sock )
|
||||
|
||||
LOCAL BOOLEAN Handle_Write( CONN_ID Idx )
|
||||
{
|
||||
/* Daten aus Schreibpuffer versenden */
|
||||
/* Daten aus Schreibpuffer versenden bzw. Connection aufbauen */
|
||||
|
||||
INT len;
|
||||
INT len, res, err;
|
||||
|
||||
assert( Idx >= 0 );
|
||||
assert( My_Connections[Idx].sock > NONE );
|
||||
|
||||
if( FD_ISSET( My_Connections[Idx].sock, &My_Connects ))
|
||||
{
|
||||
/* es soll nichts geschrieben werden, sondern ein
|
||||
* connect() hat ein Ergebnis geliefert */
|
||||
|
||||
FD_CLR( My_Connections[Idx].sock, &My_Connects );
|
||||
|
||||
/* Ergebnis des connect() ermitteln */
|
||||
len = sizeof( err );
|
||||
res = getsockopt( My_Connections[Idx].sock, SOL_SOCKET, SO_ERROR, &err, &len );
|
||||
assert( len == sizeof( err ));
|
||||
|
||||
/* Fehler aufgetreten? */
|
||||
if(( res != 0 ) || ( err != 0 ))
|
||||
{
|
||||
/* Fehler! */
|
||||
if( res != 0 ) Log( LOG_CRIT, "getsockopt (connection %d): %s!", Idx, strerror( errno ));
|
||||
else Log( LOG_CRIT, "Can't connect socket to \"%s:%d\" (connection %d): %s!", My_Connections[Idx].host, Conf_Server[My_Connections[Idx].our_server].port, Idx, strerror( err ));
|
||||
|
||||
/* Socket etc. pp. aufraeumen */
|
||||
FD_CLR( My_Connections[Idx].sock, &My_Sockets );
|
||||
close( My_Connections[Idx].sock );
|
||||
Init_Conn_Struct( Idx );
|
||||
|
||||
/* Bei Server-Verbindungen lasttry-Zeitpunkt auf "jetzt" setzen */
|
||||
Conf_Server[My_Connections[Idx].our_server].lasttry = time( NULL );
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
Log( LOG_DEBUG, "Connection %d with \"%s:%d\" established, now sendig PASS and SERVER ...", Idx, My_Connections[Idx].host, Conf_Server[My_Connections[Idx].our_server].port );
|
||||
|
||||
/* PASS und SERVER verschicken */
|
||||
Conn_WriteStr( Idx, "PASS %s "PASSSERVERADD, Conf_Server[My_Connections[Idx].our_server].pwd );
|
||||
Conn_WriteStr( Idx, "SERVER %s :%s", Conf_ServerName, Conf_ServerInfo );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
assert( My_Connections[Idx].wdatalen > 0 );
|
||||
|
||||
/* Daten schreiben */
|
||||
@@ -682,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 );
|
||||
@@ -775,7 +708,7 @@ LOCAL VOID Read_Request( CONN_ID Idx )
|
||||
{
|
||||
/* Socket wurde geschlossen */
|
||||
Log( LOG_INFO, "%s:%d is closing the connection ...", inet_ntoa( My_Connections[Idx].addr.sin_addr ), ntohs( My_Connections[Idx].addr.sin_port));
|
||||
Conn_Close( Idx, "Socket closed.", NULL, FALSE );
|
||||
Conn_Close( Idx, "Socket closed!", "Client closed connection", FALSE );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -783,7 +716,7 @@ LOCAL VOID Read_Request( CONN_ID Idx )
|
||||
{
|
||||
/* Fehler beim Lesen */
|
||||
Log( LOG_ERR, "Read error on connection %d: %s!", Idx, strerror( errno ));
|
||||
Conn_Close( Idx, "Read error!", NULL, FALSE );
|
||||
Conn_Close( Idx, "Read error!", "Client closed connection", FALSE );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -805,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" );
|
||||
@@ -824,7 +757,7 @@ LOCAL VOID Handle_Buffer( CONN_ID Idx )
|
||||
else if( ptr2 ) ptr = ptr2;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
if( ptr )
|
||||
{
|
||||
/* Ende der Anfrage wurde gefunden */
|
||||
@@ -839,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 */
|
||||
@@ -876,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 );
|
||||
}
|
||||
}
|
||||
@@ -894,8 +827,8 @@ LOCAL VOID Check_Connections( VOID )
|
||||
if( My_Connections[i].lastdata < time( NULL ) - Conf_PingTimeout )
|
||||
{
|
||||
/* Timeout */
|
||||
Log( LOG_INFO, "Connection %d: Timeout.", i );
|
||||
Conn_Close( i, NULL, "Timeout", TRUE );
|
||||
Log( LOG_DEBUG, "Connection %d timed out ...", i );
|
||||
Conn_Close( i, NULL, "Timeout", FALSE );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -909,16 +842,22 @@ LOCAL VOID Check_Servers( VOID )
|
||||
|
||||
INT idx, i, n;
|
||||
RES_STAT *s;
|
||||
|
||||
|
||||
/* Wenn "Passive-Mode" aktiv: nicht verbinden */
|
||||
if( NGIRCd_Passive ) return;
|
||||
|
||||
for( i = 0; i < Conf_Server_Count; i++ )
|
||||
{
|
||||
/* Ist ein Hostname und Port definiert? */
|
||||
if(( ! Conf_Server[i].host[0] ) || ( ! Conf_Server[i].port > 0 )) continue;
|
||||
|
||||
|
||||
/* Haben wir schon eine Verbindung? */
|
||||
for( n = 0; n < MAX_CONNECTIONS; n++ )
|
||||
{
|
||||
if(( My_Connections[n].sock != NONE ) && ( My_Connections[n].our_server == i ))
|
||||
if( My_Connections[n].sock == NONE ) continue;
|
||||
|
||||
/* Verbindung zu diesem Server? */
|
||||
if( My_Connections[n].our_server == i )
|
||||
{
|
||||
/* Komplett aufgebaute Verbindung? */
|
||||
if( My_Connections[n].sock > NONE ) break;
|
||||
@@ -926,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;
|
||||
|
||||
@@ -948,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 )
|
||||
@@ -985,8 +930,8 @@ LOCAL VOID New_Server( INT Server, CONN_ID Idx )
|
||||
Log( LOG_ERR, "Can't connect to \"%s\" (connection %d): ip address unknown!", Conf_Server[Server].host, Idx );
|
||||
return;
|
||||
}
|
||||
|
||||
Log( LOG_INFO, "Establishing connection to \"%s\", %s (connection %d) ... ", Conf_Server[Server].host, Conf_Server[Server].ip, Idx );
|
||||
|
||||
Log( LOG_INFO, "Establishing connection to \"%s\", %s, port %d (connection %d) ... ", Conf_Server[Server].host, Conf_Server[Server].ip, Conf_Server[Server].port, Idx );
|
||||
|
||||
if( inet_aton( Conf_Server[Server].ip, &inaddr ) == 0 )
|
||||
{
|
||||
@@ -1008,8 +953,13 @@ LOCAL VOID New_Server( INT Server, CONN_ID Idx )
|
||||
Log( LOG_CRIT, "Can't create socket: %s!", strerror( errno ));
|
||||
return;
|
||||
}
|
||||
if( connect( new_sock, (struct sockaddr *)&new_addr, sizeof( new_addr )) < 0)
|
||||
|
||||
if( ! Init_Socket( new_sock )) return;
|
||||
|
||||
connect( new_sock, (struct sockaddr *)&new_addr, sizeof( new_addr ));
|
||||
if( errno != EINPROGRESS )
|
||||
{
|
||||
|
||||
close( new_sock );
|
||||
Init_Conn_Struct( Idx );
|
||||
Log( LOG_CRIT, "Can't connect socket: %s!", strerror( errno ));
|
||||
@@ -1026,7 +976,8 @@ LOCAL VOID New_Server( INT Server, CONN_ID Idx )
|
||||
return;
|
||||
}
|
||||
Client_SetIntroducer( c, c );
|
||||
|
||||
Client_SetToken( c, TOKEN_OUTBOUND );
|
||||
|
||||
/* Verbindung registrieren */
|
||||
My_Connections[Idx].sock = new_sock;
|
||||
My_Connections[Idx].addr = new_addr;
|
||||
@@ -1034,11 +985,8 @@ LOCAL VOID New_Server( INT Server, CONN_ID Idx )
|
||||
|
||||
/* Neuen Socket registrieren */
|
||||
FD_SET( new_sock, &My_Sockets );
|
||||
FD_SET( new_sock, &My_Connects );
|
||||
if( new_sock > My_Max_Fd ) My_Max_Fd = new_sock;
|
||||
|
||||
/* PASS und SERVER verschicken */
|
||||
Conn_WriteStr( Idx, "PASS %s "PASSSERVERADD, Conf_Server[Server].pwd );
|
||||
Conn_WriteStr( Idx, "SERVER %s :%s", Conf_ServerName, Conf_ServerInfo );
|
||||
} /* New_Server */
|
||||
|
||||
|
||||
@@ -1053,13 +1001,37 @@ LOCAL VOID Init_Conn_Struct( INT Idx )
|
||||
My_Connections[Idx].rdatalen = 0;
|
||||
My_Connections[Idx].wbuf[0] = '\0';
|
||||
My_Connections[Idx].wdatalen = 0;
|
||||
My_Connections[Idx].our_server = -1;
|
||||
My_Connections[Idx].our_server = NONE;
|
||||
My_Connections[Idx].lastdata = time( NULL );
|
||||
My_Connections[Idx].lastping = 0;
|
||||
My_Connections[Idx].lastprivmsg = time( NULL );
|
||||
} /* Init_Conn_Struct */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Init_Socket( INT Sock )
|
||||
{
|
||||
/* Socket-Optionen setzen */
|
||||
|
||||
INT on = 1;
|
||||
|
||||
#ifdef O_NONBLOCK /* A/UX kennt das nicht? */
|
||||
if( fcntl( Sock, F_SETFL, O_NONBLOCK ) != 0 )
|
||||
{
|
||||
Log( LOG_CRIT, "Can't enable non-blocking mode: %s!", strerror( errno ));
|
||||
close( Sock );
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
if( setsockopt( Sock, SOL_SOCKET, SO_REUSEADDR, &on, (socklen_t)sizeof( on )) != 0)
|
||||
{
|
||||
Log( LOG_ERR, "Can't set socket options: %s!", strerror( errno ));
|
||||
/* dieser Fehler kann ignoriert werden. */
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
} /* Init_Socket */
|
||||
|
||||
|
||||
LOCAL RES_STAT *ResolveAddr( struct sockaddr_in *Addr )
|
||||
{
|
||||
/* IP (asyncron!) aufloesen. Bei Fehler, z.B. wenn der
|
||||
|
||||
+7
-40
@@ -9,45 +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.11 2002/02/11 01:00:50 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.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.
|
||||
*/
|
||||
|
||||
|
||||
@@ -55,6 +19,9 @@
|
||||
#define __conn_h__
|
||||
|
||||
|
||||
#include <time.h>
|
||||
|
||||
|
||||
typedef INT CONN_ID;
|
||||
|
||||
typedef struct _Res_Stat
|
||||
@@ -67,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 );
|
||||
|
||||
@@ -77,8 +44,8 @@ GLOBAL BOOLEAN Conn_WriteStr( CONN_ID Idx, CHAR *Format, ... );
|
||||
GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient );
|
||||
|
||||
GLOBAL VOID Conn_UpdateIdle( CONN_ID Idx );
|
||||
GLOBAL INT32 Conn_GetIdle( CONN_ID Idx );
|
||||
GLOBAL INT32 Conn_LastPing( CONN_ID Idx );
|
||||
GLOBAL time_t Conn_GetIdle( CONN_ID Idx );
|
||||
GLOBAL time_t Conn_LastPing( CONN_ID Idx );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
+20
-34
@@ -9,39 +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.9 2002/02/13 23:04:27 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.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__
|
||||
@@ -58,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 */
|
||||
|
||||
@@ -72,9 +42,11 @@
|
||||
#define CLIENT_HOST_LEN 64 /* max. Laenge des Hostname */
|
||||
#define CLIENT_MODE_LEN 8 /* max. Laenge der Client-Modes */
|
||||
#define CLIENT_INFO_LEN 64 /* max. Infotext-Laenge (Server) */
|
||||
#define CLIENT_AWAY_LEN 128 /* max. Laenger der AWAY-Nachricht */
|
||||
|
||||
#define CHANNEL_NAME_LEN 51 /* max. Laenge eines Channel-Namens, vgl. RFC 2812, 1.3 */
|
||||
#define CHANNEL_MODE_LEN 8 /* max. Laenge der Channel-Modes */
|
||||
#define CHANNEL_TOPIC_LEN 128 /* max. Laenge eines Channel-Topics */
|
||||
|
||||
#define COMMAND_LEN 513 /* max. Laenge eines Befehls, vgl. RFC 2812, 3.2 */
|
||||
|
||||
@@ -87,10 +59,24 @@
|
||||
#define PASSSERVERADD PROTOVER""PROTOSUFFIX" IRC|"PACKAGE"-"VERSION" P"
|
||||
|
||||
#define STARTUP_DELAY 1 /* Erst n Sek. nach Start zu anderen Servern verbinden */
|
||||
#define RECONNECT_DELAY 3 /* Server-Links erst nach 3 Sekunden versuchen, wieder aufzubauen */
|
||||
|
||||
#define USERMODES "io" /* 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
|
||||
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: global.h,v 1.6 2002/01/05 15:55:11 alex Exp $
|
||||
*
|
||||
* global.h: Globaler Header, wir in jedes(!) Modul eingebunden.
|
||||
*
|
||||
* $Log: global.h,v $
|
||||
* Revision 1.6 2002/01/05 15:55:11 alex
|
||||
* - Wrapper fuer inet_aton(): liefert immer Fehler.
|
||||
*
|
||||
* Revision 1.5 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.4 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.3 2001/12/14 08:14:34 alex
|
||||
* - NONE als -1 definiert. Macht den Source lesbarer ;-)
|
||||
*
|
||||
* Revision 1.2 2001/12/12 01:58:53 alex
|
||||
* - Test auf socklen_t verbessert.
|
||||
*
|
||||
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
* Imported sources to CVS.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __global_h__
|
||||
#define __global_h__
|
||||
|
||||
|
||||
#include "config.h"
|
||||
#include "defines.h"
|
||||
|
||||
#ifndef HAVE_socklen_t
|
||||
#define socklen_t int /* u.a. fuer Mac OS X */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_INET_ATON
|
||||
#define inet_aton( opt, bind ) 0
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
@@ -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- */
|
||||
@@ -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- */
|
||||
@@ -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- */
|
||||
@@ -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- */
|
||||
@@ -0,0 +1,414 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-login.c,v 1.11.2.1 2002/04/08 18:07:42 alex Exp $
|
||||
*
|
||||
* irc-login.c: Anmeldung und Abmeldung im IRC
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "conf.h"
|
||||
#include "irc.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-login.h"
|
||||
|
||||
|
||||
LOCAL BOOLEAN Hello_User( CLIENT *Client );
|
||||
LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason );
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Fehler liefern, wenn kein lokaler Client */
|
||||
if( Client_Conn( Client ) <= NONE ) return IRC_WriteStrClient( Client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
if(( Client_Type( Client ) == CLIENT_UNKNOWN ) && ( Req->argc == 1))
|
||||
{
|
||||
/* noch nicht registrierte unbekannte Verbindung */
|
||||
Log( LOG_DEBUG, "Connection %d: got PASS command ...", Client_Conn( Client ));
|
||||
|
||||
/* Passwort speichern */
|
||||
Client_SetPassword( Client, Req->argv[0] );
|
||||
|
||||
Client_SetType( Client, CLIENT_GOTPASS );
|
||||
return CONNECTED;
|
||||
}
|
||||
else if((( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) && (( Req->argc == 3 ) || ( Req->argc == 4 )))
|
||||
{
|
||||
/* noch nicht registrierte Server-Verbindung */
|
||||
Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client ));
|
||||
|
||||
/* Passwort speichern */
|
||||
Client_SetPassword( Client, Req->argv[0] );
|
||||
|
||||
Client_SetType( Client, CLIENT_GOTPASSSERVER );
|
||||
return CONNECTED;
|
||||
}
|
||||
else if(( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER ))
|
||||
{
|
||||
/* Falsche Anzahl Parameter? */
|
||||
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
}
|
||||
else return IRC_WriteStrClient( Client, ERR_ALREADYREGISTRED_MSG, Client_ID( Client ));
|
||||
} /* IRC_PASS */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *intr_c, *target, *c;
|
||||
CHAR *modes;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Zumindest BitchX sendet NICK-USER in der falschen Reihenfolge. */
|
||||
#ifndef STRICT_RFC
|
||||
if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTUSER || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
|
||||
#else
|
||||
if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
|
||||
#endif
|
||||
{
|
||||
/* User-Registrierung bzw. Nick-Aenderung */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* "Ziel-Client" ermitteln */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
target = Client_Search( Req->prefix );
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Ist der Client "restricted"? */
|
||||
if( Client_HasMode( Client, 'r' )) return IRC_WriteStrClient( Client, ERR_RESTRICTED_MSG, Client_ID( Client ));
|
||||
target = Client;
|
||||
}
|
||||
|
||||
#ifndef STRICT_RFC
|
||||
/* Wenn der Client zu seinem eigenen Nick wechseln will, so machen
|
||||
* wir nichts. So macht es das Original und mind. Snak hat probleme,
|
||||
* wenn wir es nicht so machen. Ob es so okay ist? Hm ... */
|
||||
if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 ) return CONNECTED;
|
||||
#endif
|
||||
|
||||
/* pruefen, ob Nick bereits vergeben. Speziallfall: der Client
|
||||
* will nur die Gross- und Kleinschreibung aendern. Das darf
|
||||
* er natuerlich machen :-) */
|
||||
if( strcasecmp( Client_ID( target ), Req->argv[0] ) != 0 )
|
||||
{
|
||||
if( ! Client_CheckNick( target, Req->argv[0] )) return CONNECTED;
|
||||
}
|
||||
|
||||
if(( Client_Type( target ) != CLIENT_USER ) && ( Client_Type( target ) != CLIENT_SERVER ))
|
||||
{
|
||||
/* Neuer Client */
|
||||
Log( LOG_DEBUG, "Connection %d: got valid NICK command ...", Client_Conn( Client ));
|
||||
|
||||
/* Client-Nick registrieren */
|
||||
Client_SetID( target, Req->argv[0] );
|
||||
|
||||
/* schon ein USER da? Dann registrieren! */
|
||||
if( Client_Type( Client ) == CLIENT_GOTUSER ) return Hello_User( Client );
|
||||
else Client_SetType( Client, CLIENT_GOTNICK );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Nick-Aenderung */
|
||||
if( Client_Conn( target ) > NONE )
|
||||
{
|
||||
/* lokaler Client */
|
||||
Log( LOG_INFO, "User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".", Client_Mask( target ), Client_Conn( target ), Client_ID( target ), Req->argv[0] );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Remote-Client */
|
||||
Log( LOG_DEBUG, "User \"%s\" changed nick: \"%s\" -> \"%s\".", Client_Mask( target ), Client_ID( target ), Req->argv[0] );
|
||||
}
|
||||
|
||||
/* alle betroffenen User und Server ueber Nick-Aenderung informieren */
|
||||
if( Client_Type( Client ) == CLIENT_USER ) IRC_WriteStrClientPrefix( Client, Client, "NICK :%s", Req->argv[0] );
|
||||
IRC_WriteStrServersPrefix( Client, target, "NICK :%s", Req->argv[0] );
|
||||
IRC_WriteStrRelatedPrefix( target, target, FALSE, "NICK :%s", Req->argv[0] );
|
||||
|
||||
/* neuen Client-Nick speichern */
|
||||
Client_SetID( target, Req->argv[0] );
|
||||
}
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Server fuehrt neuen Client ein */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 7 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Nick ueberpruefen */
|
||||
c = Client_Search( Req->argv[0] );
|
||||
if( c )
|
||||
{
|
||||
/* Der neue Nick ist auf diesem Server bereits registriert:
|
||||
* sowohl der neue, als auch der alte Client muessen nun
|
||||
* disconnectiert werden. */
|
||||
Log( LOG_ERR, "Server %s introduces already registered nick \"%s\"!", Client_ID( Client ), Req->argv[0] );
|
||||
Kill_Nick( Req->argv[0], "Nick collision" );
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
/* Server, zu dem der Client connectiert ist, suchen */
|
||||
intr_c = Client_GetFromToken( Client, atoi( Req->argv[4] ));
|
||||
if( ! intr_c )
|
||||
{
|
||||
Log( LOG_ERR, "Server %s introduces nick \"%s\" on unknown server!?", Client_ID( Client ), Req->argv[0] );
|
||||
Kill_Nick( Req->argv[0], "Unknown server" );
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
/* Neue Client-Struktur anlegen */
|
||||
c = Client_NewRemoteUser( intr_c, Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], atoi( Req->argv[4] ), Req->argv[5] + 1, Req->argv[6], TRUE );
|
||||
if( ! c )
|
||||
{
|
||||
/* Eine neue Client-Struktur konnte nicht angelegt werden.
|
||||
* Der Client muss disconnectiert werden, damit der Netz-
|
||||
* status konsistent bleibt. */
|
||||
Log( LOG_ALERT, "Can't create client structure! (on connection %d)", Client_Conn( Client ));
|
||||
Kill_Nick( Req->argv[0], "Server error" );
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
modes = Client_Modes( c );
|
||||
if( *modes ) Log( LOG_DEBUG, "User \"%s\" (+%s) registered (via %s, on %s, %d hop%s).", Client_Mask( c ), modes, Client_ID( Client ), Client_ID( intr_c ), Client_Hops( c ), Client_Hops( c ) > 1 ? "s": "" );
|
||||
else Log( LOG_DEBUG, "User \"%s\" registered (via %s, on %s, %d hop%s).", Client_Mask( c ), Client_ID( Client ), Client_ID( intr_c ), Client_Hops( c ), Client_Hops( c ) > 1 ? "s": "" );
|
||||
|
||||
/* Andere Server, ausser dem Introducer, informieren */
|
||||
IRC_WriteStrServersPrefix( Client, Client, "NICK %s %d %s %s %d %s :%s", Req->argv[0], atoi( Req->argv[1] ) + 1, Req->argv[2], Req->argv[3], Client_MyToken( intr_c ), Req->argv[5], Req->argv[6] );
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else return IRC_WriteStrClient( Client, ERR_ALREADYREGISTRED_MSG, Client_ID( Client ));
|
||||
} /* IRC_NICK */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
#ifndef STRICT_RFC
|
||||
if( Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_UNKNOWN )
|
||||
#else
|
||||
if( Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTPASS )
|
||||
#endif
|
||||
{
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 4 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
Client_SetUser( Client, Req->argv[0], FALSE );
|
||||
Client_SetInfo( Client, Req->argv[3] );
|
||||
|
||||
Log( LOG_DEBUG, "Connection %d: got valid USER command ...", Client_Conn( Client ));
|
||||
if( Client_Type( Client ) == CLIENT_GOTNICK ) return Hello_User( Client );
|
||||
else Client_SetType( Client, CLIENT_GOTUSER );
|
||||
return CONNECTED;
|
||||
}
|
||||
else if( Client_Type( Client ) == CLIENT_USER || Client_Type( Client ) == CLIENT_SERVER || Client_Type( Client ) == CLIENT_SERVICE )
|
||||
{
|
||||
return IRC_WriteStrClient( Client, ERR_ALREADYREGISTRED_MSG, Client_ID( Client ));
|
||||
}
|
||||
else return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
|
||||
} /* IRC_USER */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
if(( Client_Type( Client ) == CLIENT_USER ) || ( Client_Type( Client ) == CLIENT_SERVICE ))
|
||||
{
|
||||
/* User / Service */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
if( Req->argc == 0 ) Conn_Close( Client_Conn( Client ), "Got QUIT command.", NULL, TRUE );
|
||||
else Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argv[0], TRUE );
|
||||
|
||||
return DISCONNECTED;
|
||||
}
|
||||
else if ( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Server */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
target = Client_Search( Req->prefix );
|
||||
if( ! target )
|
||||
{
|
||||
/* Den Client kennen wir nicht (mehr), also nichts zu tun. */
|
||||
Log( LOG_WARNING, "Got QUIT from %s for unknown client!?", Client_ID( Client ));
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
if( Req->argc == 0 ) Client_Destroy( target, "Got QUIT command.", NULL, TRUE );
|
||||
else Client_Destroy( target, "Got QUIT command.", Req->argv[0], TRUE );
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
|
||||
} /* IRC_QUIT */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *from;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NOORIGIN_MSG, Client_ID( Client ));
|
||||
#ifdef STRICT_RFC
|
||||
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
#endif
|
||||
|
||||
if( Req->argc > 1 )
|
||||
{
|
||||
/* es wurde ein Ziel-Client angegeben */
|
||||
target = Client_Search( Req->argv[1] );
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
|
||||
if( target != Client_ThisServer( ))
|
||||
{
|
||||
/* ok, forwarden */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
|
||||
else from = Client;
|
||||
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
|
||||
return IRC_WriteStrClientPrefix( target, from, "PING %s :%s", Client_ID( from ), Req->argv[1] );
|
||||
}
|
||||
}
|
||||
|
||||
Log( LOG_DEBUG, "Connection %d: got PING, sending PONG ...", Client_Conn( Client ));
|
||||
return IRC_WriteStrClient( Client, "PONG %s :%s", Client_ID( Client_ThisServer( )), Client_ID( Client ));
|
||||
} /* IRC_PING */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *from;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NOORIGIN_MSG, Client_ID( Client ));
|
||||
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* forwarden? */
|
||||
if( Req->argc == 2 )
|
||||
{
|
||||
target = Client_Search( Req->argv[1] );
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
|
||||
if( target != Client_ThisServer( ))
|
||||
{
|
||||
/* ok, forwarden */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
|
||||
else from = Client;
|
||||
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
|
||||
return IRC_WriteStrClientPrefix( target, from, "PONG %s :%s", Client_ID( from ), Req->argv[1] );
|
||||
}
|
||||
}
|
||||
|
||||
/* Der Connection-Timestamp wurde schon beim Lesen aus dem Socket
|
||||
* aktualisiert, daher muss das hier nicht mehr gemacht werden. */
|
||||
|
||||
if( Client_Conn( Client ) > NONE ) Log( LOG_DEBUG, "Connection %d: received PONG. Lag: %ld seconds.", Client_Conn( Client ), time( NULL ) - Conn_LastPing( Client_Conn( Client )));
|
||||
else Log( LOG_DEBUG, "Connection %d: received PONG.", Client_Conn( Client ));
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_PONG */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Hello_User( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
|
||||
/* Passwort ueberpruefen */
|
||||
if( strcmp( Client_Password( Client ), Conf_ServerPwd ) != 0 )
|
||||
{
|
||||
/* Falsches Passwort */
|
||||
Log( LOG_ERR, "User \"%s\" rejected (connection %d): Bad password!", Client_Mask( Client ), Client_Conn( Client ));
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Bad password", TRUE );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
Log( LOG_NOTICE, "User \"%s\" registered (connection %d).", Client_Mask( Client ), Client_Conn( Client ));
|
||||
|
||||
/* Andere Server informieren */
|
||||
IRC_WriteStrServers( NULL, "NICK %s 1 %s %s 1 +%s :%s", Client_ID( Client ), Client_User( Client ), Client_Hostname( Client ), Client_Modes( Client ), Client_Info( Client ));
|
||||
|
||||
if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return FALSE;
|
||||
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return FALSE;
|
||||
if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return FALSE;
|
||||
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return FALSE;
|
||||
|
||||
Client_SetType( Client, CLIENT_USER );
|
||||
|
||||
if( ! IRC_Send_LUSERS( Client )) return DISCONNECTED;
|
||||
if( ! IRC_Show_MOTD( Client )) return DISCONNECTED;
|
||||
|
||||
return CONNECTED;
|
||||
} /* Hello_User */
|
||||
|
||||
|
||||
LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason )
|
||||
{
|
||||
CLIENT *c;
|
||||
|
||||
assert( Nick != NULL );
|
||||
assert( Reason != NULL );
|
||||
|
||||
Log( LOG_ERR, "User(s) with nick \"%s\" will be disconnected: %s", Nick, Reason );
|
||||
|
||||
/* andere Server benachrichtigen */
|
||||
IRC_WriteStrServers( NULL, "KILL %s :%s", Nick, Reason );
|
||||
|
||||
/* Ggf. einen eigenen Client toeten */
|
||||
c = Client_Search( Nick );
|
||||
if( c && ( Client_Conn( c ) != NONE )) Conn_Close( Client_Conn( c ), NULL, Reason, TRUE );
|
||||
} /* Kill_Nick */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-login.h,v 1.3 2002/03/12 14:37:52 alex Exp $
|
||||
*
|
||||
* irc-login.h: Anmeldung und Abmeldung im IRC (Header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __irc_login_h__
|
||||
#define __irc_login_h__
|
||||
|
||||
#include "parse.h"
|
||||
#include "client.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
@@ -0,0 +1,393 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-mode.c,v 1.4 2002/03/25 17:11:45 alex Exp $
|
||||
*
|
||||
* irc-mode.c: IRC-Befehle zur Mode-Aenderung (MODE, AWAY, ...)
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "channel.h"
|
||||
#include "defines.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-mode.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR *mode_ptr, the_modes[CLIENT_MODE_LEN], x[2];
|
||||
CLIENT *cl, *chan_cl, *prefix;
|
||||
BOOLEAN set, ok;
|
||||
CHANNEL *chan;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
cl = chan_cl = prefix = NULL;
|
||||
chan = NULL;
|
||||
|
||||
/* Valider Client? */
|
||||
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
|
||||
|
||||
/* Keine Parameter? */
|
||||
if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Ziel suchen: Client bzw. Channel */
|
||||
if( Client_IsValidNick( Req->argv[0] )) cl = Client_Search( Req->argv[0] );
|
||||
if( Channel_IsValidName( Req->argv[0] )) chan = Channel_Search( Req->argv[0] );
|
||||
|
||||
/* Kein Ziel gefunden? */
|
||||
if(( ! cl ) && ( ! chan )) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
|
||||
assert(( cl && chan ) != TRUE );
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if(( cl ) && ( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
if(( chan ) && ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Client ermitteln, wenn bei Channel-Modes mit 3 Parametern */
|
||||
if(( chan ) && (Req->argc == 3 ))
|
||||
{
|
||||
chan_cl = Client_Search( Req->argv[2] );
|
||||
if( ! chan_cl ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
}
|
||||
|
||||
/* Wenn Anfragender ein User ist: Zugriff erlaubt? */
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
{
|
||||
if( cl )
|
||||
{
|
||||
/* MODE ist nur fuer sich selber zulaessig! */
|
||||
if( cl != Client ) return IRC_WriteStrClient( Client, ERR_USERSDONTMATCH_MSG, Client_ID( Client ));
|
||||
}
|
||||
if( chan )
|
||||
{
|
||||
/* Darf der User die Channel-Modes ermitteln? */
|
||||
}
|
||||
}
|
||||
|
||||
/* Werden die Modes "nur" erfragt? */
|
||||
if(( cl ) && ( Req->argc == 1 )) return IRC_WriteStrClient( Client, RPL_UMODEIS_MSG, Client_ID( Client ), Client_Modes( cl ));
|
||||
if(( chan ) && ( Req->argc == 1 )) return IRC_WriteStrClient( Client, RPL_CHANNELMODEIS_MSG, Client_ID( Client ), Channel_Name( chan ), Channel_Modes( chan ));
|
||||
|
||||
mode_ptr = Req->argv[1];
|
||||
|
||||
/* Sollen Modes gesetzt oder geloescht werden? */
|
||||
if( cl )
|
||||
{
|
||||
if( *mode_ptr == '+' ) set = TRUE;
|
||||
else if( *mode_ptr == '-' ) set = FALSE;
|
||||
else return IRC_WriteStrClient( Client, ERR_UMODEUNKNOWNFLAG_MSG, Client_ID( Client ));
|
||||
mode_ptr++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( *mode_ptr == '-' ) set = FALSE;
|
||||
else set = TRUE;
|
||||
if(( *mode_ptr == '-' ) || ( *mode_ptr == '+' )) mode_ptr++;
|
||||
}
|
||||
|
||||
/* Prefix fuer Antworten etc. ermitteln */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
prefix = Client_Search( Req->prefix );
|
||||
if( ! prefix ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
}
|
||||
else prefix = Client;
|
||||
|
||||
/* Reply-String mit Aenderungen vorbereiten */
|
||||
if( set ) strcpy( the_modes, "+" );
|
||||
else strcpy( the_modes, "-" );
|
||||
|
||||
ok = TRUE;
|
||||
x[1] = '\0';
|
||||
while( *mode_ptr )
|
||||
{
|
||||
x[0] = '\0';
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Befehl kommt von einem Server, daher
|
||||
* trauen wir ihm "unbesehen" ... */
|
||||
x[0] = *mode_ptr;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Modes validieren */
|
||||
if( cl )
|
||||
{
|
||||
/* User-Modes */
|
||||
switch( *mode_ptr )
|
||||
{
|
||||
case 'i':
|
||||
/* invisible */
|
||||
x[0] = 'i';
|
||||
break;
|
||||
case 'r':
|
||||
/* restricted (kann nur gesetzt werden) */
|
||||
if( set ) x[0] = 'r';
|
||||
else ok = IRC_WriteStrClient( Client, ERR_RESTRICTED_MSG, Client_ID( Client ));
|
||||
break;
|
||||
case 'o':
|
||||
/* operator (kann nur geloescht werden) */
|
||||
if( ! set )
|
||||
{
|
||||
Client_SetOperByMe( Client, FALSE );
|
||||
x[0] = 'o';
|
||||
}
|
||||
else ok = IRC_WriteStrClient( Client, ERR_UMODEUNKNOWNFLAG_MSG, Client_ID( Client ));
|
||||
break;
|
||||
case 's':
|
||||
/* server messages */
|
||||
x[0] = 's';
|
||||
break;
|
||||
default:
|
||||
Log( LOG_DEBUG, "Unknown mode \"%c%c\" from \"%s\"!?", set ? '+' : '-', *mode_ptr, Client_ID( Client ));
|
||||
ok = IRC_WriteStrClient( Client, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Client ), set ? '+' : '-', *mode_ptr );
|
||||
x[0] = '\0';
|
||||
}
|
||||
}
|
||||
if( chan )
|
||||
{
|
||||
/* Ist der User ein Channel Operator? */
|
||||
if( ! strchr( Channel_UserModes( chan, Client ), 'o' ))
|
||||
{
|
||||
Log( LOG_DEBUG, "Can't change modes: \"%s\" is not operator on %s!", Client_ID( Client ), Channel_Name( chan ));
|
||||
ok = IRC_WriteStrClient( Client, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Client ), Channel_Name( chan ));
|
||||
break;
|
||||
}
|
||||
|
||||
/* Channel-Modes oder Channel-User-Modes */
|
||||
if( chan_cl )
|
||||
{
|
||||
/* Channel-User-Modes */
|
||||
switch( *mode_ptr )
|
||||
{
|
||||
case 'o':
|
||||
/* Channel Operator */
|
||||
x[0] = 'o';
|
||||
break;
|
||||
case 'v':
|
||||
/* Voice */
|
||||
x[0] = 'v';
|
||||
break;
|
||||
default:
|
||||
Log( LOG_DEBUG, "Unknown channel-user-mode \"%c%c\" from \"%s\" on \"%s\" at %s!?", set ? '+' : '-', *mode_ptr, Client_ID( Client ), Client_ID( chan_cl ), Channel_Name( chan ));
|
||||
ok = IRC_WriteStrClient( Client, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Client ), set ? '+' : '-', *mode_ptr );
|
||||
x[0] = '\0';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Channel-Modes */
|
||||
switch( *mode_ptr )
|
||||
{
|
||||
case 'a':
|
||||
/* Anonymous */
|
||||
x[0] = 'a';
|
||||
break;
|
||||
case 'm':
|
||||
/* Moderated */
|
||||
x[0] = 'm';
|
||||
break;
|
||||
case 'n':
|
||||
/* kein Schreiben in den Channel von aussen */
|
||||
x[0] = 'n';
|
||||
break;
|
||||
case 'p':
|
||||
/* Private */
|
||||
x[0] = 'p';
|
||||
break;
|
||||
case 'q':
|
||||
/* Quiet */
|
||||
x[0] = 'q';
|
||||
break;
|
||||
case 's':
|
||||
/* Secret */
|
||||
x[0] = 's';
|
||||
break;
|
||||
case 't':
|
||||
/* Topic Lock */
|
||||
x[0] = 't';
|
||||
break;
|
||||
default:
|
||||
Log( LOG_DEBUG, "Unknown channel-mode \"%c%c\" from \"%s\" at %s!?", set ? '+' : '-', *mode_ptr, Client_ID( Client ), Channel_Name( chan ));
|
||||
ok = IRC_WriteStrClient( Client, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Client ), set ? '+' : '-', *mode_ptr );
|
||||
x[0] = '\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if( ! ok ) break;
|
||||
|
||||
mode_ptr++;
|
||||
if( ! x[0] ) continue;
|
||||
|
||||
/* Okay, gueltigen Mode gefunden */
|
||||
if( cl )
|
||||
{
|
||||
/* Es geht um User-Modes */
|
||||
if( set )
|
||||
{
|
||||
/* Mode setzen. Wenn der Client ihn noch nicht hatte: merken */
|
||||
if( Client_ModeAdd( cl, x[0] )) strcat( the_modes, x );
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Modes geloescht. Wenn der Client ihn hatte: merken */
|
||||
if( Client_ModeDel( cl, x[0] )) strcat( the_modes, x );
|
||||
}
|
||||
|
||||
/* "nachbearbeiten" */
|
||||
if( x[0] == 'a' )
|
||||
{
|
||||
/* away */
|
||||
if( set ) Client_SetAway( cl, DEFAULT_AWAY_MSG );
|
||||
else Client_SetAway( cl, NULL );
|
||||
}
|
||||
}
|
||||
if( chan )
|
||||
{
|
||||
/* Es geht um Channel-Modes oder Channel-User-Modes */
|
||||
if( chan_cl )
|
||||
{
|
||||
/* Channel-User-Modes */
|
||||
if( set )
|
||||
{
|
||||
/* Mode setzen. Wenn der Channel ihn noch nicht hatte: merken */
|
||||
if( Channel_UserModeAdd( chan, chan_cl, x[0] )) strcat( the_modes, x );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Mode setzen. Wenn der Channel ihn noch nicht hatte: merken */
|
||||
if( Channel_UserModeDel( chan, chan_cl, x[0] )) strcat( the_modes, x );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Channel-Mode */
|
||||
if( set )
|
||||
{
|
||||
/* Mode setzen. Wenn der Channel ihn noch nicht hatte: merken */
|
||||
if( Channel_ModeAdd( chan, x[0] )) strcat( the_modes, x );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Mode setzen. Wenn der Channel ihn noch nicht hatte: merken */
|
||||
if( Channel_ModeDel( chan, x[0] )) strcat( the_modes, x );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Wurden Modes geaendert? */
|
||||
if( the_modes[1] )
|
||||
{
|
||||
if( cl )
|
||||
{
|
||||
/* Client-Mode */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Modes an andere Server forwarden */
|
||||
IRC_WriteStrServersPrefix( Client, prefix, "MODE %s :%s", Client_ID( cl ), the_modes );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Bestaetigung an Client schicken & andere Server informieren */
|
||||
ok = IRC_WriteStrClientPrefix( Client, prefix, "MODE %s %s", Client_ID( cl ), the_modes );
|
||||
IRC_WriteStrServersPrefix( Client, prefix, "MODE %s :%s", Client_ID( cl ), the_modes );
|
||||
}
|
||||
Log( LOG_DEBUG, "User \"%s\": Mode change, now \"%s\".", Client_Mask( cl ), Client_Modes( cl ));
|
||||
}
|
||||
if( chan )
|
||||
{
|
||||
/* Channel-Modes oder Channel-User-Mode */
|
||||
if( chan_cl )
|
||||
{
|
||||
/* Channel-User-Mode */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Modes an andere Server und Channel-User forwarden */
|
||||
IRC_WriteStrServersPrefix( Client, prefix, "MODE %s %s :%s", Channel_Name( chan ), the_modes, Client_ID( chan_cl));
|
||||
IRC_WriteStrChannelPrefix( Client, chan, prefix, FALSE, "MODE %s %s %s", Channel_Name( chan ), the_modes, Client_ID( chan_cl));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Bestaetigung an Client schicken & andere Server sowie Channel-User informieren */
|
||||
ok = IRC_WriteStrClientPrefix( Client, prefix, "MODE %s %s %s", Channel_Name( chan ), the_modes, Client_ID( chan_cl));
|
||||
IRC_WriteStrServersPrefix( Client, prefix, "MODE %s %s :%s", Channel_Name( chan ), the_modes, Client_ID( chan_cl));
|
||||
IRC_WriteStrChannelPrefix( Client, chan, prefix, FALSE, "MODE %s %s %s", Channel_Name( chan ), the_modes, Client_ID( chan_cl));
|
||||
}
|
||||
Log( LOG_DEBUG, "User \"%s\" on %s: Mode change, now \"%s\".", Client_Mask( chan_cl), Channel_Name( chan ), Channel_UserModes( chan, chan_cl ));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Channel-Mode */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Modes an andere Server und Channel-User forwarden */
|
||||
IRC_WriteStrServersPrefix( Client, prefix, "MODE %s :%s", Channel_Name( chan ), the_modes );
|
||||
IRC_WriteStrChannelPrefix( Client, chan, prefix, FALSE, "MODE %s %s", Channel_Name( chan ), the_modes );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Bestaetigung an Client schicken & andere Server sowie Channel-User informieren */
|
||||
ok = IRC_WriteStrClientPrefix( Client, prefix, "MODE %s %s", Channel_Name( chan ), the_modes );
|
||||
IRC_WriteStrServersPrefix( Client, prefix, "MODE %s :%s", Channel_Name( chan ), the_modes );
|
||||
IRC_WriteStrChannelPrefix( Client, chan, prefix, FALSE, "MODE %s %s", Channel_Name( chan ), the_modes );
|
||||
}
|
||||
Log( LOG_DEBUG, "Channel \"%s\": Mode change, now \"%s\".", Channel_Name( chan ), Channel_Modes( chan ));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ok;
|
||||
} /* IRC_MODE */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_AWAY( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
if( Client_Type( Client ) != CLIENT_USER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
if(( Req->argc == 1 ) && (Req->argv[0][0] ))
|
||||
{
|
||||
/* AWAY setzen */
|
||||
Client_SetAway( Client, Req->argv[0] );
|
||||
IRC_WriteStrServersPrefix( Client, Client, "MODE %s :+a", Client_ID( Client ));
|
||||
return IRC_WriteStrClient( Client, RPL_NOWAWAY_MSG, Client_ID( Client ));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* AWAY loeschen */
|
||||
Client_SetAway( Client, NULL );
|
||||
IRC_WriteStrServersPrefix( Client, Client, "MODE %s :-a", Client_ID( Client ));
|
||||
return IRC_WriteStrClient( Client, RPL_UNAWAY_MSG, Client_ID( Client ));
|
||||
}
|
||||
} /* IRC_AWAY */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-mode.h,v 1.2.2.1 2002/04/08 18:07:42 alex Exp $
|
||||
*
|
||||
* irc-mode.h: IRC-Befehle zur Mode-Aenderung (MODE, AWAY, ...) (Header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __irc_mode_h__
|
||||
#define __irc_mode_h__
|
||||
|
||||
#include "parse.h"
|
||||
#include "client.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_AWAY( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
@@ -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- */
|
||||
@@ -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- */
|
||||
@@ -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- */
|
||||
@@ -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- */
|
||||
@@ -0,0 +1,271 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-write.c,v 1.3 2002/03/25 17:13:07 alex Exp $
|
||||
*
|
||||
* irc-write.c: IRC-Texte und Befehle ueber Netzwerk versenden
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "defines.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-write.h"
|
||||
|
||||
|
||||
LOCAL CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client );
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... )
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
BOOLEAN ok = CONNECTED;
|
||||
va_list ap;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
va_start( ap, Format );
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
/* an den Client selber */
|
||||
ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), buffer );
|
||||
|
||||
return ok;
|
||||
} /* IRC_WriteStrClient */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... )
|
||||
{
|
||||
/* Text an Clients, lokal bzw. remote, senden. */
|
||||
|
||||
CHAR buffer[1000];
|
||||
va_list ap;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Format != NULL );
|
||||
assert( Prefix != NULL );
|
||||
|
||||
va_start( ap, Format );
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
return Conn_WriteStr( Client_Conn( Client_NextHop( Client )), ":%s %s", Get_Prefix( Client_NextHop( Client ), Prefix ), buffer );
|
||||
} /* IRC_WriteStrClientPrefix */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... )
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
va_list ap;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
va_start( ap, Format );
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, buffer );
|
||||
} /* IRC_WriteStrChannel */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
|
||||
{
|
||||
BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
|
||||
CHAR buffer[1000];
|
||||
CL2CHAN *cl2chan;
|
||||
CLIENT *c;
|
||||
INT s, i;
|
||||
va_list ap;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Chan != NULL );
|
||||
assert( Prefix != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
va_start( ap, Format );
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
for( i = 0; i < MAX_CONNECTIONS; i++ ) sock[i] = FALSE;
|
||||
|
||||
/* An alle Clients, die in den selben Channels sind.
|
||||
* Dabei aber nur einmal je Remote-Server */
|
||||
cl2chan = Channel_FirstMember( Chan );
|
||||
while( cl2chan )
|
||||
{
|
||||
c = Channel_GetClient( cl2chan );
|
||||
if( ! Remote )
|
||||
{
|
||||
if( Client_Conn( c ) <= NONE ) c = NULL;
|
||||
else if( Client_Type( c ) == CLIENT_SERVER ) c = NULL;
|
||||
}
|
||||
if( c ) c = Client_NextHop( c );
|
||||
|
||||
if( c && ( c != Client ))
|
||||
{
|
||||
/* Ok, anderer Client */
|
||||
s = Client_Conn( c );
|
||||
assert( s >= 0 );
|
||||
assert( s < MAX_CONNECTIONS );
|
||||
sock[s] = TRUE;
|
||||
if( Client_Type( c ) == CLIENT_SERVER ) is_server[s] = TRUE;
|
||||
else is_server[s] = FALSE;
|
||||
}
|
||||
cl2chan = Channel_NextMember( Chan, cl2chan );
|
||||
}
|
||||
|
||||
/* Senden ... */
|
||||
for( i = 0; i < MAX_CONNECTIONS; i++ )
|
||||
{
|
||||
if( sock[i] )
|
||||
{
|
||||
if( is_server[i] ) ok = Conn_WriteStr( i, ":%s %s", Client_ID( Prefix ), buffer );
|
||||
else ok = Conn_WriteStr( i, ":%s %s", Client_Mask( Prefix ), buffer );
|
||||
if( ! ok ) break;
|
||||
}
|
||||
}
|
||||
return ok;
|
||||
} /* IRC_WriteStrChannelPrefix */
|
||||
|
||||
|
||||
GLOBAL VOID IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... )
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
|
||||
va_start( ap, Format );
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
/* an den Client selber */
|
||||
return IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), buffer );
|
||||
} /* IRC_WriteStrServers */
|
||||
|
||||
|
||||
GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... )
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
CLIENT *c;
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
assert( Prefix != NULL );
|
||||
|
||||
va_start( ap, Format );
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if(( Client_Type( c ) == CLIENT_SERVER ) && ( Client_Conn( c ) > NONE ) && ( c != Client_ThisServer( )) && ( c != ExceptOf ))
|
||||
{
|
||||
/* Ziel-Server gefunden */
|
||||
IRC_WriteStrClientPrefix( c, Prefix, buffer );
|
||||
}
|
||||
c = Client_Next( c );
|
||||
}
|
||||
} /* IRC_WriteStrServersPrefix */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
|
||||
{
|
||||
BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
|
||||
CL2CHAN *chan_cl2chan, *cl2chan;
|
||||
CHAR buffer[1000];
|
||||
CHANNEL *chan;
|
||||
va_list ap;
|
||||
CLIENT *c;
|
||||
INT i, s;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Prefix != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
va_start( ap, Format );
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
/* initialisieren */
|
||||
for( i = 0; i < MAX_CONNECTIONS; i++ ) sock[i] = FALSE;
|
||||
|
||||
/* An alle Clients, die in einem Channel mit dem "Ausloeser" sind,
|
||||
* den Text schicken. An Remote-Server aber jeweils nur einmal. */
|
||||
chan_cl2chan = Channel_FirstChannelOf( Client );
|
||||
while( chan_cl2chan )
|
||||
{
|
||||
/* Channel des Users durchsuchen */
|
||||
chan = Channel_GetChannel( chan_cl2chan );
|
||||
cl2chan = Channel_FirstMember( chan );
|
||||
while( cl2chan )
|
||||
{
|
||||
c = Channel_GetClient( cl2chan );
|
||||
if( ! Remote )
|
||||
{
|
||||
if( Client_Conn( c ) <= NONE ) c = NULL;
|
||||
else if( Client_Type( c ) == CLIENT_SERVER ) c = NULL;
|
||||
}
|
||||
if( c ) c = Client_NextHop( c );
|
||||
|
||||
if( c && ( c != Client ))
|
||||
{
|
||||
/* Ok, anderer Client */
|
||||
s = Client_Conn( c );
|
||||
assert( s >= 0 );
|
||||
assert( s < MAX_CONNECTIONS );
|
||||
sock[s] = TRUE;
|
||||
if( Client_Type( c ) == CLIENT_SERVER ) is_server[s] = TRUE;
|
||||
else is_server[s] = FALSE;
|
||||
}
|
||||
cl2chan = Channel_NextMember( chan, cl2chan );
|
||||
}
|
||||
|
||||
/* naechsten Channel */
|
||||
chan_cl2chan = Channel_NextChannelOf( Client, chan_cl2chan );
|
||||
}
|
||||
|
||||
/* Senden ... */
|
||||
for( i = 0; i < MAX_CONNECTIONS; i++ )
|
||||
{
|
||||
if( sock[i] )
|
||||
{
|
||||
if( is_server[i] ) ok = Conn_WriteStr( i, ":%s %s", Client_ID( Prefix ), buffer );
|
||||
else ok = Conn_WriteStr( i, ":%s %s", Client_Mask( Prefix ), buffer );
|
||||
if( ! ok ) break;
|
||||
}
|
||||
}
|
||||
return ok;
|
||||
} /* IRC_WriteStrRelatedPrefix */
|
||||
|
||||
|
||||
LOCAL CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client )
|
||||
{
|
||||
assert( Target != NULL );
|
||||
assert( Client != NULL );
|
||||
|
||||
if( Client_Type( Target ) == CLIENT_SERVER ) return Client_ID( Client );
|
||||
else return Client_Mask( Client );
|
||||
} /* Get_Prefix */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-write.h,v 1.2 2002/03/12 14:37:52 alex Exp $
|
||||
*
|
||||
* irc-write.h: IRC-Texte und Befehle ueber Netzwerk versenden (Header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __irc_write_h__
|
||||
#define __irc_write_h__
|
||||
|
||||
#include "channel.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... );
|
||||
GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... );
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... );
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... );
|
||||
|
||||
GLOBAL VOID IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... );
|
||||
GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... );
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
+280
-1603
File diff suppressed because it is too large
Load Diff
+9
-102
@@ -9,82 +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.21 2002/01/27 21:53:57 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.21 2002/01/27 21:53:57 alex
|
||||
* - IRC_WriteStrServersPrefixID() und IRC_WriteStrClientPrefixID() wieder entfernt.
|
||||
*
|
||||
* Revision 1.20 2002/01/27 17:15:49 alex
|
||||
* - anderungen an den Funktions-Prototypen von IRC_WriteStrChannel() und
|
||||
* IRC_WriteStrChannelPrefix(),
|
||||
* - neue: IRC_WriteStrClientPrefixID() und IRC_WriteStrServersPrefixID().
|
||||
*
|
||||
* Revision 1.19 2002/01/26 18:43:11 alex
|
||||
* - neue Funktionen IRC_WriteStrChannelPrefix() und IRC_WriteStrChannel(),
|
||||
* die IRC_Write_xxx_Related() sind dafuer entfallen.
|
||||
* - IRC_PRIVMSG() kann nun auch mit Channels als Ziel umgehen.
|
||||
*
|
||||
* Revision 1.18 2002/01/21 00:04:13 alex
|
||||
* - neue Funktionen IRC_JOIN, IRC_PART, IRC_WriteStrRelatedPrefix und
|
||||
* IRC_WriteStrRelatedChannelPrefix().
|
||||
*
|
||||
* Revision 1.17 2002/01/11 23:50:55 alex
|
||||
* - LINKS implementiert, LUSERS begonnen.
|
||||
*
|
||||
* Revision 1.16 2002/01/05 19:15:03 alex
|
||||
* - Fehlerpruefung bei select() in der "Hauptschleife" korrigiert.
|
||||
*
|
||||
* Revision 1.15 2002/01/04 17:58:21 alex
|
||||
* - IRC_WriteStrXXX()-Funktionen angepasst; neuer Befehl SQUIT.
|
||||
*
|
||||
* Revision 1.14 2002/01/03 02:26:07 alex
|
||||
* - neue Befehle SERVER und NJOIN begonnen.
|
||||
*
|
||||
* Revision 1.13 2002/01/02 02:51:39 alex
|
||||
* - Copyright-Texte angepasst.
|
||||
* - neuer Befehl "ERROR".
|
||||
*
|
||||
* Revision 1.11 2001/12/31 15:33:13 alex
|
||||
* - neuer Befehl NAMES, kleinere Bugfixes.
|
||||
* - Bug bei PING behoben: war zu restriktiv implementiert :-)
|
||||
*
|
||||
* Revision 1.10 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.9 2001/12/29 03:09:31 alex
|
||||
* - Neue Funktion IRC_MODE() implementiert.
|
||||
*
|
||||
* Revision 1.8 2001/12/27 19:17:26 alex
|
||||
* - neue Befehle PRIVMSG, NOTICE, PING.
|
||||
*
|
||||
* Revision 1.7 2001/12/27 16:55:41 alex
|
||||
* - neu: IRC_WriteStrRelated(), Aenderungen auch in IRC_WriteStrClient().
|
||||
*
|
||||
* Revision 1.6 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.5 2001/12/26 03:21:46 alex
|
||||
* - PING/PONG-Befehle implementiert,
|
||||
* - Meldungen ueberarbeitet: enthalten nun (fast) immer den Nick.
|
||||
*
|
||||
* Revision 1.4 2001/12/25 22:02:42 alex
|
||||
* - neuer IRC-Befehl "/QUIT". Verbessertes Logging & Debug-Ausgaben.
|
||||
*
|
||||
* Revision 1.3 2001/12/25 19:19:30 alex
|
||||
* - bessere Fehler-Abfragen, diverse Bugfixes.
|
||||
* - Nicks werden nur einmal vergeben :-)
|
||||
* - /MOTD wird unterstuetzt.
|
||||
*
|
||||
* Revision 1.2 2001/12/23 21:57:16 alex
|
||||
* - erste IRC-Befehle zu implementieren begonnen.
|
||||
*
|
||||
* Revision 1.1 2001/12/14 08:13:43 alex
|
||||
* - neues Modul begonnen :-)
|
||||
*/
|
||||
|
||||
|
||||
@@ -92,51 +19,31 @@
|
||||
#define __irc_h__
|
||||
|
||||
#include "parse.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
|
||||
|
||||
GLOBAL VOID IRC_Init( VOID );
|
||||
GLOBAL VOID IRC_Exit( VOID );
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... );
|
||||
GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... );
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... );
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... );
|
||||
GLOBAL VOID IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... );
|
||||
GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... );
|
||||
|
||||
GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_SQUIT( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
GLOBAL BOOLEAN IRC_MOTD( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_LUSERS( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_LINKS( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_VERSION( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_ISON( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_USERHOST( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
GLOBAL BOOLEAN IRC_OPER( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_DIE( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_RESTART( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_WHO( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
GLOBAL BOOLEAN IRC_ERROR( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_KILL( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_PART( 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
|
||||
|
||||
+130
-72
@@ -9,116 +9,142 @@
|
||||
* 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.17 2002/01/11 14:45:37 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.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 )
|
||||
{
|
||||
#ifdef USE_SYSLOG
|
||||
/* Syslog initialisieren */
|
||||
openlog( PACKAGE, LOG_CONS|LOG_PID, LOG_LOCAL5 );
|
||||
#endif
|
||||
|
||||
/* Hello World! */
|
||||
Log( LOG_NOTICE, "%s started.", NGIRCd_Version( ));
|
||||
|
||||
/* Informationen uebern den "Operation Mode" */
|
||||
strcpy( Init_Txt, "" );
|
||||
#ifdef DEBUG
|
||||
if( NGIRCd_Debug )
|
||||
{
|
||||
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
|
||||
strcat( Init_Txt, "debug-mode" );
|
||||
}
|
||||
#endif
|
||||
if( NGIRCd_NoDaemon )
|
||||
{
|
||||
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
|
||||
strcat( Init_Txt, "no-daemon-mode" );
|
||||
}
|
||||
if( NGIRCd_Passive )
|
||||
{
|
||||
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
|
||||
strcat( Init_Txt, "passive-mode" );
|
||||
}
|
||||
#ifdef SNIFFER
|
||||
if( NGIRCd_Sniffer )
|
||||
{
|
||||
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
|
||||
strcat( Init_Txt, "network sniffer" );
|
||||
}
|
||||
#endif
|
||||
if( Init_Txt[0] ) Log( LOG_INFO, "Activating: %s.", Init_Txt );
|
||||
} /* Log_Init */
|
||||
|
||||
|
||||
GLOBAL VOID Log_InitErrorfile( VOID )
|
||||
{
|
||||
/* "Error-Log" initialisieren: stderr in Datei umlenken. Dort
|
||||
* landen z.B. alle Ausgaben von assert()-Aufrufen. */
|
||||
|
||||
/* Dateiname zusammen bauen */
|
||||
sprintf( Error_File, ERROR_DIR"/"PACKAGE"-%ld.err", (INT32)getpid( ));
|
||||
|
||||
/* stderr umlenken */
|
||||
fflush( stderr );
|
||||
if( ! freopen( Error_File, "w", stderr ))
|
||||
{
|
||||
Log( LOG_ERR, "Can't reopen stderr (\"%s\"): %s", Error_File, strerror( errno ));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Einige Infos in das Error-File schreiben */
|
||||
fputs( ctime( &NGIRCd_Start ), stderr );
|
||||
fprintf( stderr, "%s started.\n", NGIRCd_Version( ));
|
||||
fprintf( stderr, "Activating: %s\n\n", Init_Txt[0] ? Init_Txt : "-" );
|
||||
fflush( stderr );
|
||||
|
||||
Log( LOG_DEBUG, "Redirected stderr to \"%s\".", Error_File );
|
||||
} /* Log_InitErrfile */
|
||||
|
||||
|
||||
GLOBAL VOID Log_Exit( VOID )
|
||||
{
|
||||
/* Good Bye! */
|
||||
Log( LOG_NOTICE, PACKAGE" done.");
|
||||
|
||||
/* Error-File (stderr) loeschen */
|
||||
if( unlink( Error_File ) != 0 ) Log( LOG_ERR, "Can't delete \"%s\": %s", Error_File, strerror( errno ));
|
||||
|
||||
#ifdef USE_SYSLOG
|
||||
/* syslog abmelden */
|
||||
closelog( );
|
||||
#endif
|
||||
} /* Log_Exit */
|
||||
|
||||
|
||||
GLOBAL VOID Log( CONST INT Level, CONST CHAR *Format, ... )
|
||||
GLOBAL VOID Log( INT Level, CONST CHAR *Format, ... )
|
||||
{
|
||||
/* Eintrag in Logfile(s) schreiben */
|
||||
|
||||
CHAR msg[MAX_LOG_MSG_LEN];
|
||||
BOOLEAN snotice;
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
|
||||
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
|
||||
@@ -127,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 */
|
||||
|
||||
|
||||
@@ -177,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- */
|
||||
|
||||
+6
-26
@@ -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 );
|
||||
|
||||
+44
-103
@@ -9,100 +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.28 2002/02/13 23:04:50 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.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 :-)
|
||||
*/
|
||||
|
||||
|
||||
@@ -114,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"
|
||||
@@ -122,6 +31,9 @@
|
||||
#define RPL_MYINFO "004"
|
||||
#define RPL_MYINFO_MSG RPL_MYINFO" %s :%s ngircd-"VERSION" "USERMODES" "CHANMODES
|
||||
|
||||
#define RPL_UMODEIS "211"
|
||||
#define RPL_UMODEIS_MSG RPL_UMODEIS" %s +%s"
|
||||
|
||||
#define RPL_LUSERCLIENT "251"
|
||||
#define RPL_LUSERCLIENT_MSG RPL_LUSERCLIENT" %s :There are %d users and %d services on %d servers"
|
||||
|
||||
@@ -137,17 +49,24 @@
|
||||
#define RPL_LUSERME "255"
|
||||
#define RPL_LUSERME_MSG RPL_LUSERME" %s :I have %d users, %d services and %d servers"
|
||||
|
||||
#define RPL_MOTDSTART "375"
|
||||
#define RPL_MOTDSTART_MSG RPL_MOTDSTART" %s :- %s message of the day"
|
||||
|
||||
#define RPL_UNAWAY "305"
|
||||
#define RPL_UNAWAY_MSG RPL_UNAWAY" %s :You are no longer marked as being away"
|
||||
|
||||
#define RPL_NOWAWAY "306"
|
||||
#define RPL_NOWAWAY_MSG RPL_NOWAWAY" %s :You have been marked as being away"
|
||||
|
||||
#define RPL_MOTD "372"
|
||||
#define RPL_MOTD_MSG RPL_MOTD" %s :- %s"
|
||||
|
||||
#define RPL_MOTDSTART "375"
|
||||
#define RPL_MOTDSTART_MSG RPL_MOTDSTART" %s :- %s message of the day"
|
||||
|
||||
#define RPL_ENDOFMOTD "376"
|
||||
#define RPL_ENDOFMOTD_MSG RPL_ENDOFMOTD" %s :End of MOTD command"
|
||||
|
||||
#define RPL_UMODEIS "211"
|
||||
#define RPL_UMODEIS_MSG RPL_UMODEIS" %s +%s"
|
||||
#define RPL_AWAY "301"
|
||||
#define RPL_AWAY_MSG RPL_AWAY" %s %s :%s"
|
||||
|
||||
#define RPL_USERHOST "302"
|
||||
#define RPL_USERHOST_MSG RPL_USERHOST" %s :"
|
||||
@@ -164,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"
|
||||
|
||||
@@ -173,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"
|
||||
|
||||
@@ -182,6 +110,12 @@
|
||||
#define RPL_TOPIC "332"
|
||||
#define RPL_TOPIC_MSG RPL_TOPIC" %s %s :%s"
|
||||
|
||||
#define RPL_VERSION "351"
|
||||
#define RPL_VERSION_MSG RPL_VERSION" %s "PACKAGE"-"VERSION".%s %s :%s"
|
||||
|
||||
#define RPL_WHOREPLY "352"
|
||||
#define RPL_WHOREPLY_MSG RPL_WHOREPLY" %s %s %s %s %s %s %s :%d %s"
|
||||
|
||||
#define RPL_NAMREPLY "353"
|
||||
#define RPL_NAMREPLY_MSG RPL_NAMREPLY" %s %s %s :"
|
||||
|
||||
@@ -194,7 +128,6 @@
|
||||
#define RPL_ENDOFNAMES "366"
|
||||
#define RPL_ENDOFNAMES_MSG RPL_ENDOFNAMES" %s %s :End of NAMES list"
|
||||
|
||||
|
||||
#define RPL_YOUREOPER "381"
|
||||
#define RPL_YOUREOPER_MSG RPL_YOUREOPER" %s :You are now an IRC Operator"
|
||||
|
||||
@@ -208,6 +141,9 @@
|
||||
#define ERR_NOSUCHCHANNEL "403"
|
||||
#define ERR_NOSUCHCHANNEL_MSG ERR_NOSUCHCHANNEL" %s %s :No such channel"
|
||||
|
||||
#define ERR_CANNOTSENDTOCHAN "404"
|
||||
#define ERR_CANNOTSENDTOCHAN_MSG ERR_CANNOTSENDTOCHAN" %s %s :Cannot send to channel"
|
||||
|
||||
#define ERR_NOORIGIN "409"
|
||||
#define ERR_NOORIGIN_MSG ERR_NOORIGIN" %s :No origin specified"
|
||||
|
||||
@@ -229,6 +165,13 @@
|
||||
#define ERR_NICKNAMEINUSE "433"
|
||||
#define ERR_NICKNAMEINUSE_MSG ERR_NICKNAMEINUSE" %s %s :Nickname already in use"
|
||||
|
||||
#define ERR_NOTONCHANNEL "442"
|
||||
#define ERR_NOTONCHANNEL_MSG ERR_NOTONCHANNEL" %s %s :You are not on that channel"
|
||||
|
||||
#define ERR_NOTREGISTERED "451"
|
||||
#define ERR_NOTREGISTERED_MSG ERR_NOTREGISTERED" %s :Connection not registered"
|
||||
#define ERR_NOTREGISTEREDSERVER_MSG ERR_NOTREGISTERED" %s :Connection not registered as server link"
|
||||
|
||||
#define ERR_NEEDMOREPARAMS "461"
|
||||
#define ERR_NEEDMOREPARAMS_MSG ERR_NEEDMOREPARAMS" %s %s :Syntax error"
|
||||
|
||||
@@ -238,10 +181,6 @@
|
||||
#define ERR_PASSWDMISMATCH "464"
|
||||
#define ERR_PASSWDMISMATCH_MSG ERR_PASSWDMISMATCH" %s: Invalid password"
|
||||
|
||||
#define ERR_NOTREGISTERED "451"
|
||||
#define ERR_NOTREGISTERED_MSG ERR_NOTREGISTERED" %s :Connection not registered"
|
||||
#define ERR_NOTREGISTEREDSERVER_MSG ERR_NOTREGISTERED" %s :Connection not registered as server link"
|
||||
|
||||
#define ERR_NOPRIVILEGES "481"
|
||||
#define ERR_NOPRIVILEGES_MSG ERR_NOPRIVILEGES" %s :Permission denied"
|
||||
|
||||
@@ -254,8 +193,10 @@
|
||||
#define ERR_NOOPERHOST "491"
|
||||
#define ERR_NOOPERHOST_MSG ERR_NOOPERHOST" %s :Not configured for your host"
|
||||
|
||||
|
||||
#define ERR_UMODEUNKNOWNFLAG "501"
|
||||
#define ERR_UMODEUNKNOWNFLAG_MSG ERR_UMODEUNKNOWNFLAG" %s :Unknown mode flag"
|
||||
#define ERR_UMODEUNKNOWNFLAG_MSG ERR_UMODEUNKNOWNFLAG" %s :Unknown mode"
|
||||
#define ERR_UMODEUNKNOWNFLAG2_MSG ERR_UMODEUNKNOWNFLAG" %s :Unknown mode \"%c%c\""
|
||||
|
||||
#define ERR_USERSDONTMATCH "502"
|
||||
#define ERR_USERSDONTMATCH_MSG ERR_USERSDONTMATCH" %s :Can't set/get mode for other users"
|
||||
|
||||
+166
-127
@@ -9,94 +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.22 2002/01/22 17:15:39 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.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>
|
||||
@@ -108,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"
|
||||
|
||||
|
||||
@@ -125,23 +51,23 @@ 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;
|
||||
NGIRCd_NoDaemon = FALSE;
|
||||
NGIRCd_Passive = FALSE;
|
||||
#ifdef DEBUG
|
||||
NGIRCd_Debug = FALSE;
|
||||
#endif
|
||||
#ifdef SNIFFER
|
||||
NGIRCd_Sniffer = FALSE;
|
||||
#endif
|
||||
strcpy( NGIRCd_ConfFile, CONFIG_FILE );
|
||||
|
||||
/* Kommandozeile parsen */
|
||||
for( i = 1; i < argc; i++ )
|
||||
@@ -151,16 +77,22 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
|
||||
{
|
||||
/* Lange Option */
|
||||
|
||||
if( strcmp( argv[i], "--help" ) == 0 )
|
||||
if( strcmp( argv[i], "--config" ) == 0 )
|
||||
{
|
||||
Show_Version( ); puts( "" );
|
||||
Show_Help( ); puts( "" );
|
||||
exit( 1 );
|
||||
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], "--version" ) == 0 )
|
||||
if( strcmp( argv[i], "--configtest" ) == 0 )
|
||||
{
|
||||
Show_Version( );
|
||||
exit( 1 );
|
||||
configtest = TRUE;
|
||||
ok = TRUE;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
if( strcmp( argv[i], "--debug" ) == 0 )
|
||||
@@ -169,6 +101,22 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
|
||||
ok = TRUE;
|
||||
}
|
||||
#endif
|
||||
if( strcmp( argv[i], "--help" ) == 0 )
|
||||
{
|
||||
Show_Version( );
|
||||
puts( "" ); Show_Help( ); puts( "" );
|
||||
exit( 1 );
|
||||
}
|
||||
if( strcmp( argv[i], "--nodaemon" ) == 0 )
|
||||
{
|
||||
NGIRCd_NoDaemon = TRUE;
|
||||
ok = TRUE;
|
||||
}
|
||||
if( strcmp( argv[i], "--passive" ) == 0 )
|
||||
{
|
||||
NGIRCd_Passive = TRUE;
|
||||
ok = TRUE;
|
||||
}
|
||||
#ifdef SNIFFER
|
||||
if( strcmp( argv[i], "--sniffer" ) == 0 )
|
||||
{
|
||||
@@ -176,17 +124,17 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
|
||||
ok = TRUE;
|
||||
}
|
||||
#endif
|
||||
if( strcmp( argv[i], "--nodaemon" ) == 0 )
|
||||
if( strcmp( argv[i], "--version" ) == 0 )
|
||||
{
|
||||
NGIRCd_NoDaemon = TRUE;
|
||||
ok = TRUE;
|
||||
Show_Version( );
|
||||
exit( 1 );
|
||||
}
|
||||
}
|
||||
else if(( argv[i][0] == '-' ) && ( argv[i][1] != '-' ))
|
||||
{
|
||||
/* Kurze Option */
|
||||
|
||||
for( n = 1; n < strlen( argv[i] ); n++ )
|
||||
for( n = 1; n < (INT32)strlen( argv[i] ); n++ )
|
||||
{
|
||||
ok = FALSE;
|
||||
#ifdef DEBUG
|
||||
@@ -196,6 +144,29 @@ 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;
|
||||
ok = TRUE;
|
||||
}
|
||||
if( argv[i][n] == 'p' )
|
||||
{
|
||||
NGIRCd_Passive = TRUE;
|
||||
ok = TRUE;
|
||||
}
|
||||
#ifdef SNIFFER
|
||||
if( argv[i][n] == 's' )
|
||||
{
|
||||
@@ -203,11 +174,6 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
|
||||
ok = TRUE;
|
||||
}
|
||||
#endif
|
||||
if( argv[i][n] == 'n' )
|
||||
{
|
||||
NGIRCd_NoDaemon = TRUE;
|
||||
ok = TRUE;
|
||||
}
|
||||
|
||||
if( ! ok )
|
||||
{
|
||||
@@ -226,6 +192,22 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
|
||||
}
|
||||
}
|
||||
|
||||
/* Debug-Level (fuer IRC-Befehl "VERSION") ermitteln */
|
||||
strcpy( NGIRCd_DebugLevel, "" );
|
||||
#ifdef DEBUG
|
||||
if( NGIRCd_Debug ) strcpy( NGIRCd_DebugLevel, "1" );
|
||||
#endif
|
||||
#ifdef SNIFFER
|
||||
if( NGIRCd_Sniffer ) strcpy( NGIRCd_DebugLevel, "2" );
|
||||
#endif
|
||||
|
||||
/* Soll nur die Konfigurations ueberprueft und ausgegeben werden? */
|
||||
if( configtest )
|
||||
{
|
||||
Show_Version( ); puts( "" );
|
||||
exit( Conf_Test( ));
|
||||
}
|
||||
|
||||
while( ! NGIRCd_Quit )
|
||||
{
|
||||
/* In der Regel wird ein Sub-Prozess ge-fork()'t, der
|
||||
@@ -235,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 */
|
||||
@@ -247,25 +229,44 @@ 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;
|
||||
|
||||
/* Module initialisieren */
|
||||
Log_Init( );
|
||||
Conf_Init( );
|
||||
Parse_Init( );
|
||||
IRC_Init( );
|
||||
Channel_Init( );
|
||||
Client_Init( );
|
||||
Conn_Init( );
|
||||
|
||||
/* Wenn als root ausgefuehrt und eine andere UID
|
||||
* konfiguriert ist, jetzt zu dieser wechseln */
|
||||
if( getuid( ) == 0 )
|
||||
{
|
||||
if( Conf_GID != 0 )
|
||||
{
|
||||
/* Neue Group-ID setzen */
|
||||
if( setgid( Conf_GID ) != 0 ) Log( LOG_ERR, "Can't change Group-ID to %u: %s", Conf_GID, strerror( errno ));
|
||||
}
|
||||
if( Conf_UID != 0 )
|
||||
{
|
||||
/* Neue User-ID setzen */
|
||||
if( setuid( Conf_UID ) != 0 ) Log( LOG_ERR, "Can't change User-ID to %u: %s", Conf_UID, strerror( errno ));
|
||||
}
|
||||
}
|
||||
Log( LOG_INFO, "Running as user %ld, group %ld.", (INT32)getuid( ), (INT32)getgid( ));
|
||||
|
||||
Log_InitErrorfile( );
|
||||
|
||||
/* Signal-Handler initialisieren */
|
||||
Initialize_Signal_Handler( );
|
||||
|
||||
@@ -283,11 +284,10 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
|
||||
Conn_Exit( );
|
||||
Client_Exit( );
|
||||
Channel_Exit( );
|
||||
IRC_Exit( );
|
||||
Parse_Exit( );
|
||||
Conf_Exit( );
|
||||
Log_Exit( );
|
||||
}
|
||||
|
||||
return 0;
|
||||
} /* main */
|
||||
|
||||
@@ -295,34 +295,40 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
|
||||
GLOBAL CHAR *NGIRCd_Version( VOID )
|
||||
{
|
||||
STATIC CHAR version[126];
|
||||
CHAR txt[64];
|
||||
|
||||
sprintf( version, PACKAGE" version "VERSION"-%s", NGIRCd_VersionAddition( ));
|
||||
return version;
|
||||
} /* NGIRCd_Version */
|
||||
|
||||
|
||||
GLOBAL CHAR *NGIRCd_VersionAddition( VOID )
|
||||
{
|
||||
STATIC CHAR txt[64];
|
||||
|
||||
strcpy( txt, "" );
|
||||
|
||||
#ifdef USE_SYSLOG
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
else strcat( txt, "-" );
|
||||
strcat( txt, "SYSLOG" );
|
||||
#endif
|
||||
#ifdef STRICT_RFC
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
else strcat( txt, "-" );
|
||||
strcat( txt, "RFC" );
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
else strcat( txt, "-" );
|
||||
strcat( txt, "DEBUG" );
|
||||
#endif
|
||||
#ifdef SNIFFER
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
else strcat( txt, "-" );
|
||||
strcat( txt, "SNIFFER" );
|
||||
#endif
|
||||
|
||||
sprintf( version, PACKAGE" version "VERSION"%s-"P_OSNAME"/"P_ARCHNAME, txt );
|
||||
return version;
|
||||
} /* NGIRCd_Version */
|
||||
if( txt[0] ) strcat( txt, "-" );
|
||||
strcat( txt, TARGET_CPU"/"TARGET_VENDOR"/"TARGET_OS );
|
||||
|
||||
return txt;
|
||||
} /* NGIRCd_VersionAddition */
|
||||
|
||||
|
||||
LOCAL VOID Initialize_Signal_Handler( VOID )
|
||||
@@ -330,22 +336,44 @@ LOCAL VOID Initialize_Signal_Handler( VOID )
|
||||
/* Signal-Handler initialisieren: einige Signale
|
||||
* werden ignoriert, andere speziell behandelt. */
|
||||
|
||||
#ifdef HAVE_SIGACTION
|
||||
/* sigaction() ist vorhanden */
|
||||
|
||||
struct sigaction saction;
|
||||
|
||||
/* Signal-Struktur initialisieren */
|
||||
memset( &saction, 0, sizeof( saction ));
|
||||
saction.sa_handler = Signal_Handler;
|
||||
saction.sa_flags = SA_RESTART;
|
||||
#ifdef SA_RESTART
|
||||
saction.sa_flags |= SA_RESTART;
|
||||
#endif
|
||||
#ifdef SA_NOCLDWAIT
|
||||
saction.sa_flags |= SA_NOCLDWAIT;
|
||||
#endif
|
||||
|
||||
/* Signal-Handler einhaengen */
|
||||
sigaction( SIGINT, &saction, NULL );
|
||||
sigaction( SIGQUIT, &saction, NULL );
|
||||
sigaction( SIGTERM, &saction, NULL);
|
||||
sigaction( SIGHUP, &saction, NULL);
|
||||
sigaction( SIGCHLD, &saction, NULL);
|
||||
|
||||
/* einige Signale ignorieren */
|
||||
saction.sa_handler = SIG_IGN;
|
||||
sigaction( SIGPIPE, &saction, NULL );
|
||||
#else
|
||||
/* kein sigaction() vorhanden */
|
||||
|
||||
/* Signal-Handler einhaengen */
|
||||
signal( SIGINT, Signal_Handler );
|
||||
signal( SIGQUIT, Signal_Handler );
|
||||
signal( SIGTERM, Signal_Handler );
|
||||
signal( SIGHUP, Signal_Handler );
|
||||
signal( SIGCHLD, Signal_Handler );
|
||||
|
||||
/* einige Signale ignorieren */
|
||||
signal( SIGPIPE, SIG_IGN );
|
||||
#endif
|
||||
} /* Initialize_Signal_Handler */
|
||||
|
||||
|
||||
@@ -361,9 +389,16 @@ LOCAL VOID Signal_Handler( INT Signal )
|
||||
case SIGINT:
|
||||
case SIGQUIT:
|
||||
/* wir soll(t)en uns wohl beenden ... */
|
||||
Log( LOG_WARNING, "Got signal %d, terminating now ...", Signal );
|
||||
if( Signal == SIGTERM ) Log( LOG_WARNING, "Got TERM signal, terminating now ..." );
|
||||
else if( Signal == SIGINT ) Log( LOG_WARNING, "Got INT signal, terminating now ..." );
|
||||
else if( Signal == SIGQUIT ) Log( LOG_WARNING, "Got QUIT signal, terminating now ..." );
|
||||
NGIRCd_Quit = TRUE;
|
||||
break;
|
||||
case SIGHUP:
|
||||
/* neu starten */
|
||||
Log( LOG_WARNING, "Got HUP signal, restarting now ..." );
|
||||
NGIRCd_Restart = TRUE;
|
||||
break;
|
||||
case SIGCHLD:
|
||||
/* Child-Prozess wurde beendet. Zombies vermeiden: */
|
||||
while( waitpid( -1, NULL, WNOHANG ) > 0);
|
||||
@@ -380,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 )
|
||||
@@ -401,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 */
|
||||
@@ -410,14 +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( " -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 */
|
||||
|
||||
|
||||
|
||||
+9
-28
@@ -9,36 +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.8 2002/01/18 11:12:11 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.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.
|
||||
*/
|
||||
|
||||
|
||||
@@ -47,6 +20,8 @@
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#include "defines.h"
|
||||
|
||||
|
||||
GLOBAL time_t NGIRCd_Start; /* Startzeitpunkt des Daemon */
|
||||
GLOBAL CHAR NGIRCd_StartStr[64];
|
||||
@@ -61,11 +36,17 @@ GLOBAL BOOLEAN NGIRCd_Sniffer; /* Sniffer aktivieren */
|
||||
|
||||
GLOBAL BOOLEAN NGIRCd_NoDaemon; /* nicht im Hintergrund laufen */
|
||||
|
||||
GLOBAL BOOLEAN NGIRCd_Passive; /* nicht zu anderen Servern connecten */
|
||||
|
||||
GLOBAL BOOLEAN NGIRCd_Quit; /* TRUE: ngIRCd beenden */
|
||||
GLOBAL BOOLEAN NGIRCd_Restart; /* TRUE: neu starten */
|
||||
|
||||
GLOBAL CHAR NGIRCd_DebugLevel[2]; /* Debug-Level fuer IRC_VERSION() */
|
||||
|
||||
GLOBAL CHAR NGIRCd_ConfFile[FNAME_LEN]; /* Konfigurationsdatei */
|
||||
|
||||
GLOBAL CHAR *NGIRCd_Version( VOID );
|
||||
GLOBAL CHAR *NGIRCd_VersionAddition( VOID );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
+20
-94
@@ -9,92 +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.22 2002/01/21 00:01:37 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.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>
|
||||
@@ -103,12 +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"
|
||||
|
||||
|
||||
@@ -123,16 +53,6 @@ LOCAL BOOLEAN Validate_Args( REQUEST *Req );
|
||||
LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req );
|
||||
|
||||
|
||||
GLOBAL VOID Parse_Init( VOID )
|
||||
{
|
||||
} /* Parse_Init */
|
||||
|
||||
|
||||
GLOBAL VOID Parse_Exit( VOID )
|
||||
{
|
||||
} /* Parse_Exit */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
{
|
||||
/* Client-Request parsen. Bei einem schwerwiegenden Fehler wird
|
||||
@@ -304,11 +224,11 @@ 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 )
|
||||
{
|
||||
if( target ) Log( LOG_WARNING, "Unknown target for status code: \"%s\"", Req->argv[0] );
|
||||
if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code: \"%s\"", Req->argv[0] );
|
||||
else Log( LOG_WARNING, "Unknown target for status code!" );
|
||||
return TRUE;
|
||||
}
|
||||
@@ -324,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 );
|
||||
@@ -367,6 +287,12 @@ LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req )
|
||||
else if( strcasecmp( Req->command, "LINKS" ) == 0 ) return IRC_LINKS( client, Req );
|
||||
else if( strcasecmp( Req->command, "JOIN" ) == 0 ) return IRC_JOIN( client, Req );
|
||||
else if( strcasecmp( Req->command, "PART" ) == 0 ) return IRC_PART( client, Req );
|
||||
else if( strcasecmp( Req->command, "VERSION" ) == 0 ) return IRC_VERSION( client, Req );
|
||||
else if( strcasecmp( Req->command, "KILL" ) == 0 ) return IRC_KILL( client, Req );
|
||||
else if( strcasecmp( Req->command, "AWAY" ) == 0 ) return IRC_AWAY( client, Req );
|
||||
else if( strcasecmp( Req->command, "TOPIC" ) == 0 ) return IRC_TOPIC( client, Req );
|
||||
else if( strcasecmp( Req->command, "WHO" ) == 0 ) return IRC_WHO( client, Req );
|
||||
else if( strcasecmp( Req->command, "LIST" ) == 0 ) return IRC_LIST( client, Req );
|
||||
|
||||
/* Unbekannter Befehl */
|
||||
if( Client_Type( client ) != CLIENT_SERVER ) IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( client ), Req->command );
|
||||
|
||||
+1
-19
@@ -9,24 +9,9 @@
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: parse.h,v 1.4 2002/01/02 02:43:50 alex Exp $
|
||||
* $Id: parse.h,v 1.6 2002/03/12 14:37:52 alex Exp $
|
||||
*
|
||||
* parse.h: Parsen der Client-Anfragen (Header)
|
||||
*
|
||||
* $Log: parse.h,v $
|
||||
* Revision 1.4 2002/01/02 02:43:50 alex
|
||||
* - Copyright-Text ergaenzt bzw. aktualisiert.
|
||||
*
|
||||
* Revision 1.3 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.2 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.1 2001/12/21 23:53:16 alex
|
||||
* - Modul zum Parsen von Client-Requests begonnen.
|
||||
*/
|
||||
|
||||
|
||||
@@ -45,9 +30,6 @@ typedef struct _REQUEST /* vgl. RFC 2812, 2.3 */
|
||||
} REQUEST;
|
||||
|
||||
|
||||
GLOBAL VOID Parse_Init( VOID );
|
||||
GLOBAL VOID Parse_Exit( VOID );
|
||||
|
||||
GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request );
|
||||
|
||||
|
||||
|
||||
+27
-27
@@ -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- */
|
||||
|
||||
+3
-19
@@ -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
|
||||
|
||||
|
||||
@@ -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-
|
||||
@@ -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- */
|
||||
@@ -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- */
|
||||
@@ -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- */
|
||||
@@ -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- */
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: splint.h,v 1.1 2002/03/25 19:13:19 alex Exp $
|
||||
*
|
||||
* splint.h: spezieller Header fuer SPLint Code-Check
|
||||
*
|
||||
* Dieser Header wird von portab.h nur dann includiert, wenn ein Code-Check
|
||||
* mit SPLint laeufr (d.h. S_SPLINT_S definiert ist).
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __splint__
|
||||
#define __splint__
|
||||
|
||||
|
||||
#define SYSCONFDIR "/"
|
||||
#define LOCALSTATEDIR "/"
|
||||
|
||||
#define LOG_EMERG 0
|
||||
#define LOG_ALERT 1
|
||||
#define LOG_CRIT 2
|
||||
#define LOG_ERR 3
|
||||
#define LOG_WARNING 4
|
||||
#define LOG_NOTICE 5
|
||||
#define LOG_INFO 6
|
||||
#define LOG_DEBUG 7
|
||||
|
||||
#define WNOHANG 0
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
Reference in New Issue
Block a user