mirror of
https://github.com/osmarks/ngircd.git
synced 2025-10-17 23:57:39 +00:00
Compare commits
29 Commits
rel-0-5-2
...
branch-0-5
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b74699b074 | ||
![]() |
35054b1f64 | ||
![]() |
f68369d821 | ||
![]() |
d53d18833d | ||
![]() |
a02c7a5f47 | ||
![]() |
14216308a0 | ||
![]() |
7a449bad3c | ||
![]() |
e0941f1a17 | ||
![]() |
6cdc8f7802 | ||
![]() |
266b68b873 | ||
![]() |
34d7f4162d | ||
![]() |
6eab6d9514 | ||
![]() |
2230a6c96a | ||
![]() |
b4afaf9c52 | ||
![]() |
8e9a84a902 | ||
![]() |
0a90f59030 | ||
![]() |
ad252b5c4c | ||
![]() |
b0eb4b0019 | ||
![]() |
92a9e0d34f | ||
![]() |
ed4417c1a0 | ||
![]() |
1e66da4e50 | ||
![]() |
6e55ea7298 | ||
![]() |
bb180adb49 | ||
![]() |
e2c896cb7e | ||
![]() |
2c7b276cc5 | ||
![]() |
4decf352fa | ||
![]() |
19c2e79b72 | ||
![]() |
49d9585242 | ||
![]() |
9487976620 |
38
ChangeLog
38
ChangeLog
@@ -10,6 +10,42 @@
|
||||
-- ChangeLog / Aenderungen --
|
||||
|
||||
|
||||
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.
|
||||
@@ -284,4 +320,4 @@ ngIRCd 0.0.1, 31.12.2001
|
||||
|
||||
|
||||
--
|
||||
$Id: ChangeLog,v 1.87.2.10 2002/10/04 12:43:53 alex Exp $
|
||||
$Id: ChangeLog,v 1.87.2.18 2002/11/29 11:42:24 alex Exp $
|
||||
|
@@ -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.58.2.6 2002/10/04 12:47:14 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.2)
|
||||
AM_INIT_AUTOMAKE(ngircd,0.5.x-CVS)
|
||||
AM_CONFIG_HEADER(src/config.h)
|
||||
|
||||
# -- Templates fuer config.h --
|
||||
|
@@ -1,5 +1,5 @@
|
||||
%define name ngircd
|
||||
%define version 0.5.2
|
||||
%define version 0.5.x-CVS
|
||||
%define release 1
|
||||
%define prefix %{_prefix}
|
||||
|
||||
@@ -51,4 +51,4 @@ make
|
||||
%doc AUTHORS COPYING ChangeLog INSTALL NEWS README
|
||||
%config(noreplace) /etc
|
||||
%{_prefix}/sbin
|
||||
%attr(644,root,root) %{_prefix}/share/man/
|
||||
%{_prefix}/share/man/
|
||||
|
@@ -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 );
|
||||
|
||||
|
@@ -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 ));
|
||||
|
@@ -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.2.1 2002/10/04 12:40:58 alex Exp $
|
||||
* $Id: client.c,v 1.60.2.2 2002/11/04 19:18:39 alex Exp $
|
||||
*
|
||||
* client.c: Management aller Clients
|
||||
*
|
||||
@@ -60,8 +60,8 @@ LOCAL CLIENT *This_Server, *My_Clients;
|
||||
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 ));
|
||||
@@ -840,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;
|
||||
@@ -892,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;
|
||||
@@ -909,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;
|
||||
@@ -953,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;
|
||||
@@ -970,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;
|
||||
|
@@ -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 ));
|
||||
|
||||
|
@@ -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.2.3 2002/10/04 13:12:46 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,6 +70,8 @@ Conf_Test( VOID )
|
||||
{
|
||||
/* Konfiguration einlesen, ueberpruefen und ausgeben. */
|
||||
|
||||
struct passwd *pwd;
|
||||
struct group *grp;
|
||||
INT i;
|
||||
|
||||
Use_Log = FALSE;
|
||||
@@ -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 );
|
||||
|
@@ -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.2.3 2002/10/04 13:12:46 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? */
|
||||
@@ -454,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 );
|
||||
@@ -475,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 */
|
||||
|
||||
|
||||
@@ -541,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;
|
||||
}
|
||||
@@ -598,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 */
|
||||
|
||||
@@ -610,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 ))
|
||||
@@ -646,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 );
|
||||
@@ -657,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;
|
||||
}
|
||||
|
||||
@@ -685,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 )
|
||||
@@ -693,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 )
|
||||
{
|
||||
@@ -752,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 */
|
||||
|
||||
|
||||
@@ -788,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;
|
||||
}
|
||||
@@ -806,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? */
|
||||
@@ -833,6 +886,7 @@ Handle_Buffer( CONN_ID Idx )
|
||||
}
|
||||
#endif
|
||||
|
||||
action = FALSE;
|
||||
if( ptr )
|
||||
{
|
||||
/* Ende der Anfrage wurde gefunden */
|
||||
@@ -841,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 */
|
||||
|
||||
|
||||
@@ -995,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 );
|
||||
@@ -1041,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;
|
||||
}
|
||||
|
||||
@@ -1072,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 */
|
||||
|
||||
|
||||
@@ -1151,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;
|
||||
|
@@ -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 */
|
||||
|
@@ -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.2.2 2002/10/04 13:12:46 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
|
||||
*/
|
||||
@@ -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 )
|
||||
{
|
||||
|
@@ -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.2.2 2002/10/04 13:12:46 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;
|
||||
@@ -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 );
|
||||
|
||||
|
@@ -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.2.2 2002/10/04 13:12:46 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 );
|
||||
|
@@ -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.2.1 2002/10/03 16:13:38 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_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 "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_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"
|
||||
|
@@ -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.2.2 2002/10/04 13:12:46 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 = (INT32)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 */
|
||||
|
@@ -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.2.2 2002/10/04 13:12:46 alex Exp $
|
||||
* $Id: parse.c,v 1.41.2.4 2002/11/29 10:59:51 alex Exp $
|
||||
*
|
||||
* parse.c: Parsen der Client-Anfragen
|
||||
*/
|
||||
@@ -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( ))
|
||||
|
@@ -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;
|
||||
|
@@ -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"
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user