- viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
authorAlexander Barton <alex@barton.de>
Mon, 31 Dec 2001 02:18:51 +0000 (02:18 +0000)
committerAlexander Barton <alex@barton.de>
Mon, 31 Dec 2001 02:18:51 +0000 (02:18 +0000)
- neuen Header "defines.h" mit (fast) allen Konstanten.
- Code Cleanups und viele "kleine" Aenderungen & Bugfixes.

22 files changed:
src/ngircd/Makefile.am
src/ngircd/channel.c
src/ngircd/channel.h
src/ngircd/client.c
src/ngircd/client.h
src/ngircd/conf.c
src/ngircd/conf.h
src/ngircd/conn.c
src/ngircd/conn.h
src/ngircd/defines.h [new file with mode: 0644]
src/ngircd/global.h
src/ngircd/irc.c
src/ngircd/irc.h
src/ngircd/log.c
src/ngircd/log.h
src/ngircd/messages.h
src/ngircd/ngircd.c
src/ngircd/ngircd.h
src/ngircd/parse.c
src/ngircd/parse.h
src/ngircd/tool.c
src/ngircd/tool.h

index 45865bf6eea14ceae4a15e0f776f46e467c3f902..474a6c0a1132f0b592cfaa3380474b09941f7979 100644 (file)
@@ -1,6 +1,11 @@
-# $Id: Makefile.am,v 1.8 2001/12/30 19:25:03 alex Exp $
+# $Id: Makefile.am,v 1.9 2001/12/31 02:18:51 alex Exp $
 
 # $Log: Makefile.am,v $
+# Revision 1.9  2001/12/31 02:18:51  alex
+# - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+# - neuen Header "defines.h" mit (fast) allen Konstanten.
+# - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+#
 # Revision 1.8  2001/12/30 19:25:03  alex
 # - in "noinst_HEADERS" waren einige Dateien als .c anstelle .h aufgefuehrt.
 #
 
 sbin_PROGRAMS = ngircd
 
-ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c irc.c log.c parse.c tool.c
+ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c irc.c log.c \
+       parse.c tool.c
 
-noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h irc.h log.h parse.h tool.h global.h messages.h
+noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h irc.h log.h \
+       parse.h tool.h global.h messages.h defines.h
 
 maintainer-clean-local:
        rm -f Makefile Makefile.in
index 0c11a7294212d07b76b9e0949454c1d37f645bb4..3e0db2664cc463b17611dd89b49afe2035c60967 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: channel.c,v 1.1 2001/12/14 08:13:43 alex Exp $
+ * $Id: channel.c,v 1.2 2001/12/31 02:18:51 alex Exp $
  *
  * channel.c: Management der Channels
  *
  * $Log: channel.c,v $
+ * Revision 1.2  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.1  2001/12/14 08:13:43  alex
  * - neues Modul begonnen :-)
  *
index 53ad9e818d3ebd9891f64d994db933c0d615800e..12d212a7c097f1095df14bcc26d8864365271da2 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: channel.h,v 1.2 2001/12/23 21:54:30 alex Exp $
+ * $Id: channel.h,v 1.3 2001/12/31 02:18:51 alex Exp $
  *
  * channel.h: Management der Channels (Header)
  *
  * $Log: channel.h,v $
+ * Revision 1.3  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.2  2001/12/23 21:54:30  alex
  * - Konstanten um Prefix "CHANNEL_" erweitert.
  *
 #define __channel_h__
 
 
-#define CHANNEL_NAME_LEN 50                    /* vgl. RFC 2812, 1.3 */
-
-
 typedef struct _CHANNEL
 {
-       CHAR name[CHANNEL_NAME_LEN + 1];        /* Name */
+       CHAR name[CHANNEL_NAME_LEN];    /* Name */
 } CHANNEL;
 
 
index 5b8e6547ce75f06570f8f606189c994a6e40cd66..ea420d6e891e6ce0ad13684719faad4e9284ac40 100644 (file)
@@ -7,9 +7,9 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: client.c,v 1.13 2001/12/30 19:26:11 alex Exp $
+ * $Id: client.c,v 1.14 2001/12/31 02:18:51 alex Exp $
  *
  * client.c: Management aller Clients
  *
  * Server gewesen, so existiert eine entsprechende CONNECTION-Struktur.
  *
  * $Log: client.c,v $
+ * Revision 1.14  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.13  2001/12/30 19:26:11  alex
  * - Unterstuetzung fuer die Konfigurationsdatei eingebaut.
  *
@@ -43,7 +48,7 @@
  * - "Code Cleanups".
  *
  * Revision 1.6  2001/12/26 03:19:16  alex
- * - neue Funktion Client_Name().
+ * - neue Funktion Client_Nick().
  *
  * Revision 1.5  2001/12/25 22:04:26  alex
  * - Aenderungen an den Debug- und Logging-Funktionen.
@@ -117,6 +122,7 @@ GLOBAL VOID Client_Init( VOID )
        if( h ) strcpy( This_Server->host, h->h_name );
 
        strcpy( This_Server->nick, Conf_ServerName );
+       strcpy( This_Server->info, Conf_ServerInfo );
 
        My_Clients = This_Server;
 } /* Client_Init */
@@ -201,13 +207,13 @@ GLOBAL VOID Client_SetHostname( CLIENT *Client, CHAR *Hostname )
        
        assert( Client != NULL );
        strncpy( Client->host, Hostname, CLIENT_HOST_LEN );
-       Client->host[CLIENT_HOST_LEN] = '\0';
+       Client->host[CLIENT_HOST_LEN - 1] = '\0';
 } /* Client_SetHostname */
 
 
 GLOBAL CLIENT *Client_GetFromConn( CONN_ID Idx )
 {
-       /* Client-Struktur, die zur lokalen Verbindung Idx gehoert
+       /* Client-Struktur, die zur lokalen Verbindung Idx gehoert,
         * liefern. Wird keine gefunden, so wird NULL geliefert. */
 
        CLIENT *c;
@@ -224,7 +230,26 @@ GLOBAL CLIENT *Client_GetFromConn( CONN_ID Idx )
 } /* Client_GetFromConn */
 
 
-GLOBAL CHAR *Client_Name( CLIENT *Client )
+GLOBAL CLIENT *Client_GetFromNick( CHAR *Nick )
+{
+       /* Client-Struktur, die den entsprechenden Nick hat,
+       * liefern. Wird keine gefunden, so wird NULL geliefert. */
+
+       CLIENT *c;
+
+       assert( Nick != NULL );
+
+       c = My_Clients;
+       while( c )
+       {
+               if( strcasecmp( c->nick, Nick ) == 0 ) return c;
+               c = c->next;
+       }
+       return NULL;
+} /* Client_GetFromNick */
+
+
+GLOBAL CHAR *Client_Nick( CLIENT *Client )
 {
        assert( Client != NULL );
 
@@ -243,7 +268,7 @@ GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick )
        assert( Nick != NULL );
        
        /* Nick zu lang? */
-       if( strlen( Nick ) > CLIENT_NICK_LEN ) return IRC_WriteStrClient( Client, This_Server, ERR_ERRONEUSNICKNAME_MSG, Client_Name( Client ), Nick );
+       if( strlen( Nick ) > CLIENT_NICK_LEN ) return IRC_WriteStrClient( Client, This_Server, ERR_ERRONEUSNICKNAME_MSG, Client_Nick( Client ), Nick );
 
        /* Nick bereits vergeben? */
        c = My_Clients;
@@ -252,7 +277,7 @@ GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick )
                if( strcasecmp( c->nick, Nick ) == 0 )
                {
                        /* den Nick gibt es bereits */
-                       IRC_WriteStrClient( Client, This_Server, ERR_NICKNAMEINUSE_MSG, Client_Name( Client ), Nick );
+                       IRC_WriteStrClient( Client, This_Server, ERR_NICKNAMEINUSE_MSG, Client_Nick( Client ), Nick );
                        return FALSE;
                }
                c = c->next;
