mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-10-25 19:17:38 +00:00 
			
		
		
		
	Compare commits
	
		
			59 Commits
		
	
	
		
			rel-0-10-3
			...
			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 | ||
|   | 35d1c2fc06 | ||
|   | c557a2920e | ||
|   | 845b295e7d | ||
|   | 59b5b0e025 | ||
|   | bdd23ece63 | ||
|   | a119700c62 | ||
|   | b0e7f564c7 | ||
|   | d69410f28d | ||
|   | d5fa1f76bb | ||
|   | 3dec467ebc | ||
|   | a5fe6d6783 | ||
|   | 37b579f3cd | ||
|   | 268d02b90d | ||
|   | 037418e8c0 | ||
|   | 45c3886800 | ||
|   | 38f387146f | ||
|   | fcbd44caa9 | ||
|   | f027308798 | ||
|   | 462540e079 | ||
|   | 7721c79747 | ||
|   | 678a4dfba0 | ||
|   | 8c956d25b7 | ||
|   | 9f9f676716 | ||
|   | cf20b16d2a | ||
|   | 97d4e580ae | ||
|   | b072b7712c | ||
|   | fd6a7f67ce | ||
|   | 6c04ba84cd | ||
|   | ef6b7c7c63 | ||
|   | 2592e73da0 | 
							
								
								
									
										70
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								ChangeLog
									
									
									
									
									
								
							| @@ -10,8 +10,74 @@ | ||||
|                         -- ChangeLog / Aenderungen -- | ||||
|  | ||||
|  | ||||
| ngIRCd CVS-HEAD | ||||
| ngIRCd 0.5.x-CVS | ||||
|  | ||||
|   - Prefix-Fehler werden besser protokolliert (mit verursachendem Befehl). | ||||
|   - SQUIT wird nicht mehr doppelt an andere Server weitergeleitet. | ||||
|   - Der Server versucht nun vor dem Schliessen einer Verbindung Daten, die | ||||
|     noch im Schreibpuffer stehen, zu senden. | ||||
|  | ||||
| ngIRCd 0.5.4, 24.11.2002 | ||||
|  | ||||
|   - Fehler-Handling von connect() gefixed: der Server kann sich nun auch    | ||||
|     unter A/UX wieder zu anderen verbinden. | ||||
|   - in den Konfigurationsvariablen ServerUID und ServerGID kann nun nicht | ||||
|     nur die numerische ID, sondern auch der Name des Users bzw. der Gruppe | ||||
|     verwendet werden. Beim Start des Daemons wird nun beides angezeigt. | ||||
|   - Besseres Logging von Prefix-Fehlern. | ||||
|   - angenommene Sockets werden nun korrekt auf "non-blocking" konfiguriert, | ||||
|     beim Senden und Empfangen werden Blockierungen besser abgefangen. | ||||
|   - RPL_UMODEIS hat Code 221, nicht 211 ... *argl* | ||||
|   - select() in Try_Write() hat falschen (keinen!) Timeout verwendet; | ||||
|     die "Zeit-Aufloesung" des Servers sind zudem nun 2 Sekunden (TIME_RES). | ||||
|     Insgesamt sollte die Reaktionszeit des Server nun besser sein. | ||||
|  | ||||
| ngIRCd 0.5.3, 08.11.2002 | ||||
|  | ||||
|   - NOTICE liefert nun wirklich nie mehr einen Fehler, auch dann nicht, | ||||
|     wenn der sendende Client noch gar nicht registriert ist. | ||||
|   - ein "schneller Server-Reconnect" wird nur noch dann versucht, wenn die | ||||
|     Verbindung zuvor ordentlich (="lange genug") in Ordnung war; somit also | ||||
|     nicht meht, wenn der Peer-Server gleich beim Connect ein ERROR liefert. | ||||
|     Das vermeidet "Connect-Orgien". | ||||
|   - einige Datentypen aufgeraumt: z.B. sind viele INT32s nun LONGs. Das ist | ||||
|     auf Platformen mit 8-Byte-Integern kompatibler. | ||||
|   - RPL_YOURHOST_MSG ist nun ircII- und RFC-kompatibel ;-) | ||||
|   - Segfault unter hoher Netzaktivitaet behoben: in Conn_Close() wird die | ||||
|     Connection-Struktur nun frueher als "ungueltig" markiert. | ||||
|  | ||||
| ngIRCd 0.5.2, 04.10.2002 | ||||
|  | ||||
|   - Buffer Overflow in Read_Resolver_Result() behoben. | ||||
|   - Format-String-Bugs, die zum Abbruch des Servers fuehrten, behoben. | ||||
|   - Maximale Laenge eines IRC-Prefix wurde falsch berechnet. | ||||
|  | ||||
| ngIRCd 0.5.1, 03.10.2002 | ||||
|  | ||||
|   - in RPL_YOURHOST_MSG wurde ein fehlerhafter Versionsstring geliefert. | ||||
|   - Test-Suite: start-server.sh, stop-server.sh und stress-server.sh koennen | ||||
|     nun "manuell" von der Kommandozeile gestartet werden, stress-server.sh | ||||
|     startet per Default nur noch 5 Sessions, eine andere Zahl kann auf der | ||||
|     Kommandozeile uebergeben werden (Syntax: "stress-server.sh <count>"). | ||||
|   - In bestimmten Faellen hat der Server versucht auf einen bereits wieder | ||||
|     geschlossenen Socket Daten zu schreiben; das fuehrte zu einem Abbruch des | ||||
|     Servers durch ein assert(). Nun wird geprueft, ob der Socket noch ok ist. | ||||
|   - im "contrib"-Verzeichnis befindet sich nun eine RPM-Spec-Datei, aus den | ||||
|     .tar.gz's koennen nun mit "rpm -ta <archiv>" RPM's erzeugt werden. Danke | ||||
|     an Sean Reifschneider <jafo@tummy.com>! | ||||
|   - Syntax von RPL_MYINFO_MSG korrigiert: liefert nun vier Parameter. | ||||
|  | ||||
| ngIRCd 0.5.0, 20.09.2002 | ||||
|  | ||||
|   - Dokumentation aktualisiert. | ||||
|   - Fehler bei Validierung von "AdminInfo2" behoben. | ||||
|   - Test der Flags fuer "ps" in der Testsuite verbessert, ist nun zu mehr | ||||
|     Plattformen kompatibler. | ||||
|  | ||||
|   ngIRCd 0.5.0-pre2, 17.09.2002 | ||||
|   - Fix in IRC_WriteStrServersPrefix() war "badly broken" -- behoben. | ||||
|  | ||||
|   ngIRCd 0.5.0-pre1, 16.09.2002 | ||||
|   - Manual-Pages ngircd.8 und ngircd.conf.5 begonnen. | ||||
|   - Wird der Netzwerk-Sniffer aktiviert (--sniffer), so schaltet der | ||||
|     ngIRCd nun automatisch in den Debug-Modus. | ||||
| @@ -254,4 +320,4 @@ ngIRCd 0.0.1, 31.12.2001 | ||||
|  | ||||
|  | ||||
| --  | ||||
| $Id: ChangeLog,v 1.87 2002/09/16 10:00:28 alex Exp $ | ||||
| $Id: ChangeLog,v 1.87.2.18 2002/11/29 11:42:24 alex Exp $ | ||||
|   | ||||
| @@ -9,12 +9,12 @@ | ||||
| # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
| # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
| # | ||||
| # $Id: Makefile.am,v 1.9 2002/03/31 20:23:06 alex Exp $ | ||||
| # $Id: Makefile.am,v 1.9.2.1 2002/10/03 16:13:38 alex Exp $ | ||||
| # | ||||
|  | ||||
| AUTOMAKE_OPTIONS = gnu | ||||
|  | ||||
| SUBDIRS = doc MacOSX src man | ||||
| SUBDIRS = doc MacOSX src man contrib | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -rf autom4te.cache | ||||
| @@ -25,4 +25,7 @@ maintainer-clean-local: | ||||
| lint: | ||||
| 	make -C src/ngircd lint | ||||
|  | ||||
| rpm: distcheck | ||||
| 	rpm -ta ngircd-*.tar.gz | ||||
|  | ||||
| # -eof- | ||||
|   | ||||
							
								
								
									
										34
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								NEWS
									
									
									
									
									
								
							| @@ -10,31 +10,25 @@ | ||||
