1
0
mirror of https://github.com/osmarks/ngircd.git synced 2025-09-18 02:04:03 +00:00

Compare commits

...

59 Commits

Author SHA1 Message Date
Alexander Barton
b74699b074 - Dokumentation aktualisiert. 2002-11-29 11:42:24 +00:00
Alexander Barton
35054b1f64 - beim Schliessen eines Socket wird versucht, alle Daten zu schreiben [HEAD]. 2002-11-29 11:35:08 +00:00
Alexander Barton
f68369d821 - Prefix-Fehler werden besser protokolliert [aus HEAD]. 2002-11-29 10:59:51 +00:00
Alexander Barton
d53d18833d - Server versendet keine doppelten SQUIT's mehr [aus HEAD]. 2002-11-29 10:58:49 +00:00
Alexander Barton
a02c7a5f47 - Version auf 0.5.x-CVS geaendert. 2002-11-29 10:53:44 +00:00
Alexander Barton
14216308a0 - Versionsnummer auf 0.5.4 angehoben. 2002-11-24 15:33:26 +00:00
Alexander Barton
7a449bad3c - Dokumentation aktualisiert. 2002-11-24 15:33:14 +00:00
Alexander Barton
e0941f1a17 - Fehler-Handling von connect() gefixed (z.B. fuer A/UX relevant). Aus HEAD. 2002-11-24 15:32:14 +00:00
Alexander Barton
6cdc8f7802 - Backport aus HEAD: UID und GID kann nun auch textuell angegeben werden. 2002-11-24 15:25:25 +00:00
Alexander Barton
266b68b873 - volle Lesebuffer und Timeouts behandelt Conn_Handle() nun besser.
- Handle_Buffer() liefert nun ein Ergebnis. (beides aus HEAD)
2002-11-24 15:10:09 +00:00
Alexander Barton
34d7f4162d - Dokumentation aktualisiert (Backports aus HEAD). 2002-11-23 16:21:02 +00:00
Alexander Barton
6eab6d9514 - select() in Try_Write() hat falschen (keinen!) Timeout verwendet;
- der Timeout fuer das select() in Conn_Handler() ist nun TIME_RES (=2).
2002-11-23 16:20:48 +00:00
Alexander Barton
2230a6c96a - neue Konstante TIME_RES: "Zeitaufloesung" des Servers (aus HEAD). 2002-11-23 16:20:25 +00:00
Alexander Barton
b4afaf9c52 - Test-Suite an korrigiertest RPL_UMODEIS angepasst. 2002-11-22 23:46:09 +00:00
Alexander Barton
8e9a84a902 - Dokumentation aktualisiert. 2002-11-22 23:43:48 +00:00
Alexander Barton
0a90f59030 - RPL_UMODEIS ist Code 221, nicht 211 ... *argl* 2002-11-22 22:55:05 +00:00
Alexander Barton
ad252b5c4c - Dokumentation aktualisiert. 2002-11-20 15:53:32 +00:00
Alexander Barton
b0eb4b0019 - angenommene Socketes werden nun korrekt auf "non-blocking" gestellt;
- beim Senden und Empfangen wird EAGAIN ("Blockierung") nun abgefangen.
2002-11-20 15:52:40 +00:00
Alexander Barton
92a9e0d34f - Versionsnummer auf 0.5.x-CVS geaendert. 2002-11-20 11:17:41 +00:00
Alexander Barton
ed4417c1a0 - Dokumentation aktualisiert. 2002-11-20 11:15:33 +00:00
Alexander Barton
1e66da4e50 - bessere Fehler-Ausgaben bei Prefix-Fehlern. 2002-11-20 11:11:19 +00:00
Alexander Barton
6e55ea7298 - corrected a permission problem (Sean Reifschneider). 2002-11-18 14:11:24 +00:00
Alexander Barton
bb180adb49 - Versionsnummer auf 0.5.3 angehoben. 2002-11-08 21:17:17 +00:00
Alexander Barton
e2c896cb7e - Dokumentation aktualisiert. 2002-11-08 21:17:03 +00:00
Alexander Barton
2c7b276cc5 - Dokumentation aktualisiert. 2002-11-04 20:03:38 +00:00
Alexander Barton
4decf352fa - Versionsnummer auf 0.5.3-pre1 angehoben. 2002-11-04 19:34:28 +00:00
Alexander Barton
19c2e79b72 - Code-Formatierung korrigiert: da waren Tabs wo keine hin gehoerten. 2002-11-04 19:27:23 +00:00
Alexander Barton
49d9585242 - "back-ports" aus CVS-HEAD fuer Version 0.5.3 2002-11-04 19:18:39 +00:00
Alexander Barton
9487976620 - Versionsnummer auf 0.5.3-pre1 angehoben. 2002-11-04 19:17:52 +00:00
Alexander Barton
35d1c2fc06 - fehlende $Id$-Tags ergaenzt. 2002-10-04 13:12:46 +00:00
Alexander Barton
c557a2920e - Versionsnummer auf 0.5.2 angehoben. 2002-10-04 12:47:14 +00:00
Alexander Barton
845b295e7d - Dokumentation aktualisiert. 2002-10-04 12:43:53 +00:00
Alexander Barton
59b5b0e025 - aus HEAD: der Buffer fuer das Prefix war zu klein. 2002-10-04 12:40:58 +00:00
Alexander Barton
bdd23ece63 - Backports aus HEAD: Format-String- und Buffer-Overflow-Bugs behoben,
die zum Abbruch des Servers fuehren konnten.
2002-10-04 11:31:28 +00:00
Alexander Barton
a119700c62 - Version angepasst. 2002-10-03 17:09:00 +00:00
Alexander Barton
b0e7f564c7 - Dokumentation aktualisiert. 2002-10-03 17:08:53 +00:00
Alexander Barton
d69410f28d - Backports aus CVS HEAD. 2002-10-03 16:13:38 +00:00
Alexander Barton
d5fa1f76bb - Versionsnummer auf 0.5.1 angehoben. 2002-10-03 16:10:25 +00:00
Alexander Barton
3dec467ebc - Dokumentation aktualisiert. 2002-10-03 16:09:50 +00:00
Alexander Barton
a5fe6d6783 Test-Suite: es werden nun nur noch 5 Sessions parallel gestartet. 2002-09-23 21:55:06 +00:00
Alexander Barton
37b579f3cd - Dokumentation aktualisiert. 2002-09-23 21:54:43 +00:00
Alexander Barton
268d02b90d - Versionsnummer auf "0.5.CVS" angepasst. 2002-09-22 21:39:23 +00:00
Alexander Barton
037418e8c0 - Dokumentation aktualisiert. 2002-09-22 21:38:34 +00:00
Alexander Barton
45c3886800 - in RPL_YOURHOST_MSG wurde ein fehlerhafter Versionsstring geliefert. 2002-09-22 21:37:06 +00:00
Alexander Barton
38f387146f - Dokumentation aktualisiert. 2002-09-20 17:20:48 +00:00
Alexander Barton
fcbd44caa9 - Version auf 0.5.0 angehoben. 2002-09-20 16:16:20 +00:00
Alexander Barton
f027308798 - Dokumentation aktualisiert. 2002-09-20 15:44:53 +00:00
Alexander Barton
462540e079 - getpid.sh wird nun auch bei "make distcheck" gefunden. 2002-09-20 15:39:55 +00:00
Alexander Barton
7721c79747 - Dokumentation aktualisiert. 2002-09-20 15:25:50 +00:00
Alexander Barton
678a4dfba0 - neues Script getpid.sh (aus HEAD): dieses ermittelt nun die PID des Servers. 2002-09-20 15:19:55 +00:00
Alexander Barton
8c956d25b7 - Backports aus CVS-HEAD: neues Script getpid.sh ermittelt nun die PID. 2002-09-20 15:18:56 +00:00
Alexander Barton
9f9f676716 - die ermittelte PID des ngIRCd wird besser validiert (leer?). 2002-09-20 13:55:51 +00:00
Alexander Barton
cf20b16d2a - Flags bei "ps" werden in anderer Reihenfolge geprueft (aus CVS-HEAD). 2002-09-20 13:46:22 +00:00
Alexander Barton
97d4e580ae - Dokumentation aktualisiert. 2002-09-19 10:18:29 +00:00
Alexander Barton
b072b7712c - Fehler bei Validierung von ServerAdminInfo2 behoben. 2002-09-19 10:17:50 +00:00
Alexander Barton
fd6a7f67ce - Dokumentation aktualisiert. 2002-09-19 09:35:21 +00:00
Alexander Barton
6c04ba84cd - Versionsnummer auf 0.5.0-pre2 angehoben. 2002-09-17 17:29:38 +00:00
Alexander Barton
ef6b7c7c63 - Fix in IRC_WriteStrServersPrefix() war "badly broken" -- behoben. 2002-09-17 17:29:20 +00:00
Alexander Barton
2592e73da0 - Dokumentation aktualisiert. 2002-09-17 17:28:45 +00:00
30 changed files with 493 additions and 215 deletions