@@ -318,8 +343,10 @@ LOCAL CLIENT *New_Client_Struct( VOID )
        strcpy( c->host, "" );
        strcpy( c->user, "" );
        strcpy( c->name, "" );
+       strcpy( c->info, "" );
        for( i = 0; i < MAX_CHANNELS; c->channels[i++] = NULL );
        strcpy( c->modes, "" );
+       c->oper_by_me = FALSE;
 
        return c;
 } /* New_Client */
index 144a43118e0eba0c8965dcaeae2a78b888b15a78..68943db3f325565cd0efd697b333117793fdda3b 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: client.h,v 1.9 2001/12/29 20:18:18 alex Exp $
+ * $Id: client.h,v 1.10 2001/12/31 02:18:51 alex Exp $
  *
  * client.h: Konfiguration des ngircd (Header)
  *
  * $Log: client.h,v $
+ * Revision 1.10  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.9  2001/12/29 20:18:18  alex
  * - neue Funktion Client_SetHostname().
  *
@@ -30,7 +35,7 @@
  * - "Code Cleanups".
  *
  * Revision 1.4  2001/12/26 03:19:16  alex
- * - neue Funktion Client_Name().
+ * - neue Funktion Client_Nick().
  *
  * Revision 1.3  2001/12/25 19:21:26  alex
  * - Client-Typ ("Status") besser unterteilt, My_Clients ist zudem nun global.
 #include "conn.h"
 
 
-#define CLIENT_ID_LEN 63               /* max. ID-Laenge; vgl. RFC 2812, 1.1 und 1.2.1 */
-#define CLIENT_NICK_LEN 9              /* max. Nick-Laenge; vgl. RFC 2812, 1.2.1 */
-#define CLIENT_PASS_LEN 9              /* max. Laenge des Passwortes */
-#define CLIENT_USER_LEN 8              /* max. Laenge des Benutzernamen ("Login") */
-#define CLIENT_NAME_LEN 32             /* max. Laenge des "langen Benutzernamen" */
-#define CLIENT_HOST_LEN 63             /* max. Laenge des Hostname */
-#define CLIENT_MODE_LEN 16             /* max. Laenge der Client-Modes */
-
-#define MAX_CHANNELS 32                        /* max. Anzahl Channels pro Nick */
-
-
 typedef enum
 {
        CLIENT_UNKNOWN,                 /* Verbindung mit (noch) unbekanntem Typ */
@@ -80,13 +74,15 @@ typedef struct _CLIENT
        CLIENT_TYPE type;               /* Typ des Client, vgl. CLIENT_TYPE */
        CONN_ID conn_id;                /* ID der Connection (wenn lokal) bzw. NONE (remote) */
        struct _CLIENT *introducer;     /* ID des Servers, der die Verbindung hat */
-       CHAR nick[CLIENT_ID_LEN + 1];   /* Nick (bzw. Server-ID, daher auch IDLEN!) */
-       CHAR pass[CLIENT_PASS_LEN + 1]; /* Passwort, welches der Client angegeben hat */
-       CHAR host[CLIENT_HOST_LEN + 1]; /* Hostname des Client */
-       CHAR user[CLIENT_USER_LEN + 1]; /* Benutzername ("Login") */
-       CHAR name[CLIENT_NAME_LEN + 1]; /* Langer Benutzername */
+       CHAR nick[CLIENT_ID_LEN];       /* Nick (bzw. Server-ID, daher auch IDLEN!) */
+       CHAR pass[CLIENT_PASS_LEN];     /* Passwort, welches der Client angegeben hat */
+       CHAR host[CLIENT_HOST_LEN];     /* Hostname des Client */
+       CHAR user[CLIENT_USER_LEN];     /* Benutzername ("Login") */
+       CHAR name[CLIENT_NAME_LEN];     /* Langer Benutzername */
+       CHAR info[CLIENT_INFO_LEN];     /* Infotext (Server) */
        CHANNEL *channels[MAX_CHANNELS];/* IDs der Channel, bzw. NULL */
        CHAR modes[CLIENT_MODE_LEN];    /* Client Modes */
+       BOOLEAN oper_by_me;             /* Operator-Status durch diesen Server? */
 } CLIENT;
 
 
@@ -100,7 +96,8 @@ GLOBAL CLIENT *Client_NewLocal( CONN_ID Idx, CHAR *Hostname );
 GLOBAL VOID Client_Destroy( CLIENT *Client );
 GLOBAL VOID Client_SetHostname( CLIENT *Client, CHAR *Hostname );
 GLOBAL CLIENT *Client_GetFromConn( CONN_ID Idx );
-GLOBAL CHAR *Client_Name( CLIENT *Client );
+GLOBAL CLIENT *Client_GetFromNick( CHAR *Nick );
+GLOBAL CHAR *Client_Nick( CLIENT *Client );
 GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick );
 GLOBAL CHAR *Client_GetID( CLIENT *Client );
 GLOBAL CLIENT *Client_Search( CHAR *ID );
index fec8903a1fc7408b52d0dd45478ff59ed9120efd..af283c0d6be497941a8799ebfacb4aedc04dd2cf 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: conf.c,v 1.5 2001/12/30 19:26:11 alex Exp $
+ * $Id: conf.c,v 1.6 2001/12/31 02:18:51 alex Exp $
  *
  * conf.h: Konfiguration des ngircd
  *
  * $Log: conf.c,v $
+ * Revision 1.6  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.5  2001/12/30 19:26:11  alex
  * - Unterstuetzung fuer die Konfigurationsdatei eingebaut.
  *
@@ -48,9 +53,6 @@
 #include "conf.h"
 
 
-#define MAX_LINE_LEN 246               /* max. Laenge einer Konfigurationszeile */
-
-
 LOCAL VOID Read_Config( VOID );
 LOCAL VOID Validate_Config( VOID );
 
@@ -63,6 +65,10 @@ GLOBAL VOID Conf_Init( VOID )
        strcpy( Conf_File, "/usr/local/etc/ngircd.conf" );
 
        strcpy( Conf_ServerName, "" );
+       strcpy( Conf_ServerInfo, PACKAGE" "VERSION );
+
+       strcpy( Conf_Oper, "" );
+       strcpy( Conf_OperPwd, "" );
 
        strcpy( Conf_MotdFile, "/usr/local/etc/ngircd.motd" );
 