|                            -- NEWS / Neuigkeiten -- | ||||
|  | ||||
|  | ||||
| ngIRCd CVS-HEAD | ||||
| ngIRCd 0.5.0, 20.09.2002 | ||||
|  | ||||
|   - Manual-Pages ngircd.8 und ngircd.conf.5 begonnen. | ||||
|   - AIX (3.2.5), HP-UX (10.20), IRIX (6.5), NetBSD (1.5.3/m68k) und Solaris | ||||
|     (2.5.1, 2.6) gehoeren nun auch zu den unterstuetzten Platformen. | ||||
|   - "persistente Channels" (Mode 'P') implementiert: diese koennen in der | ||||
|     Konfigurationsdatei definiert werden (Sektion "Channel", vgl. Beispiel- | ||||
|     Konfiguration "sample-ngircd.conf") und bleiben auch dann bestehen, | ||||
|     wenn kein User mehr im Channel ist. Zu Channel-Operatoren werden bisher | ||||
|     nur IRC-Operatoren, die den Channel betreten. Die persistenten Channels | ||||
|     werden durch das Flag "P" gelennzeichnet, welches normal durch Channel- | ||||
|     Op's gesetzt und geloescht werden kann. | ||||
|   - KICK implementiert (bisher kann nur ein User aus einem Channel geckicked | ||||
|     werden, Listen, wir im RFC vorgesehen, werden bisher nicht unterstuetzt). | ||||
|   - INVITE, den Channel-Mode "i" sowie Invite-Lists ueber den MODE-Befehl | ||||
|     (setzen, erfragen und loeschen) implementiert. | ||||
|   - Unter A/UX (und evtl. weiteren Systemen) kompiliert der ngIRCd nun mit | ||||
|     dem "nativen" (ggf. pre-ANSI) Compiler. | ||||
|   - LIST versteht nun Wildcards und kann an andere Server geforwarded werden. | ||||
|   - neue Konfigurationsoption "OperCanUseMode" (Sektion "Global"): | ||||
|   - "persistente Channels" (Mode 'P') implementiert: diese koennen in der | ||||
|     Konfigurationsdatei definiert werden (Sektion "Channel", vgl. Beispiel- | ||||
|     Konfiguration "sample-ngircd.conf") und bleiben auch dann bestehen,    | ||||
|     wenn kein User mehr im Channel ist. | ||||
|   - neue IRC-Befehle: KICK, INVITE, ADMIN, CHANINFO; LIST wurde erweitert.   | ||||
|     Mit dem neuen Befehl CHANINFO syncronisieren Server, die das IRC+-    | ||||
|     Protokoll unterstuetzen, Channel-Modes und Topics. Fuer den ADMIN-Befehl | ||||
|     gibt es neue Konfigurationsoptionen (Sektion "Global"): "AdminInfo1", | ||||
|     "AdminInfo2" und "AdminEMail". | ||||
|   - Invite- und Ban-Lists implementiert.    | ||||
|   - neue Konfigurationsoption "OperCanUseMode" (Sektion "Global"):    | ||||
|     ist sie aktiv, koennen IRC-Operatoren immer Channel-Modes setzen. | ||||
|   - mit dem neuen Befehl CHANINFO syncronisieren Server, die das IRC+- | ||||
|     Protokoll unterstuetzen, Channel-Modes und Topics. | ||||
|   - Ban-Lists (setzen, erfragen und loeschen) implementiert. | ||||
|   - ADMIN-Befehl implementiert. | ||||
|   - "Test-Suite" begonnen: mit "make check" wird sie durchlaufen. | ||||
|  | ||||
| ngIRCd 0.4.2, 29.04.2002 | ||||
|  | ||||
| @@ -116,4 +110,4 @@ ngIRCd 0.0.1, 31.12.2001 | ||||
|  | ||||
|  | ||||
| --  | ||||
| $Id: NEWS,v 1.38 2002/09/16 11:03:05 alex Exp $ | ||||
| $Id: NEWS,v 1.38.2.4 2002/10/03 16:09:50 alex Exp $ | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
| # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
| # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
| # | ||||
| # $Id: configure.in,v 1.59 2002/09/17 17:12:24 alex Exp $ | ||||
| # $Id: configure.in,v 1.58.2.11 2002/11/29 10:53:44 alex Exp $ | ||||
| # | ||||
|  | ||||
| # -- Initialisierung -- | ||||
| @@ -18,7 +18,7 @@ AC_INIT | ||||
| AC_PREREQ(2.50) | ||||
| AC_CANONICAL_TARGET | ||||
| AC_CONFIG_SRCDIR(src/config.h.in) | ||||
| AM_INIT_AUTOMAKE(ngircd,0.5.0-pre2) | ||||
| AM_INIT_AUTOMAKE(ngircd,0.5.x-CVS) | ||||
| AM_CONFIG_HEADER(src/config.h) | ||||
|  | ||||
| # -- Templates fuer config.h -- | ||||
| @@ -194,6 +194,7 @@ AC_OUTPUT([ \ | ||||
| 	src/ngircd/Makefile \ | ||||
| 	src/testsuite/Makefile \ | ||||
| 	man/Makefile \ | ||||
| 	contrib/Makefile \ | ||||
| ]) | ||||
|  | ||||
| # -- Ergebnis -- | ||||
|   | ||||
							
								
								
									
										20
									
								
								contrib/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								contrib/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| # | ||||