View File

@@ -10,8 +10,74 @@
-- ChangeLog / Aenderungen --
ngIRCd CVS-HEAD
ngIRCd 0.5.x-CVS
- Prefix-Fehler werden besser protokolliert (mit verursachendem Befehl).
- SQUIT wird nicht mehr doppelt an andere Server weitergeleitet.
- Der Server versucht nun vor dem Schliessen einer Verbindung Daten, die
noch im Schreibpuffer stehen, zu senden.
ngIRCd 0.5.4, 24.11.2002
- Fehler-Handling von connect() gefixed: der Server kann sich nun auch
unter A/UX wieder zu anderen verbinden.
- in den Konfigurationsvariablen ServerUID und ServerGID kann nun nicht
nur die numerische ID, sondern auch der Name des Users bzw. der Gruppe
verwendet werden. Beim Start des Daemons wird nun beides angezeigt.
- Besseres Logging von Prefix-Fehlern.
- angenommene Sockets werden nun korrekt auf "non-blocking" konfiguriert,
beim Senden und Empfangen werden Blockierungen besser abgefangen.
- RPL_UMODEIS hat Code 221, nicht 211 ... *argl*
- select() in Try_Write() hat falschen (keinen!) Timeout verwendet;
die "Zeit-Aufloesung" des Servers sind zudem nun 2 Sekunden (TIME_RES).
Insgesamt sollte die Reaktionszeit des Server nun besser sein.
ngIRCd 0.5.3, 08.11.2002
- NOTICE liefert nun wirklich nie mehr einen Fehler, auch dann nicht,
wenn der sendende Client noch gar nicht registriert ist.
- ein "schneller Server-Reconnect" wird nur noch dann versucht, wenn die
Verbindung zuvor ordentlich (="lange genug") in Ordnung war; somit also
nicht meht, wenn der Peer-Server gleich beim Connect ein ERROR liefert.
Das vermeidet "Connect-Orgien".
- einige Datentypen aufgeraumt: z.B. sind viele INT32s nun LONGs. Das ist
auf Platformen mit 8-Byte-Integern kompatibler.
- RPL_YOURHOST_MSG ist nun ircII- und RFC-kompatibel ;-)
- Segfault unter hoher Netzaktivitaet behoben: in Conn_Close() wird die
Connection-Struktur nun frueher als "ungueltig" markiert.
ngIRCd 0.5.2, 04.10.2002
- Buffer Overflow in Read_Resolver_Result() behoben.
- Format-String-Bugs, die zum Abbruch des Servers fuehrten, behoben.
- Maximale Laenge eines IRC-Prefix wurde falsch berechnet.
ngIRCd 0.5.1, 03.10.2002
- in RPL_YOURHOST_MSG wurde ein fehlerhafter Versionsstring geliefert.
- Test-Suite: start-server.sh, stop-server.sh und stress-server.sh koennen
nun "manuell" von der Kommandozeile gestartet werden, stress-server.sh
startet per Default nur noch 5 Sessions, eine andere Zahl kann auf der
Kommandozeile uebergeben werden (Syntax: "stress-server.sh <count>").
- In bestimmten Faellen hat der Server versucht auf einen bereits wieder
geschlossenen Socket Daten zu schreiben; das fuehrte zu einem Abbruch des
Servers durch ein assert(). Nun wird geprueft, ob der Socket noch ok ist.
- im "contrib"-Verzeichnis befindet sich nun eine RPM-Spec-Datei, aus den
.tar.gz's koennen nun mit "rpm -ta <archiv>" RPM's erzeugt werden. Danke
an Sean Reifschneider <jafo@tummy.com>!
- Syntax von RPL_MYINFO_MSG korrigiert: liefert nun vier Parameter.
ngIRCd 0.5.0, 20.09.2002
- Dokumentation aktualisiert.
- Fehler bei Validierung von "AdminInfo2" behoben.
- Test der Flags fuer "ps" in der Testsuite verbessert, ist nun zu mehr
Plattformen kompatibler.
ngIRCd 0.5.0-pre2, 17.09.2002
- Fix in IRC_WriteStrServersPrefix() war "badly broken" -- behoben.
ngIRCd 0.5.0-pre1, 16.09.2002
- Manual-Pages ngircd.8 und ngircd.conf.5 begonnen.
- Wird der Netzwerk-Sniffer aktiviert (--sniffer), so schaltet der
ngIRCd nun automatisch in den Debug-Modus.
@@ -254,4 +320,4 @@ ngIRCd 0.0.1, 31.12.2001
--
$Id: ChangeLog,v 1.87 2002/09/16 10:00:28 alex Exp $
$Id: ChangeLog,v 1.87.2.18 2002/11/29 11:42:24 alex Exp $

View File

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

34
NEWS
View File

@@ -10,31 +10,25 @@
-- NEWS / Neuigkeiten --
ngIRCd CVS-HEAD
ngIRCd 0.5.0, 20.09.2002
- Manual-Pages ngircd.8 und ngircd.conf.5 begonnen.
- AIX (3.2.5), HP-UX (10.20), IRIX (6.5), NetBSD (1.5.3/m68k) und Solaris
(2.5.1, 2.6) gehoeren nun auch zu den unterstuetzten Platformen.
- "persistente Channels" (Mode 'P') implementiert: diese koennen in der
Konfigurationsdatei definiert werden (Sektion "Channel", vgl. Beispiel-
Konfiguration "sample-ngircd.conf") und bleiben auch dann bestehen,
wenn kein User mehr im Channel ist. Zu Channel-Operatoren werden bisher
nur IRC-Operatoren, die den Channel betreten. Die persistenten Channels
werden durch das Flag "P" gelennzeichnet, welches normal durch Channel-
Op's gesetzt und geloescht werden kann.
- KICK implementiert (bisher kann nur ein User aus einem Channel geckicked
werden, Listen, wir im RFC vorgesehen, werden bisher nicht unterstuetzt).
- INVITE, den Channel-Mode "i" sowie Invite-Lists ueber den MODE-Befehl
(setzen, erfragen und loeschen) implementiert.
- Unter A/UX (und evtl. weiteren Systemen) kompiliert der ngIRCd nun mit
dem "nativen" (ggf. pre-ANSI) Compiler.
- LIST versteht nun Wildcards und kann an andere Server geforwarded werden.
- neue Konfigurationsoption "OperCanUseMode" (Sektion "Global"):
- "persistente Channels" (Mode 'P') implementiert: diese koennen in der
Konfigurationsdatei definiert werden (Sektion "Channel", vgl. Beispiel-
Konfiguration "sample-ngircd.conf") und bleiben auch dann bestehen,
wenn kein User mehr im Channel ist.
- neue IRC-Befehle: KICK, INVITE, ADMIN, CHANINFO; LIST wurde erweitert.
Mit dem neuen Befehl CHANINFO syncronisieren Server, die das IRC+-
Protokoll unterstuetzen, Channel-Modes und Topics. Fuer den ADMIN-Befehl
gibt es neue Konfigurationsoptionen (Sektion "Global"): "AdminInfo1",
"AdminInfo2" und "AdminEMail".
- Invite- und Ban-Lists implementiert.
- neue Konfigurationsoption "OperCanUseMode" (Sektion "Global"):
ist sie aktiv, koennen IRC-Operatoren immer Channel-Modes setzen.
- mit dem neuen Befehl CHANINFO syncronisieren Server, die das IRC+-
Protokoll unterstuetzen, Channel-Modes und Topics.
- Ban-Lists (setzen, erfragen und loeschen) implementiert.
- ADMIN-Befehl implementiert.
- "Test-Suite" begonnen: mit "make check" wird sie durchlaufen.
ngIRCd 0.4.2, 29.04.2002
@@ -116,4 +110,4 @@ ngIRCd 0.0.1, 31.12.2001
--
$Id: NEWS,v 1.38 2002/09/16 11:03:05 alex Exp $
$Id: NEWS,v 1.38.2.4 2002/10/03 16:09:50 alex Exp $

View File

@@ -9,7 +9,7 @@
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
#
# $Id: configure.in,v 1.59 2002/09/17 17:12:24 alex Exp $
# $Id: configure.in,v 1.58.2.11 2002/11/29 10:53:44 alex Exp $
#
# -- Initialisierung --
@@ -18,7 +18,7 @@ AC_INIT
AC_PREREQ(2.50)
AC_CANONICAL_TARGET
AC_CONFIG_SRCDIR(src/config.h.in)
AM_INIT_AUTOMAKE(ngircd,0.5.0-pre2)
AM_INIT_AUTOMAKE(ngircd,0.5.x-CVS)
AM_CONFIG_HEADER(src/config.h)
# -- Templates fuer config.h --
@@ -194,6 +194,7 @@ AC_OUTPUT([ \
src/ngircd/Makefile \
src/testsuite/Makefile \
man/Makefile \
contrib/Makefile \
])
# -- Ergebnis --