@@ -87,7 +93,7 @@ LOCAL VOID Read_Config( VOID )
 {
        /* Konfigurationsdatei einlesen. */
 
-       CHAR str[MAX_LINE_LEN], *var, *arg, *ptr;
+       CHAR str[LINE_LEN], *var, *arg, *ptr;
        BOOLEAN ok;
        INT32 port;
        INT line;
@@ -105,15 +111,15 @@ LOCAL VOID Read_Config( VOID )
        line = 0;
        while( TRUE )
        {
-               if( ! fgets( str, MAX_LINE_LEN, fd )) break;
+               ok = FALSE;
+
+               if( ! fgets( str, LINE_LEN, fd )) break;
                ngt_TrimStr( str );
                line++;
 
                /* Kommentarzeilen und leere Zeilen ueberspringen */
                if( str[0] == ';' || str[0] == '#' || str[0] == '\0' ) continue;
 
-               ok = FALSE;
-
                ptr = strchr( str, '=' );
                if( ! ptr )
                {
@@ -129,7 +135,28 @@ LOCAL VOID Read_Config( VOID )
                {
                        /* Der Server-Name */
                        strncpy( Conf_ServerName, arg, CLIENT_ID_LEN );
-                       Conf_ServerName[CLIENT_ID_LEN] = '\0';
+                       Conf_ServerName[CLIENT_ID_LEN - 1] = '\0';
+                       ok = TRUE;
+               }
+               else if( strcasecmp( str, "ServerInfo" ) == 0 )
+               {
+                       /* Server-Info-Text */
+                       strncpy( Conf_ServerInfo, arg, CLIENT_INFO_LEN );
+                       Conf_ServerInfo[CLIENT_INFO_LEN - 1] = '\0';
+                       ok = TRUE;
+               }
+               else if( strcasecmp( str, "Operator" ) == 0 )
+               {
+                       /* Name des IRC Operator */
+                       strncpy( Conf_Oper, arg, CLIENT_PASS_LEN );
+                       Conf_Oper[CLIENT_PASS_LEN - 1] = '\0';
+                       ok = TRUE;
+               }
+               else if( strcasecmp( str, "OperatorPwd" ) == 0 )
+               {
+                       /* Passwort des IRC Operator */
+                       strncpy( Conf_OperPwd, arg, CLIENT_PASS_LEN );
+                       Conf_OperPwd[CLIENT_PASS_LEN - 1] = '\0';
                        ok = TRUE;
                }
                else if( strcasecmp( str, "ListenPorts" ) == 0 )
@@ -152,7 +179,7 @@ LOCAL VOID Read_Config( VOID )
                {
                        /* Datei mit der "message of the day" (MOTD) */
                        strncpy( Conf_MotdFile, arg, FNAME_LEN );
-                       Conf_MotdFile[FNAME_LEN] = '\0';
+                       Conf_MotdFile[FNAME_LEN - 1] = '\0';
                        ok = TRUE;
                }
                else if( strcasecmp( str, "PingTimeout" ) == 0 )
index ceea6a52b32e7e53c6cb58118100ea970e4dd00f..60f4770b785f7b4e9d10448360f0128b457d09e9 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: conf.h,v 1.5 2001/12/30 19:26:11 alex Exp $
+ * $Id: conf.h,v 1.6 2001/12/31 02:18:51 alex Exp $
  *
  * conf.h: Konfiguration des ngircd (Header)
  *
  * $Log: conf.h,v $
+ * Revision 1.6  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.5  2001/12/30 19:26:11  alex
  * - Unterstuetzung fuer die Konfigurationsdatei eingebaut.
  *
 #define __conf_h__
 
 
-#define FNAME_LEN 256
-#define LISTEN_PORTS 16
-
-
 GLOBAL CHAR Conf_File[FNAME_LEN];              /* Konfigurationsdatei */
 
 GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN];    /* Name ("Nick") des Servers */
+GLOBAL CHAR Conf_ServerInfo[CLIENT_INFO_LEN];  /* Servers-Info-Text */
 
 GLOBAL CHAR Conf_MotdFile[FNAME_LEN];          /* Datei mit MOTD-Text */
 
 GLOBAL INT Conf_ListenPorts[LISTEN_PORTS];     /* Ports, auf denen der Server Verbindungen */
 GLOBAL INT Conf_ListenPorts_Count;             /* entgegen nimmt sowie deren Anzahl */
 
+GLOBAL CHAR Conf_Oper[CLIENT_PASS_LEN];                /* Operator Name */
+GLOBAL CHAR Conf_OperPwd[CLIENT_PASS_LEN];     /* Operator Passwort */
+
 GLOBAL INT Conf_PingTimeout;                   /* Ping Timeout */
 GLOBAL INT Conf_PongTimeout;                   /* Pong Timeout */
 
index 1a16689830fa3e8ec93e7722a6b40bc58d88e71b..da9eb92c1029a51dbb5e755c0ecad7e0879de823 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: conn.c,v 1.22 2001/12/30 19:26:11 alex Exp $
+ * $Id: conn.c,v 1.23 2001/12/31 02:18:51 alex Exp $
  *
  * connect.h: Verwaltung aller Netz-Verbindungen ("connections")
  *
  * $Log: conn.c,v $
+ * Revision 1.23  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.22  2001/12/30 19:26:11  alex
  * - Unterstuetzung fuer die Konfigurationsdatei eingebaut.
  *
 #include "conn.h"
 
 
-#define MAX_CONNECTIONS 100            /* max. Anzahl von Verbindungen an diesem Server */
-
-#define MAX_CMDLEN 512                 /* max. Laenge eines Befehls, vgl. RFC 2812, 3.2 */
-
-#define READBUFFER_LEN 2 * MAX_CMDLEN  /* Laenge des Lesepuffers je Verbindung (Bytes) */
-#define WRITEBUFFER_LEN 4096           /* Laenge des Schreibpuffers je Verbindung (Bytes) */
-
-#define HOST_LEN 256                   /* max. Laenge eines Hostnamen */
-
-
 typedef struct _Res_Stat
 {
        INT pid;                        /* PID des Child-Prozess */
@@ -149,12 +144,13 @@ typedef struct _Connection
        struct sockaddr_in addr;        /* Adresse des Client */
        RES_STAT *res_stat;             /* "Resolver-Status", s.o. */
        CHAR host[HOST_LEN];            /* Hostname */
-       CHAR rbuf[READBUFFER_LEN + 1];  /* Lesepuffer */
+       CHAR rbuf[READBUFFER_LEN];      /* Lesepuffer */
        INT rdatalen;                   /* Laenge der Daten im Lesepuffer */
-       CHAR wbuf[WRITEBUFFER_LEN + 1]; /* Schreibpuffer */
+       CHAR wbuf[WRITEBUFFER_LEN];     /* Schreibpuffer */
        INT wdatalen;                   /* Laenge der Daten im Schreibpuffer */
        time_t lastdata;                /* Letzte Aktivitaet */
        time_t lastping;                /* Letzter PING */
+       time_t lastprivmsg;             /* Letzte PRIVMSG */
 } CONNECTION;
 
 
@@ -391,12 +387,12 @@ GLOBAL BOOLEAN Conn_WriteStr( CONN_ID Idx, CHAR *Format, ... )
         * automatisch angehaengt. Im Fehlerfall wird dir Verbindung
         * getrennt und FALSE geliefert. */
 
-       CHAR buffer[MAX_CMDLEN];
+       CHAR buffer[COMMAND_LEN];
        BOOLEAN ok;
        va_list ap;
 
        va_start( ap, Format );
-       if( vsnprintf( buffer, MAX_CMDLEN - 2, Format, ap ) == MAX_CMDLEN - 2 )
+       if( vsnprintf( buffer, COMMAND_LEN - 2, Format, ap ) == COMMAND_LEN - 2 )
        {
                Log( LOG_ALERT, "String too long to send (connection %d)!", Idx );
                Conn_Close( Idx, "Server error: String too long to send!" );
@@ -491,6 +487,24 @@ GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *Msg )
 } /* Conn_Close */
 
 
+GLOBAL VOID Conn_UpdateIdle( CONN_ID Idx )
+{
+       /* Idle-Timer zuruecksetzen */
+
+       assert( Idx >= 0 );
+       My_Connections[Idx].lastprivmsg = time( NULL );
+}
+
+
+GLOBAL INT32 Conn_GetIdle( CONN_ID Idx )
+{
+       /* Idle-Time einer Verbindung liefern (in Sekunden) */
+
+       assert( Idx >= 0 );
+       return time( NULL ) - My_Connections[Idx].lastprivmsg;
+} /* Conn_GetIdle */
+
+
 LOCAL BOOLEAN Try_Write( CONN_ID Idx )
 {
        /* Versuchen, Daten aus dem Schreib-Puffer in den
@@ -670,8 +684,8 @@ LOCAL VOID Read_Request( CONN_ID Idx )
        assert( Idx >= 0 );
        assert( My_Connections[Idx].sock >= 0 );
 
-       len = recv( My_Connections[Idx].sock, My_Connections[Idx].rbuf + My_Connections[Idx].rdatalen, READBUFFER_LEN - My_Connections[Idx].rdatalen, 0 );
-       My_Connections[Idx].rbuf[READBUFFER_LEN] = '\0';
+       len = recv( My_Connections[Idx].sock, My_Connections[Idx].rbuf + My_Connections[Idx].rdatalen, READBUFFER_LEN - My_Connections[Idx].rdatalen - 1, 0 );
+       My_Connections[Idx].rbuf[READBUFFER_LEN - 1] = '\0';
 
        if( len == 0 )
        {
@@ -694,7 +708,7 @@ LOCAL VOID Read_Request( CONN_ID Idx )
        assert( My_Connections[Idx].rdatalen <= READBUFFER_LEN );
        My_Connections[Idx].rbuf[My_Connections[Idx].rdatalen] = '\0';
 
-       if( My_Connections[Idx].rdatalen > MAX_CMDLEN )
+       if( My_Connections[Idx].rdatalen > COMMAND_LEN )
        {
                /* Eine Anfrage darf(!) nicht laenger als 512 Zeichen
                 * (incl. CR+LF!) werden; vgl. RFC 2812. Wenn soetwas
@@ -800,6 +814,7 @@ LOCAL VOID Init_Conn_Struct( INT Idx )
        My_Connections[Idx].wdatalen = 0;
        My_Connections[Idx].lastdata = time( NULL );
        My_Connections[Idx].lastping = 0;
+       My_Connections[Idx].lastprivmsg = time( NULL );
 } /* Init_Conn_Struct */
 
 
index 3db6f6cc6179108a7b9347c67d56f6c2675802f3..e76a862e4d83203a98453c80647a15c95dd1b5cc 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: conn.h,v 1.7 2001/12/26 14:45:37 alex Exp $
+ * $Id: conn.h,v 1.8 2001/12/31 02:18:51 alex Exp $
  *
  * conn.h: Verwaltung aller Netz-Verbindungen ("connections") (Header)
  *
  * $Log: conn.h,v $
+ * Revision 1.8  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.7  2001/12/26 14:45:37  alex
  * - "Code Cleanups".
  *
@@ -56,6 +61,9 @@ GLOBAL BOOLEAN Conn_WriteStr( CONN_ID Idx, CHAR *Format, ... );
 
 GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *Msg );
 
+GLOBAL VOID Conn_UpdateIdle( CONN_ID Idx );
+GLOBAL INT32 Conn_GetIdle( CONN_ID Idx );
+
 
 #endif
 
diff --git a/src/ngircd/defines.h b/src/ngircd/defines.h
new file mode 100644 (file)
index 0000000..c652506
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * ngIRCd -- The Next Generation IRC Daemon
+ * Copyright (c)2001 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: defines.h,v 1.1 2001/12/31 02:18:51 alex Exp $
+ *
+ * defines.h: (globale) Konstanten
+ *
+ * $Log: defines.h,v $
+ * Revision 1.1  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
+ */
+
+#ifndef __defines_h__
+#define __defines_h__
+
+
+#define NONE -1
+
+#define FNAME_LEN 256                  /* max. Laenge eines Dateinamen */
+
+#define LISTEN_PORTS 16                        /* max. Anzahl von Listen-Ports */
+
+#define LINE_LEN 256                   /* max. Laenge einer Konfigurationszeile */
+
+#define HOST_LEN 256                   /* max. Laenge eines Hostnamen */
+
+#define MAX_CONNECTIONS 100            /* max. Anzahl von Verbindungen an diesem Server */
+
+#define MAX_CHANNELS 32                        /* max. Anzahl Channels pro Nick */
+
+#define CLIENT_ID_LEN 64               /* max. ID-Laenge; vgl. RFC 2812, 1.1 und 1.2.1 */
+#define CLIENT_NICK_LEN 10             /* max. Nick-Laenge; vgl. RFC 2812, 1.2.1 */
+#define CLIENT_PASS_LEN 9              /* max. Laenge des Passwortes */
+#define CLIENT_USER_LEN 9              /* max. Laenge des Benutzernamen ("Login") */
+#define CLIENT_NAME_LEN 32             /* max. Laenge des "langen Benutzernamen" */
+#define CLIENT_HOST_LEN 64             /* max. Laenge des Hostname */
+#define CLIENT_MODE_LEN 8              /* max. Laenge der Client-Modes */
+#define CLIENT_INFO_LEN 64             /* max. Infotext-Laenge (Server) */
+
+#define COMMAND_LEN 513                        /* max. Laenge eines Befehls, vgl. RFC 2812, 3.2 */
+
+#define CHANNEL_NAME_LEN 51            /* max. Laenge eines Channel-Namens, vgl. RFC 2812, 1.3 */
+
+#define READBUFFER_LEN 2 * COMMAND_LEN /* Laenge des Lesepuffers je Verbindung (Bytes) */
+#define WRITEBUFFER_LEN 4096           /* Laenge des Schreibpuffers je Verbindung (Bytes) */
+
+#endif
+
+
+/* -eof- */
index 409b02481080d82d7d04b5d36c8f6e9254afb393..a25f28219112860c2b2816bf03553574dae1e6b3 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: global.h,v 1.3 2001/12/14 08:14:34 alex Exp $
+ * $Id: global.h,v 1.4 2001/12/31 02:18:51 alex Exp $
  *
  * global.h: Globaler Header, wir in jedes(!) Modul eingebunden.
  *
  * $Log: global.h,v $
+ * Revision 1.4  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.3  2001/12/14 08:14:34  alex
  * - NONE als -1 definiert. Macht den Source lesbarer ;-)
  *
 
 
 #include "config.h"