| # ngIRCd -- The Next Generation IRC Daemon | ||||
| # Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) | ||||
| # | ||||
| # Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen | ||||
| # der GNU General Public License (GPL), wie von der Free Software Foundation | ||||
| # herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2 | ||||
| # der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version. | ||||
| # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
| # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
| # | ||||
| # $Id: Makefile.am,v 1.1.2.1 2002/10/03 16:13:38 alex Exp $ | ||||
| # | ||||
|  | ||||
| EXTRA_DIST = ngircd.spec | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile Makefile.in | ||||
|  | ||||
| # -eof- | ||||
							
								
								
									
										54
									
								
								contrib/ngircd.spec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								contrib/ngircd.spec
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| %define name    ngircd | ||||
| %define version 0.5.x-CVS | ||||
| %define release 1 | ||||
| %define prefix  %{_prefix} | ||||
|  | ||||
| Summary:      Next Generation Internet Relay Chat Daemon | ||||
| Name:         %{name} | ||||
| Version:      %{version} | ||||
| Release:      %{release} | ||||
| Copyright:    GPL | ||||
| Group:        Networking/Daemons | ||||
| URL:          http://arthur.ath.cx/~alex/ngircd/ | ||||
| Source:       %{name}-%{version}.tar.gz | ||||
| Packager:     Sean Reifschneider <jafo-rpms@tummy.com> | ||||
| BuildRoot:    /var/tmp/%{name}-root | ||||
|  | ||||
| %description | ||||
| ngIRCd is a free open source daemon for Internet Relay Chat (IRC), | ||||
| developed under the GNU General Public License (GPL). It's written from | ||||
| scratch and is not based upon the original IRCd like many others. | ||||
|  | ||||
| Why should you use ngIRCd? Because ... | ||||
|  | ||||
|    * ... there are no problems with servers on changing or non-static IP | ||||
|          addresses. | ||||
|    * ... there is a small and lean configuration file. | ||||
|    * ... there is a free, modern and open source C source code. | ||||
|    * ... it is still under active development.  | ||||
|  | ||||
| %prep | ||||
| %setup | ||||
| %build | ||||
| %configure | ||||
| make | ||||
|  | ||||
| %install | ||||
| [ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT" | ||||
| %makeinstall | ||||
| ( | ||||
|    cd "$RPM_BUILD_ROOT" | ||||
|    ( cd usr/sbin; mv *-ngircd ngircd ) | ||||
|    ( cd usr/share/man/man5; mv *-ngircd.conf.5 ngircd.conf.5 ) | ||||
|    ( cd usr/share/man/man8; mv *-ngircd.8 ngircd.8 ) | ||||
| ) | ||||
|  | ||||
| %clean | ||||
| [ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT" | ||||
|  | ||||
| %files | ||||
| %defattr(755,root,root) | ||||
| %doc AUTHORS  COPYING  ChangeLog  INSTALL NEWS  README | ||||
| %config(noreplace) /etc | ||||
| %{_prefix}/sbin | ||||
| %{_prefix}/share/man/ | ||||
| @@ -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 2002/09/03 18:54:31 alex Exp $ | ||||
|  * $Id: client.c,v 1.60.2.2 2002/11/04 19:18:39 alex Exp $ | ||||
|  * | ||||
|  * client.c: Management aller Clients | ||||
|  * | ||||
| @@ -53,12 +53,15 @@ | ||||
| #include <exp.h> | ||||
|  | ||||
|  | ||||
| #define GETID_LEN (CLIENT_NICK_LEN-1) + 1 + (CLIENT_USER_LEN-1) + 1 + (CLIENT_HOST_LEN-1) + 1 | ||||
|  | ||||
|  | ||||
| LOCAL CLIENT *This_Server, *My_Clients; | ||||
| LOCAL CHAR GetID_Buffer[CLIENT_ID_LEN]; | ||||
| LOCAL CHAR GetID_Buffer[GETID_LEN]; | ||||
|  | ||||
|  | ||||
| LOCAL INT Count PARAMS(( CLIENT_TYPE Type )); | ||||
| LOCAL INT MyCount PARAMS(( CLIENT_TYPE Type )); | ||||
| LOCAL LONG Count PARAMS(( CLIENT_TYPE Type )); | ||||
| LOCAL LONG MyCount PARAMS(( CLIENT_TYPE Type )); | ||||
|  | ||||
| LOCAL CLIENT *New_Client_Struct PARAMS(( VOID )); | ||||
| LOCAL VOID Generate_MyToken PARAMS(( CLIENT *Client )); | ||||
| @@ -713,7 +716,7 @@ Client_Mask( CLIENT *Client ) | ||||
| 	 | ||||
| 	if( Client->type == CLIENT_SERVER ) return Client->id; | ||||
|  | ||||
| 	sprintf( GetID_Buffer, "%s!%s@%s", Client->id, Client->user, Client->host ); | ||||
| 	snprintf( GetID_Buffer, GETID_LEN, "%s!%s@%s", Client->id, Client->user, Client->host ); | ||||
| 	return GetID_Buffer; | ||||
| } /* Client_Mask */ | ||||
|  | ||||
| @@ -837,46 +840,46 @@ Client_Next( CLIENT *c ) | ||||
| } /* Client_Next */ | ||||
|  | ||||
|  | ||||
| GLOBAL INT | ||||
| GLOBAL LONG | ||||
| Client_UserCount( VOID ) | ||||
| { | ||||
| 	return Count( CLIENT_USER ); | ||||
| } /* Client_UserCount */ | ||||
|  | ||||
|  | ||||
| GLOBAL INT | ||||
| GLOBAL LONG | ||||
| Client_ServiceCount( VOID ) | ||||
| { | ||||
| 	return Count( CLIENT_SERVICE );; | ||||
| } /* Client_ServiceCount */ | ||||
|  | ||||
|  | ||||
| GLOBAL INT | ||||
| GLOBAL LONG | ||||
| Client_ServerCount( VOID ) | ||||
| { | ||||
| 	return Count( CLIENT_SERVER ); | ||||
| } /* Client_ServerCount */ | ||||
|  | ||||
|  | ||||
| GLOBAL INT | ||||
| GLOBAL LONG | ||||
| Client_MyUserCount( VOID ) | ||||
| { | ||||
| 	return MyCount( CLIENT_USER ); | ||||
| } /* Client_MyUserCount */ | ||||
|  | ||||
|  | ||||
| GLOBAL INT | ||||
| GLOBAL LONG | ||||
| Client_MyServiceCount( VOID ) | ||||
| { | ||||
| 	return MyCount( CLIENT_SERVICE ); | ||||
| } /* Client_MyServiceCount */ | ||||
|  | ||||
|  | ||||
| GLOBAL INT | ||||
| GLOBAL LONG | ||||
| Client_MyServerCount( VOID ) | ||||
| { | ||||
| 	CLIENT *c; | ||||
| 	INT cnt; | ||||
| 	LONG cnt; | ||||
|  | ||||
| 	cnt = 0; | ||||
| 	c = My_Clients; | ||||
| @@ -889,11 +892,11 @@ Client_MyServerCount( VOID ) | ||||
| } /* Client_MyServerCount */ | ||||
|  | ||||
|  | ||||
| GLOBAL INT | ||||
| GLOBAL LONG | ||||
| Client_OperCount( VOID ) | ||||
| { | ||||
| 	CLIENT *c; | ||||
| 	INT cnt; | ||||
| 	LONG cnt; | ||||
|  | ||||
| 	cnt = 0; | ||||
| 	c = My_Clients; | ||||
| @@ -906,11 +909,11 @@ Client_OperCount( VOID ) | ||||
| } /* Client_OperCount */ | ||||
|  | ||||
|  | ||||
| GLOBAL INT | ||||
| GLOBAL LONG | ||||
| Client_UnknownCount( VOID ) | ||||
| { | ||||
| 	CLIENT *c; | ||||
| 	INT cnt; | ||||
| 	LONG cnt; | ||||
|  | ||||
| 	cnt = 0; | ||||
| 	c = My_Clients; | ||||
| @@ -950,11 +953,11 @@ Client_IsValidNick( CHAR *Nick ) | ||||
| } /* Client_IsValidNick */ | ||||
|  | ||||
|  | ||||
| LOCAL INT | ||||
| LOCAL LONG | ||||
| Count( CLIENT_TYPE Type ) | ||||
| { | ||||
| 	CLIENT *c; | ||||
| 	INT cnt; | ||||
| 	LONG cnt; | ||||
|  | ||||
| 	cnt = 0; | ||||
| 	c = My_Clients; | ||||
| @@ -967,11 +970,11 @@ Count( CLIENT_TYPE Type ) | ||||
| } /* Count */ | ||||
|  | ||||
|  | ||||
| LOCAL INT | ||||
| LOCAL LONG | ||||
| MyCount( CLIENT_TYPE Type ) | ||||
| { | ||||
| 	CLIENT *c; | ||||
| 	INT cnt; | ||||
| 	LONG cnt; | ||||
|  | ||||
| 	cnt = 0; | ||||
| 	c = My_Clients; | ||||
|   | ||||
| @@ -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 2002/09/16 09:13:06 alex Exp $ | ||||
|  * $Id: conf.c,v 1.29.2.5 2002/11/24 15:25:25 alex Exp $ | ||||
|  * | ||||
|  * conf.h: Konfiguration des ngircd | ||||
|  */ | ||||
| @@ -25,6 +25,9 @@ | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <unistd.h> | ||||
| #include <pwd.h> | ||||
| #include <grp.h> | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #include "ngircd.h" | ||||
| #include "conn.h" | ||||
| @@ -67,7 +70,9 @@ Conf_Test( VOID ) | ||||
| { | ||||
| 	/* Konfiguration einlesen, ueberpruefen und ausgeben. */ | ||||
|  | ||||
| 	UINT i; | ||||
| 	struct passwd *pwd; | ||||
| 	struct group *grp; | ||||
| 	INT i; | ||||
|  | ||||
| 	Use_Log = FALSE; | ||||
| 	Set_Defaults( ); | ||||
| @@ -91,15 +96,19 @@ Conf_Test( VOID ) | ||||
| 	printf( "  AdminInfo2 = %s\n", Conf_ServerAdmin2 ); | ||||
| 	printf( "  AdminEMail = %s\n", Conf_ServerAdminMail ); | ||||
| 	printf( "  MotdFile = %s\n", Conf_MotdFile ); | ||||
| 	printf( "  ListenPorts = " ); | ||||
| 	printf( "  Ports = " ); | ||||
| 	for( i = 0; i < Conf_ListenPorts_Count; i++ ) | ||||
| 	{ | ||||
| 		if( i != 0 ) printf( ", " ); | ||||
| 		printf( "%u", Conf_ListenPorts[i] ); | ||||
| 	} | ||||
| 	puts( "" ); | ||||
| 	printf( "  ServerUID = %ld\n", (INT32)Conf_UID ); | ||||
| 	printf( "  ServerGID = %ld\n", (INT32)Conf_GID ); | ||||
| 	pwd = getpwuid( Conf_UID ); | ||||
| 	if( pwd ) printf( "  ServerUID = %s\n", pwd->pw_name ); | ||||
| 	else printf( "  ServerUID = %ld\n", (LONG)Conf_UID ); | ||||
| 	grp = getgrgid( Conf_GID ); | ||||
| 	if( grp ) printf( "  ServerGID = %s\n", grp->gr_name ); | ||||
| 	else printf( "  ServerGID = %ld\n", (LONG)Conf_GID ); | ||||
| 	printf( "  PingTimeout = %d\n", Conf_PingTimeout ); | ||||
| 	printf( "  PongTimeout = %d\n", Conf_PongTimeout ); | ||||
| 	printf( "  ConnectRetry = %d\n", Conf_ConnectRetry ); | ||||
| @@ -294,8 +303,10 @@ Read_Config( VOID ) | ||||
| LOCAL VOID | ||||
| Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) | ||||
| { | ||||
| 	struct passwd *pwd; | ||||
| 	struct group *grp; | ||||
| 	CHAR *ptr; | ||||
| 	INT32 port; | ||||
| 	LONG port; | ||||
| 	 | ||||
| 	assert( Line > 0 ); | ||||
| 	assert( Var != NULL ); | ||||
| @@ -372,13 +383,17 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) | ||||
| 	if( strcasecmp( Var, "ServerUID" ) == 0 ) | ||||
| 	{ | ||||
| 		/* UID, mit der der Daemon laufen soll */ | ||||
| 		Conf_UID = (UINT)atoi( Arg ); | ||||
| 		pwd = getpwnam( Arg ); | ||||
| 		if( pwd ) Conf_UID = pwd->pw_uid; | ||||
| 		else Conf_UID = (UINT)atoi( Arg ); | ||||
| 		return; | ||||
| 	} | ||||
| 	if( strcasecmp( Var, "ServerGID" ) == 0 ) | ||||
| 	{ | ||||
| 		/* GID, mit der der Daemon laufen soll */ | ||||
| 		Conf_GID = (UINT)atoi( Arg ); | ||||
| 		grp = getgrnam( Arg ); | ||||
| 		if( grp ) Conf_GID = grp->gr_gid; | ||||
| 		else Conf_GID = (UINT)atoi( Arg ); | ||||
| 		return; | ||||
| 	} | ||||
| 	if( strcasecmp( Var, "PingTimeout" ) == 0 ) | ||||
| @@ -446,7 +461,7 @@ Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg ) | ||||
| LOCAL VOID | ||||
| Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg ) | ||||
| { | ||||
| 	INT32 port; | ||||
| 	LONG port; | ||||
| 	 | ||||
| 	assert( Line > 0 ); | ||||
| 	assert( Var != NULL ); | ||||
| @@ -539,7 +554,7 @@ Validate_Config( VOID ) | ||||
| 	} | ||||
|  | ||||
| #ifdef STRICT_RFC | ||||
| 	if( ! ConfAdminMail[0] ) | ||||
| 	if( ! Conf_ServerAdminMail[0] ) | ||||
| 	{ | ||||
| 		/* Keine Server-Information konfiguriert */ | ||||
| 		Config_Error( LOG_ALERT, "No administrator email address configured in \"%s\" ('AdminEMail')!", NGIRCd_ConfFile ); | ||||
| @@ -548,7 +563,7 @@ Validate_Config( VOID ) | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	if( ! Conf_ServerAdmin1[0] && ! Conf_ServerAdmin1[0] && ! Conf_ServerAdminMail[0] ) | ||||
| 	if( ! Conf_ServerAdmin1[0] && ! Conf_ServerAdmin2[0] && ! Conf_ServerAdminMail[0] ) | ||||
| 	{ | ||||
| 		/* Keine Server-Information konfiguriert */ | ||||
| 		Log( LOG_WARNING, "No server information configured but required by RFC!" ); | ||||
| @@ -584,7 +599,7 @@ va_dcl | ||||
| 	/* Im "normalen Betrieb" soll der Log-Mechanismus des ngIRCd verwendet | ||||
| 	 * werden, beim Testen der Konfiguration jedoch nicht, hier sollen alle | ||||
| 	 * Meldungen direkt auf die Konsole ausgegeben werden: */ | ||||
| 	if( Use_Log ) Log( Level, msg ); | ||||
| 	if( Use_Log ) Log( Level, "%s", msg ); | ||||
| 	else puts( msg ); | ||||
| } /* Config_Error */ | ||||
|  | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
|  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
|  * | ||||
|  * $Id: conn.c,v 1.72 2002/09/07 22:34:44 alex Exp $ | ||||
|  * $Id: conn.c,v 1.72.2.9 2002/11/29 11:35:08 alex Exp $ | ||||
|  * | ||||
|  * connect.h: Verwaltung aller Netz-Verbindungen ("connections") | ||||
|  */ | ||||
| @@ -84,7 +84,7 @@ LOCAL VOID New_Connection PARAMS(( INT Sock )); | ||||
| LOCAL CONN_ID Socket2Index PARAMS(( INT Sock )); | ||||
| LOCAL VOID Read_Request PARAMS(( CONN_ID Idx )); | ||||
| LOCAL BOOLEAN Try_Write PARAMS(( CONN_ID Idx )); | ||||
| LOCAL VOID Handle_Buffer PARAMS(( CONN_ID Idx )); | ||||
| LOCAL BOOLEAN Handle_Buffer PARAMS(( CONN_ID Idx )); | ||||
| LOCAL VOID Check_Connections PARAMS(( VOID )); | ||||
| LOCAL VOID Check_Servers PARAMS(( VOID )); | ||||
| LOCAL VOID Init_Conn_Struct PARAMS(( INT Idx )); | ||||
| @@ -235,11 +235,14 @@ Conn_Handler( VOID ) | ||||
| 	fd_set read_sockets, write_sockets; | ||||
| 	struct timeval tv; | ||||
| 	time_t start, t; | ||||
| 	INT i; | ||||
| 	INT i, idx; | ||||
| 	BOOLEAN timeout; | ||||
|  | ||||
| 	start = time( NULL ); | ||||
| 	while(( ! NGIRCd_Quit ) && ( ! NGIRCd_Restart )) | ||||
| 	{ | ||||
| 		timeout = TRUE; | ||||
|  | ||||
| 		Check_Servers( ); | ||||
|  | ||||
| 		Check_Connections( ); | ||||
| @@ -250,7 +253,7 @@ Conn_Handler( VOID ) | ||||
| 			if(( My_Connections[i].sock > NONE ) && ( My_Connections[i].rdatalen > 0 )) | ||||
| 			{ | ||||
| 				/* Kann aus dem Buffer noch ein Befehl extrahiert werden? */ | ||||
| 				Handle_Buffer( i ); | ||||
| 				if( Handle_Buffer( i )) timeout = FALSE; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| @@ -302,8 +305,9 @@ Conn_Handler( VOID ) | ||||
| 		} | ||||
|  | ||||
| 		/* Timeout initialisieren */ | ||||
| 		tv.tv_sec = 1; | ||||
| 		tv.tv_usec = 0; | ||||
| 		if( timeout ) tv.tv_sec = TIME_RES; | ||||
| 		else tv.tv_sec = 0; | ||||
| 		 | ||||
| 		/* Auf Aktivitaet warten */ | ||||
| 		i = select( Conn_MaxFD + 1, &read_sockets, &write_sockets, NULL, &tv ); | ||||
| @@ -317,7 +321,7 @@ Conn_Handler( VOID ) | ||||
| 			/* Fehler (z.B. Interrupt) */ | ||||
| 			if( errno != EINTR ) | ||||
| 			{ | ||||
| 				Log( LOG_EMERG, "select(): %s!", strerror( errno )); | ||||
| 				Log( LOG_EMERG, "Conn_Handler(): select(): %s!", strerror( errno )); | ||||
| 				Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE ); | ||||
| 				exit( 1 ); | ||||
| 			} | ||||
| @@ -327,7 +331,18 @@ Conn_Handler( VOID ) | ||||
| 		/* Koennen Daten geschrieben werden? */ | ||||
| 		for( i = 0; i < Conn_MaxFD + 1; i++ ) | ||||
| 		{ | ||||
| 			if( FD_ISSET( i, &write_sockets )) Handle_Write( Socket2Index( i )); | ||||
| 			if( ! FD_ISSET( i, &write_sockets )) continue; | ||||
|  | ||||
| 			/* Es kann geschrieben werden ... */ | ||||
| 			idx = Socket2Index( i ); | ||||
| 			if( idx == NONE ) continue; | ||||
| 			 | ||||
| 			if( ! Handle_Write( idx )) | ||||
| 			{ | ||||
| 				/* Fehler beim Schreiben! Diesen Socket nun | ||||
| 				 * auch aus dem Read-Set entfernen: */ | ||||
| 				FD_CLR( i, &read_sockets ); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		/* Daten zum Lesen vorhanden? */ | ||||
| @@ -359,7 +374,6 @@ va_dcl | ||||
| 	va_list ap; | ||||
|  | ||||
| 	assert( Idx >= 0 ); | ||||
| 	assert( My_Connections[Idx].sock > NONE ); | ||||
| 	assert( Format != NULL ); | ||||
|  | ||||
| #ifdef PROTOTYPES | ||||
| @@ -393,10 +407,20 @@ Conn_Write( CONN_ID Idx, CHAR *Data, INT Len ) | ||||
| 	 * der Client disconnectiert und FALSE geliefert. */ | ||||
|  | ||||
| 	assert( Idx >= 0 ); | ||||
| 	assert( My_Connections[Idx].sock > NONE ); | ||||
| 	assert( Data != NULL ); | ||||
| 	assert( Len > 0 ); | ||||
|  | ||||
| 	/* Ist der entsprechende Socket ueberhaupt noch offen? | ||||
| 	 * In einem "Handler-Durchlauf" kann es passieren, dass | ||||
| 	 * dem nicht mehr so ist, wenn einer von mehreren | ||||
| 	 * Conn_Write()'s fehlgeschlagen ist. In diesem Fall | ||||
| 	 * wird hier einfach ein Fehler geliefert. */ | ||||
| 	if( My_Connections[Idx].sock <= NONE ) | ||||
| 	{ | ||||
| 		Log( LOG_DEBUG, "Skipped write on closed socket (connection %d).", Idx ); | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	/* pruefen, ob Daten im Schreibpuffer sind. Wenn ja, zunaechst | ||||
| 	 * pruefen, ob diese gesendet werden koennen */ | ||||
| 	if( My_Connections[Idx].wdatalen > 0 ) | ||||
| @@ -445,14 +469,23 @@ Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient ) | ||||
| 		if( My_Connections[Idx].sock == NONE ) return; | ||||
| 	} | ||||
|  | ||||
| 	/* zunaechst versuchen, noch im Schreibpuffer vorhandene | ||||
| 	 * Daten auf den Socket zu schreiben ... */ | ||||
| 	Try_Write( Idx ); | ||||
|  | ||||
| 	if( close( My_Connections[Idx].sock ) != 0 ) | ||||
| 	{ | ||||
| 		Log( LOG_ERR, "Error closing connection %d with %s:%d - %s!", Idx, inet_ntoa( My_Connections[Idx].addr.sin_addr ), ntohs( My_Connections[Idx].addr.sin_port), strerror( errno )); | ||||
| 		Log( LOG_ERR, "Error closing connection %d (socket %d) with %s:%d - %s!", Idx, My_Connections[Idx].sock, inet_ntoa( My_Connections[Idx].addr.sin_addr ), ntohs( My_Connections[Idx].addr.sin_port), strerror( errno )); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		Log( LOG_INFO, "Connection %d with %s:%d closed.", Idx, inet_ntoa( My_Connections[Idx].addr.sin_addr ), ntohs( My_Connections[Idx].addr.sin_port )); | ||||
| 		Log( LOG_INFO, "Connection %d (socket %d) with %s:%d closed.", Idx, My_Connections[Idx].sock, inet_ntoa( My_Connections[Idx].addr.sin_addr ), ntohs( My_Connections[Idx].addr.sin_port )); | ||||
| 	} | ||||
| 	 | ||||
| 	/* Socket als "ungueltig" markieren */ | ||||
| 	FD_CLR( My_Connections[Idx].sock, &My_Sockets ); | ||||
| 	FD_CLR( My_Connections[Idx].sock, &My_Connects ); | ||||
| 	My_Connections[Idx].sock = NONE; | ||||
|  | ||||
| 	c = Client_GetFromConn( Idx ); | ||||
| 	if( c ) Client_Destroy( c, LogMsg, FwdMsg, TRUE ); | ||||
| @@ -466,18 +499,18 @@ Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient ) | ||||
| 		free( My_Connections[Idx].res_stat ); | ||||
| 	} | ||||
|  | ||||
| 	/* Bei Server-Verbindungen lasttry-Zeitpunkt so setzen, dass | ||||
| 	 * der naechste Verbindungsversuch in RECONNECT_DELAY Sekunden | ||||
| 	 * gestartet wird. */ | ||||
| 	if(( My_Connections[Idx].our_server >= 0 ) && ( Conf_Server[My_Connections[Idx].our_server].lasttry <  time( NULL ))) | ||||
| 	/* Startzeit des naechsten Connect-Versuchs modifizieren? */ | ||||
| 	if(( My_Connections[Idx].our_server >= 0 ) && ( Conf_Server[My_Connections[Idx].our_server].lasttry <  time( NULL ) - Conf_ConnectRetry )) | ||||
| 	{ | ||||
| 		/* Okay, die Verbindung stand schon "genuegend lange" */ | ||||
| 		/* Okay, die Verbindung stand schon "genuegend lange": | ||||
| 		 * lasttry-Zeitpunkt so setzen, dass der naechste | ||||
| 		 * Verbindungsversuch in RECONNECT_DELAY Sekunden | ||||
| 		 * gestartet wird. */ | ||||
| 		Conf_Server[My_Connections[Idx].our_server].lasttry = time( NULL ) - Conf_ConnectRetry + RECONNECT_DELAY; | ||||
| 	} | ||||
|  | ||||
| 	FD_CLR( My_Connections[Idx].sock, &My_Sockets ); | ||||
| 	FD_CLR( My_Connections[Idx].sock, &My_Connects ); | ||||
| 	My_Connections[Idx].sock = NONE; | ||||
| 	/* Connection-Struktur loeschen (=freigeben) */ | ||||
| 	Init_Conn_Struct( Idx ); | ||||
| } /* Conn_Close */ | ||||
|  | ||||
|  | ||||
| @@ -532,23 +565,32 @@ Conn_SetPenalty( CONN_ID Idx, time_t Seconds ) | ||||
| LOCAL BOOLEAN | ||||
| Try_Write( CONN_ID Idx ) | ||||
| { | ||||
| 	/* Versuchen, Daten aus dem Schreib-Puffer in den | ||||
| 	 * Socket zu schreiben. */ | ||||
| 	/* Versuchen, Daten aus dem Schreib-Puffer in den Socket zu  | ||||
| 	 * schreiben. TRUE wird geliefert, wenn entweder keine Daten | ||||
| 	 * zum Versenden vorhanden sind oder erfolgreich bearbeitet | ||||
| 	 * werden konnten. Im Fehlerfall wird FALSE geliefert und | ||||
| 	 * die Verbindung geschlossen. */ | ||||
|  | ||||
| 	fd_set write_socket; | ||||
| 	struct timeval tv; | ||||
|  | ||||
| 	assert( Idx >= 0 ); | ||||
| 	assert( My_Connections[Idx].sock > NONE ); | ||||
| 	assert( My_Connections[Idx].wdatalen > 0 ); | ||||
|  | ||||
| 	/* sind ueberhaupt Daten vorhanden? */ | ||||
| 	if( ! My_Connections[Idx].wdatalen > 0 ) return TRUE; | ||||
|  | ||||
| 	/* Timeout initialisieren: 0 Sekunden, also nicht blockieren */ | ||||
| 	tv.tv_sec = 0; tv.tv_usec = 0; | ||||
|  | ||||
| 	FD_ZERO( &write_socket ); | ||||
| 	FD_SET( My_Connections[Idx].sock, &write_socket ); | ||||
| 	if( select( My_Connections[Idx].sock + 1, NULL, &write_socket, NULL, 0 ) == -1 ) | ||||
| 	if( select( My_Connections[Idx].sock + 1, NULL, &write_socket, NULL, &tv ) == -1 ) | ||||
| 	{ | ||||
| 		/* Fehler! */ | ||||
| 		if( errno != EINTR ) | ||||
| 		{ | ||||
| 			Log( LOG_ALERT, "select() failed: %s!", strerror( errno )); | ||||
| 			Log( LOG_ALERT, "Try_Write(): select() failed: %s (con=%d, sock=%d)!", strerror( errno ), Idx, My_Connections[Idx].sock ); | ||||
| 			Conn_Close( Idx, "Server error!", NULL, FALSE ); | ||||
| 			return FALSE; | ||||
| 		} | ||||
| @@ -589,7 +631,7 @@ Handle_Read( INT Sock ) | ||||
| 		/* Ein Client Socket: entweder ein User oder Server */ | ||||
|  | ||||
| 		idx = Socket2Index( Sock ); | ||||
| 		Read_Request( idx ); | ||||
| 		if( idx > NONE ) Read_Request( idx ); | ||||
| 	} | ||||
| } /* Handle_Read */ | ||||
|  | ||||
| @@ -601,7 +643,7 @@ Handle_Write( CONN_ID Idx ) | ||||
|  | ||||
| 	INT len, res, err; | ||||
|  | ||||
| 	assert( Idx >= 0 ); | ||||
| 	assert( Idx > NONE ); | ||||
| 	assert( My_Connections[Idx].sock > NONE ); | ||||
|  | ||||
| 	if( FD_ISSET( My_Connections[Idx].sock, &My_Connects )) | ||||
| @@ -637,9 +679,7 @@ Handle_Write( CONN_ID Idx ) | ||||
|  | ||||
| 		/* PASS und SERVER verschicken */ | ||||
| 		Conn_WriteStr( Idx, "PASS %s %s", Conf_Server[My_Connections[Idx].our_server].pwd, NGIRCd_ProtoID ); | ||||
| 		Conn_WriteStr( Idx, "SERVER %s :%s", Conf_ServerName, Conf_ServerInfo ); | ||||
|  | ||||
| 		return TRUE; | ||||
| 		return Conn_WriteStr( Idx, "SERVER %s :%s", Conf_ServerName, Conf_ServerInfo ); | ||||
| 	} | ||||
|  | ||||
| 	assert( My_Connections[Idx].wdatalen > 0 ); | ||||
| @@ -648,9 +688,12 @@ Handle_Write( CONN_ID Idx ) | ||||
| 	len = send( My_Connections[Idx].sock, My_Connections[Idx].wbuf, My_Connections[Idx].wdatalen, 0 ); | ||||
| 	if( len < 0 ) | ||||
| 	{ | ||||
| 		/* Operation haette Socket "nur" blockiert ... */ | ||||
| 		if( errno == EAGAIN ) return TRUE; | ||||
|  | ||||
| 		/* Oops, ein Fehler! */ | ||||
| 		Log( LOG_ERR, "Write error (buffer) on connection %d: %s!", Idx, strerror( errno )); | ||||
| 		Conn_Close( Idx, "Write error (buffer)!", NULL, FALSE ); | ||||
| 		Log( LOG_ERR, "Write error on connection %d (socket %d): %s!", Idx, My_Connections[Idx].sock, strerror( errno )); | ||||
| 		Conn_Close( Idx, "Write error!", NULL, FALSE ); | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| @@ -676,6 +719,7 @@ New_Connection( INT Sock ) | ||||
|  | ||||
| 	assert( Sock >= 0 ); | ||||
|  | ||||
| 	/* Connection auf Listen-Socket annehmen */ | ||||
| 	new_sock_len = sizeof( new_addr ); | ||||
| 	new_sock = accept( Sock, (struct sockaddr *)&new_addr, (socklen_t *)&new_sock_len ); | ||||
| 	if( new_sock < 0 ) | ||||
| @@ -684,7 +728,10 @@ New_Connection( INT Sock ) | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	/* Freie Connection-Struktur suschen */ | ||||
| 	/* Socket initialisieren */ | ||||
| 	Init_Socket( new_sock ); | ||||
|  | ||||
| 	/* Freie Connection-Struktur suchen */ | ||||
| 	for( idx = 0; idx < MAX_CONNECTIONS; idx++ ) if( My_Connections[idx].sock == NONE ) break; | ||||
| 	if( idx >= MAX_CONNECTIONS ) | ||||
| 	{ | ||||
| @@ -743,8 +790,14 @@ Socket2Index( INT Sock ) | ||||
|  | ||||
| 	for( idx = 0; idx < MAX_CONNECTIONS; idx++ ) if( My_Connections[idx].sock == Sock ) break; | ||||
|  | ||||
| 	assert( idx < MAX_CONNECTIONS ); | ||||
| 	return idx; | ||||
| 	if( idx >= MAX_CONNECTIONS ) | ||||
| 	{ | ||||
| 		/* die Connection wurde vermutlich (wegen eines | ||||
| 		 * Fehlers) bereits wieder abgebaut ... */ | ||||
| 		Log( LOG_DEBUG, "Socket2Index: can't get connection for socket %d!", Sock ); | ||||
| 		return NONE; | ||||
| 	} | ||||
| 	else return idx; | ||||
| } /* Socket2Index */ | ||||
|  | ||||
|  | ||||
| @@ -779,8 +832,11 @@ Read_Request( CONN_ID Idx ) | ||||
|  | ||||
| 	if( len < 0 ) | ||||
| 	{ | ||||
| 		/* Operation haette Socket "nur" blockiert ... */ | ||||
| 		if( errno == EAGAIN ) return; | ||||
|  | ||||
| 		/* Fehler beim Lesen */ | ||||
| 		Log( LOG_ERR, "Read error on connection %d: %s!", Idx, strerror( errno )); | ||||
| 		Log( LOG_ERR, "Read error on connection %d (socket %d): %s!", Idx, My_Connections[Idx].sock, strerror( errno )); | ||||
| 		Conn_Close( Idx, "Read error!", "Client closed connection", FALSE ); | ||||
| 		return; | ||||
| 	} | ||||
| @@ -797,13 +853,19 @@ Read_Request( CONN_ID Idx ) | ||||
| } /* Read_Request */ | ||||
|  | ||||
|  | ||||
| LOCAL VOID | ||||
| LOCAL BOOLEAN | ||||
| Handle_Buffer( CONN_ID Idx ) | ||||
| { | ||||
| 	/* Daten im Lese-Puffer einer Verbindung verarbeiten. */ | ||||
| 	/* Daten im Lese-Puffer einer Verbindung verarbeiten. | ||||
| 	 * Wurde ein Request verarbeitet, so wird TRUE geliefert, | ||||
| 	 * ansonsten FALSE (auch bei Fehlern). */ | ||||
|  | ||||
| 	CHAR *ptr, *ptr1, *ptr2; | ||||
| #ifndef STRICT_RFC | ||||
| 	CHAR *ptr1, *ptr2; | ||||
| #endif | ||||
| 	CHAR *ptr; | ||||
| 	INT len, delta; | ||||
| 	BOOLEAN action; | ||||
|  | ||||
| 	/* Eine komplette Anfrage muss mit CR+LF enden, vgl. | ||||
| 	 * RFC 2812. Haben wir eine? */ | ||||
| @@ -824,6 +886,7 @@ Handle_Buffer( CONN_ID Idx ) | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	action = FALSE; | ||||
| 	if( ptr ) | ||||
| 	{ | ||||
| 		/* Ende der Anfrage wurde gefunden */ | ||||
| @@ -832,23 +895,26 @@ Handle_Buffer( CONN_ID Idx ) | ||||
| 		if( len > ( COMMAND_LEN - 1 )) | ||||
| 		{ | ||||
| 			/* Eine Anfrage darf(!) nicht laenger als 512 Zeichen | ||||
| 			* (incl. CR+LF!) werden; vgl. RFC 2812. Wenn soetwas | ||||
| 			* empfangen wird, wird der Client disconnectiert. */ | ||||
| 			 * (incl. CR+LF!) werden; vgl. RFC 2812. Wenn soetwas | ||||
| 			 * empfangen wird, wird der Client disconnectiert. */ | ||||
| 			Log( LOG_ERR, "Request too long (connection %d): %d bytes (max. %d expected)!", Idx, My_Connections[Idx].rdatalen, COMMAND_LEN - 1 ); | ||||
| 			Conn_Close( Idx, NULL, "Request too long", TRUE ); | ||||
| 			return; | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		if( len > delta ) | ||||
| 		{ | ||||
| 			/* Es wurde ein Request gelesen */ | ||||
| 			if( ! Parse_Request( Idx, My_Connections[Idx].rbuf )) return; | ||||
| 			if( ! Parse_Request( Idx, My_Connections[Idx].rbuf )) return FALSE; | ||||
| 			else action = TRUE; | ||||
| 		} | ||||
|  | ||||
| 		/* Puffer anpassen */ | ||||
| 		My_Connections[Idx].rdatalen -= len; | ||||
| 		memmove( My_Connections[Idx].rbuf, My_Connections[Idx].rbuf + len, My_Connections[Idx].rdatalen ); | ||||
| 	} | ||||
| 	 | ||||
| 	return action; | ||||
| } /* Handle_Buffer */ | ||||
|  | ||||
|  | ||||
| @@ -986,7 +1052,7 @@ New_Server( INT Server, CONN_ID Idx ) | ||||
|  | ||||
| 	struct sockaddr_in new_addr; | ||||
| 	struct in_addr inaddr; | ||||
| 	INT new_sock; | ||||
| 	INT res, new_sock; | ||||
| 	CLIENT *c; | ||||
|  | ||||
| 	assert( Server >= 0 ); | ||||
| @@ -1032,13 +1098,12 @@ New_Server( INT Server, CONN_ID Idx ) | ||||
|  | ||||
| 	if( ! Init_Socket( new_sock )) return; | ||||
|  | ||||
| 	connect( new_sock, (struct sockaddr *)&new_addr, sizeof( new_addr )); | ||||
| 	if( errno != EINPROGRESS ) | ||||
| 	res = connect( new_sock, (struct sockaddr *)&new_addr, sizeof( new_addr )); | ||||
| 	if(( res != 0 ) && ( errno != EINPROGRESS )) | ||||
| 	{ | ||||
|  | ||||
| 		Log( LOG_CRIT, "Can't connect socket: %s!", strerror( errno )); | ||||
| 		close( new_sock ); | ||||
| 		Init_Conn_Struct( Idx ); | ||||
| 		Log( LOG_CRIT, "Can't connect socket: %s!", strerror( errno )); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| @@ -1063,6 +1128,8 @@ New_Server( INT Server, CONN_ID Idx ) | ||||
| 	FD_SET( new_sock, &My_Sockets ); | ||||
| 	FD_SET( new_sock, &My_Connects ); | ||||
| 	if( new_sock > Conn_MaxFD ) Conn_MaxFD = new_sock; | ||||
| 	 | ||||
| 	Log( LOG_DEBUG, "Registered new connection %d on socket %d.", Idx, My_Connections[Idx].sock ); | ||||
| } /* New_Server */ | ||||
|  | ||||
|  | ||||
| @@ -1124,7 +1191,7 @@ Read_Resolver_Result( INT r_fd ) | ||||
| 	FD_CLR( r_fd, &Resolver_FDs ); | ||||
|  | ||||
| 	/* Anfrage vom Parent lesen */ | ||||
| 	len = read( r_fd, result, HOST_LEN); | ||||
| 	len = read( r_fd, result, HOST_LEN - 1 ); | ||||
| 	if( len < 0 ) | ||||
| 	{ | ||||
| 		/* Fehler beim Lesen aus der Pipe */ | ||||
| @@ -1142,7 +1209,7 @@ Read_Resolver_Result( INT r_fd ) | ||||
| 	if( i >= MAX_CONNECTIONS ) | ||||
| 	{ | ||||
| 		/* Opsa! Keine passende Connection gefunden!? Vermutlich | ||||
| 		* wurde sie schon wieder geschlossen. */ | ||||
| 		 * wurde sie schon wieder geschlossen. */ | ||||
| 		close( r_fd ); | ||||
| 		Log( LOG_DEBUG, "Resolver: Got result for unknown connection!?" ); | ||||
| 		return; | ||||
|   | ||||
| @@ -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-login.c,v 1.21 2002/09/09 03:34:33 alex Exp $ | ||||
|  * $Id: irc-login.c,v 1.21.2.1 2002/09/22 21:37:06 alex Exp $ | ||||
|  * | ||||
|  * irc-login.c: Anmeldung und Abmeldung im IRC | ||||
|  */ | ||||
| @@ -441,7 +441,7 @@ Hello_User( CLIENT *Client ) | ||||
| 	IRC_WriteStrServers( NULL, "NICK %s 1 %s %s 1 +%s :%s", Client_ID( Client ), Client_User( Client ), Client_Hostname( Client ), Client_Modes( Client ), Client_Info( Client )); | ||||
|  | ||||
| 	if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return FALSE; | ||||
| 	if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), VERSION, TARGET_CPU, TARGET_CPU, TARGET_OS )) return FALSE; | ||||
| 	if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), VERSION, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return FALSE; | ||||
| 	if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return FALSE; | ||||
| 	if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), VERSION, USERMODES, CHANMODES )) return FALSE; | ||||
|  | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
|  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
|  * | ||||
|  * $Id: irc-server.c,v 1.17 2002/09/07 17:57:31 alex Exp $ | ||||
|  * $Id: irc-server.c,v 1.17.2.3 2002/11/29 10:58:49 alex Exp $ | ||||
|  * | ||||
|  * irc-server.c: IRC-Befehle fuer Server-Links | ||||
|  */ | ||||
| @@ -188,7 +188,7 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req ) | ||||
| 				if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 8 )) | ||||
| 				{ | ||||
| 					/* Zeile senden */ | ||||
| 					if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED; | ||||
| 					if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; | ||||
| 					sprintf( str, "NJOIN %s :", Channel_Name( chan )); | ||||
| 				} | ||||
| 				 | ||||
| @@ -199,7 +199,7 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req ) | ||||
| 			if( str[strlen( str ) - 1] != ':') | ||||
| 			{ | ||||
| 				/* Ja; Also senden ... */ | ||||
| 				if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED; | ||||
| 				if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; | ||||
| 			} | ||||
|  | ||||
| 			/* naechsten Channel suchen */ | ||||
| @@ -339,9 +339,6 @@ IRC_SQUIT( CLIENT *Client, REQUEST *Req ) | ||||
|  | ||||
| 	Log( LOG_DEBUG, "Got SQUIT from %s for \"%s\": \"%s\" ...", Client_ID( Client ), Req->argv[0], Req->argv[1] ); | ||||
|  | ||||
| 	/* SQUIT an alle Server weiterleiten */ | ||||
| 	IRC_WriteStrServers( Client, "SQUIT %s :%s", Req->argv[0], Req->argv[1] ); | ||||
|  | ||||
| 	target = Client_Search( Req->argv[0] ); | ||||
| 	if( ! target ) | ||||
| 	{ | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
|  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
|  * | ||||
|  * $Id: irc-write.c,v 1.8 2002/09/17 17:11:56 alex Exp $ | ||||
|  * $Id: irc-write.c,v 1.7.2.3 2002/10/04 13:12:46 alex Exp $ | ||||
|  * | ||||
|  * irc-write.c: IRC-Texte und Befehle ueber Netzwerk versenden | ||||
|  */ | ||||
| @@ -62,7 +62,7 @@ va_dcl | ||||
| 	va_end( ap ); | ||||
|  | ||||
| 	/* an den Client selber */ | ||||
| 	ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), buffer ); | ||||
| 	ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), "%s", buffer ); | ||||
|  | ||||
| 	return ok; | ||||
| } /* IRC_WriteStrClient */ | ||||
| @@ -128,7 +128,7 @@ va_dcl | ||||
| 	vsnprintf( buffer, 1000, Format, ap ); | ||||
| 	va_end( ap ); | ||||
|  | ||||
| 	return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, buffer ); | ||||
| 	return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, "%s", buffer ); | ||||
| } /* IRC_WriteStrChannel */ | ||||
|  | ||||
|  | ||||
| @@ -233,7 +233,7 @@ va_dcl | ||||
| 	va_end( ap ); | ||||
|  | ||||
| 	/* an den Client selber */ | ||||
| 	IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), buffer ); | ||||
| 	IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), "%s", buffer ); | ||||
| } /* IRC_WriteStrServers */ | ||||
|  | ||||
|  | ||||
| @@ -263,7 +263,7 @@ va_dcl | ||||
| 	vsnprintf( buffer, 1000, Format, ap ); | ||||
| 	va_end( ap ); | ||||
|  | ||||
| 	IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, '\0', buffer ); | ||||
| 	IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, '\0', "%s", buffer ); | ||||
| } /* IRC_WriteStrServersPrefix */ | ||||
| 	 | ||||
|  | ||||
| @@ -301,7 +301,7 @@ va_dcl | ||||
| 		if(( Client_Type( c ) == CLIENT_SERVER ) && ( Client_Conn( c ) > NONE ) && ( c != Client_ThisServer( )) && ( c != ExceptOf )) | ||||
| 		{ | ||||
| 			/* Ziel-Server gefunden. Nun noch pruefen, ob Flags stimmen */ | ||||
| 			if(( Flag == '\0' ) || ( strchr( Client_Flags( c ), Flag ) != NULL )) IRC_WriteStrClientPrefix( c, Prefix, buffer ); | ||||
| 			if(( Flag == '\0' ) || ( strchr( Client_Flags( c ), Flag ) != NULL )) IRC_WriteStrClientPrefix( c, Prefix, "%s", buffer ); | ||||
| 		} | ||||
| 		c = Client_Next( c ); | ||||
| 	} | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
|  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
|  * | ||||
|  * $Id: irc.c,v 1.95 2002/09/16 09:14:45 alex Exp $ | ||||
|  * $Id: irc.c,v 1.95.2.3 2002/11/04 19:18:39 alex Exp $ | ||||
|  * | ||||
|  * irc.c: IRC-Befehle | ||||
|  */ | ||||
| @@ -109,7 +109,7 @@ IRC_NOTICE( CLIENT *Client, REQUEST *Req ) | ||||
| 	assert( Client != NULL ); | ||||
| 	assert( Req != NULL ); | ||||
|  | ||||
| 	if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client )); | ||||
| 	if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return CONNECTED; | ||||
|  | ||||
| 	/* Falsche Anzahl Parameter? */ | ||||
| 	if( Req->argc != 2 ) return CONNECTED; | ||||
| @@ -206,7 +206,7 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req ) | ||||
| 			if( strlen( rpl ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 )) | ||||
| 			{ | ||||
| 				/* Zeile wird zu lang: senden! */ | ||||
| 				if( ! IRC_WriteStrClient( from, rpl )) return DISCONNECTED; | ||||
| 				if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED; | ||||
| 				sprintf( rpl, RPL_NAMREPLY_MSG, Client_ID( from ), "*", "*" ); | ||||
| 			} | ||||
| 		} | ||||
| @@ -217,7 +217,7 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req ) | ||||
| 	if( rpl[strlen( rpl ) - 1] != ':') | ||||
| 	{ | ||||
| 		/* es wurden User gefunden */ | ||||
| 		if( ! IRC_WriteStrClient( from, rpl )) return DISCONNECTED; | ||||
| 		if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED; | ||||
| 	} | ||||
| 	 | ||||
| 	return IRC_WriteStrClient( from, RPL_ENDOFNAMES_MSG, Client_ID( from ), "*" ); | ||||
| @@ -259,7 +259,7 @@ IRC_ISON( CLIENT *Client, REQUEST *Req ) | ||||
| 	} | ||||
| 	if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0'; | ||||
|  | ||||
| 	return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) ); | ||||
| 	return IRC_WriteStrClient( Client, "%s", rpl, Client_ID( Client ) ); | ||||
| } /* IRC_ISON */ | ||||
|  | ||||
|  | ||||
| @@ -325,7 +325,7 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req ) | ||||
| 		if( strlen( str ) > ( LINE_LEN - CHANNEL_NAME_LEN - 4 )) | ||||
| 		{ | ||||
| 			/* Zeile wird zu lang: senden! */ | ||||
| 			if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED; | ||||
| 			if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; | ||||
| 			sprintf( str, RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c )); | ||||
| 		} | ||||
|  | ||||
| @@ -335,7 +335,7 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req ) | ||||
| 	if( str[strlen( str ) - 1] != ':') | ||||
| 	{ | ||||
| 		/* Es sind noch Daten da, die gesendet werden muessen */ | ||||
| 		if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED; | ||||
| 		if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; | ||||
| 	} | ||||
| 	 | ||||
| 	/* IRC-Operator? */ | ||||
| @@ -477,7 +477,7 @@ IRC_USERHOST( CLIENT *Client, REQUEST *Req ) | ||||
| 	} | ||||
| 	if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0'; | ||||
|  | ||||
| 	return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) ); | ||||
| 	return IRC_WriteStrClient( Client, "%s", rpl, Client_ID( Client ) ); | ||||
| } /* IRC_USERHOST */ | ||||
|  | ||||
|  | ||||
| @@ -768,7 +768,7 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan ) | ||||
| 			if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 )) | ||||
| 			{ | ||||
| 				/* Zeile wird zu lang: senden! */ | ||||
| 				if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED; | ||||
| 				if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; | ||||
| 				sprintf( str, RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan )); | ||||
| 			} | ||||
| 		} | ||||
| @@ -779,7 +779,7 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan ) | ||||
| 	if( str[strlen( str ) - 1] != ':') | ||||
| 	{ | ||||
| 		/* Es sind noch Daten da, die gesendet werden muessen */ | ||||
| 		if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED; | ||||
| 		if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; | ||||
| 	} | ||||
|  | ||||
| 	return CONNECTED; | ||||
| @@ -834,7 +834,7 @@ IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps ) | ||||
| GLOBAL BOOLEAN | ||||
| IRC_Send_LUSERS( CLIENT *Client ) | ||||
| { | ||||
| 	INT cnt; | ||||
| 	LONG cnt; | ||||
|  | ||||
| 	assert( Client != NULL ); | ||||
|  | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
|  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
|  * | ||||
|  * $Id: lists.c,v 1.8 2002/09/08 17:06:07 alex Exp $ | ||||
|  * $Id: lists.c,v 1.8.2.2 2002/10/04 13:12:46 alex Exp $ | ||||
|  * | ||||
|  * lists.c: Verwaltung der "IRC-Listen": Ban, Invite, ... | ||||
|  */ | ||||
| @@ -317,13 +317,13 @@ GLOBAL CHAR * | ||||
| Lists_MakeMask( CHAR *Pattern ) | ||||
| { | ||||
| 	/* Hier wird aus einem "beliebigen" Pattern eine gueltige IRC-Mask erzeugt. | ||||
| 	* Diese ist aber nur bis zum naechsten Aufruf von Lists_MakeMask() gueltig, | ||||
| 	* da ein einziger globaler Puffer verwendet wird. ->Umkopieren!*/ | ||||
| 	 * Diese ist aber nur bis zum naechsten Aufruf von Lists_MakeMask() gueltig, | ||||
| 	 * da ein einziger globaler Puffer verwendet wird. ->Umkopieren!*/ | ||||
|  | ||||
| 	STATIC CHAR TheMask[MASK_LEN]; | ||||
| 	CHAR *excl, *at; | ||||
|  | ||||
| 	assert( Pattern ); | ||||
| 	assert( Pattern != NULL ); | ||||
|  | ||||
| 	excl = strchr( Pattern, '!' ); | ||||
| 	at = strchr( Pattern, '@' ); | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
|  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
|  * | ||||
|  * $Id: log.c,v 1.37 2002/09/09 22:55:21 alex Exp $ | ||||
|  * $Id: log.c,v 1.37.2.3 2002/11/04 19:18:39 alex Exp $ | ||||
|  * | ||||
|  * log.c: Logging-Funktionen | ||||
|  */ | ||||
| @@ -96,7 +96,7 @@ Log_InitErrorfile( VOID ) | ||||
| 	 * landen z.B. alle Ausgaben von assert()-Aufrufen. */ | ||||
|  | ||||
| 	/* Dateiname zusammen bauen */ | ||||
| 	sprintf( Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE, (INT32)getpid( )); | ||||
| 	sprintf( Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE, (LONG)getpid( )); | ||||
|  | ||||
| 	/* stderr umlenken */ | ||||
| 	fflush( stderr ); | ||||
| @@ -185,7 +185,7 @@ va_dcl | ||||
| 	else | ||||
| 	{ | ||||
| 		/* Syslog */ | ||||
| 		syslog( Level, msg ); | ||||
| 		syslog( Level, "%s", msg ); | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
|  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
|  * | ||||
|  * $Id: messages.h,v 1.46 2002/09/16 09:23:40 alex Exp $ | ||||
|  * $Id: messages.h,v 1.46.2.4 2002/11/22 22:55:05 alex Exp $ | ||||
|  * | ||||
|  * irc.h: IRC-Befehle (Header) | ||||
|  */ | ||||
| @@ -20,15 +20,15 @@ | ||||
|  | ||||
|  | ||||
| #define RPL_WELCOME_MSG			"001 %s :Welcome to the Internet Relay Network %s" | ||||
| #define RPL_YOURHOST_MSG		"002 %s :Your host is %s, running ngircd %s-%s/%s/%s" | ||||
| #define RPL_CREATED_MSG			"003 %s :This server was started %s" | ||||
| #define RPL_MYINFO_MSG			"004 %s :%s ngircd-%s %s %s" | ||||
| #define RPL_UMODEIS_MSG			"211 %s +%s" | ||||
| #define RPL_LUSERCLIENT_MSG		"251 %s :There are %d users and %d services on %d servers" | ||||
| #define RPL_LUSEROP_MSG			"252 %s %d :operator(s) online" | ||||
| #define	RPL_LUSERUNKNOWN_MSG		"253 %s %d :unknown connection(s)" | ||||
| #define RPL_LUSERCHANNELS_MSG		"254 %s %d :channels formed" | ||||
| #define	RPL_LUSERME_MSG			"255 %s :I have %d users, %d services and %d servers" | ||||
| #define RPL_YOURHOST_MSG		"002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)" | ||||
| #define RPL_CREATED_MSG			"003 %s :This server has been started %s" | ||||
| #define RPL_MYINFO_MSG			"004 %s %s ngircd-%s %s %s" | ||||
| #define RPL_UMODEIS_MSG			"221 %s +%s" | ||||
| #define RPL_LUSERCLIENT_MSG		"251 %s :There are %ld users and %ld services on %ld servers" | ||||
| #define RPL_LUSEROP_MSG			"252 %s %ld :operator(s) online" | ||||
| #define RPL_LUSERUNKNOWN_MSG		"253 %s %ld :unknown connection(s)" | ||||
| #define RPL_LUSERCHANNELS_MSG		"254 %s %ld :channels formed" | ||||
| #define RPL_LUSERME_MSG			"255 %s :I have %ld users, %ld services and %ld servers" | ||||
| #define RPL_ADMINME_MSG			"256 %s %s :Administrative info" | ||||
| #define RPL_ADMINLOC1_MSG		"257 %s :%s" | ||||
| #define RPL_ADMINLOC2_MSG		"258 %s :%s" | ||||
| @@ -46,7 +46,7 @@ | ||||
| #define RPL_WHOISIDLE_MSG		"317 %s %s %ld :seconds idle" | ||||
| #define RPL_ENDOFWHOIS_MSG		"318 %s %s :End of WHOIS list" | ||||
| #define RPL_WHOISCHANNELS_MSG		"319 %s %s :" | ||||
| #define RPL_LIST_MSG			"322 %s %s %d :%s" | ||||
| #define RPL_LIST_MSG			"322 %s %s %ld :%s" | ||||
| #define RPL_LISTEND_MSG			"323 %s :End of LIST" | ||||
| #define RPL_CHANNELMODEIS_MSG		"324 %s %s +%s" | ||||
| #define RPL_NOTOPIC_MSG			"331 %s %s :No topic is set" | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
|  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
|  * | ||||
|  * $Id: ngircd.c,v 1.54 2002/09/07 17:57:17 alex Exp $ | ||||
|  * $Id: ngircd.c,v 1.54.2.4 2002/11/24 15:25:25 alex Exp $ | ||||
|  * | ||||
|  * ngircd.c: Hier beginnt alles ;-) | ||||
|  */ | ||||
| @@ -29,6 +29,8 @@ | ||||
| #include <sys/stat.h> | ||||
| #include <sys/wait.h> | ||||
| #include <time.h> | ||||
| #include <pwd.h> | ||||
| #include <grp.h> | ||||
|  | ||||
| #include "resolve.h" | ||||
| #include "conn.h" | ||||
| @@ -57,8 +59,10 @@ LOCAL VOID Show_Help PARAMS(( VOID )); | ||||
| GLOBAL int | ||||
| main( int argc, const char *argv[] ) | ||||
| { | ||||
| 	struct passwd *pwd; | ||||
| 	struct group *grp; | ||||
| 	BOOLEAN ok, configtest = FALSE; | ||||
| 	INT32 pid, n; | ||||
| 	LONG pid, n; | ||||
| 	INT i; | ||||
|  | ||||
| 	umask( 0077 ); | ||||
| @@ -140,7 +144,7 @@ main( int argc, const char *argv[] ) | ||||
| 		{ | ||||
| 			/* Kurze Option */ | ||||
| 			 | ||||
| 			for( n = 1; n < (INT32)strlen( argv[i] ); n++ ) | ||||
| 			for( n = 1; n < (LONG)strlen( argv[i] ); n++ ) | ||||
| 			{ | ||||
| 				ok = FALSE; | ||||
| #ifdef DEBUG | ||||
| @@ -159,7 +163,7 @@ main( int argc, const char *argv[] ) | ||||
| 						NGIRCd_ConfFile[FNAME_LEN - 1] = '\0'; | ||||
|  | ||||
| 						/* zum uebernaechsten Parameter */ | ||||
| 						i++; n = strlen( argv[i] ); | ||||
| 						i++; n = (LONG)strlen( argv[i] ); | ||||
| 						ok = TRUE; | ||||
| 					} | ||||
| 				} | ||||
| @@ -227,7 +231,7 @@ main( int argc, const char *argv[] ) | ||||
| 		if( ! NGIRCd_NoDaemon ) | ||||
| 		{ | ||||
| 			/* Daemon im Hintergrund erzeugen */ | ||||
| 			pid = (INT32)fork( ); | ||||
| 			pid = (LONG)fork( ); | ||||
| 			if( pid > 0 ) | ||||
| 			{ | ||||
| 				/* "alter" Prozess */ | ||||
| @@ -275,8 +279,12 @@ main( int argc, const char *argv[] ) | ||||
| 				if( setuid( Conf_UID ) != 0 ) Log( LOG_ERR, "Can't change User-ID to %u: %s", Conf_UID, strerror( errno )); | ||||
| 			} | ||||
| 		} | ||||
| 		Log( LOG_INFO, "Running as user %ld, group %ld, with PID %ld.", (INT32)getuid( ), (INT32)getgid( ), (INT32)getpid( )); | ||||
| 		 | ||||
| 		/* User, Gruppe und Prozess-ID des Daemon ausgeben */ | ||||
| 		pwd = getpwuid( getuid( )); grp = getgrgid( getgid( )); | ||||
| 		Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", pwd ? pwd->pw_name : "unknown", (LONG)getuid( ), grp ? grp->gr_name : "unknown", (LONG)getgid( ), (LONG)getpid( )); | ||||
|  | ||||
| 		/* stderr in "Error-File" umlenken */ | ||||
| 		Log_InitErrorfile( ); | ||||
|  | ||||
| 		/* Signal-Handler initialisieren */ | ||||
| @@ -451,7 +459,7 @@ Initialize_Listen_Ports( VOID ) | ||||
| 	/* Ports, auf denen der Server Verbindungen entgegennehmen | ||||
| 	 * soll, initialisieren */ | ||||
| 	 | ||||
| 	UINT created, i; | ||||
| 	INT created, i; | ||||
|  | ||||
| 	created = 0; | ||||
| 	for( i = 0; i < Conf_ListenPorts_Count; i++ ) | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
|  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
|  * | ||||
|  * $Id: parse.c,v 1.41 2002/09/16 09:20:27 alex Exp $ | ||||
|  * $Id: parse.c,v 1.41.2.4 2002/11/29 10:59:51 alex Exp $ | ||||
|  * | ||||
|  * parse.c: Parsen der Client-Anfragen | ||||
|  */ | ||||
| @@ -101,8 +101,6 @@ Parse_Request( CONN_ID Idx, CHAR *Request ) | ||||
| 	} | ||||
| 	else start = Request; | ||||
|  | ||||
| 	if( ! Validate_Prefix( Idx, &req, &closed )) return ! closed; | ||||
|  | ||||
| 	/* Befehl */ | ||||
| 	ptr = strchr( start, ' ' ); | ||||
| 	if( ptr ) | ||||
| @@ -116,8 +114,6 @@ Parse_Request( CONN_ID Idx, CHAR *Request ) | ||||
| 	} | ||||
| 	req.command = start; | ||||
|  | ||||
| 	if( ! Validate_Command( Idx, &req, &closed )) return ! closed; | ||||
|  | ||||
| 	/* Argumente, Parameter */ | ||||
| 	if( ptr ) | ||||
| 	{ | ||||
| @@ -156,6 +152,9 @@ Parse_Request( CONN_ID Idx, CHAR *Request ) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* Daten validieren */ | ||||
| 	if( ! Validate_Prefix( Idx, &req, &closed )) return ! closed; | ||||
| 	if( ! Validate_Command( Idx, &req, &closed )) return ! closed; | ||||
| 	if( ! Validate_Args( Idx, &req, &closed )) return ! closed; | ||||
|  | ||||
| 	return Handle_Request( Idx, &req ); | ||||
| @@ -209,8 +208,8 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ) | ||||
| 	if( ! c ) | ||||
| 	{ | ||||
| 		/* im Prefix angegebener Client ist nicht bekannt */ | ||||
| 		Log( LOG_ERR, "Invalid prefix, client not known (connection %d)!?", Idx ); | ||||
| 		if( ! Conn_WriteStr( Idx, "ERROR :Invalid prefix, client not known!?" )) *Closed = TRUE; | ||||
| 		Log( LOG_ERR, "Invalid prefix \"%s\", client not known (connection %d, command %s)!?", Req->prefix, Idx, Req->command ); | ||||
| 		if( ! Conn_WriteStr( Idx, "ERROR :Invalid prefix \"%s\", client not known!?", Req->prefix )) *Closed = TRUE; | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| @@ -221,7 +220,7 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ) | ||||
| 	{ | ||||
| 		/* das angegebene Prefix ist aus dieser Richtung, also | ||||
| 		 * aus der gegebenen Connection, ungueltig! */ | ||||
| 		Log( LOG_ERR, "Spoofed prefix \"%s\" from \"%s\" (connection %d)!", Req->prefix, Client_Mask( Client_GetFromConn( Idx )), Idx ); | ||||
| 		Log( LOG_ERR, "Spoofed prefix \"%s\" from \"%s\" (connection %d, command %s)!", Req->prefix, Client_Mask( Client_GetFromConn( Idx )), Idx, Req->command ); | ||||
| 		Conn_Close( Idx, NULL, "Spoofed prefix", TRUE ); | ||||
| 		*Closed = TRUE; | ||||
| 		return FALSE; | ||||
| @@ -280,8 +279,8 @@ Handle_Request( CONN_ID Idx, REQUEST *Req ) | ||||
| 		else target = NULL; | ||||
| 		if( ! target ) | ||||
| 		{ | ||||
| 			if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code: \"%s\"", Req->argv[0] ); | ||||
| 			else Log( LOG_WARNING, "Unknown target for status code!" ); | ||||
| 			if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code %s: \"%s\"", Req->command, Req->argv[0] ); | ||||
| 			else Log( LOG_WARNING, "Unknown target for status code %s!", Req->command ); | ||||
| 			return TRUE; | ||||
| 		} | ||||
| 		if( target == Client_ThisServer( )) | ||||
| @@ -311,7 +310,7 @@ Handle_Request( CONN_ID Idx, REQUEST *Req ) | ||||
| 			else strcat( str, " :" ); | ||||
| 			strcat( str, Req->argv[i] ); | ||||
| 		} | ||||
| 		return IRC_WriteStrClientPrefix( target, prefix, str ); | ||||
| 		return IRC_WriteStrClientPrefix( target, prefix, "%s", str ); | ||||
| 	} | ||||
|  | ||||
| 	if( strcasecmp( Req->command, "PASS" ) == 0 ) return IRC_PASS( client, Req ); | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
| # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
| # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
| # | ||||
| # $Id: Makefile.am,v 1.3 2002/09/12 02:26:17 alex Exp $ | ||||
| # $Id: Makefile.am,v 1.3.2.2 2002/09/20 15:39:55 alex Exp $ | ||||
| # | ||||
|  | ||||
| AUTOMAKE_OPTIONS = ../portab/ansi2knr | ||||
| @@ -17,21 +17,24 @@ AUTOMAKE_OPTIONS = ../portab/ansi2knr | ||||
| INCLUDES = -I$(srcdir)/../portab | ||||
|  | ||||
| EXTRA_DIST = \ | ||||
| 	getpid.sh \ | ||||
| 	start-server.sh stop-server.sh tests.sh stress-server.sh \ | ||||
| 	connect-test.e channel-test.e mode-test.e \ | ||||
| 	stress-A.e stress-B.e check-idle.e \ | ||||
| 	ngircd-test.conf | ||||
|  | ||||
| clean-local: | ||||
| 	rm -rf logs tests *-test ngircd-test.log ngircd-test.motd ngircd-TEST procs.tmp  | ||||
| 	rm -rf logs tests *-test ngircd-test.log ngircd-test.motd \ | ||||
| 	 ngircd-TEST* procs.tmp  | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile Makefile.in | ||||
|  | ||||
| check_SCRIPTS = ngircd-TEST tests.sh | ||||
| check_SCRIPTS = ngircd-TEST-Binary tests.sh | ||||
|  | ||||
| ngircd-TEST: | ||||
| 	ln -s ../ngircd/ngircd ngircd-TEST | ||||
| ngircd-TEST-Binary: | ||||
| 	cp ../ngircd/ngircd ngircd-TEST | ||||
| 	[ -f getpid.sh ] || ln -s $(srcdir)/getpid.sh . | ||||
|  | ||||
| connect-test: tests.sh | ||||
| 	ln -s $(srcdir)/tests.sh connect-test | ||||
|   | ||||
							
								
								
									
										28
									
								
								src/testsuite/getpid.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										28
									
								
								src/testsuite/getpid.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| #!/bin/sh | ||||