20
contrib/Makefile.am Normal file
View File

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

54
contrib/ngircd.spec Normal file
View File

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

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: channel.c,v 1.32 2002/09/03 23:57:57 alex Exp $
* $Id: channel.c,v 1.32.2.1 2002/11/04 19:18:39 alex Exp $
*
* channel.c: Management der Channels
*/
@@ -249,11 +249,11 @@ Channel_Quit( CLIENT *Client, CHAR *Reason )
} /* Channel_Quit */
GLOBAL INT
GLOBAL LONG
Channel_Count( VOID )
{
CHANNEL *c;
INT count;
LONG count;
count = 0;
c = My_Channels;
@@ -266,11 +266,11 @@ Channel_Count( VOID )
} /* Channel_Count */
GLOBAL INT
GLOBAL LONG
Channel_MemberCount( CHANNEL *Chan )
{
CL2CHAN *cl2chan;
INT count;
LONG count;
assert( Chan != NULL );

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: channel.h,v 1.21 2002/09/03 23:57:57 alex Exp $
* $Id: channel.h,v 1.21.2.1 2002/11/04 19:18:39 alex Exp $
*
* channel.h: Management der Channels (Header)
*/
@@ -59,8 +59,8 @@ GLOBAL VOID Channel_Quit PARAMS((CLIENT *Client, CHAR *Reason ));
GLOBAL VOID Channel_Kick PARAMS(( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason ));
GLOBAL INT Channel_Count PARAMS((VOID ));
GLOBAL INT Channel_MemberCount PARAMS((CHANNEL *Chan ));
GLOBAL LONG Channel_Count PARAMS((VOID ));
GLOBAL LONG Channel_MemberCount PARAMS((CHANNEL *Chan ));
GLOBAL CHAR *Channel_Name PARAMS((CHANNEL *Chan ));
GLOBAL CHAR *Channel_Modes PARAMS((CHANNEL *Chan ));

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: client.c,v 1.60 2002/09/03 18:54:31 alex Exp $
* $Id: client.c,v 1.60.2.2 2002/11/04 19:18:39 alex Exp $
*
* client.c: Management aller Clients
*
@@ -53,12 +53,15 @@
#include <exp.h>
#define GETID_LEN (CLIENT_NICK_LEN-1) + 1 + (CLIENT_USER_LEN-1) + 1 + (CLIENT_HOST_LEN-1) + 1
LOCAL CLIENT *This_Server, *My_Clients;
LOCAL CHAR GetID_Buffer[CLIENT_ID_LEN];
LOCAL CHAR GetID_Buffer[GETID_LEN];
LOCAL INT Count PARAMS(( CLIENT_TYPE Type ));
LOCAL INT MyCount PARAMS(( CLIENT_TYPE Type ));
LOCAL LONG Count PARAMS(( CLIENT_TYPE Type ));
LOCAL LONG MyCount PARAMS(( CLIENT_TYPE Type ));
LOCAL CLIENT *New_Client_Struct PARAMS(( VOID ));
LOCAL VOID Generate_MyToken PARAMS(( CLIENT *Client ));
@@ -713,7 +716,7 @@ Client_Mask( CLIENT *Client )
if( Client->type == CLIENT_SERVER ) return Client->id;
sprintf( GetID_Buffer, "%s!%s@%s", Client->id, Client->user, Client->host );
snprintf( GetID_Buffer, GETID_LEN, "%s!%s@%s", Client->id, Client->user, Client->host );
return GetID_Buffer;
} /* Client_Mask */
@@ -837,46 +840,46 @@ Client_Next( CLIENT *c )
} /* Client_Next */
GLOBAL INT
GLOBAL LONG
Client_UserCount( VOID )
{
return Count( CLIENT_USER );
} /* Client_UserCount */
GLOBAL INT
GLOBAL LONG
Client_ServiceCount( VOID )
{
return Count( CLIENT_SERVICE );;
} /* Client_ServiceCount */
GLOBAL INT
GLOBAL LONG
Client_ServerCount( VOID )
{
return Count( CLIENT_SERVER );
} /* Client_ServerCount */
GLOBAL INT
GLOBAL LONG
Client_MyUserCount( VOID )
{
return MyCount( CLIENT_USER );
} /* Client_MyUserCount */
GLOBAL INT
GLOBAL LONG
Client_MyServiceCount( VOID )
{
return MyCount( CLIENT_SERVICE );
} /* Client_MyServiceCount */
GLOBAL INT
GLOBAL LONG
Client_MyServerCount( VOID )
{
CLIENT *c;
INT cnt;
LONG cnt;
cnt = 0;
c = My_Clients;
@@ -889,11 +892,11 @@ Client_MyServerCount( VOID )
} /* Client_MyServerCount */
GLOBAL INT
GLOBAL LONG
Client_OperCount( VOID )
{
CLIENT *c;
INT cnt;
LONG cnt;
cnt = 0;
c = My_Clients;
@@ -906,11 +909,11 @@ Client_OperCount( VOID )
} /* Client_OperCount */
GLOBAL INT
GLOBAL LONG
Client_UnknownCount( VOID )
{
CLIENT *c;
INT cnt;
LONG cnt;
cnt = 0;
c = My_Clients;
@@ -950,11 +953,11 @@ Client_IsValidNick( CHAR *Nick )
} /* Client_IsValidNick */
LOCAL INT
LOCAL LONG
Count( CLIENT_TYPE Type )
{
CLIENT *c;
INT cnt;
LONG cnt;
cnt = 0;
c = My_Clients;
@@ -967,11 +970,11 @@ Count( CLIENT_TYPE Type )
} /* Count */
LOCAL INT
LOCAL LONG
MyCount( CLIENT_TYPE Type )
{
CLIENT *c;
INT cnt;
LONG cnt;
cnt = 0;
c = My_Clients;

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: client.h,v 1.29 2002/09/03 18:54:31 alex Exp $
* $Id: client.h,v 1.29.2.1 2002/11/04 19:18:39 alex Exp $
*
* client.h: Konfiguration des ngircd (Header)
*/
@@ -124,14 +124,14 @@ GLOBAL BOOLEAN Client_ModeDel PARAMS((CLIENT *Client, CHAR Mode ));
GLOBAL BOOLEAN Client_CheckNick PARAMS((CLIENT *Client, CHAR *Nick ));
GLOBAL BOOLEAN Client_CheckID PARAMS((CLIENT *Client, CHAR *ID ));
GLOBAL INT Client_UserCount PARAMS((VOID ));
GLOBAL INT Client_ServiceCount PARAMS((VOID ));
GLOBAL INT Client_ServerCount PARAMS((VOID ));
GLOBAL INT Client_OperCount PARAMS((VOID ));
GLOBAL INT Client_UnknownCount PARAMS((VOID ));
GLOBAL INT Client_MyUserCount PARAMS((VOID ));
GLOBAL INT Client_MyServiceCount PARAMS((VOID ));
GLOBAL INT Client_MyServerCount PARAMS((VOID ));
GLOBAL LONG Client_UserCount PARAMS((VOID ));
GLOBAL LONG Client_ServiceCount PARAMS((VOID ));
GLOBAL LONG Client_ServerCount PARAMS((VOID ));
GLOBAL LONG Client_OperCount PARAMS((VOID ));
GLOBAL LONG Client_UnknownCount PARAMS((VOID ));
GLOBAL LONG Client_MyUserCount PARAMS((VOID ));
GLOBAL LONG Client_MyServiceCount PARAMS((VOID ));
GLOBAL LONG Client_MyServerCount PARAMS((VOID ));
GLOBAL BOOLEAN Client_IsValidNick PARAMS((CHAR *Nick ));

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: conf.c,v 1.29 2002/09/16 09:13:06 alex Exp $
* $Id: conf.c,v 1.29.2.5 2002/11/24 15:25:25 alex Exp $
*
* conf.h: Konfiguration des ngircd
*/
@@ -25,6 +25,9 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <sys/types.h>
#include "ngircd.h"
#include "conn.h"
@@ -67,7 +70,9 @@ Conf_Test( VOID )
{
/* Konfiguration einlesen, ueberpruefen und ausgeben. */
UINT i;
struct passwd *pwd;
struct group *grp;
INT i;
Use_Log = FALSE;
Set_Defaults( );
@@ -91,15 +96,19 @@ Conf_Test( VOID )
printf( " AdminInfo2 = %s\n", Conf_ServerAdmin2 );
printf( " AdminEMail = %s\n", Conf_ServerAdminMail );
printf( " MotdFile = %s\n", Conf_MotdFile );
printf( " ListenPorts = " );
printf( " Ports = " );
for( i = 0; i < Conf_ListenPorts_Count; i++ )
{
if( i != 0 ) printf( ", " );
printf( "%u", Conf_ListenPorts[i] );
}
puts( "" );
printf( " ServerUID = %ld\n", (INT32)Conf_UID );
printf( " ServerGID = %ld\n", (INT32)Conf_GID );
pwd = getpwuid( Conf_UID );
if( pwd ) printf( " ServerUID = %s\n", pwd->pw_name );
else printf( " ServerUID = %ld\n", (LONG)Conf_UID );
grp = getgrgid( Conf_GID );
if( grp ) printf( " ServerGID = %s\n", grp->gr_name );
else printf( " ServerGID = %ld\n", (LONG)Conf_GID );
printf( " PingTimeout = %d\n", Conf_PingTimeout );
printf( " PongTimeout = %d\n", Conf_PongTimeout );
printf( " ConnectRetry = %d\n", Conf_ConnectRetry );
@@ -294,8 +303,10 @@ Read_Config( VOID )
LOCAL VOID
Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
{
struct passwd *pwd;
struct group *grp;
CHAR *ptr;
INT32 port;
LONG port;
assert( Line > 0 );
assert( Var != NULL );
@@ -372,13 +383,17 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
if( strcasecmp( Var, "ServerUID" ) == 0 )
{
/* UID, mit der der Daemon laufen soll */
Conf_UID = (UINT)atoi( Arg );
pwd = getpwnam( Arg );
if( pwd ) Conf_UID = pwd->pw_uid;
else Conf_UID = (UINT)atoi( Arg );
return;
}
if( strcasecmp( Var, "ServerGID" ) == 0 )
{
/* GID, mit der der Daemon laufen soll */
Conf_GID = (UINT)atoi( Arg );
grp = getgrnam( Arg );
if( grp ) Conf_GID = grp->gr_gid;
else Conf_GID = (UINT)atoi( Arg );
return;
}
if( strcasecmp( Var, "PingTimeout" ) == 0 )
@@ -446,7 +461,7 @@ Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg )
LOCAL VOID
Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg )
{
INT32 port;
LONG port;
assert( Line > 0 );
assert( Var != NULL );
@@ -539,7 +554,7 @@ Validate_Config( VOID )
}
#ifdef STRICT_RFC
if( ! ConfAdminMail[0] )
if( ! Conf_ServerAdminMail[0] )
{
/* Keine Server-Information konfiguriert */
Config_Error( LOG_ALERT, "No administrator email address configured in \"%s\" ('AdminEMail')!", NGIRCd_ConfFile );
@@ -548,7 +563,7 @@ Validate_Config( VOID )
}
#endif
if( ! Conf_ServerAdmin1[0] && ! Conf_ServerAdmin1[0] && ! Conf_ServerAdminMail[0] )
if( ! Conf_ServerAdmin1[0] && ! Conf_ServerAdmin2[0] && ! Conf_ServerAdminMail[0] )
{
/* Keine Server-Information konfiguriert */
Log( LOG_WARNING, "No server information configured but required by RFC!" );
@@ -584,7 +599,7 @@ va_dcl
/* Im "normalen Betrieb" soll der Log-Mechanismus des ngIRCd verwendet
* werden, beim Testen der Konfiguration jedoch nicht, hier sollen alle
* Meldungen direkt auf die Konsole ausgegeben werden: */
if( Use_Log ) Log( Level, msg );
if( Use_Log ) Log( Level, "%s", msg );
else puts( msg );
} /* Config_Error */

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: conn.c,v 1.72 2002/09/07 22:34:44 alex Exp $
* $Id: conn.c,v 1.72.2.9 2002/11/29 11:35:08 alex Exp $
*
* connect.h: Verwaltung aller Netz-Verbindungen ("connections")
*/
@@ -84,7 +84,7 @@ LOCAL VOID New_Connection PARAMS(( INT Sock ));
LOCAL CONN_ID Socket2Index PARAMS(( INT Sock ));
LOCAL VOID Read_Request PARAMS(( CONN_ID Idx ));
LOCAL BOOLEAN Try_Write PARAMS(( CONN_ID Idx ));
LOCAL VOID Handle_Buffer PARAMS(( CONN_ID Idx ));
LOCAL BOOLEAN Handle_Buffer PARAMS(( CONN_ID Idx ));
LOCAL VOID Check_Connections PARAMS(( VOID ));
LOCAL VOID Check_Servers PARAMS(( VOID ));
LOCAL VOID Init_Conn_Struct PARAMS(( INT Idx ));
@@ -235,11 +235,14 @@ Conn_Handler( VOID )
fd_set read_sockets, write_sockets;
struct timeval tv;
time_t start, t;
INT i;
INT i, idx;
BOOLEAN timeout;
start = time( NULL );
while(( ! NGIRCd_Quit ) && ( ! NGIRCd_Restart ))
{
timeout = TRUE;
Check_Servers( );
Check_Connections( );
@@ -250,7 +253,7 @@ Conn_Handler( VOID )
if(( My_Connections[i].sock > NONE ) && ( My_Connections[i].rdatalen > 0 ))
{
/* Kann aus dem Buffer noch ein Befehl extrahiert werden? */
Handle_Buffer( i );
if( Handle_Buffer( i )) timeout = FALSE;
}
}
@@ -302,8 +305,9 @@ Conn_Handler( VOID )
}
/* Timeout initialisieren */
tv.tv_sec = 1;
tv.tv_usec = 0;
if( timeout ) tv.tv_sec = TIME_RES;
else tv.tv_sec = 0;
/* Auf Aktivitaet warten */
i = select( Conn_MaxFD + 1, &read_sockets, &write_sockets, NULL, &tv );
@@ -317,7 +321,7 @@ Conn_Handler( VOID )
/* Fehler (z.B. Interrupt) */
if( errno != EINTR )
{
Log( LOG_EMERG, "select(): %s!", strerror( errno ));
Log( LOG_EMERG, "Conn_Handler(): select(): %s!", strerror( errno ));
Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE );
exit( 1 );
}
@@ -327,7 +331,18 @@ Conn_Handler( VOID )
/* Koennen Daten geschrieben werden? */
for( i = 0; i < Conn_MaxFD + 1; i++ )
{
if( FD_ISSET( i, &write_sockets )) Handle_Write( Socket2Index( i ));
if( ! FD_ISSET( i, &write_sockets )) continue;
/* Es kann geschrieben werden ... */
idx = Socket2Index( i );
if( idx == NONE ) continue;
if( ! Handle_Write( idx ))
{
/* Fehler beim Schreiben! Diesen Socket nun
* auch aus dem Read-Set entfernen: */
FD_CLR( i, &read_sockets );
}
}
/* Daten zum Lesen vorhanden? */
@@ -359,7 +374,6 @@ va_dcl
va_list ap;
assert( Idx >= 0 );
assert( My_Connections[Idx].sock > NONE );
assert( Format != NULL );
#ifdef PROTOTYPES
@@ -393,10 +407,20 @@ Conn_Write( CONN_ID Idx, CHAR *Data, INT Len )
* der Client disconnectiert und FALSE geliefert. */
assert( Idx >= 0 );
assert( My_Connections[Idx].sock > NONE );
assert( Data != NULL );
assert( Len > 0 );
/* Ist der entsprechende Socket ueberhaupt noch offen?
* In einem "Handler-Durchlauf" kann es passieren, dass
* dem nicht mehr so ist, wenn einer von mehreren
* Conn_Write()'s fehlgeschlagen ist. In diesem Fall
* wird hier einfach ein Fehler geliefert. */
if( My_Connections[Idx].sock <= NONE )
{
Log( LOG_DEBUG, "Skipped write on closed socket (connection %d).", Idx );
return FALSE;
}
/* pruefen, ob Daten im Schreibpuffer sind. Wenn ja, zunaechst
* pruefen, ob diese gesendet werden koennen */
if( My_Connections[Idx].wdatalen > 0 )
@@ -445,14 +469,23 @@ Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient )
if( My_Connections[Idx].sock == NONE ) return;
}
/* zunaechst versuchen, noch im Schreibpuffer vorhandene
* Daten auf den Socket zu schreiben ... */
Try_Write( Idx );
if( close( My_Connections[Idx].sock ) != 0 )
{
Log( LOG_ERR, "Error closing connection %d with %s:%d - %s!", Idx, inet_ntoa( My_Connections[Idx].addr.sin_addr ), ntohs( My_Connections[Idx].addr.sin_port), strerror( errno ));
Log( LOG_ERR, "Error closing connection %d (socket %d) with %s:%d - %s!", Idx, My_Connections[Idx].sock, inet_ntoa( My_Connections[Idx].addr.sin_addr ), ntohs( My_Connections[Idx].addr.sin_port), strerror( errno ));
}
else
{
Log( LOG_INFO, "Connection %d with %s:%d closed.", Idx, inet_ntoa( My_Connections[Idx].addr.sin_addr ), ntohs( My_Connections[Idx].addr.sin_port ));
Log( LOG_INFO, "Connection %d (socket %d) with %s:%d closed.", Idx, My_Connections[Idx].sock, inet_ntoa( My_Connections[Idx].addr.sin_addr ), ntohs( My_Connections[Idx].addr.sin_port ));
}
/* Socket als "ungueltig" markieren */
FD_CLR( My_Connections[Idx].sock, &My_Sockets );
FD_CLR( My_Connections[Idx].sock, &My_Connects );
My_Connections[Idx].sock = NONE;
c = Client_GetFromConn( Idx );
if( c ) Client_Destroy( c, LogMsg, FwdMsg, TRUE );
@@ -466,18 +499,18 @@ Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient )
free( My_Connections[Idx].res_stat );
}
/* 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 )))
/* Startzeit des naechsten Connect-Versuchs modifizieren? */
if(( My_Connections[Idx].our_server >= 0 ) && ( Conf_Server[My_Connections[Idx].our_server].lasttry < time( NULL ) - Conf_ConnectRetry ))
{
/* Okay, die Verbindung stand schon "genuegend lange" */
/* Okay, die Verbindung stand schon "genuegend lange":
* lasttry-Zeitpunkt so setzen, dass der naechste
* Verbindungsversuch in RECONNECT_DELAY Sekunden
* gestartet wird. */
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;
/* Connection-Struktur loeschen (=freigeben) */
Init_Conn_Struct( Idx );
} /* Conn_Close */
@@ -532,23 +565,32 @@ Conn_SetPenalty( CONN_ID Idx, time_t Seconds )
LOCAL BOOLEAN
Try_Write( CONN_ID Idx )
{
/* Versuchen, Daten aus dem Schreib-Puffer in den
* Socket zu schreiben. */
/* Versuchen, Daten aus dem Schreib-Puffer in den Socket zu
* schreiben. TRUE wird geliefert, wenn entweder keine Daten
* zum Versenden vorhanden sind oder erfolgreich bearbeitet
* werden konnten. Im Fehlerfall wird FALSE geliefert und
* die Verbindung geschlossen. */
fd_set write_socket;
struct timeval tv;
assert( Idx >= 0 );
assert( My_Connections[Idx].sock > NONE );
assert( My_Connections[Idx].wdatalen > 0 );
/* sind ueberhaupt Daten vorhanden? */
if( ! My_Connections[Idx].wdatalen > 0 ) return TRUE;
/* Timeout initialisieren: 0 Sekunden, also nicht blockieren */
tv.tv_sec = 0; tv.tv_usec = 0;
FD_ZERO( &write_socket );
FD_SET( My_Connections[Idx].sock, &write_socket );
if( select( My_Connections[Idx].sock + 1, NULL, &write_socket, NULL, 0 ) == -1 )
if( select( My_Connections[Idx].sock + 1, NULL, &write_socket, NULL, &tv ) == -1 )
{
/* Fehler! */
if( errno != EINTR )
{
Log( LOG_ALERT, "select() failed: %s!", strerror( errno ));
Log( LOG_ALERT, "Try_Write(): select() failed: %s (con=%d, sock=%d)!", strerror( errno ), Idx, My_Connections[Idx].sock );
Conn_Close( Idx, "Server error!", NULL, FALSE );
return FALSE;
}
@@ -589,7 +631,7 @@ Handle_Read( INT Sock )
/* Ein Client Socket: entweder ein User oder Server */
idx = Socket2Index( Sock );
Read_Request( idx );
if( idx > NONE ) Read_Request( idx );
}
} /* Handle_Read */
@@ -601,7 +643,7 @@ Handle_Write( CONN_ID Idx )
INT len, res, err;
assert( Idx >= 0 );
assert( Idx > NONE );
assert( My_Connections[Idx].sock > NONE );
if( FD_ISSET( My_Connections[Idx].sock, &My_Connects ))
@@ -637,9 +679,7 @@ Handle_Write( CONN_ID Idx )
/* PASS und SERVER verschicken */
Conn_WriteStr( Idx, "PASS %s %s", Conf_Server[My_Connections[Idx].our_server].pwd, NGIRCd_ProtoID );
Conn_WriteStr( Idx, "SERVER %s :%s", Conf_ServerName, Conf_ServerInfo );
return TRUE;
return Conn_WriteStr( Idx, "SERVER %s :%s", Conf_ServerName, Conf_ServerInfo );
}
assert( My_Connections[Idx].wdatalen > 0 );
@@ -648,9 +688,12 @@ Handle_Write( CONN_ID Idx )
len = send( My_Connections[Idx].sock, My_Connections[Idx].wbuf, My_Connections[Idx].wdatalen, 0 );
if( len < 0 )
{
/* Operation haette Socket "nur" blockiert ... */
if( errno == EAGAIN ) return TRUE;
/* Oops, ein Fehler! */
Log( LOG_ERR, "Write error (buffer) on connection %d: %s!", Idx, strerror( errno ));
Conn_Close( Idx, "Write error (buffer)!", NULL, FALSE );
Log( LOG_ERR, "Write error on connection %d (socket %d): %s!", Idx, My_Connections[Idx].sock, strerror( errno ));
Conn_Close( Idx, "Write error!", NULL, FALSE );
return FALSE;
}
@@ -676,6 +719,7 @@ New_Connection( INT Sock )
assert( Sock >= 0 );
/* Connection auf Listen-Socket annehmen */
new_sock_len = sizeof( new_addr );
new_sock = accept( Sock, (struct sockaddr *)&new_addr, (socklen_t *)&new_sock_len );
if( new_sock < 0 )
@@ -684,7 +728,10 @@ New_Connection( INT Sock )
return;
}
/* Freie Connection-Struktur suschen */
/* Socket initialisieren */
Init_Socket( new_sock );
/* Freie Connection-Struktur suchen */
for( idx = 0; idx < MAX_CONNECTIONS; idx++ ) if( My_Connections[idx].sock == NONE ) break;
if( idx >= MAX_CONNECTIONS )
{
@@ -743,8 +790,14 @@ Socket2Index( INT Sock )
for( idx = 0; idx < MAX_CONNECTIONS; idx++ ) if( My_Connections[idx].sock == Sock ) break;
assert( idx < MAX_CONNECTIONS );
return idx;
if( idx >= MAX_CONNECTIONS )
{
/* die Connection wurde vermutlich (wegen eines
* Fehlers) bereits wieder abgebaut ... */
Log( LOG_DEBUG, "Socket2Index: can't get connection for socket %d!", Sock );
return NONE;
}
else return idx;
} /* Socket2Index */
@@ -779,8 +832,11 @@ Read_Request( CONN_ID Idx )
if( len < 0 )
{
/* Operation haette Socket "nur" blockiert ... */
if( errno == EAGAIN ) return;
/* Fehler beim Lesen */
Log( LOG_ERR, "Read error on connection %d: %s!", Idx, strerror( errno ));
Log( LOG_ERR, "Read error on connection %d (socket %d): %s!", Idx, My_Connections[Idx].sock, strerror( errno ));
Conn_Close( Idx, "Read error!", "Client closed connection", FALSE );
return;
}
@@ -797,13 +853,19 @@ Read_Request( CONN_ID Idx )
} /* Read_Request */
LOCAL VOID
LOCAL BOOLEAN
Handle_Buffer( CONN_ID Idx )
{
/* Daten im Lese-Puffer einer Verbindung verarbeiten. */
/* Daten im Lese-Puffer einer Verbindung verarbeiten.
* Wurde ein Request verarbeitet, so wird TRUE geliefert,
* ansonsten FALSE (auch bei Fehlern). */
CHAR *ptr, *ptr1, *ptr2;
#ifndef STRICT_RFC
CHAR *ptr1, *ptr2;
#endif
CHAR *ptr;
INT len, delta;
BOOLEAN action;
/* Eine komplette Anfrage muss mit CR+LF enden, vgl.
* RFC 2812. Haben wir eine? */
@@ -824,6 +886,7 @@ Handle_Buffer( CONN_ID Idx )
}
#endif
action = FALSE;
if( ptr )
{
/* Ende der Anfrage wurde gefunden */
@@ -832,23 +895,26 @@ Handle_Buffer( CONN_ID Idx )
if( len > ( COMMAND_LEN - 1 ))
{
/* Eine Anfrage darf(!) nicht laenger als 512 Zeichen
* (incl. CR+LF!) werden; vgl. RFC 2812. Wenn soetwas
* empfangen wird, wird der Client disconnectiert. */
* (incl. CR+LF!) werden; vgl. RFC 2812. Wenn soetwas
* empfangen wird, wird der Client disconnectiert. */
Log( LOG_ERR, "Request too long (connection %d): %d bytes (max. %d expected)!", Idx, My_Connections[Idx].rdatalen, COMMAND_LEN - 1 );
Conn_Close( Idx, NULL, "Request too long", TRUE );
return;
return FALSE;
}
if( len > delta )
{
/* Es wurde ein Request gelesen */
if( ! Parse_Request( Idx, My_Connections[Idx].rbuf )) return;
if( ! Parse_Request( Idx, My_Connections[Idx].rbuf )) return FALSE;
else action = TRUE;
}
/* Puffer anpassen */
My_Connections[Idx].rdatalen -= len;
memmove( My_Connections[Idx].rbuf, My_Connections[Idx].rbuf + len, My_Connections[Idx].rdatalen );
}
return action;
} /* Handle_Buffer */
@@ -986,7 +1052,7 @@ New_Server( INT Server, CONN_ID Idx )
struct sockaddr_in new_addr;
struct in_addr inaddr;
INT new_sock;
INT res, new_sock;
CLIENT *c;
assert( Server >= 0 );
@@ -1032,13 +1098,12 @@ New_Server( INT Server, CONN_ID Idx )
if( ! Init_Socket( new_sock )) return;
connect( new_sock, (struct sockaddr *)&new_addr, sizeof( new_addr ));
if( errno != EINPROGRESS )
res = connect( new_sock, (struct sockaddr *)&new_addr, sizeof( new_addr ));
if(( res != 0 ) && ( errno != EINPROGRESS ))
{
Log( LOG_CRIT, "Can't connect socket: %s!", strerror( errno ));
close( new_sock );
Init_Conn_Struct( Idx );
Log( LOG_CRIT, "Can't connect socket: %s!", strerror( errno ));
return;
}
@@ -1063,6 +1128,8 @@ New_Server( INT Server, CONN_ID Idx )
FD_SET( new_sock, &My_Sockets );
FD_SET( new_sock, &My_Connects );
if( new_sock > Conn_MaxFD ) Conn_MaxFD = new_sock;
Log( LOG_DEBUG, "Registered new connection %d on socket %d.", Idx, My_Connections[Idx].sock );
} /* New_Server */
@@ -1124,7 +1191,7 @@ Read_Resolver_Result( INT r_fd )
FD_CLR( r_fd, &Resolver_FDs );
/* Anfrage vom Parent lesen */
len = read( r_fd, result, HOST_LEN);
len = read( r_fd, result, HOST_LEN - 1 );
if( len < 0 )
{
/* Fehler beim Lesen aus der Pipe */
@@ -1142,7 +1209,7 @@ Read_Resolver_Result( INT r_fd )
if( i >= MAX_CONNECTIONS )
{
/* Opsa! Keine passende Connection gefunden!? Vermutlich
* wurde sie schon wieder geschlossen. */
* wurde sie schon wieder geschlossen. */
close( r_fd );
Log( LOG_DEBUG, "Resolver: Got result for unknown connection!?" );
return;

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: defines.h,v 1.33 2002/09/07 17:58:00 alex Exp $
* $Id: defines.h,v 1.33.2.1 2002/11/23 16:20:25 alex Exp $
*
* defines.h: (globale) Konstanten
*/
@@ -20,6 +20,8 @@
#define NONE -1
#define TIME_RES 2 /* Zeit-Aufloesung des Servers in Sekunden */
#define FNAME_LEN 256 /* max. Laenge eines Dateinamen */
#define LINE_LEN 256 /* max. Laenge einer Konfigurationszeile */

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: irc-login.c,v 1.21 2002/09/09 03:34:33 alex Exp $
* $Id: irc-login.c,v 1.21.2.1 2002/09/22 21:37:06 alex Exp $
*
* irc-login.c: Anmeldung und Abmeldung im IRC
*/
@@ -441,7 +441,7 @@ Hello_User( CLIENT *Client )
IRC_WriteStrServers( NULL, "NICK %s 1 %s %s 1 +%s :%s", Client_ID( Client ), Client_User( Client ), Client_Hostname( Client ), Client_Modes( Client ), Client_Info( Client ));
if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return FALSE;
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), VERSION, TARGET_CPU, TARGET_CPU, TARGET_OS )) return FALSE;
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), VERSION, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return FALSE;
if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return FALSE;
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), VERSION, USERMODES, CHANMODES )) return FALSE;

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: irc-server.c,v 1.17 2002/09/07 17:57:31 alex Exp $
* $Id: irc-server.c,v 1.17.2.3 2002/11/29 10:58:49 alex Exp $
*
* irc-server.c: IRC-Befehle fuer Server-Links
*/
@@ -188,7 +188,7 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 8 ))
{
/* Zeile senden */
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
sprintf( str, "NJOIN %s :", Channel_Name( chan ));
}
@@ -199,7 +199,7 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
if( str[strlen( str ) - 1] != ':')
{
/* Ja; Also senden ... */
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
}
/* naechsten Channel suchen */
@@ -339,9 +339,6 @@ IRC_SQUIT( CLIENT *Client, REQUEST *Req )
Log( LOG_DEBUG, "Got SQUIT from %s for \"%s\": \"%s\" ...", Client_ID( Client ), Req->argv[0], Req->argv[1] );
/* SQUIT an alle Server weiterleiten */
IRC_WriteStrServers( Client, "SQUIT %s :%s", Req->argv[0], Req->argv[1] );
target = Client_Search( Req->argv[0] );
if( ! target )
{

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: irc-write.c,v 1.8 2002/09/17 17:11:56 alex Exp $
* $Id: irc-write.c,v 1.7.2.3 2002/10/04 13:12:46 alex Exp $
*
* irc-write.c: IRC-Texte und Befehle ueber Netzwerk versenden
*/
@@ -62,7 +62,7 @@ va_dcl
va_end( ap );
/* an den Client selber */
ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), buffer );
ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), "%s", buffer );
return ok;
} /* IRC_WriteStrClient */
@@ -128,7 +128,7 @@ va_dcl
vsnprintf( buffer, 1000, Format, ap );
va_end( ap );
return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, buffer );
return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, "%s", buffer );
} /* IRC_WriteStrChannel */
@@ -233,7 +233,7 @@ va_dcl
va_end( ap );
/* an den Client selber */
IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), buffer );
IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), "%s", buffer );
} /* IRC_WriteStrServers */
@@ -263,7 +263,7 @@ va_dcl
vsnprintf( buffer, 1000, Format, ap );
va_end( ap );
IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, '\0', buffer );
IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, '\0', "%s", buffer );
} /* IRC_WriteStrServersPrefix */
@@ -301,7 +301,7 @@ va_dcl
if(( Client_Type( c ) == CLIENT_SERVER ) && ( Client_Conn( c ) > NONE ) && ( c != Client_ThisServer( )) && ( c != ExceptOf ))
{
/* Ziel-Server gefunden. Nun noch pruefen, ob Flags stimmen */
if(( Flag == '\0' ) || ( strchr( Client_Flags( c ), Flag ) != NULL )) IRC_WriteStrClientPrefix( c, Prefix, buffer );
if(( Flag == '\0' ) || ( strchr( Client_Flags( c ), Flag ) != NULL )) IRC_WriteStrClientPrefix( c, Prefix, "%s", buffer );
}
c = Client_Next( c );
}

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: irc.c,v 1.95 2002/09/16 09:14:45 alex Exp $
* $Id: irc.c,v 1.95.2.3 2002/11/04 19:18:39 alex Exp $
*
* irc.c: IRC-Befehle
*/
@@ -109,7 +109,7 @@ IRC_NOTICE( CLIENT *Client, REQUEST *Req )
assert( Client != NULL );
assert( Req != NULL );
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return CONNECTED;
/* Falsche Anzahl Parameter? */
if( Req->argc != 2 ) return CONNECTED;
@@ -206,7 +206,7 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req )
if( strlen( rpl ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 ))
{
/* Zeile wird zu lang: senden! */
if( ! IRC_WriteStrClient( from, rpl )) return DISCONNECTED;
if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED;
sprintf( rpl, RPL_NAMREPLY_MSG, Client_ID( from ), "*", "*" );
}
}
@@ -217,7 +217,7 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req )
if( rpl[strlen( rpl ) - 1] != ':')
{
/* es wurden User gefunden */
if( ! IRC_WriteStrClient( from, rpl )) return DISCONNECTED;
if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED;
}
return IRC_WriteStrClient( from, RPL_ENDOFNAMES_MSG, Client_ID( from ), "*" );
@@ -259,7 +259,7 @@ IRC_ISON( CLIENT *Client, REQUEST *Req )
}
if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) );
return IRC_WriteStrClient( Client, "%s", rpl, Client_ID( Client ) );
} /* IRC_ISON */
@@ -325,7 +325,7 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
if( strlen( str ) > ( LINE_LEN - CHANNEL_NAME_LEN - 4 ))
{
/* Zeile wird zu lang: senden! */
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
sprintf( str, RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c ));
}
@@ -335,7 +335,7 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
if( str[strlen( str ) - 1] != ':')
{
/* Es sind noch Daten da, die gesendet werden muessen */
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
}
/* IRC-Operator? */
@@ -477,7 +477,7 @@ IRC_USERHOST( CLIENT *Client, REQUEST *Req )
}
if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) );
return IRC_WriteStrClient( Client, "%s", rpl, Client_ID( Client ) );
} /* IRC_USERHOST */
@@ -768,7 +768,7 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 ))
{
/* Zeile wird zu lang: senden! */
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
sprintf( str, RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan ));
}
}
@@ -779,7 +779,7 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
if( str[strlen( str ) - 1] != ':')
{
/* Es sind noch Daten da, die gesendet werden muessen */
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
}
return CONNECTED;
@@ -834,7 +834,7 @@ IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )
GLOBAL BOOLEAN
IRC_Send_LUSERS( CLIENT *Client )
{
INT cnt;
LONG cnt;
assert( Client != NULL );

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: lists.c,v 1.8 2002/09/08 17:06:07 alex Exp $
* $Id: lists.c,v 1.8.2.2 2002/10/04 13:12:46 alex Exp $
*
* lists.c: Verwaltung der "IRC-Listen": Ban, Invite, ...
*/
@@ -317,13 +317,13 @@ GLOBAL CHAR *
Lists_MakeMask( CHAR *Pattern )
{
/* Hier wird aus einem "beliebigen" Pattern eine gueltige IRC-Mask erzeugt.
* Diese ist aber nur bis zum naechsten Aufruf von Lists_MakeMask() gueltig,
* da ein einziger globaler Puffer verwendet wird. ->Umkopieren!*/
* Diese ist aber nur bis zum naechsten Aufruf von Lists_MakeMask() gueltig,
* da ein einziger globaler Puffer verwendet wird. ->Umkopieren!*/
STATIC CHAR TheMask[MASK_LEN];
CHAR *excl, *at;
assert( Pattern );
assert( Pattern != NULL );
excl = strchr( Pattern, '!' );
at = strchr( Pattern, '@' );

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: log.c,v 1.37 2002/09/09 22:55:21 alex Exp $
* $Id: log.c,v 1.37.2.3 2002/11/04 19:18:39 alex Exp $
*
* log.c: Logging-Funktionen
*/
@@ -96,7 +96,7 @@ Log_InitErrorfile( VOID )
* landen z.B. alle Ausgaben von assert()-Aufrufen. */
/* Dateiname zusammen bauen */
sprintf( Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE, (INT32)getpid( ));
sprintf( Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE, (LONG)getpid( ));
/* stderr umlenken */
fflush( stderr );
@@ -185,7 +185,7 @@ va_dcl
else
{
/* Syslog */
syslog( Level, msg );
syslog( Level, "%s", msg );
}
#endif

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: messages.h,v 1.46 2002/09/16 09:23:40 alex Exp $
* $Id: messages.h,v 1.46.2.4 2002/11/22 22:55:05 alex Exp $
*
* irc.h: IRC-Befehle (Header)
*/
@@ -20,15 +20,15 @@
#define RPL_WELCOME_MSG "001 %s :Welcome to the Internet Relay Network %s"
#define RPL_YOURHOST_MSG "002 %s :Your host is %s, running ngircd %s-%s/%s/%s"
#define RPL_CREATED_MSG "003 %s :This server was started %s"
#define RPL_MYINFO_MSG "004 %s :%s ngircd-%s %s %s"
#define RPL_UMODEIS_MSG "211 %s +%s"
#define RPL_LUSERCLIENT_MSG "251 %s :There are %d users and %d services on %d servers"
#define RPL_LUSEROP_MSG "252 %s %d :operator(s) online"
#define RPL_LUSERUNKNOWN_MSG "253 %s %d :unknown connection(s)"
#define RPL_LUSERCHANNELS_MSG "254 %s %d :channels formed"
#define RPL_LUSERME_MSG "255 %s :I have %d users, %d services and %d servers"
#define RPL_YOURHOST_MSG "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)"
#define RPL_CREATED_MSG "003 %s :This server has been started %s"
#define RPL_MYINFO_MSG "004 %s %s ngircd-%s %s %s"
#define RPL_UMODEIS_MSG "221 %s +%s"
#define RPL_LUSERCLIENT_MSG "251 %s :There are %ld users and %ld services on %ld servers"
#define RPL_LUSEROP_MSG "252 %s %ld :operator(s) online"
#define RPL_LUSERUNKNOWN_MSG "253 %s %ld :unknown connection(s)"
#define RPL_LUSERCHANNELS_MSG "254 %s %ld :channels formed"
#define RPL_LUSERME_MSG "255 %s :I have %ld users, %ld services and %ld servers"
#define RPL_ADMINME_MSG "256 %s %s :Administrative info"
#define RPL_ADMINLOC1_MSG "257 %s :%s"
#define RPL_ADMINLOC2_MSG "258 %s :%s"
@@ -46,7 +46,7 @@
#define RPL_WHOISIDLE_MSG "317 %s %s %ld :seconds idle"
#define RPL_ENDOFWHOIS_MSG "318 %s %s :End of WHOIS list"
#define RPL_WHOISCHANNELS_MSG "319 %s %s :"
#define RPL_LIST_MSG "322 %s %s %d :%s"
#define RPL_LIST_MSG "322 %s %s %ld :%s"
#define RPL_LISTEND_MSG "323 %s :End of LIST"
#define RPL_CHANNELMODEIS_MSG "324 %s %s +%s"
#define RPL_NOTOPIC_MSG "331 %s %s :No topic is set"

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: ngircd.c,v 1.54 2002/09/07 17:57:17 alex Exp $
* $Id: ngircd.c,v 1.54.2.4 2002/11/24 15:25:25 alex Exp $
*
* ngircd.c: Hier beginnt alles ;-)
*/
@@ -29,6 +29,8 @@
#include <sys/stat.h>
#include <sys/wait.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include "resolve.h"
#include "conn.h"
@@ -57,8 +59,10 @@ LOCAL VOID Show_Help PARAMS(( VOID ));
GLOBAL int
main( int argc, const char *argv[] )
{
struct passwd *pwd;
struct group *grp;
BOOLEAN ok, configtest = FALSE;
INT32 pid, n;
LONG pid, n;
INT i;
umask( 0077 );
@@ -140,7 +144,7 @@ main( int argc, const char *argv[] )
{
/* Kurze Option */
for( n = 1; n < (INT32)strlen( argv[i] ); n++ )
for( n = 1; n < (LONG)strlen( argv[i] ); n++ )
{
ok = FALSE;
#ifdef DEBUG
@@ -159,7 +163,7 @@ main( int argc, const char *argv[] )
NGIRCd_ConfFile[FNAME_LEN - 1] = '\0';
/* zum uebernaechsten Parameter */
i++; n = strlen( argv[i] );
i++; n = (LONG)strlen( argv[i] );
ok = TRUE;
}
}
@@ -227,7 +231,7 @@ main( int argc, const char *argv[] )
if( ! NGIRCd_NoDaemon )
{
/* Daemon im Hintergrund erzeugen */
pid = (INT32)fork( );
pid = (LONG)fork( );
if( pid > 0 )
{
/* "alter" Prozess */
@@ -275,8 +279,12 @@ main( int argc, const char *argv[] )
if( setuid( Conf_UID ) != 0 ) Log( LOG_ERR, "Can't change User-ID to %u: %s", Conf_UID, strerror( errno ));
}
}
Log( LOG_INFO, "Running as user %ld, group %ld, with PID %ld.", (INT32)getuid( ), (INT32)getgid( ), (INT32)getpid( ));
/* User, Gruppe und Prozess-ID des Daemon ausgeben */
pwd = getpwuid( getuid( )); grp = getgrgid( getgid( ));
Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", pwd ? pwd->pw_name : "unknown", (LONG)getuid( ), grp ? grp->gr_name : "unknown", (LONG)getgid( ), (LONG)getpid( ));
/* stderr in "Error-File" umlenken */
Log_InitErrorfile( );
/* Signal-Handler initialisieren */
@@ -451,7 +459,7 @@ Initialize_Listen_Ports( VOID )
/* Ports, auf denen der Server Verbindungen entgegennehmen
* soll, initialisieren */
UINT created, i;
INT created, i;
created = 0;
for( i = 0; i < Conf_ListenPorts_Count; i++ )

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: parse.c,v 1.41 2002/09/16 09:20:27 alex Exp $
* $Id: parse.c,v 1.41.2.4 2002/11/29 10:59:51 alex Exp $
*
* parse.c: Parsen der Client-Anfragen
*/
@@ -101,8 +101,6 @@ Parse_Request( CONN_ID Idx, CHAR *Request )
}
else start = Request;
if( ! Validate_Prefix( Idx, &req, &closed )) return ! closed;
/* Befehl */
ptr = strchr( start, ' ' );
if( ptr )
@@ -116,8 +114,6 @@ Parse_Request( CONN_ID Idx, CHAR *Request )
}
req.command = start;
if( ! Validate_Command( Idx, &req, &closed )) return ! closed;
/* Argumente, Parameter */
if( ptr )
{
@@ -156,6 +152,9 @@ Parse_Request( CONN_ID Idx, CHAR *Request )
}
}
/* Daten validieren */
if( ! Validate_Prefix( Idx, &req, &closed )) return ! closed;
if( ! Validate_Command( Idx, &req, &closed )) return ! closed;
if( ! Validate_Args( Idx, &req, &closed )) return ! closed;
return Handle_Request( Idx, &req );
@@ -209,8 +208,8 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
if( ! c )
{
/* im Prefix angegebener Client ist nicht bekannt */
Log( LOG_ERR, "Invalid prefix, client not known (connection %d)!?", Idx );
if( ! Conn_WriteStr( Idx, "ERROR :Invalid prefix, client not known!?" )) *Closed = TRUE;
Log( LOG_ERR, "Invalid prefix \"%s\", client not known (connection %d, command %s)!?", Req->prefix, Idx, Req->command );
if( ! Conn_WriteStr( Idx, "ERROR :Invalid prefix \"%s\", client not known!?", Req->prefix )) *Closed = TRUE;
return FALSE;
}
@@ -221,7 +220,7 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
{
/* das angegebene Prefix ist aus dieser Richtung, also
* aus der gegebenen Connection, ungueltig! */
Log( LOG_ERR, "Spoofed prefix \"%s\" from \"%s\" (connection %d)!", Req->prefix, Client_Mask( Client_GetFromConn( Idx )), Idx );
Log( LOG_ERR, "Spoofed prefix \"%s\" from \"%s\" (connection %d, command %s)!", Req->prefix, Client_Mask( Client_GetFromConn( Idx )), Idx, Req->command );
Conn_Close( Idx, NULL, "Spoofed prefix", TRUE );
*Closed = TRUE;
return FALSE;
@@ -280,8 +279,8 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
else target = NULL;
if( ! target )
{
if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code: \"%s\"", Req->argv[0] );
else Log( LOG_WARNING, "Unknown target for status code!" );
if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code %s: \"%s\"", Req->command, Req->argv[0] );
else Log( LOG_WARNING, "Unknown target for status code %s!", Req->command );
return TRUE;
}
if( target == Client_ThisServer( ))
@@ -311,7 +310,7 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
else strcat( str, " :" );
strcat( str, Req->argv[i] );
}
return IRC_WriteStrClientPrefix( target, prefix, str );
return IRC_WriteStrClientPrefix( target, prefix, "%s", str );
}
if( strcasecmp( Req->command, "PASS" ) == 0 ) return IRC_PASS( client, Req );