+#include "defines.h"
 
 #ifndef HAVE_socklen_t
 #define socklen_t int                  /* u.a. fuer Mac OS X */
 #endif
 
 
-#define NONE -1
-
-
 #endif
 
 
index c476d34fc25fa2da15830cbe35b914afe6e067b3..4c4db01023a1feae06a11861660927256f268af4 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: irc.c,v 1.15 2001/12/30 19:26:11 alex Exp $
+ * $Id: irc.c,v 1.16 2001/12/31 02:18:51 alex Exp $
  *
  * irc.c: IRC-Befehle
  *
  * $Log: irc.c,v $
+ * Revision 1.16  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.15  2001/12/30 19:26:11  alex
  * - Unterstuetzung fuer die Konfigurationsdatei eingebaut.
  *
 #include "ngircd.h"
 #include "client.h"
 #include "conf.h"
+#include "conn.h"
 #include "log.h"
 #include "messages.h"
 #include "parse.h"
+#include "tool.h"
 
 #include <exp.h>
 #include "irc.h"
@@ -161,9 +168,9 @@ GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req )
        if( Client->type == CLIENT_UNKNOWN )
        {
                Log( LOG_DEBUG, "Connection %d: got PASS command ...", Client->conn_id );
-               return IRC_WriteStrClient( Client, This_Server, ERR_UNKNOWNCOMMAND_MSG, Client_Name( Client ), Req->command );
+               return IRC_WriteStrClient( Client, This_Server, ERR_UNKNOWNCOMMAND_MSG, Client_Nick( Client ), Req->command );
        }
-       else return IRC_WriteStrClient( Client, This_Server, ERR_ALREADYREGISTRED_MSG, Client_Name( Client ));
+       else return IRC_WriteStrClient( Client, This_Server, ERR_ALREADYREGISTRED_MSG, Client_Nick( Client ));
 } /* IRC_PASS */
 
 