| # ngIRCd Test Suite | ||||
| # $Id: getpid.sh,v 1.1.2.1 2002/09/20 15:19:55 alex Exp $ | ||||
|  | ||||
| # wurde ein Name uebergeben? | ||||
| [ $# -ne 1 ] && exit 1 | ||||
|  | ||||
| # Flags fuer "ps" ermitteln | ||||
| if [ `uname` = "FreeBSD" ]; then | ||||
|   PS_FLAGS=-a; PS_PIDCOL=1 | ||||
| else | ||||
|   PS_FLAGS=-f; PS_PIDCOL=2 | ||||
|   ps $PS_FLAGS > /dev/null 2>&1 | ||||
|   if [ $? -ne 0 ]; then PS_FLAGS=a; PS_PIDCOL=1; fi | ||||
| fi | ||||
|  | ||||
| # PID ermitteln | ||||
| ps $PS_FLAGS > procs.tmp | ||||
| pid=`cat procs.tmp | grep "$1" | awk "{ print \\\$$PS_PIDCOL }" | sort -n | head -n 1` | ||||
|  | ||||
| # ermittelte PID validieren | ||||
| [ "$pid" -gt 1 ] > /dev/null 2>&1 | ||||
| [ $? -ne 0 ] && exit 1 | ||||
|  | ||||
| echo $pid | ||||
| exit 0 | ||||
|  | ||||
| # -eof- | ||||
| @@ -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 | ||||
|   | ||||
| @@ -1,22 +1,32 @@ | ||||
| #!/bin/sh | ||||
| # ngIRCd Test Suite | ||||
| # $Id: start-server.sh,v 1.5 2002/09/16 09:53:16 alex Exp $ | ||||
| # $Id: start-server.sh,v 1.5.2.4 2002/10/03 16:13:38 alex Exp $ | ||||
|  | ||||
| [ -z "$srcdir" ] && srcdir=`dirname $0` | ||||
|  | ||||
| echo "      starting server ..." | ||||
|  | ||||
| rm -rf logs | ||||
| # alte Logfiles loeschen | ||||
| rm -rf logs *.log | ||||
|  | ||||
| # pruefen, ob getpid.sh gueltige PID's liefert. Wenn dem nicht so ist, | ||||
| # wird kein ngIRCd gestartet, da dieser ansonsten nicht mehr am Ende | ||||
| # des Testlaufs beendet werden koennte! | ||||
| ./getpid.sh make > /dev/null 2>&1 | ||||
| if [ $? -ne 0 ]; then | ||||
|   echo "      error: getpid.sh FAILED!" | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| # MOTD fuer Test-Server erzeugen | ||||
| echo "This is an ngIRCd Test Server" > ngircd-test.motd | ||||
|  | ||||
| # Test-Server starten ... | ||||
| ./ngircd-TEST -np -f ${srcdir}/ngircd-test.conf > ngircd-test.log 2>&1 & | ||||
| sleep 1 | ||||
|  | ||||
| PS_FLAGS=a; PS_PIDCOL=1 | ||||
| ps a > /dev/null 2>&1 | ||||
| if [ $? -ne 0 ]; then PS_FLAGS=-f; PS_PIDCOL=2; fi | ||||
|  | ||||
| ps $PS_FLAGS > procs.tmp | ||||
| pid=`cat procs.tmp | grep ngircd-TEST | awk "{ print \\\$$PS_PIDCOL }"` | ||||
| kill -0 $pid > /dev/null 2>&1 | ||||
| # validieren, dass Server laeuft | ||||
| pid=`./getpid.sh ngircd-TEST` | ||||
| [ -n "$pid" ] && kill -0 $pid > /dev/null 2>&1 || exit 1 | ||||
|  | ||||
| # -eof- | ||||
|   | ||||
| @@ -1,15 +1,17 @@ | ||||
| #!/bin/sh | ||||
| # ngIRCd Test Suite | ||||
| # $Id: stop-server.sh,v 1.4 2002/09/16 09:53:16 alex Exp $ | ||||
| # $Id: stop-server.sh,v 1.4.2.4 2002/10/03 16:13:38 alex Exp $ | ||||
|  | ||||
| [ -z "$srcdir" ] && srcdir=`dirname $0` | ||||
|  | ||||
| echo "      stopping server ..." | ||||
|  | ||||
| PS_FLAGS=a; PS_PIDCOL=1 | ||||
| ps a > /dev/null 2>&1 | ||||
| if [ $? -ne 0 ]; then PS_FLAGS=-f; PS_PIDCOL=2; fi | ||||
| # Test-Server stoppen ... | ||||
| pid=`./getpid.sh ngircd-TEST` | ||||
| [ -n "$pid" ] && kill $pid > /dev/null 2>&1 || exit 1 | ||||
| sleep 1 | ||||
|  | ||||
| ps $PS_FLAGS > procs.tmp | ||||
| pid=`cat procs.tmp | grep ngircd-TEST | awk "{ print \\\$$PS_PIDCOL }"` | ||||
| kill $pid > /dev/null 2>&1 | ||||
| # jetzt duerfte der Prozess nicht mehr laufen | ||||
| kill -0 $pid > /dev/null 2>&1 && exit 1 || exit 0 | ||||
|  | ||||
| # -eof- | ||||
|   | ||||
| @@ -1,9 +1,10 @@ | ||||
| #!/bin/sh | ||||
| # ngIRCd Test Suite | ||||
| # $Id: stress-server.sh,v 1.4 2002/09/16 09:54:17 alex Exp $ | ||||
| # $Id: stress-server.sh,v 1.4.2.2 2002/10/03 16:13:38 alex Exp $ | ||||
|  | ||||
| if [ `uname` = "Darwin" -o `uname` = "IRIX" -o `uname` = "IRIX64" ]; then CLIENTS=5 | ||||
| else CLIENTS=50; fi | ||||
| [ -z "$srcdir" ] && srcdir=`dirname $0` | ||||
|  | ||||
| [ $1 -gt 0 ] 2> /dev/null && CLIENTS=$1 || CLIENTS=5 | ||||
|  | ||||
| name=`basename $0` | ||||
| test=`echo ${name} | cut -d '.' -f 1` | ||||
|   | ||||
		Reference in New Issue
	
	Block a user