View File

@@ -9,7 +9,7 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: portab.h,v 1.7 2002/06/26 15:43:38 alex Exp $
* $Id: portab.h,v 1.7.2.1 2002/11/04 19:18:39 alex Exp $
*
* portab.h: "Portabilitaets-Definitionen"
*/
@@ -56,6 +56,9 @@ typedef void POINTER;
typedef signed int INT;
typedef unsigned int UINT;
typedef signed long LONG;
typedef unsigned long ULONG;
typedef signed char INT8;
typedef unsigned char UINT8;
typedef signed short INT16;
@@ -63,6 +66,7 @@ typedef unsigned short UINT16;
typedef signed long INT32;
typedef unsigned long UINT32;
typedef double DOUBLE;
typedef float FLOAT;
typedef char CHAR;

View File

@@ -9,7 +9,7 @@
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
#
# $Id: Makefile.am,v 1.3 2002/09/12 02:26:17 alex Exp $
# $Id: Makefile.am,v 1.3.2.2 2002/09/20 15:39:55 alex Exp $
#
AUTOMAKE_OPTIONS = ../portab/ansi2knr
@@ -17,21 +17,24 @@ AUTOMAKE_OPTIONS = ../portab/ansi2knr
INCLUDES = -I$(srcdir)/../portab
EXTRA_DIST = \
getpid.sh \
start-server.sh stop-server.sh tests.sh stress-server.sh \
connect-test.e channel-test.e mode-test.e \
stress-A.e stress-B.e check-idle.e \
ngircd-test.conf
clean-local:
rm -rf logs tests *-test ngircd-test.log ngircd-test.motd ngircd-TEST procs.tmp
rm -rf logs tests *-test ngircd-test.log ngircd-test.motd \
ngircd-TEST* procs.tmp
maintainer-clean-local:
rm -f Makefile Makefile.in
check_SCRIPTS = ngircd-TEST tests.sh
check_SCRIPTS = ngircd-TEST-Binary tests.sh
ngircd-TEST:
ln -s ../ngircd/ngircd ngircd-TEST
ngircd-TEST-Binary:
cp ../ngircd/ngircd ngircd-TEST
[ -f getpid.sh ] || ln -s $(srcdir)/getpid.sh .
connect-test: tests.sh
ln -s $(srcdir)/tests.sh connect-test