@@ -180,10 +187,10 @@ GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
 #endif
        {
                /* Falsche Anzahl Parameter? */
-               if( Req->argc != 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Name( Client ), Req->command );
+               if( Req->argc != 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command );
 
                /* Ist der Client "restricted"? */
-               if( strchr( Client->modes, 'r' )) return IRC_WriteStrClient( Client, This_Server, ERR_RESTRICTED_MSG, Client_Name( Client ));
+               if( strchr( Client->modes, 'r' )) return IRC_WriteStrClient( Client, This_Server, ERR_RESTRICTED_MSG, Client_Nick( Client ));
 
                /* Wenn der Client zu seinem eigenen Nick wechseln will, so machen
                 * wir nichts. So macht es das Original und mind. Snak hat probleme,
@@ -214,7 +221,7 @@ GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
                }
                return CONNECTED;
        }
-       else return IRC_WriteStrClient( Client, This_Server, ERR_ALREADYREGISTRED_MSG, Client_Name( Client ));
+       else return IRC_WriteStrClient( Client, This_Server, ERR_ALREADYREGISTRED_MSG, Client_Nick( Client ));
 } /* IRC_NICK */
 
 
@@ -230,12 +237,12 @@ GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req )
 #endif
        {
                /* Falsche Anzahl Parameter? */
-               if( Req->argc != 4 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Name( Client ), Req->command );
+               if( Req->argc != 4 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command );
 
                strncpy( Client->user, Req->argv[0], CLIENT_USER_LEN );
-               Client->user[CLIENT_USER_LEN] = '\0';
+               Client->user[CLIENT_USER_LEN - 1] = '\0';
                strncpy( Client->name, Req->argv[3], CLIENT_NAME_LEN );
-               Client->name[CLIENT_NAME_LEN] = '\0';
+               Client->name[CLIENT_NAME_LEN - 1] = '\0';
 
                Log( LOG_DEBUG, "Connection %d: got USER command ...", Client->conn_id );
                if( Client->type == CLIENT_GOTNICK ) return Hello_User( Client );
@@ -244,9 +251,9 @@ GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req )
        }
        else if( Client->type == CLIENT_USER || Client->type == CLIENT_SERVER || Client->type == CLIENT_SERVICE )
        {
-               return IRC_WriteStrClient( Client, This_Server, ERR_ALREADYREGISTRED_MSG, Client_Name( Client ));
+               return IRC_WriteStrClient( Client, This_Server, ERR_ALREADYREGISTRED_MSG, Client_Nick( Client ));
        }
-       else return IRC_WriteStrClient( Client, This_Server, ERR_NOTREGISTERED_MSG, Client_Name( Client ));
+       else return IRC_WriteStrClient( Client, This_Server, ERR_NOTREGISTERED_MSG, Client_Nick( Client ));
 } /* IRC_USER */
 
 
@@ -258,12 +265,12 @@ GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req )
        if( Client->type != CLIENT_SERVER && Client->type != CLIENT_SERVICE )
        {
                /* Falsche Anzahl Parameter? */
-               if( Req->argc > 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Name( Client ), Req->command );
+               if( Req->argc > 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command );
 
                Conn_Close( Client->conn_id, "Client wants to quit." );
                return DISCONNECTED;
        }
-       else return IRC_WriteStrClient( Client, This_Server, ERR_NOTREGISTERED_MSG, Client_Name( Client ));
+       else return IRC_WriteStrClient( Client, This_Server, ERR_NOTREGISTERED_MSG, Client_Nick( Client ));
 } /* IRC_QUIT */
 
 
@@ -277,13 +284,13 @@ GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req )
        if( ! Check_Valid_User( Client )) return CONNECTED;
 
        /* Falsche Anzahl Parameter? */
-       if( Req->argc < 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NOORIGIN_MSG, Client_Name( Client ));
-       if( Req->argc > 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Name( Client ), Req->command );
+       if( Req->argc < 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NOORIGIN_MSG, Client_Nick( Client ));
+       if( Req->argc > 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command );
 
        to = Client_Search( Req->argv[0] );
        
-       if( to ) return IRC_WriteStrClient( Client, This_Server, "PONG :%s", Client_Name( Client ));
-       else return IRC_WriteStrClient( Client, This_Server, ERR_NOSUCHNICK_MSG, Client_Name( Client ), Req->argv[0] );
+       if( to ) return IRC_WriteStrClient( Client, This_Server, "PONG :%s", Client_Nick( Client ));
+       else return IRC_WriteStrClient( Client, This_Server, ERR_NOSUCHNICK_MSG, Client_Nick( Client ), Req->argv[0] );
 } /* IRC_PING */
 
 
@@ -295,8 +302,8 @@ GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
        if( ! Check_Valid_User( Client )) return CONNECTED;
 
        /* Falsche Anzahl Parameter? */
-       if( Req->argc < 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NOORIGIN_MSG, Client_Name( Client ));
-       if( Req->argc > 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Name( Client ), Req->command );
+       if( Req->argc < 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NOORIGIN_MSG, Client_Nick( Client ));
+       if( Req->argc > 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command );
 
        /* Der Connection-Timestamp wurde schon beim Lesen aus dem Socket
         * aktualisiert, daher muss das hier nicht mehr gemacht werden. */
@@ -314,7 +321,7 @@ GLOBAL BOOLEAN IRC_MOTD( CLIENT *Client, REQUEST *Req )
        if( ! Check_Valid_User( Client )) return CONNECTED;
 
        /* Falsche Anzahl Parameter? */
-       if( Req->argc != 0 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Name( Client ), Req->command );
+       if( Req->argc != 0 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command );
 
        return Show_MOTD( Client );
 } /* IRC_MOTD */
@@ -330,18 +337,19 @@ GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
        if( ! Check_Valid_User( Client )) return CONNECTED;
 
        /* Falsche Anzahl Parameter? */
-       if( Req->argc == 0 ) return IRC_WriteStrClient( Client, This_Server, ERR_NORECIPIENT_MSG, Client_Name( Client ), Req->command );
-       if( Req->argc == 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NOTEXTTOSEND_MSG, Client_Name( Client ));
-       if( Req->argc > 2 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Name( Client ), Req->command );
+       if( Req->argc == 0 ) return IRC_WriteStrClient( Client, This_Server, ERR_NORECIPIENT_MSG, Client_Nick( Client ), Req->command );
+       if( Req->argc == 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NOTEXTTOSEND_MSG, Client_Nick( Client ));
+       if( Req->argc > 2 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command );
 
        to = Client_Search( Req->argv[0] );
        if( to )
        {
                /* Okay, Ziel ist ein User */
+               if( Client->conn_id >= 0 ) Conn_UpdateIdle( Client->conn_id );
                return IRC_WriteStrClient( to, Client, "PRIVMSG %s :%s", to->nick, Req->argv[1] );
        }
 
-       return IRC_WriteStrClient( Client, This_Server, ERR_NOSUCHNICK_MSG, Client_Name( Client ), Req->argv[0] );
+       return IRC_WriteStrClient( Client, This_Server, ERR_NOSUCHNICK_MSG, Client_Nick( Client ), Req->argv[0] );
 } /* IRC_PRIVMSG */
 
 
@@ -379,20 +387,20 @@ GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
        if( ! Check_Valid_User( Client )) return CONNECTED;
 
        /* Falsche Anzahl Parameter? */
-       if(( Req->argc > 2 ) || ( Req->argc < 1 )) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Name( Client ), Req->command );
+       if(( Req->argc > 2 ) || ( Req->argc < 1 )) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command );
 
        /* MODE ist nur fuer sich selber zulaessig */
-       if( Client_Search( Req->argv[0] ) != Client ) return IRC_WriteStrClient( Client, This_Server, ERR_USERSDONTMATCH_MSG, Client_Name( Client ));
+       if( Client_Search( Req->argv[0] ) != Client ) return IRC_WriteStrClient( Client, This_Server, ERR_USERSDONTMATCH_MSG, Client_Nick( Client ));
 
        /* Werden die Modes erfragt? */
-       if( Req->argc == 1 ) return IRC_WriteStrClient( Client, This_Server, RPL_UMODEIS_MSG, Client_Name( Client ), Client->modes );
+       if( Req->argc == 1 ) return IRC_WriteStrClient( Client, This_Server, RPL_UMODEIS_MSG, Client_Nick( Client ), Client->modes );
 
        ptr = Req->argv[1];
 
        /* Sollen Modes gesetzt oder geloescht werden? */
        if( *ptr == '+' ) set = TRUE;
        else if( *ptr == '-' ) set = FALSE;
-       else return IRC_WriteStrClient( Client, This_Server, ERR_UMODEUNKNOWNFLAG_MSG, Client_Name( Client ));
+       else return IRC_WriteStrClient( Client, This_Server, ERR_UMODEUNKNOWNFLAG_MSG, Client_Nick( Client ));
 
        /* Reply-String mit Aenderungen vorbereiten */
        if( set ) strcpy( new_modes, "+" );
