Index: ChangeLog =================================================================== RCS file: /usr/local/CVS/ngircd/ngircd/ChangeLog,v retrieving revision 1.87.2.12 retrieving revision 1.87.2.17 diff -u -r1.87.2.12 -r1.87.2.17 --- ChangeLog 2002/11/08 21:17:03 1.87.2.12 +++ ChangeLog 2002/11/24 15:33:14 1.87.2.17 @@ -10,6 +10,21 @@ -- ChangeLog / Aenderungen -- +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, @@ -298,4 +313,4 @@ -- -$Id: ChangeLog,v 1.87.2.12 2002/11/08 21:17:03 alex Exp $ +$Id: ChangeLog,v 1.87.2.17 2002/11/24 15:33:14 alex Exp $ Index: configure.in =================================================================== RCS file: /usr/local/CVS/ngircd/ngircd/configure.in,v retrieving revision 1.58.2.8 retrieving revision 1.58.2.10 diff -u -r1.58.2.8 -r1.58.2.10 --- configure.in 2002/11/08 21:17:17 1.58.2.8 +++ configure.in 2002/11/24 15:33:26 1.58.2.10 @@ -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.8 2002/11/08 21:17:17 alex Exp $ +# $Id: configure.in,v 1.58.2.10 2002/11/24 15:33:26 alex Exp $ # # -- Initialisierung -- @@ -18,7 +18,7 @@ AC_PREREQ(2.50) AC_CANONICAL_TARGET AC_CONFIG_SRCDIR(src/config.h.in) -AM_INIT_AUTOMAKE(ngircd,0.5.3) +AM_INIT_AUTOMAKE(ngircd,0.5.4) AM_CONFIG_HEADER(src/config.h) # -- Templates fuer config.h -- Index: contrib/ngircd.spec =================================================================== RCS file: /usr/local/CVS/ngircd/ngircd/contrib/ngircd.spec,v retrieving revision 1.1.2.5 retrieving revision 1.1.2.7 diff -u -r1.1.2.5 -r1.1.2.7 --- contrib/ngircd.spec 2002/11/08 21:17:17 1.1.2.5 +++ contrib/ngircd.spec 2002/11/24 15:33:26 1.1.2.7 @@ -1,5 +1,5 @@ %define name ngircd -%define version 0.5.3 +%define version 0.5.4 %define release 1 %define prefix %{_prefix} @@ -51,4 +51,4 @@ %doc AUTHORS COPYING ChangeLog INSTALL NEWS README %config(noreplace) /etc %{_prefix}/sbin -%attr(644,root,root) %{_prefix}/share/man/ +%{_prefix}/share/man/ Index: src/ngircd/conf.c =================================================================== RCS file: /usr/local/CVS/ngircd/ngircd/src/ngircd/conf.c,v retrieving revision 1.29.2.4 retrieving revision 1.29.2.5 diff -u -r1.29.2.4 -r1.29.2.5 --- src/ngircd/conf.c 2002/11/04 19:18:39 1.29.2.4 +++ src/ngircd/conf.c 2002/11/24 15:25:25 1.29.2.5 @@ -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.4 2002/11/04 19:18:39 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 #include #include +#include +#include +#include #include "ngircd.h" #include "conn.h" @@ -67,6 +70,8 @@ { /* Konfiguration einlesen, ueberpruefen und ausgeben. */ + struct passwd *pwd; + struct group *grp; INT i; Use_Log = FALSE; @@ -91,15 +96,19 @@ 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", (LONG)Conf_UID ); - printf( " ServerGID = %ld\n", (LONG)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,6 +303,8 @@ LOCAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) { + struct passwd *pwd; + struct group *grp; CHAR *ptr; LONG port; @@ -372,13 +383,17 @@ 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 ) Index: src/ngircd/conn.c =================================================================== RCS file: /usr/local/CVS/ngircd/ngircd/src/ngircd/conn.c,v retrieving revision 1.72.2.4 retrieving revision 1.72.2.8 diff -u -r1.72.2.4 -r1.72.2.8 --- src/ngircd/conn.c 2002/11/04 19:18:39 1.72.2.4 +++ src/ngircd/conn.c 2002/11/24 15:32:14 1.72.2.8 @@ -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.4 2002/11/04 19:18:39 alex Exp $ + * $Id: conn.c,v 1.72.2.8 2002/11/24 15:32:14 alex Exp $ * * connect.h: Verwaltung aller Netz-Verbindungen ("connections") */ @@ -84,7 +84,7 @@ 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 )); @@ -236,10 +236,13 @@ struct timeval tv; time_t start, t; INT i, idx; + BOOLEAN timeout; start = time( NULL ); while(( ! NGIRCd_Quit ) && ( ! NGIRCd_Restart )) { + timeout = TRUE; + Check_Servers( ); Check_Connections( ); @@ -250,7 +253,7 @@ 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 @@ } /* 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 ); @@ -561,14 +565,18 @@ * Socket zu schreiben. */ fd_set write_socket; + struct timeval tv; assert( Idx >= 0 ); assert( My_Connections[Idx].sock > NONE ); assert( My_Connections[Idx].wdatalen > 0 ); + /* 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 ) @@ -671,6 +679,9 @@ 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 on connection %d (socket %d): %s!", Idx, My_Connections[Idx].sock, strerror( errno )); Conn_Close( Idx, "Write error!", NULL, FALSE ); @@ -699,6 +710,7 @@ 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 ) @@ -707,6 +719,9 @@ return; } + /* 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 ) @@ -808,6 +823,9 @@ if( len < 0 ) { + /* Operation haette Socket "nur" blockiert ... */ + if( errno == EAGAIN ) return; + /* Fehler beim Lesen */ 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 ); @@ -826,16 +844,19 @@ } /* 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). */ #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? */ @@ -856,6 +877,7 @@ } #endif + action = FALSE; if( ptr ) { /* Ende der Anfrage wurde gefunden */ @@ -864,23 +886,26 @@ 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 */ @@ -1018,7 +1043,7 @@ struct sockaddr_in new_addr; struct in_addr inaddr; - INT new_sock; + INT res, new_sock; CLIENT *c; assert( Server >= 0 ); @@ -1064,13 +1089,12 @@ 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; } Index: src/ngircd/defines.h =================================================================== RCS file: /usr/local/CVS/ngircd/ngircd/src/ngircd/defines.h,v retrieving revision 1.33 retrieving revision 1.33.2.1 diff -u -r1.33 -r1.33.2.1 --- src/ngircd/defines.h 2002/09/07 17:58:00 1.33 +++ src/ngircd/defines.h 2002/11/23 16:20:25 1.33.2.1 @@ -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 */ @@ -19,6 +19,8 @@ #define NONE -1 + +#define TIME_RES 2 /* Zeit-Aufloesung des Servers in Sekunden */ #define FNAME_LEN 256 /* max. Laenge eines Dateinamen */ Index: src/ngircd/messages.h =================================================================== RCS file: /usr/local/CVS/ngircd/ngircd/src/ngircd/messages.h,v retrieving revision 1.46.2.3 retrieving revision 1.46.2.4 diff -u -r1.46.2.3 -r1.46.2.4 --- src/ngircd/messages.h 2002/11/04 19:27:23 1.46.2.3 +++ src/ngircd/messages.h 2002/11/22 22:55:05 1.46.2.4 @@ -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.3 2002/11/04 19:27:23 alex Exp $ + * $Id: messages.h,v 1.46.2.4 2002/11/22 22:55:05 alex Exp $ * * irc.h: IRC-Befehle (Header) */ @@ -23,7 +23,7 @@ #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_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)" Index: src/ngircd/ngircd.c =================================================================== RCS file: /usr/local/CVS/ngircd/ngircd/src/ngircd/ngircd.c,v retrieving revision 1.54.2.3 retrieving revision 1.54.2.4 diff -u -r1.54.2.3 -r1.54.2.4 --- src/ngircd/ngircd.c 2002/11/04 19:18:39 1.54.2.3 +++ src/ngircd/ngircd.c 2002/11/24 15:25:25 1.54.2.4 @@ -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.3 2002/11/04 19:18:39 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 #include #include +#include +#include #include "resolve.h" #include "conn.h" @@ -57,6 +59,8 @@ GLOBAL int main( int argc, const char *argv[] ) { + struct passwd *pwd; + struct group *grp; BOOLEAN ok, configtest = FALSE; LONG pid, n; INT i; @@ -275,8 +279,12 @@ 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.", (LONG)getuid( ), (LONG)getgid( ), (LONG)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 */ Index: src/ngircd/parse.c =================================================================== RCS file: /usr/local/CVS/ngircd/ngircd/src/ngircd/parse.c,v retrieving revision 1.41.2.2 retrieving revision 1.41.2.3 diff -u -r1.41.2.2 -r1.41.2.3 --- src/ngircd/parse.c 2002/10/04 13:12:46 1.41.2.2 +++ src/ngircd/parse.c 2002/11/20 11:11:19 1.41.2.3 @@ -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.3 2002/11/20 11:11:19 alex Exp $ * * parse.c: Parsen der Client-Anfragen */ @@ -209,8 +209,8 @@ 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)!?", Req->prefix, Idx ); + if( ! Conn_WriteStr( Idx, "ERROR :Invalid prefix \"%s\", client not known!?", Req->prefix )) *Closed = TRUE; return FALSE; } @@ -280,8 +280,8 @@ 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( )) Index: src/testsuite/mode-test.e =================================================================== RCS file: /usr/local/CVS/ngircd/ngircd/src/testsuite/mode-test.e,v retrieving revision 1.2 retrieving revision 1.2.2.1 diff -u -r1.2 -r1.2.2.1 --- src/testsuite/mode-test.e 2002/09/09 21:26:00 1.2 +++ src/testsuite/mode-test.e 2002/11/22 23:46:09 1.2.2.1 @@ -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 @@ send "mode nick\r" expect { timeout { exit 1 } - "211 nick +i" + "221 nick +i" } send "mode nick -i\r" @@ -44,7 +44,7 @@ send "mode nick\r" expect { timeout { exit 1 } - "211 nick +o" + "221 nick +o" } send "join #channel\r"