28
src/testsuite/getpid.sh Executable file
View File

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

View File

@@ -1,4 +1,4 @@
# $Id: mode-test.e,v 1.2 2002/09/09 21:26:00 alex Exp $
# $Id: mode-test.e,v 1.2.2.1 2002/11/22 23:46:09 alex Exp $
spawn telnet localhost 6789
expect {
@@ -22,7 +22,7 @@ expect {
send "mode nick\r"
expect {
timeout { exit 1 }
"211 nick +i"
"221 nick +i"
}
send "mode nick -i\r"
@@ -44,7 +44,7 @@ expect {
send "mode nick\r"
expect {
timeout { exit 1 }
"211 nick +o"
"221 nick +o"
}
send "join #channel\r"

View File

@@ -1,10 +1,11 @@
# $Id: ngircd-test.conf,v 1.2 2002/09/09 21:25:50 alex Exp $
# $Id: ngircd-test.conf,v 1.2.2.1 2002/11/04 19:18:39 alex Exp $
[Global]
Name = ngircd.test.server
Info = ngIRCd Test-Server
Ports = 6789
MotdFile = ngircd-test.motd
AdminEMail = admin@irc.server
[Operator]
Name = TestOp

View File

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

View File

@@ -1,15 +1,17 @@
#!/bin/sh
# ngIRCd Test Suite
# $Id: stop-server.sh,v 1.4 2002/09/16 09:53:16 alex Exp $
# $Id: stop-server.sh,v 1.4.2.4 2002/10/03 16:13:38 alex Exp $
[ -z "$srcdir" ] && srcdir=`dirname $0`
echo " stopping server ..."
PS_FLAGS=a; PS_PIDCOL=1
ps a > /dev/null 2>&1
if [ $? -ne 0 ]; then PS_FLAGS=-f; PS_PIDCOL=2; fi
# Test-Server stoppen ...
pid=`./getpid.sh ngircd-TEST`
[ -n "$pid" ] && kill $pid > /dev/null 2>&1 || exit 1
sleep 1
ps $PS_FLAGS > procs.tmp
pid=`cat procs.tmp | grep ngircd-TEST | awk "{ print \\\$$PS_PIDCOL }"`
kill $pid > /dev/null 2>&1
# jetzt duerfte der Prozess nicht mehr laufen
kill -0 $pid > /dev/null 2>&1 && exit 1 || exit 0
# -eof-

View File

@@ -1,9 +1,10 @@
#!/bin/sh
# ngIRCd Test Suite
# $Id: stress-server.sh,v 1.4 2002/09/16 09:54:17 alex Exp $
# $Id: stress-server.sh,v 1.4.2.2 2002/10/03 16:13:38 alex Exp $
if [ `uname` = "Darwin" -o `uname` = "IRIX" -o `uname` = "IRIX64" ]; then CLIENTS=5
else CLIENTS=50; fi
[ -z "$srcdir" ] && srcdir=`dirname $0`
[ $1 -gt 0 ] 2> /dev/null && CLIENTS=$1 || CLIENTS=5
name=`basename $0`
test=`echo ${name} | cut -d '.' -f 1`