@@ -413,10 +421,19 @@ GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
                        case 'r':
                                /* restricted (kann nur gesetzt werden) */
                                if( set ) x[0] = 'r';
-                               else ok = IRC_WriteStrClient( Client, This_Server, ERR_RESTRICTED_MSG, Client_Name( Client ));
+                               else ok = IRC_WriteStrClient( Client, This_Server, ERR_RESTRICTED_MSG, Client_Nick( Client ));
+                               break;
+                       case 'o':
+                               /* operator (kann nur geloescht werden) */
+                               if( ! set )
+                               {
+                                       Client->oper_by_me = FALSE;
+                                       x[0] = 'o';
+                               }
+                               else ok = IRC_WriteStrClient( Client, This_Server, ERR_UMODEUNKNOWNFLAG_MSG, Client_Nick( Client ));
                                break;
                        default:
-                               ok = IRC_WriteStrClient( Client, This_Server, ERR_UMODEUNKNOWNFLAG_MSG, Client_Name( Client ));
+                               ok = IRC_WriteStrClient( Client, This_Server, ERR_UMODEUNKNOWNFLAG_MSG, Client_Nick( Client ));
                                x[0] = '\0';
                }
                if( ! ok ) break;
@@ -462,13 +479,197 @@ GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req )
 } /* IRC_MODE */
 
 
+GLOBAL BOOLEAN IRC_OPER( CLIENT *Client, REQUEST *Req )
+{
+       assert( Client != NULL );
+       assert( Req != NULL );
+
+       if( ! Check_Valid_User( Client )) return CONNECTED;
+       
+       /* Falsche Anzahl Parameter? */
+       if( Req->argc != 2 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command );
+       
+       /* Ist ueberhaupt ein Operator gesetzt? */
+       if(( ! Conf_Oper[0] ) || ( ! Conf_OperPwd[0] )) return IRC_WriteStrClient( Client, This_Server, ERR_PASSWDMISMATCH_MSG, Client_Nick( Client ));
+
+       /* Stimmt der Name und das Passwort? */
+       if(( strcmp( Conf_Oper, Req->argv[0] ) != 0 ) || ( strcmp( Conf_OperPwd, Req->argv[1] ) != 0 )) return IRC_WriteStrClient( Client, This_Server, ERR_PASSWDMISMATCH_MSG, Client_Nick( Client ));
+       
+       if( ! strchr( Client->modes, 'o' ))
+       {
+               /* noch kein o-Mode gesetzt */
+               strcat( Client->modes, "o" );
+               if( ! IRC_WriteStrRelated( Client, "MODE %s :+o", Client->nick )) return DISCONNECTED;
+       }
+
+       if( ! Client->oper_by_me ) Log( LOG_NOTICE, "User \"%s!%s@%s\" is now an IRC Operator.", Client->nick, Client->user, Client->host );
+
+       Client->oper_by_me = TRUE;
+       return IRC_WriteStrClient( Client, This_Server, RPL_YOUREOPER_MSG, Client_Nick( Client ));
+} /* IRC_OPER */
+
+
+GLOBAL BOOLEAN IRC_DIE( CLIENT *Client, REQUEST *Req )
+{
+       assert( Client != NULL );
+       assert( Req != NULL );
+
+       if( ! Check_Valid_User( Client )) return CONNECTED;
+
+       /* Falsche Anzahl Parameter? */
+       if( Req->argc != 0 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command );
+
+       if(( ! strchr( Client->modes, 'o' )) || ( ! Client->oper_by_me )) return IRC_WriteStrClient( Client, This_Server, ERR_NOPRIVILEGES_MSG, Client_Nick( Client ));
+
+       Log( LOG_NOTICE, "Got DIE command from \"%s!%s@%s\", going down!", Client->nick, Client->user, Client->host );
+       NGIRCd_Quit = TRUE;
+       return CONNECTED;
+} /* IRC_DIE */
+
+
+GLOBAL BOOLEAN IRC_RESTART( CLIENT *Client, REQUEST *Req )
+{
+       assert( Client != NULL );
+       assert( Req != NULL );
+
+       if( ! Check_Valid_User( Client )) return CONNECTED;
+
+       /* Falsche Anzahl Parameter? */
+       if( Req->argc != 0 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command );
+
+       if(( ! strchr( Client->modes, 'o' )) || ( ! Client->oper_by_me )) return IRC_WriteStrClient( Client, This_Server, ERR_NOPRIVILEGES_MSG, Client_Nick( Client ));
+
+       Log( LOG_NOTICE, "Got RESTART command from \"%s!%s@%s\", going down!", Client->nick, Client->user, Client->host );
+       NGIRCd_Restart = TRUE;
+       return CONNECTED;
+} /* IRC_RESTART */
+
+
+GLOBAL BOOLEAN IRC_ISON( CLIENT *Client, REQUEST *Req )
+{
+       CHAR rpl[COMMAND_LEN];
+       CLIENT *c;
+       CHAR *ptr;
+       INT i;
+       
+       assert( Client != NULL );
+       assert( Req != NULL );
+
+       if( ! Check_Valid_User( Client )) return CONNECTED;
+
+       /* Falsche Anzahl Parameter? */
+       if(( Req->argc < 1 )) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command );
+
+       strcpy( rpl, RPL_ISON_MSG );
+       for( i = 0; i < Req->argc; i++ )
+       {
+               ptr = strtok( Req->argv[i], " " );
+               while( ptr )
+               {
+                       ngt_TrimStr( ptr );
+                       c = Client_GetFromNick( ptr );
+                       if( c && ( c->type == CLIENT_USER ))
+                       {
+                               /* Dieser Nick ist "online" */
+                               strcat( rpl, ptr );
+                               strcat( rpl, " " );
+                       }
+                       ptr = strtok( NULL, " " );
+               }
+       }
+       if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
+
+       return IRC_WriteStrClient( Client, This_Server, rpl, Client->nick );
+} /* IRC_ISON */
+
+
+GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req )
+{
+       CLIENT *c;
+       
+       assert( Client != NULL );
+       assert( Req != NULL );
+
+       if( ! Check_Valid_User( Client )) return CONNECTED;
+
+       /* Falsche Anzahl Parameter? */
+       if(( Req->argc < 1 ) || ( Req->argc > 2 )) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command );
+
+       /* Client suchen */
+       c = Client_GetFromNick( Req->argv[0] );
+       if(( ! c ) || ( c->type != CLIENT_USER )) return IRC_WriteStrClient( Client, This_Server, ERR_NOSUCHNICK_MSG, Client_Nick( Client ), Req->argv[0] );
+       
+       /* Nick, User und Name */
+       if( ! IRC_WriteStrClient( Client, This_Server, RPL_WHOISUSER_MSG, Client_Nick( Client ), c->nick, c->user, c->host, c->name )) return DISCONNECTED;
+
+       /* Server */
+       if( ! IRC_WriteStrClient( Client, This_Server, RPL_WHOISSERVER_MSG, Client_Nick( Client ), c->nick, c->introducer->nick, c->introducer->info )) return DISCONNECTED;
+
+       /* IRC-Operator? */
+       if( strchr( c->modes, 'o' ))
+       {
+               if( ! IRC_WriteStrClient( Client, This_Server, RPL_WHOISOPERATOR_MSG, Client_Nick( Client ), c->nick )) return DISCONNECTED;
+       }
+
+       /* Idle (nur lokale Clients) */
+       if( c->conn_id >= 0 )
+       {
+               if( ! IRC_WriteStrClient( Client, This_Server, RPL_WHOISIDLE_MSG, Client_Nick( Client ), c->nick, Conn_GetIdle( c->conn_id ))) return DISCONNECTED;
+       }
+
+       /* End of Whois */
+       return IRC_WriteStrClient( Client, This_Server, RPL_ENDOFWHOIS_MSG, Client_Nick( Client ), c->nick );
+} /* IRC_WHOIS */
+
+
+GLOBAL BOOLEAN IRC_USERHOST( CLIENT *Client, REQUEST *Req )
+{
+       CHAR rpl[COMMAND_LEN];
+       CLIENT *c;
+       INT max, i;
+
+       assert( Client != NULL );
+       assert( Req != NULL );
+
+       if( ! Check_Valid_User( Client )) return CONNECTED;
+
+       /* Falsche Anzahl Parameter? */
+       if(( Req->argc < 1 )) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command );
+
+       if( Req->argc > 5 ) max = 5;
+       else max = Req->argc;
+       
+       strcpy( rpl, RPL_USERHOST_MSG );
+       for( i = 0; i < max; i++ )
+       {
+               c = Client_GetFromNick( Req->argv[i] );
+               if( c && ( c->type == CLIENT_USER ))
+               {
+                       /* Dieser Nick ist "online" */
+                       strcat( rpl, c->nick );
+                       if( strchr( c->modes, 'o' )) strcat( rpl, "*" );
+                       strcat( rpl, "=" );
+                       if( strchr( c->modes, 'a' )) strcat( rpl, "-" );
+                       else strcat( rpl, "+" );
+                       strcat( rpl, c->user );
+                       strcat( rpl, "@" );
+                       strcat( rpl, c->host );
+                       strcat( rpl, " " );
+               }
+       }
+       if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
+
+       return IRC_WriteStrClient( Client, This_Server, rpl, Client->nick );
+} /* IRC_USERHOST */   
+
+
 LOCAL BOOLEAN Check_Valid_User( CLIENT *Client )
 {
        assert( Client != NULL );
 
        if( Client->type != CLIENT_USER )
        {
-               IRC_WriteStrClient( Client, This_Server, ERR_NOTREGISTERED_MSG, Client_Name( Client ));
+               IRC_WriteStrClient( Client, This_Server, ERR_NOTREGISTERED_MSG, Client_Nick( Client ));
                return FALSE;
        }
        else return TRUE;
index ac1042ef62e2a71d85090134c0bc664087b8836a..766095700ddfa2efd3888686f525329ba9d394ab 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: irc.h,v 1.9 2001/12/29 03:09:31 alex Exp $
+ * $Id: irc.h,v 1.10 2001/12/31 02:18:51 alex Exp $
  *
  * irc.h: IRC-Befehle (Header)
  *
  * $Log: irc.h,v $
+ * Revision 1.10  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.9  2001/12/29 03:09:31  alex
  * - Neue Funktion IRC_MODE() implementiert.
  *
@@ -72,6 +77,14 @@ GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req );
 
 GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req );
 
+GLOBAL BOOLEAN IRC_ISON( CLIENT *Client, REQUEST *Req );
+GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req );
+GLOBAL BOOLEAN IRC_USERHOST( CLIENT *Client, REQUEST *Req );
+
+GLOBAL BOOLEAN IRC_OPER( CLIENT *Client, REQUEST *Req );
+GLOBAL BOOLEAN IRC_DIE( CLIENT *Client, REQUEST *Req );
+GLOBAL BOOLEAN IRC_RESTART( CLIENT *Client, REQUEST *Req );
+
 
 #endif
 
index c28023db1478c9833b96aafac8bd3c9f9f67fc72..7f58a1b98922ef30c37b696e025cab550fd99e87 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: log.c,v 1.12 2001/12/29 20:16:31 alex Exp $
+ * $Id: log.c,v 1.13 2001/12/31 02:18:51 alex Exp $
  *
  * log.c: Logging-Funktionen
  *
  * $Log: log.c,v $
+ * Revision 1.13  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.12  2001/12/29 20:16:31  alex
  * - Log-Funktionen fuer Resolver-Sub-Prozess implementiert.
  *
index 6c63cbd9cb9421de1882bdafee1998a6fbeb63a9..8a1ce7a3861a6943b6cb86086877381ea1ef95e3 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: log.h,v 1.5 2001/12/29 20:16:31 alex Exp $
+ * $Id: log.h,v 1.6 2001/12/31 02:18:51 alex Exp $
  *
  * log.h: Logging-Funktionen (Header)
  *
  * $Log: log.h,v $
+ * Revision 1.6  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.5  2001/12/29 20:16:31  alex
  * - Log-Funktionen fuer Resolver-Sub-Prozess implementiert.
  *
index 1a173ad0ba24580b056f3a78754b687c6d34e622..0da26acd5041e12d78af6e7003450072e46e39fb 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: messages.h,v 1.11 2001/12/30 19:25:39 alex Exp $
+ * $Id: messages.h,v 1.12 2001/12/31 02:18:51 alex Exp $
  *
  * irc.h: IRC-Befehle (Header)
  *
  * $Log: messages.h,v $
+ * Revision 1.12  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.11  2001/12/30 19:25:39  alex
  * - RPL_MYINFO_MSG um unterstuetzte User-Modes ergaengz.
  *
 #define RPL_UMODEIS                    "211"
 #define RPL_UMODEIS_MSG                        RPL_UMODEIS" %s +%s"
 
+#define RPL_USERHOST                   "302"
+#define RPL_USERHOST_MSG               RPL_USERHOST" %s :"
+
+#define RPL_ISON                       "303"
+#define RPL_ISON_MSG                   RPL_ISON" %s :"
+
+#define RPL_WHOISUSER                  "311"
+#define RPL_WHOISUSER_MSG              RPL_WHOISUSER" %s %s %s %s * :%s"
+
+#define RPL_WHOISSERVER                        "312"
+#define RPL_WHOISSERVER_MSG            RPL_WHOISSERVER" %s %s %s :%s"
+
+#define RPL_WHOISOPERATOR              "313"
+#define RPL_WHOISOPERATOR_MSG          RPL_WHOISOPERATOR" %s %s :is an IRC operator"
+
+#define RPL_WHOISIDLE                  "317"
+#define RPL_WHOISIDLE_MSG              RPL_WHOISIDLE" %s %s %ld :seconds idle"
+
+#define RPL_ENDOFWHOIS                 "318"
+#define RPL_ENDOFWHOIS_MSG             RPL_ENDOFWHOIS" %s %s :End of WHOIS list"
+
+#define RPL_WHOISCHANNELS              "319"
+#define RPL_WHOISCHANNELS_MSG          RPL_WHOISCHANNELS" %s :"
+
+#define RPL_YOUREOPER                  "381"
+#define RPL_YOUREOPER_MSG              RPL_YOUREOPER" %s :You are now an IRC Operator"
+
 
 #define ERR_NOSUCHNICK                 "401"
 #define ERR_NOSUCHNICK_MSG             ERR_NOSUCHNICK" %s %s :No such nick or channel name"
 #define ERR_ALREADYREGISTRED           "462"
 #define ERR_ALREADYREGISTRED_MSG       ERR_ALREADYREGISTRED" %s :Connection already registered"
 
+#define ERR_PASSWDMISMATCH             "464"
+#define ERR_PASSWDMISMATCH_MSG         ERR_PASSWDMISMATCH" %s: Invalid password"
+
 #define ERR_NOTREGISTERED              "451"
 #define ERR_NOTREGISTERED_MSG          ERR_NOTREGISTERED" %s :Connection not registered"
 
+#define ERR_NOPRIVILEGES               "481"
+#define ERR_NOPRIVILEGES_MSG           ERR_NOPRIVILEGES" %s :Permission denied"
+
 #define ERR_RESTRICTED                 "484"
 #define ERR_RESTRICTED_MSG             ERR_RESTRICTED" %s :Your connection is restricted"
 
+#define ERR_NOOPERHOST                 "491"
+#define ERR_NOOPERHOST_MSG             ERR_NOOPERHOST" %s :Not configured for your host"
+
 #define ERR_UMODEUNKNOWNFLAG           "501"
 #define ERR_UMODEUNKNOWNFLAG_MSG       ERR_UMODEUNKNOWNFLAG" %s :Unknown mode flag"
 
index 4e18f6ac3fa9c94f3dbcef966802030b140331fc..eb40e7e3a773192eb6fd257857de2bbd45ff0b1b 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: ngircd.c,v 1.14 2001/12/30 19:26:12 alex Exp $
+ * $Id: ngircd.c,v 1.15 2001/12/31 02:18:51 alex Exp $
  *
  * ngircd.c: Hier beginnt alles ;-)
  *
  * $Log: ngircd.c,v $
+ * Revision 1.15  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.14  2001/12/30 19:26:12  alex
  * - Unterstuetzung fuer die Konfigurationsdatei eingebaut.
  *
@@ -99,41 +104,45 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] )
        /* Datentypen der portab-Library ueberpruefen */
        portab_check_types( );
 
-       /* Globale Variablen initialisieren */
-       NGIRCd_Start = time( NULL );
-       strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start ));
-       NGIRCd_Quit = FALSE;
-
-       /* Module initialisieren */
-       Log_Init( );
-       Conf_Init( );
-       Parse_Init( );
-       IRC_Init( );
-       Channel_Init( );
-       Client_Init( );
-       Conn_Init( );
-
-       /* Signal-Handler initialisieren */
-       Initialize_Signal_Handler( );
-
-       /* Listen-Ports initialisieren */
-       Initialize_Listen_Ports( );
-       
-       /* Hauptschleife */
        while( ! NGIRCd_Quit )
        {
-               Conn_Handler( 5 );
-        }
-        
-       /* Alles abmelden */
-       Conn_Exit( );
-       Client_Exit( );
-       Channel_Exit( );
-       IRC_Exit( );
-       Parse_Exit( );
-       Conf_Exit( );
-       Log_Exit( );
-       
+               /* Globale Variablen initialisieren */
+               NGIRCd_Start = time( NULL );
+               strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start ));
+               NGIRCd_Restart = FALSE;
+               NGIRCd_Quit = FALSE;
+
+               /* Module initialisieren */
+               Log_Init( );
+               Conf_Init( );
+               Parse_Init( );
+               IRC_Init( );
+               Channel_Init( );
+               Client_Init( );
+               Conn_Init( );
+
+               /* Signal-Handler initialisieren */
+               Initialize_Signal_Handler( );
+
+               /* Listen-Ports initialisieren */
+               Initialize_Listen_Ports( );
+
+               /* Hauptschleife */
+               while( TRUE )
+               {
+                       if( NGIRCd_Quit || NGIRCd_Restart ) break;
+                       Conn_Handler( 5 );
+               }
+
+               /* Alles abmelden */
+               Conn_Exit( );
+               Client_Exit( );
+               Channel_Exit( );
+               IRC_Exit( );
+               Parse_Exit( );
+               Conf_Exit( );
+               Log_Exit( );
+       }
        return 0;
 } /* main */
 
index e23279b6daf17c58337bce336cf6b558304f4414..38162c93fa3440992664141f2c94edea32e6d071 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: ngircd.h,v 1.3 2001/12/30 11:42:00 alex Exp $
+ * $Id: ngircd.h,v 1.4 2001/12/31 02:18:51 alex Exp $
  *
  * ngircd.h: Prototypen aus dem "Haupt-Modul"
  *
  * $Log: ngircd.h,v $
+ * Revision 1.4  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.3  2001/12/30 11:42:00  alex
  * - der Server meldet nun eine ordentliche "Start-Zeit".
  *
@@ -32,7 +37,8 @@
 GLOBAL time_t NGIRCd_Start;            /* Startzeitpunkt des Daemon */
 GLOBAL CHAR NGIRCd_StartStr[64];
 
-GLOBAL BOOLEAN NGIRCd_Quit;            /* TRUE: Hauptschleife beenden */
+GLOBAL BOOLEAN NGIRCd_Quit;            /* TRUE: ngIRCd beenden */
+GLOBAL BOOLEAN NGIRCd_Restart;         /* TRUE: neu starten */
 
 
 #endif
index a2adf07b4ec7054844ba50f78f5af6dc47b85024..cbe01f6c69ed9a8ecff828f7c1f81fa85bd0b130 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: parse.c,v 1.8 2001/12/29 03:08:19 alex Exp $
+ * $Id: parse.c,v 1.9 2001/12/31 02:18:51 alex Exp $
  *
  * parse.c: Parsen der Client-Anfragen
  *
  * $Log: parse.c,v $
+ * Revision 1.9  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.8  2001/12/29 03:08:19  alex
  * - Fuehrende und folgende Leerzeichen etc. in Requests werden geloescht.
  * - Logmeldungen (mal wieder) ein wenig angepasst.
@@ -239,9 +244,15 @@ LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req )
        else if( strcasecmp( Req->command, "PRIVMSG" ) == 0 ) return IRC_PRIVMSG( client, Req );
        else if( strcasecmp( Req->command, "NOTICE" ) == 0 ) return IRC_NOTICE( client, Req );
        else if( strcasecmp( Req->command, "MODE" ) == 0 ) return IRC_MODE( client, Req );
+       else if( strcasecmp( Req->command, "ISON" ) == 0 ) return IRC_ISON( client, Req );
+       else if( strcasecmp( Req->command, "WHOIS" ) == 0 ) return IRC_WHOIS( client, Req );
+       else if( strcasecmp( Req->command, "USERHOST" ) == 0 ) return IRC_USERHOST( client, Req );
+       else if( strcasecmp( Req->command, "OPER" ) == 0 ) return IRC_OPER( client, Req );
+       else if( strcasecmp( Req->command, "DIE" ) == 0 ) return IRC_DIE( client, Req );
+       else if( strcasecmp( Req->command, "RESTART" ) == 0 ) return IRC_RESTART( client, Req );
        
        /* Unbekannter Befehl */
-       IRC_WriteStrClient( client, This_Server, ERR_UNKNOWNCOMMAND_MSG, Client_Name( client ), Req->command );
+       IRC_WriteStrClient( client, This_Server, ERR_UNKNOWNCOMMAND_MSG, Client_Nick( client ), Req->command );
        Log( LOG_DEBUG, "User \"%s!%s@%s\": Unknown command \"%s\", %d %s,%s prefix.", client->nick, client->user, client->host, Req->command, Req->argc, Req->argc == 1 ? "parameter" : "parameters", Req->prefix ? "" : " no" );
 
        return TRUE;
index 919eb65e236030678afed582c63a2229f4542906..d11a9bae279b046bd813ea03495b3dbc19d9448a 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: parse.h,v 1.2 2001/12/26 14:45:37 alex Exp $
+ * $Id: parse.h,v 1.3 2001/12/31 02:18:51 alex Exp $
  *
  * parse.h: Parsen der Client-Anfragen (Header)
  *
  * $Log: parse.h,v $
+ * Revision 1.3  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.2  2001/12/26 14:45:37  alex
  * - "Code Cleanups".
  *
index f7daea1df2c5a16fffe11ba861ac4c7337b7aefc..29c254abb23e784328cba8770ba1afc210728096 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: tool.c,v 1.3 2001/12/29 03:05:34 alex Exp $
+ * $Id: tool.c,v 1.4 2001/12/31 02:18:51 alex Exp $
  *
  * tool.c: Hilfsfunktionen, ggf. Platformabhaengig
  *
  * $Log: tool.c,v $
+ * Revision 1.4  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.3  2001/12/29 03:05:34  alex
  * - Funktionsnamen etwas konsequenter umbenannt :-)
  *
index 63069fe3af8fe1437a8cc30689e3477083d922c0..9e101ab20ad779ddfd60113fa7b09d7f4e209aad 100644 (file)
@@ -7,13 +7,18 @@
  * 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: tool.h,v 1.3 2001/12/26 14:45:37 alex Exp $
+ * $Id: tool.h,v 1.4 2001/12/31 02:18:51 alex Exp $
  *
  * log.h: Hilfsfunktionen (Header)
  *
  * $Log: tool.h,v $
+ * Revision 1.4  2001/12/31 02:18:51  alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
  * Revision 1.3  2001/12/26 14:45:37  alex
  * - "Code Cleanups".
  *