mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-10-31 05:52:59 +00:00 
			
		
		
		
	- neues Source-Modul "irc-info"; neuer Befehl STATS.
This commit is contained in:
		| @@ -146,6 +146,7 @@ | |||||||
| 				F5BEF12E02A1169C01A85B03, | 				F5BEF12E02A1169C01A85B03, | ||||||
| 				F5BEF13302A12AFE01A85B03, | 				F5BEF13302A12AFE01A85B03, | ||||||
| 				F5E9448502C9F49D01A85B04, | 				F5E9448502C9F49D01A85B04, | ||||||
|  | 				F5D5CC9403990FED0155B873, | ||||||
| 			); | 			); | ||||||
| 			isa = PBXHeadersBuildPhase; | 			isa = PBXHeadersBuildPhase; | ||||||
| 			runOnlyForDeploymentPostprocessing = 0; | 			runOnlyForDeploymentPostprocessing = 0; | ||||||
| @@ -174,6 +175,7 @@ | |||||||
| 				F5BEF12F02A1169C01A85B03, | 				F5BEF12F02A1169C01A85B03, | ||||||
| 				F5BEF13502A24F1001A85B03, | 				F5BEF13502A24F1001A85B03, | ||||||
| 				F5E9448602C9F49D01A85B04, | 				F5E9448602C9F49D01A85B04, | ||||||
|  | 				F5D5CC9603990FFA0155B873, | ||||||
| 			); | 			); | ||||||
| 			isa = PBXSourcesBuildPhase; | 			isa = PBXSourcesBuildPhase; | ||||||
| 			runOnlyForDeploymentPostprocessing = 0; | 			runOnlyForDeploymentPostprocessing = 0; | ||||||
| @@ -582,6 +584,8 @@ | |||||||
| 				F51D180301C8FDD001E11C2E, | 				F51D180301C8FDD001E11C2E, | ||||||
| 				F57C888D02328D7201A85B04, | 				F57C888D02328D7201A85B04, | ||||||
| 				F57C888E02328D7201A85B04, | 				F57C888E02328D7201A85B04, | ||||||
|  | 				F5D5CC9503990FFA0155B873, | ||||||
|  | 				F5D5CC9303990FED0155B873, | ||||||
| 				F51DBB1B022D9D8F01A85B04, | 				F51DBB1B022D9D8F01A85B04, | ||||||
| 				F51DBB1C022D9D8F01A85B04, | 				F51DBB1C022D9D8F01A85B04, | ||||||
| 				F51DBB17022D995501A85B04, | 				F51DBB17022D995501A85B04, | ||||||
| @@ -1172,6 +1176,28 @@ | |||||||
| 			path = "en/sample-ngircd.conf"; | 			path = "en/sample-ngircd.conf"; | ||||||
| 			refType = 4; | 			refType = 4; | ||||||
| 		}; | 		}; | ||||||
|  | 		F5D5CC9303990FED0155B873 = { | ||||||
|  | 			isa = PBXFileReference; | ||||||
|  | 			path = "irc-info.h"; | ||||||
|  | 			refType = 4; | ||||||
|  | 		}; | ||||||
|  | 		F5D5CC9403990FED0155B873 = { | ||||||
|  | 			fileRef = F5D5CC9303990FED0155B873; | ||||||
|  | 			isa = PBXBuildFile; | ||||||
|  | 			settings = { | ||||||
|  | 			}; | ||||||
|  | 		}; | ||||||
|  | 		F5D5CC9503990FFA0155B873 = { | ||||||
|  | 			isa = PBXFileReference; | ||||||
|  | 			path = "irc-info.c"; | ||||||
|  | 			refType = 4; | ||||||
|  | 		}; | ||||||
|  | 		F5D5CC9603990FFA0155B873 = { | ||||||
|  | 			fileRef = F5D5CC9503990FFA0155B873; | ||||||
|  | 			isa = PBXBuildFile; | ||||||
|  | 			settings = { | ||||||
|  | 			}; | ||||||
|  | 		}; | ||||||
| 		F5E9447B02C9EE0E01A85B04 = { | 		F5E9447B02C9EE0E01A85B04 = { | ||||||
| 			children = ( | 			children = ( | ||||||
| 				F5E9448002C9EE4901A85B04, | 				F5E9448002C9EE4901A85B04, | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
| # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||||
| # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||||
| # | # | ||||||
| # $Id: Makefile.am,v 1.29 2002/10/08 18:30:03 alex Exp $ | # $Id: Makefile.am,v 1.30 2002/11/30 17:39:56 alex Exp $ | ||||||
| # | # | ||||||
|  |  | ||||||
| AUTOMAKE_OPTIONS = ../portab/ansi2knr | AUTOMAKE_OPTIONS = ../portab/ansi2knr | ||||||
| @@ -21,16 +21,16 @@ LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN | |||||||
| sbin_PROGRAMS = ngircd | sbin_PROGRAMS = ngircd | ||||||
|  |  | ||||||
| ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c hash.c irc.c \ | ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c hash.c irc.c \ | ||||||
| 	irc-channel.c irc-login.c irc-mode.c irc-op.c irc-oper.c irc-server.c \ | 	irc-channel.c irc-info.c irc-login.c irc-mode.c irc-op.c irc-oper.c \ | ||||||
| 	irc-write.c lists.c log.c match.c parse.c resolve.c tool.c | 	irc-server.c irc-write.c lists.c log.c match.c parse.c resolve.c tool.c | ||||||
|  |  | ||||||
| ngircd_LDFLAGS = -L../portab | ngircd_LDFLAGS = -L../portab | ||||||
|  |  | ||||||
| ngircd_LDADD = -lngportab | ngircd_LDADD = -lngportab | ||||||
|  |  | ||||||
| noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h hash.h irc.h \ | noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h hash.h irc.h \ | ||||||
| 	irc-channel.h irc-login.h irc-mode.h irc-op.h irc-oper.h irc-server.h \ | 	irc-channel.h irc-info.h irc-login.h irc-mode.h irc-op.h irc-oper.h \ | ||||||
| 	irc-write.h lists.h log.h match.h parse.h resolve.h tool.h \ | 	irc-server.h irc-write.h lists.h log.h match.h parse.h resolve.h tool.h \ | ||||||
| 	messages.h defines.h | 	messages.h defines.h | ||||||
|  |  | ||||||
| clean-local: | clean-local: | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste |  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||||
|  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. |  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||||
|  * |  * | ||||||
|  * $Id: irc-channel.c,v 1.16 2002/11/30 15:04:57 alex Exp $ |  * $Id: irc-channel.c,v 1.17 2002/11/30 17:39:56 alex Exp $ | ||||||
|  * |  * | ||||||
|  * irc-channel.c: IRC-Channel-Befehle |  * irc-channel.c: IRC-Channel-Befehle | ||||||
|  */ |  */ | ||||||
| @@ -30,7 +30,7 @@ | |||||||
| #include "match.h" | #include "match.h" | ||||||
| #include "messages.h" | #include "messages.h" | ||||||
| #include "parse.h" | #include "parse.h" | ||||||
| #include "irc.h" | #include "irc-info.h" | ||||||
| #include "irc-write.h" | #include "irc-write.h" | ||||||
|  |  | ||||||
| #include "exp.h" | #include "exp.h" | ||||||
|   | |||||||
							
								
								
									
										833
									
								
								src/ngircd/irc-info.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										833
									
								
								src/ngircd/irc-info.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,833 @@ | |||||||
|  | /* | ||||||
|  |  * 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: irc-info.c,v 1.1 2002/11/30 17:39:56 alex Exp $ | ||||||
|  |  * | ||||||
|  |  * irc-info.c: IRC-Info-Befehle | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #include "portab.h" | ||||||
|  |  | ||||||
|  | #include "imp.h" | ||||||
|  | #include <assert.h> | ||||||
|  | #include <errno.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
|  | #include "ngircd.h" | ||||||
|  | #include "conn.h" | ||||||
|  | #include "client.h" | ||||||
|  | #include "channel.h" | ||||||
|  | #include "resolve.h" | ||||||
|  | #include "conf.h" | ||||||
|  | #include "defines.h" | ||||||
|  | #include "log.h" | ||||||
|  | #include "messages.h" | ||||||
|  | #include "tool.h" | ||||||
|  | #include "parse.h" | ||||||
|  | #include "irc-write.h" | ||||||
|  |  | ||||||
|  | #include "exp.h" | ||||||
|  | #include "irc-info.h" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_ADMIN(CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	CLIENT *target, *prefix; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	/* Falsche Anzahl Parameter? */ | ||||||
|  | 	if(( Req->argc > 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
|  | 	/* Ziel suchen */ | ||||||
|  | 	if( Req->argc == 1 ) target = Client_Search( Req->argv[0] ); | ||||||
|  | 	else target = Client_ThisServer( ); | ||||||
|  |  | ||||||
|  | 	/* Prefix ermitteln */ | ||||||
|  | 	if( Client_Type( Client ) == CLIENT_SERVER ) prefix = Client_Search( Req->prefix ); | ||||||
|  | 	else prefix = Client; | ||||||
|  | 	if( ! prefix ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix ); | ||||||
|  |  | ||||||
|  | 	/* An anderen Server weiterleiten? */ | ||||||
|  | 	if( target != Client_ThisServer( )) | ||||||
|  | 	{ | ||||||
|  | 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] ); | ||||||
|  |  | ||||||
|  | 		/* forwarden */ | ||||||
|  | 		IRC_WriteStrClientPrefix( target, prefix, "ADMIN %s", Req->argv[0] ); | ||||||
|  | 		return CONNECTED; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* mit Versionsinfo antworten */ | ||||||
|  | 	if( ! IRC_WriteStrClient( Client, RPL_ADMINME_MSG, Client_ID( prefix ), Conf_ServerName )) return DISCONNECTED; | ||||||
|  | 	if( ! IRC_WriteStrClient( Client, RPL_ADMINLOC1_MSG, Client_ID( prefix ), Conf_ServerAdmin1 )) return DISCONNECTED; | ||||||
|  | 	if( ! IRC_WriteStrClient( Client, RPL_ADMINLOC2_MSG, Client_ID( prefix ), Conf_ServerAdmin2 )) return DISCONNECTED; | ||||||
|  | 	if( ! IRC_WriteStrClient( Client, RPL_ADMINEMAIL_MSG, Client_ID( prefix ), Conf_ServerAdminMail )) return DISCONNECTED; | ||||||
|  |  | ||||||
|  | 	return CONNECTED; | ||||||
|  | } /* IRC_ADMIN */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_ISON( CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	CHAR rpl[COMMAND_LEN]; | ||||||
|  | 	CLIENT *c; | ||||||
|  | 	CHAR *ptr; | ||||||
|  | 	INT i; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	/* Falsche Anzahl Parameter? */ | ||||||
|  | 	if(( Req->argc < 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( 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_Search( ptr ); | ||||||
|  | 			if( c && ( Client_Type( c ) == 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, "%s", rpl, Client_ID( Client ) ); | ||||||
|  | } /* IRC_ISON */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_LINKS( CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	CLIENT *target, *from, *c; | ||||||
|  | 	CHAR *mask; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	/* Falsche Anzahl Parameter? */ | ||||||
|  | 	if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
|  | 	/* Server-Mask ermitteln */ | ||||||
|  | 	if( Req->argc > 0 ) mask = Req->argv[Req->argc - 1]; | ||||||
|  | 	else mask = "*"; | ||||||
|  |  | ||||||
|  | 	/* Absender ermitteln */ | ||||||
|  | 	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); | ||||||
|  | 	else from = Client; | ||||||
|  | 	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); | ||||||
|  |  | ||||||
|  | 	/* An anderen Server forwarden? */ | ||||||
|  | 	if( Req->argc == 2 ) | ||||||
|  | 	{ | ||||||
|  | 		target = Client_Search( Req->argv[0] ); | ||||||
|  | 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] ); | ||||||
|  | 		else if( target != Client_ThisServer( )) return IRC_WriteStrClientPrefix( target, from, "LINKS %s %s", Req->argv[0], Req->argv[1] ); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* Wer ist der Absender? */ | ||||||
|  | 	if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix ); | ||||||
|  | 	else target = Client; | ||||||
|  | 	if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); | ||||||
|  |  | ||||||
|  | 	c = Client_First( ); | ||||||
|  | 	while( c ) | ||||||
|  | 	{ | ||||||
|  | 		if( Client_Type( c ) == CLIENT_SERVER ) | ||||||
|  | 		{ | ||||||
|  | 			if( ! IRC_WriteStrClient( target, RPL_LINKS_MSG, Client_ID( target ), Client_ID( c ), Client_ID( Client_TopServer( c ) ? Client_TopServer( c ) : Client_ThisServer( )), Client_Hops( c ), Client_Info( c ))) return DISCONNECTED; | ||||||
|  | 		} | ||||||
|  | 		c = Client_Next( c ); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return IRC_WriteStrClient( target, RPL_ENDOFLINKS_MSG, Client_ID( target ), mask ); | ||||||
|  | } /* IRC_LINKS */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_LUSERS( CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	CLIENT *target, *from; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	/* Falsche Anzahl Parameter? */ | ||||||
|  | 	if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
|  | 	/* Absender ermitteln */ | ||||||
|  | 	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); | ||||||
|  | 	else from = Client; | ||||||
|  | 	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); | ||||||
|  |  | ||||||
|  | 	/* An anderen Server forwarden? */ | ||||||
|  | 	if( Req->argc == 2 ) | ||||||
|  | 	{ | ||||||
|  | 		target = Client_Search( Req->argv[1] ); | ||||||
|  | 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] ); | ||||||
|  | 		else if( target != Client_ThisServer( )) return IRC_WriteStrClientPrefix( target, from, "LUSERS %s %s", Req->argv[0], Req->argv[1] ); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* Wer ist der Absender? */ | ||||||
|  | 	if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix ); | ||||||
|  | 	else target = Client; | ||||||
|  | 	if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); | ||||||
|  |  | ||||||
|  | 	IRC_Send_LUSERS( target ); | ||||||
|  |  | ||||||
|  | 	return CONNECTED; | ||||||
|  | } /* IRC_LUSERS */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_MOTD( CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	CLIENT *from, *target; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	/* Falsche Anzahl Parameter? */ | ||||||
|  | 	if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
|  | 	/* From aus Prefix ermitteln */ | ||||||
|  | 	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); | ||||||
|  | 	else from = Client; | ||||||
|  | 	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix ); | ||||||
|  |  | ||||||
|  | 	if( Req->argc == 1 ) | ||||||
|  | 	{ | ||||||
|  | 		/* an anderen Server forwarden */ | ||||||
|  | 		target = Client_Search( Req->argv[0] ); | ||||||
|  | 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] ); | ||||||
|  |  | ||||||
|  | 		if( target != Client_ThisServer( )) | ||||||
|  | 		{ | ||||||
|  | 			/* Ok, anderer Server ist das Ziel: forwarden */ | ||||||
|  | 			return IRC_WriteStrClientPrefix( target, from, "MOTD %s", Req->argv[0] ); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return IRC_Show_MOTD( from ); | ||||||
|  | } /* IRC_MOTD */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_NAMES( CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	CHAR rpl[COMMAND_LEN], *ptr; | ||||||
|  | 	CLIENT *target, *from, *c; | ||||||
|  | 	CHANNEL *chan; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	/* Falsche Anzahl Parameter? */ | ||||||
|  | 	if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
|  | 	/* From aus Prefix ermitteln */ | ||||||
|  | 	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); | ||||||
|  | 	else from = Client; | ||||||
|  | 	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix ); | ||||||
|  |  | ||||||
|  | 	if( Req->argc == 2 ) | ||||||
|  | 	{ | ||||||
|  | 		/* an anderen Server forwarden */ | ||||||
|  | 		target = Client_Search( Req->argv[1] ); | ||||||
|  | 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] ); | ||||||
|  |  | ||||||
|  | 		if( target != Client_ThisServer( )) | ||||||
|  | 		{ | ||||||
|  | 			/* Ok, anderer Server ist das Ziel: forwarden */ | ||||||
|  | 			return IRC_WriteStrClientPrefix( target, from, "NAMES %s :%s", Req->argv[0], Req->argv[1] ); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if( Req->argc > 0 ) | ||||||
|  | 	{ | ||||||
|  | 		/* bestimmte Channels durchgehen */ | ||||||
|  | 		ptr = strtok( Req->argv[0], "," ); | ||||||
|  | 		while( ptr ) | ||||||
|  | 		{ | ||||||
|  | 			chan = Channel_Search( ptr ); | ||||||
|  | 			if( chan ) | ||||||
|  | 			{ | ||||||
|  | 				/* Namen ausgeben */ | ||||||
|  | 				if( ! IRC_Send_NAMES( from, chan )) return DISCONNECTED; | ||||||
|  | 			} | ||||||
|  | 			if( ! IRC_WriteStrClient( from, RPL_ENDOFNAMES_MSG, Client_ID( from ), ptr )) return DISCONNECTED; | ||||||
|  |  | ||||||
|  | 			/* naechsten Namen ermitteln */ | ||||||
|  | 			ptr = strtok( NULL, "," ); | ||||||
|  | 		} | ||||||
|  | 		return CONNECTED; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* alle Channels durchgehen */ | ||||||
|  | 	chan = Channel_First( ); | ||||||
|  | 	while( chan ) | ||||||
|  | 	{ | ||||||
|  | 		/* Namen ausgeben */ | ||||||
|  | 		if( ! IRC_Send_NAMES( from, chan )) return DISCONNECTED; | ||||||
|  |  | ||||||
|  | 		/* naechster Channel */ | ||||||
|  | 		chan = Channel_Next( chan ); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* Nun noch alle Clients ausgeben, die in keinem Channel sind */ | ||||||
|  | 	c = Client_First( ); | ||||||
|  | 	sprintf( rpl, RPL_NAMREPLY_MSG, Client_ID( from ), "*", "*" ); | ||||||
|  | 	while( c ) | ||||||
|  | 	{ | ||||||
|  | 		if(( Client_Type( c ) == CLIENT_USER ) && ( Channel_FirstChannelOf( c ) == NULL ) && ( ! strchr( Client_Modes( c ), 'i' ))) | ||||||
|  | 		{ | ||||||
|  | 			/* Okay, das ist ein User: anhaengen */ | ||||||
|  | 			if( rpl[strlen( rpl ) - 1] != ':' ) strcat( rpl, " " ); | ||||||
|  | 			strcat( rpl, Client_ID( c )); | ||||||
|  |  | ||||||
|  | 			if( strlen( rpl ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 )) | ||||||
|  | 			{ | ||||||
|  | 				/* Zeile wird zu lang: senden! */ | ||||||
|  | 				if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED; | ||||||
|  | 				sprintf( rpl, RPL_NAMREPLY_MSG, Client_ID( from ), "*", "*" ); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		/* naechster Client */ | ||||||
|  | 		c = Client_Next( c ); | ||||||
|  | 	} | ||||||
|  | 	if( rpl[strlen( rpl ) - 1] != ':') | ||||||
|  | 	{ | ||||||
|  | 		/* es wurden User gefunden */ | ||||||
|  | 		if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return IRC_WriteStrClient( from, RPL_ENDOFNAMES_MSG, Client_ID( from ), "*" ); | ||||||
|  | } /* IRC_NAMES */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_STATS( CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	CLIENT *from, *target; | ||||||
|  | 	CHAR query; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	/* Falsche Anzahl Parameter? */ | ||||||
|  | 	if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
|  | 	/* From aus Prefix ermitteln */ | ||||||
|  | 	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); | ||||||
|  | 	else from = Client; | ||||||
|  | 	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix ); | ||||||
|  |  | ||||||
|  | 	if( Req->argc == 2 ) | ||||||
|  | 	{ | ||||||
|  | 		/* an anderen Server forwarden */ | ||||||
|  | 		target = Client_Search( Req->argv[0] ); | ||||||
|  | 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] ); | ||||||
|  |  | ||||||
|  | 		if( target != Client_ThisServer( )) | ||||||
|  | 		{ | ||||||
|  | 			/* Ok, anderer Server ist das Ziel: forwarden */ | ||||||
|  | 			return IRC_WriteStrClientPrefix( target, from, "STATS %s", Req->argv[0], Req->argv[1] ); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if( Req->argc > 0 ) query = Req->argv[0][0] ? Req->argv[0][0] : '*'; | ||||||
|  | 	else query = '*'; | ||||||
|  |  | ||||||
|  | 	return IRC_WriteStrClient( from, RPL_ENDOFSTATS_MSG, Client_ID( from ), query ); | ||||||
|  | } /* IRC_STATS */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_TIME( CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	CLIENT *from, *target; | ||||||
|  | 	CHAR t_str[64]; | ||||||
|  | 	time_t t; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	/* Falsche Anzahl Parameter? */ | ||||||
|  | 	if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
|  | 	/* From aus Prefix ermitteln */ | ||||||
|  | 	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); | ||||||
|  | 	else from = Client; | ||||||
|  | 	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix ); | ||||||
|  |  | ||||||
|  | 	if( Req->argc == 1 ) | ||||||
|  | 	{ | ||||||
|  | 		/* an anderen Server forwarden */ | ||||||
|  | 		target = Client_Search( Req->argv[0] ); | ||||||
|  | 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] ); | ||||||
|  |  | ||||||
|  | 		if( target != Client_ThisServer( )) | ||||||
|  | 		{ | ||||||
|  | 			/* Ok, anderer Server ist das Ziel: forwarden */ | ||||||
|  | 			return IRC_WriteStrClientPrefix( target, from, "TIME %s", Req->argv[0] ); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	t = time( NULL ); | ||||||
|  | 	(VOID)strftime( t_str, 60, "%A %B %d %Y -- %H:%M %z", localtime( &t )); | ||||||
|  | 	return IRC_WriteStrClient( from, RPL_TIME_MSG, Client_ID( from ), Client_ID( Client_ThisServer( )), t_str ); | ||||||
|  | } /* IRC_TIME */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_USERHOST( CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	CHAR rpl[COMMAND_LEN]; | ||||||
|  | 	CLIENT *c; | ||||||
|  | 	INT max, i; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	/* Falsche Anzahl Parameter? */ | ||||||
|  | 	if(( Req->argc < 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( 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_Search( Req->argv[i] ); | ||||||
|  | 		if( c && ( Client_Type( c ) == CLIENT_USER )) | ||||||
|  | 		{ | ||||||
|  | 			/* Dieser Nick ist "online" */ | ||||||
|  | 			strcat( rpl, Client_ID( c )); | ||||||
|  | 			if( Client_HasMode( c, 'o' )) strcat( rpl, "*" ); | ||||||
|  | 			strcat( rpl, "=" ); | ||||||
|  | 			if( Client_HasMode( c, 'a' )) strcat( rpl, "-" ); | ||||||
|  | 			else strcat( rpl, "+" ); | ||||||
|  | 			strcat( rpl, Client_User( c )); | ||||||
|  | 			strcat( rpl, "@" ); | ||||||
|  | 			strcat( rpl, Client_Hostname( c )); | ||||||
|  | 			strcat( rpl, " " ); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0'; | ||||||
|  |  | ||||||
|  | 	return IRC_WriteStrClient( Client, "%s", rpl, Client_ID( Client ) ); | ||||||
|  | } /* IRC_USERHOST */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_VERSION( CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	CLIENT *target, *prefix; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	/* Falsche Anzahl Parameter? */ | ||||||
|  | 	if(( Req->argc > 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
|  | 	/* Ziel suchen */ | ||||||
|  | 	if( Req->argc == 1 ) target = Client_Search( Req->argv[0] ); | ||||||
|  | 	else target = Client_ThisServer( ); | ||||||
|  |  | ||||||
|  | 	/* Prefix ermitteln */ | ||||||
|  | 	if( Client_Type( Client ) == CLIENT_SERVER ) prefix = Client_Search( Req->prefix ); | ||||||
|  | 	else prefix = Client; | ||||||
|  | 	if( ! prefix ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix ); | ||||||
|  |  | ||||||
|  | 	/* An anderen Server weiterleiten? */ | ||||||
|  | 	if( target != Client_ThisServer( )) | ||||||
|  | 	{ | ||||||
|  | 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] ); | ||||||
|  |  | ||||||
|  | 		/* forwarden */ | ||||||
|  | 		IRC_WriteStrClientPrefix( target, prefix, "VERSION %s", Req->argv[0] ); | ||||||
|  | 		return CONNECTED; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* mit Versionsinfo antworten */ | ||||||
|  | 	return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE, VERSION, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( )); | ||||||
|  | } /* IRC_VERSION */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_WHO( CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	BOOLEAN ok, only_ops; | ||||||
|  | 	CHAR flags[8], *ptr; | ||||||
|  | 	CL2CHAN *cl2chan; | ||||||
|  | 	CHANNEL *chan; | ||||||
|  | 	CLIENT *c; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	/* Falsche Anzahl Parameter? */ | ||||||
|  | 	if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
|  | 	only_ops = FALSE; | ||||||
|  | 	chan = NULL; | ||||||
|  |  | ||||||
|  | 	if( Req->argc == 2 ) | ||||||
|  | 	{ | ||||||
|  | 		/* Nur OPs anzeigen? */ | ||||||
|  | 		if( strcmp( Req->argv[1], "o" ) == 0 ) only_ops = TRUE; | ||||||
|  | #ifdef STRICT_RFC | ||||||
|  | 		else return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  | #endif | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if( Req->argc >= 1 ) | ||||||
|  | 	{ | ||||||
|  | 		/* wurde ein Channel oder Nick-Mask angegeben? */ | ||||||
|  | 		chan = Channel_Search( Req->argv[0] ); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if( chan ) | ||||||
|  | 	{ | ||||||
|  | 		/* User eines Channels ausgeben */ | ||||||
|  | 		if( ! IRC_Send_WHO( Client, chan, only_ops )) return DISCONNECTED; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	c = Client_First( ); | ||||||
|  | 	while( c ) | ||||||
|  | 	{ | ||||||
|  | 		if(( Client_Type( c ) == CLIENT_USER ) && ( ! strchr( Client_Modes( c ), 'i' ))) | ||||||
|  | 		{ | ||||||
|  | 			ok = FALSE; | ||||||
|  | 			if( Req->argc == 0 ) ok = TRUE; | ||||||
|  | 			else | ||||||
|  | 			{ | ||||||
|  | 				if( strcasecmp( Req->argv[0], Client_ID( c )) == 0 ) ok = TRUE; | ||||||
|  | 				else if( strcmp( Req->argv[0], "0" ) == 0 ) ok = TRUE; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			if( ok && (( ! only_ops ) || ( strchr( Client_Modes( c ), 'o' )))) | ||||||
|  | 			{ | ||||||
|  | 				/* Flags zusammenbasteln */ | ||||||
|  | 				strcpy( flags, "H" ); | ||||||
|  | 				if( strchr( Client_Modes( c ), 'o' )) strcat( flags, "*" ); | ||||||
|  |  | ||||||
|  | 				/* ausgeben */ | ||||||
|  | 				cl2chan = Channel_FirstChannelOf( c ); | ||||||
|  | 				if( cl2chan ) ptr = Channel_Name( Channel_GetChannel( cl2chan )); | ||||||
|  | 				else ptr = "*"; | ||||||
|  | 				if( ! IRC_WriteStrClient( Client, RPL_WHOREPLY_MSG, Client_ID( Client ), ptr, Client_User( c ), Client_Hostname( c ), Client_ID( Client_Introducer( c )), Client_ID( c ), flags, Client_Hops( c ), Client_Info( c ))) return DISCONNECTED; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		/* naechster Client */ | ||||||
|  | 		c = Client_Next( c ); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if( chan ) return IRC_WriteStrClient( Client, RPL_ENDOFWHO_MSG, Client_ID( Client ), Channel_Name( chan )); | ||||||
|  | 	else if( Req->argc == 0 ) return IRC_WriteStrClient( Client, RPL_ENDOFWHO_MSG, Client_ID( Client ), "*" ); | ||||||
|  | 	else return IRC_WriteStrClient( Client, RPL_ENDOFWHO_MSG, Client_ID( Client ), Req->argv[0] ); | ||||||
|  | } /* IRC_WHO */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_WHOIS( CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	CLIENT *from, *target, *c; | ||||||
|  | 	CHAR str[LINE_LEN + 1], *ptr = NULL; | ||||||
|  | 	CL2CHAN *cl2chan; | ||||||
|  | 	CHANNEL *chan; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	/* Falsche Anzahl Parameter? */ | ||||||
|  | 	if(( Req->argc < 1 ) || ( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
|  | 	/* Client suchen */ | ||||||
|  | 	c = Client_Search( Req->argv[Req->argc - 1] ); | ||||||
|  | 	if(( ! c ) || ( Client_Type( c ) != CLIENT_USER )) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[Req->argc - 1] ); | ||||||
|  |  | ||||||
|  | 	/* Empfaenger des WHOIS suchen */ | ||||||
|  | 	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); | ||||||
|  | 	else from = Client; | ||||||
|  | 	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); | ||||||
|  |  | ||||||
|  | 	/* Forwarden an anderen Server? */ | ||||||
|  | 	if( Req->argc > 1 ) | ||||||
|  | 	{ | ||||||
|  | 		/* angegebenen Ziel-Server suchen */ | ||||||
|  | 		target = Client_Search( Req->argv[1] ); | ||||||
|  | 		if( ! target ) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( from ), Req->argv[1] ); | ||||||
|  | 		ptr = Req->argv[1]; | ||||||
|  | 	} | ||||||
|  | 	else target = Client_ThisServer( ); | ||||||
|  |  | ||||||
|  | 	assert( target != NULL ); | ||||||
|  |  | ||||||
|  | 	if(( Client_NextHop( target ) != Client_ThisServer( )) && ( Client_Type( Client_NextHop( target )) == CLIENT_SERVER )) return IRC_WriteStrClientPrefix( target, from, "WHOIS %s :%s", Req->argv[0], ptr ); | ||||||
|  |  | ||||||
|  | 	/* Nick, User und Name */ | ||||||
|  | 	if( ! IRC_WriteStrClient( from, RPL_WHOISUSER_MSG, Client_ID( from ), Client_ID( c ), Client_User( c ), Client_Hostname( c ), Client_Info( c ))) return DISCONNECTED; | ||||||
|  |  | ||||||
|  | 	/* Server */ | ||||||
|  | 	if( ! IRC_WriteStrClient( from, RPL_WHOISSERVER_MSG, Client_ID( from ), Client_ID( c ), Client_ID( Client_Introducer( c )), Client_Info( Client_Introducer( c )))) return DISCONNECTED; | ||||||
|  |  | ||||||
|  | 	/* Channels */ | ||||||
|  | 	sprintf( str, RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c )); | ||||||
|  | 	cl2chan = Channel_FirstChannelOf( c ); | ||||||
|  | 	while( cl2chan ) | ||||||
|  | 	{ | ||||||
|  | 		chan = Channel_GetChannel( cl2chan ); | ||||||
|  | 		assert( chan != NULL ); | ||||||
|  |  | ||||||
|  | 		/* Channel-Name anhaengen */ | ||||||
|  | 		if( str[strlen( str ) - 1] != ':' ) strcat( str, " " ); | ||||||
|  | 		if( strchr( Channel_UserModes( chan, c ), 'o' )) strcat( str, "@" ); | ||||||
|  | 		else if( strchr( Channel_UserModes( chan, c ), 'v' )) strcat( str, "+" ); | ||||||
|  | 		strcat( str, Channel_Name( chan )); | ||||||
|  |  | ||||||
|  | 		if( strlen( str ) > ( LINE_LEN - CHANNEL_NAME_LEN - 4 )) | ||||||
|  | 		{ | ||||||
|  | 			/* Zeile wird zu lang: senden! */ | ||||||
|  | 			if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; | ||||||
|  | 			sprintf( str, RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c )); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		/* naechstes Mitglied suchen */ | ||||||
|  | 		cl2chan = Channel_NextChannelOf( c, cl2chan ); | ||||||
|  | 	} | ||||||
|  | 	if( str[strlen( str ) - 1] != ':') | ||||||
|  | 	{ | ||||||
|  | 		/* Es sind noch Daten da, die gesendet werden muessen */ | ||||||
|  | 		if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* IRC-Operator? */ | ||||||
|  | 	if( Client_HasMode( c, 'o' )) | ||||||
|  | 	{ | ||||||
|  | 		if( ! IRC_WriteStrClient( from, RPL_WHOISOPERATOR_MSG, Client_ID( from ), Client_ID( c ))) return DISCONNECTED; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* Idle (nur lokale Clients) */ | ||||||
|  | 	if( Client_Conn( c ) > NONE ) | ||||||
|  | 	{ | ||||||
|  | 		if( ! IRC_WriteStrClient( from, RPL_WHOISIDLE_MSG, Client_ID( from ), Client_ID( c ), Conn_GetIdle( Client_Conn ( c )))) return DISCONNECTED; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* Away? */ | ||||||
|  | 	if( Client_HasMode( c, 'a' )) | ||||||
|  | 	{ | ||||||
|  | 		if( ! IRC_WriteStrClient( from, RPL_AWAY_MSG, Client_ID( from ), Client_ID( c ), Client_Away( c ))) return DISCONNECTED; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* End of Whois */ | ||||||
|  | 	return IRC_WriteStrClient( from, RPL_ENDOFWHOIS_MSG, Client_ID( from ), Client_ID( c )); | ||||||
|  | } /* IRC_WHOIS */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_WHOWAS( CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	/* Falsche Anzahl Parameter? */ | ||||||
|  | 	if(( Req->argc < 1 ) || ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
|  | 	/* ... */ | ||||||
|  |  | ||||||
|  | 	return CONNECTED; | ||||||
|  | } /* IRC_WHOWAS */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_Send_LUSERS( CLIENT *Client ) | ||||||
|  | { | ||||||
|  | 	LONG cnt; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  |  | ||||||
|  | 	/* Users, Services und Serevr im Netz */ | ||||||
|  | 	if( ! IRC_WriteStrClient( Client, RPL_LUSERCLIENT_MSG, Client_ID( Client ), Client_UserCount( ), Client_ServiceCount( ), Client_ServerCount( ))) return DISCONNECTED; | ||||||
|  |  | ||||||
|  | 	/* IRC-Operatoren im Netz */ | ||||||
|  | 	cnt = Client_OperCount( ); | ||||||
|  | 	if( cnt > 0 ) | ||||||
|  | 	{ | ||||||
|  | 		if( ! IRC_WriteStrClient( Client, RPL_LUSEROP_MSG, Client_ID( Client ), cnt )) return DISCONNECTED; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* Unbekannt Verbindungen */ | ||||||
|  | 	cnt = Client_UnknownCount( ); | ||||||
|  | 	if( cnt > 0 ) | ||||||
|  | 	{ | ||||||
|  | 		if( ! IRC_WriteStrClient( Client, RPL_LUSERUNKNOWN_MSG, Client_ID( Client ), cnt )) return DISCONNECTED; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* Channels im Netz */ | ||||||
|  | 	if( ! IRC_WriteStrClient( Client, RPL_LUSERCHANNELS_MSG, Client_ID( Client ), Channel_Count( ))) return DISCONNECTED; | ||||||
|  |  | ||||||
|  | 	/* Channels im Netz */ | ||||||
|  | 	if( ! IRC_WriteStrClient( Client, RPL_LUSERME_MSG, Client_ID( Client ), Client_MyUserCount( ), Client_MyServiceCount( ), Client_MyServerCount( ))) return DISCONNECTED; | ||||||
|  |  | ||||||
|  | 	return CONNECTED; | ||||||
|  | } /* IRC_Send_LUSERS */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_Show_MOTD( CLIENT *Client ) | ||||||
|  | { | ||||||
|  | 	BOOLEAN ok; | ||||||
|  | 	CHAR line[127]; | ||||||
|  | 	FILE *fd; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  |  | ||||||
|  | 	fd = fopen( Conf_MotdFile, "r" ); | ||||||
|  | 	if( ! fd ) | ||||||
|  | 	{ | ||||||
|  | 		Log( LOG_WARNING, "Can't read MOTD file \"%s\": %s", Conf_MotdFile, strerror( errno )); | ||||||
|  | 		return IRC_WriteStrClient( Client, ERR_NOMOTD_MSG, Client_ID( Client ) ); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( ))); | ||||||
|  | 	while( TRUE ) | ||||||
|  | 	{ | ||||||
|  | 		if( ! fgets( line, 126, fd )) break; | ||||||
|  | 		if( line[strlen( line ) - 1] == '\n' ) line[strlen( line ) - 1] = '\0'; | ||||||
|  | 		if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), line )) | ||||||
|  | 		{ | ||||||
|  | 			fclose( fd ); | ||||||
|  | 			return FALSE; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	ok = IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ) ); | ||||||
|  |  | ||||||
|  | 	fclose( fd ); | ||||||
|  |  | ||||||
|  | 	return ok; | ||||||
|  | } /* IRC_Show_MOTD */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan ) | ||||||
|  | { | ||||||
|  | 	BOOLEAN is_visible, is_member; | ||||||
|  | 	CHAR str[LINE_LEN + 1]; | ||||||
|  | 	CL2CHAN *cl2chan; | ||||||
|  | 	CLIENT *cl; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Chan != NULL ); | ||||||
|  |  | ||||||
|  | 	if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE; | ||||||
|  | 	else is_member = FALSE; | ||||||
|  |  | ||||||
|  | 	/* Alle Mitglieder suchen */ | ||||||
|  | 	sprintf( str, RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan )); | ||||||
|  | 	cl2chan = Channel_FirstMember( Chan ); | ||||||
|  | 	while( cl2chan ) | ||||||
|  | 	{ | ||||||
|  | 		cl = Channel_GetClient( cl2chan ); | ||||||
|  |  | ||||||
|  | 		if( strchr( Client_Modes( cl ), 'i' )) is_visible = FALSE; | ||||||
|  | 		else is_visible = TRUE; | ||||||
|  |  | ||||||
|  | 		if( is_member || is_visible ) | ||||||
|  | 		{ | ||||||
|  | 			/* Nick anhaengen */ | ||||||
|  | 			if( str[strlen( str ) - 1] != ':' ) strcat( str, " " ); | ||||||
|  | 			if( strchr( Channel_UserModes( Chan, cl ), 'o' )) strcat( str, "@" ); | ||||||
|  | 			else if( strchr( Channel_UserModes( Chan, cl ), 'v' )) strcat( str, "+" ); | ||||||
|  | 			strcat( str, Client_ID( cl )); | ||||||
|  |  | ||||||
|  | 			if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 )) | ||||||
|  | 			{ | ||||||
|  | 				/* Zeile wird zu lang: senden! */ | ||||||
|  | 				if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; | ||||||
|  | 				sprintf( str, RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan )); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		/* naechstes Mitglied suchen */ | ||||||
|  | 		cl2chan = Channel_NextMember( Chan, cl2chan ); | ||||||
|  | 	} | ||||||
|  | 	if( str[strlen( str ) - 1] != ':') | ||||||
|  | 	{ | ||||||
|  | 		/* Es sind noch Daten da, die gesendet werden muessen */ | ||||||
|  | 		if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return CONNECTED; | ||||||
|  | } /* IRC_Send_NAMES */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps ) | ||||||
|  | { | ||||||
|  | 	BOOLEAN is_visible, is_member; | ||||||
|  | 	CL2CHAN *cl2chan; | ||||||
|  | 	CHAR flags[8]; | ||||||
|  | 	CLIENT *c; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Chan != NULL ); | ||||||
|  |  | ||||||
|  | 	if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE; | ||||||
|  | 	else is_member = FALSE; | ||||||
|  |  | ||||||
|  | 	/* Alle Mitglieder suchen */ | ||||||
|  | 	cl2chan = Channel_FirstMember( Chan ); | ||||||
|  | 	while( cl2chan ) | ||||||
|  | 	{ | ||||||
|  | 		c = Channel_GetClient( cl2chan ); | ||||||
|  |  | ||||||
|  | 		if( strchr( Client_Modes( c ), 'i' )) is_visible = FALSE; | ||||||
|  | 		else is_visible = TRUE; | ||||||
|  |  | ||||||
|  | 		if( is_member || is_visible ) | ||||||
|  | 		{ | ||||||
|  | 			/* Flags zusammenbasteln */ | ||||||
|  | 			strcpy( flags, "H" ); | ||||||
|  | 			if( strchr( Client_Modes( c ), 'o' )) strcat( flags, "*" ); | ||||||
|  | 			if( strchr( Channel_UserModes( Chan, c ), 'o' )) strcat( flags, "@" ); | ||||||
|  | 			else if( strchr( Channel_UserModes( Chan, c ), 'v' )) strcat( flags, "+" ); | ||||||
|  |  | ||||||
|  | 			/* ausgeben */ | ||||||
|  | 			if(( ! OnlyOps ) || ( strchr( Client_Modes( c ), 'o' ))) | ||||||
|  | 			{ | ||||||
|  | 				if( ! IRC_WriteStrClient( Client, RPL_WHOREPLY_MSG, Client_ID( Client ), Channel_Name( Chan ), Client_User( c ), Client_Hostname( c ), Client_ID( Client_Introducer( c )), Client_ID( c ), flags, Client_Hops( c ), Client_Info( c ))) return DISCONNECTED; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		/* naechstes Mitglied suchen */ | ||||||
|  | 		cl2chan = Channel_NextMember( Chan, cl2chan ); | ||||||
|  | 	} | ||||||
|  | 	return CONNECTED; | ||||||
|  | } /* IRC_Send_WHO */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* -eof- */ | ||||||
							
								
								
									
										45
									
								
								src/ngircd/irc-info.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/ngircd/irc-info.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | /* | ||||||
|  |  * 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: irc-info.h,v 1.1 2002/11/30 17:39:56 alex Exp $ | ||||||
|  |  * | ||||||
|  |  * irc-info.h: IRC-Info-Befehle (Header) | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifndef __irc_info_h__ | ||||||
|  | #define __irc_info_h__ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN IRC_ADMIN PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
|  | GLOBAL BOOLEAN IRC_ISON PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
|  | GLOBAL BOOLEAN IRC_LINKS PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
|  | GLOBAL BOOLEAN IRC_LUSERS PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
|  | GLOBAL BOOLEAN IRC_MOTD PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
|  | GLOBAL BOOLEAN IRC_NAMES PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
|  | GLOBAL BOOLEAN IRC_STATS PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
|  | GLOBAL BOOLEAN IRC_TIME PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
|  | GLOBAL BOOLEAN IRC_USERHOST PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
|  | GLOBAL BOOLEAN IRC_VERSION PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
|  | GLOBAL BOOLEAN IRC_WHO PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
|  | GLOBAL BOOLEAN IRC_WHOIS PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
|  | GLOBAL BOOLEAN IRC_WHOWAS PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN IRC_Send_LUSERS PARAMS(( CLIENT *Client )); | ||||||
|  | GLOBAL BOOLEAN IRC_Send_NAMES PARAMS(( CLIENT *Client, CHANNEL *Chan )); | ||||||
|  | GLOBAL BOOLEAN IRC_Show_MOTD PARAMS(( CLIENT *Client )); | ||||||
|  | GLOBAL BOOLEAN IRC_Send_WHO PARAMS(( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* -eof- */ | ||||||
| @@ -9,7 +9,7 @@ | |||||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste |  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||||
|  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. |  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||||
|  * |  * | ||||||
|  * $Id: irc-login.c,v 1.24 2002/11/30 15:04:57 alex Exp $ |  * $Id: irc-login.c,v 1.25 2002/11/30 17:39:56 alex Exp $ | ||||||
|  * |  * | ||||||
|  * irc-login.c: Anmeldung und Abmeldung im IRC |  * irc-login.c: Anmeldung und Abmeldung im IRC | ||||||
|  */ |  */ | ||||||
| @@ -32,7 +32,7 @@ | |||||||
| #include "log.h" | #include "log.h" | ||||||
| #include "messages.h" | #include "messages.h" | ||||||
| #include "parse.h" | #include "parse.h" | ||||||
| #include "irc.h" | #include "irc-info.h" | ||||||
| #include "irc-write.h" | #include "irc-write.h" | ||||||
|  |  | ||||||
| #include "exp.h" | #include "exp.h" | ||||||
|   | |||||||
							
								
								
									
										893
									
								
								src/ngircd/irc.c
									
									
									
									
									
								
							
							
						
						
									
										893
									
								
								src/ngircd/irc.c
									
									
									
									
									
								
							| @@ -9,7 +9,7 @@ | |||||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste |  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||||
|  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. |  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||||
|  * |  * | ||||||
|  * $Id: irc.c,v 1.103 2002/11/30 15:04:57 alex Exp $ |  * $Id: irc.c,v 1.104 2002/11/30 17:39:56 alex Exp $ | ||||||
|  * |  * | ||||||
|  * irc.c: IRC-Befehle |  * irc.c: IRC-Befehle | ||||||
|  */ |  */ | ||||||
| @@ -19,60 +19,96 @@ | |||||||
|  |  | ||||||
| #include "imp.h" | #include "imp.h" | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| #include <errno.h> |  | ||||||
| #include <stdio.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <time.h> |  | ||||||
|  |  | ||||||
| #include "ngircd.h" |  | ||||||
| #include "conn.h" | #include "conn.h" | ||||||
| #include "client.h" | #include "client.h" | ||||||
| #include "channel.h" | #include "channel.h" | ||||||
| #include "resolve.h" | #include "defines.h" | ||||||
| #include "conf.h" |  | ||||||
| #include "conn.h" |  | ||||||
| #include "irc-write.h" | #include "irc-write.h" | ||||||
| #include "log.h" | #include "log.h" | ||||||
| #include "messages.h" | #include "messages.h" | ||||||
| #include "parse.h" | #include "parse.h" | ||||||
| #include "tool.h" |  | ||||||
|  |  | ||||||
| #include "exp.h" | #include "exp.h" | ||||||
| #include "irc.h" | #include "irc.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN | GLOBAL BOOLEAN | ||||||
| IRC_MOTD( CLIENT *Client, REQUEST *Req ) | IRC_ERROR( CLIENT *Client, REQUEST *Req ) | ||||||
| { | { | ||||||
| 	CLIENT *from, *target; | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	if( Req->argc < 1 ) Log( LOG_NOTICE, "Got ERROR from \"%s\"!", Client_Mask( Client )); | ||||||
|  | 	else Log( LOG_NOTICE, "Got ERROR from \"%s\": %s!", Client_Mask( Client ), Req->argv[0] ); | ||||||
|  |  | ||||||
|  | 	return CONNECTED; | ||||||
|  | } /* IRC_ERROR */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_KILL( CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	CLIENT *prefix, *c; | ||||||
|  |  | ||||||
| 	assert( Client != NULL ); | 	assert( Client != NULL ); | ||||||
| 	assert( Req != NULL ); | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ | 	/* Falsche Anzahl Parameter? */ | ||||||
| 	if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | 	if(( Req->argc != 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
| 	/* From aus Prefix ermitteln */ | 	prefix = Client_Search( Req->prefix ); | ||||||
| 	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); | 	if( ! prefix ) | ||||||
| 	else from = Client; |  | ||||||
| 	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix ); |  | ||||||
| 	 |  | ||||||
| 	if( Req->argc == 1 ) |  | ||||||
| 	{ | 	{ | ||||||
| 		/* an anderen Server forwarden */ | 		Log( LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!", Req->prefix ); | ||||||
| 		target = Client_Search( Req->argv[0] ); | 		prefix = Client_ThisServer( ); | ||||||
| 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] ); |  | ||||||
|  |  | ||||||
| 		if( target != Client_ThisServer( )) |  | ||||||
| 		{ |  | ||||||
| 			/* Ok, anderer Server ist das Ziel: forwarden */ |  | ||||||
| 			return IRC_WriteStrClientPrefix( target, from, "MOTD %s", Req->argv[0] ); |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return IRC_Show_MOTD( from ); | 	Log( LOG_NOTICE, "Got KILL command from \"%s\" for \"%s\": %s", Client_Mask( prefix ), Req->argv[0], Req->argv[1] ); | ||||||
| } /* IRC_MOTD */ |  | ||||||
|  | 	/* andere Server benachrichtigen */ | ||||||
|  | 	IRC_WriteStrServersPrefix( Client, prefix, "KILL %s :%s", Req->argv[0], Req->argv[1] ); | ||||||
|  |  | ||||||
|  | 	/* haben wir selber einen solchen Client? */ | ||||||
|  | 	c = Client_Search( Req->argv[0] ); | ||||||
|  | 	if( c ) | ||||||
|  | 	{ | ||||||
|  | 		/* Ja, wir haben einen solchen Client */ | ||||||
|  | 		if( Client_Conn( c ) != NONE ) Conn_Close( Client_Conn( c ), NULL, Req->argv[1], TRUE ); | ||||||
|  | 		else Client_Destroy( c, NULL, Req->argv[1], TRUE ); | ||||||
|  | 	} | ||||||
|  | 	else Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] ); | ||||||
|  |  | ||||||
|  | 	return CONNECTED; | ||||||
|  | } /* IRC_KILL */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_NOTICE( CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	CLIENT *to, *from; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return CONNECTED; | ||||||
|  |  | ||||||
|  | 	/* Falsche Anzahl Parameter? */ | ||||||
|  | 	if( Req->argc != 2 ) return CONNECTED; | ||||||
|  |  | ||||||
|  | 	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); | ||||||
|  | 	else from = Client; | ||||||
|  | 	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); | ||||||
|  |  | ||||||
|  | 	to = Client_Search( Req->argv[0] ); | ||||||
|  | 	if(( to ) && ( Client_Type( to ) == CLIENT_USER )) | ||||||
|  | 	{ | ||||||
|  | 		/* Okay, Ziel ist ein User */ | ||||||
|  | 		return IRC_WriteStrClientPrefix( to, from, "NOTICE %s :%s", Client_ID( to ), Req->argv[1] ); | ||||||
|  | 	} | ||||||
|  | 	else return CONNECTED; | ||||||
|  | } /* IRC_NOTICE */ | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN | GLOBAL BOOLEAN | ||||||
| @@ -118,801 +154,4 @@ IRC_PRIVMSG( CLIENT *Client, REQUEST *Req ) | |||||||
| } /* IRC_PRIVMSG */ | } /* IRC_PRIVMSG */ | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_NOTICE( CLIENT *Client, REQUEST *Req ) |  | ||||||
| { |  | ||||||
| 	CLIENT *to, *from; |  | ||||||
|  |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Req != NULL ); |  | ||||||
|  |  | ||||||
| 	if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return CONNECTED; |  | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ |  | ||||||
| 	if( Req->argc != 2 ) return CONNECTED; |  | ||||||
|  |  | ||||||
| 	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); |  | ||||||
| 	else from = Client; |  | ||||||
| 	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); |  | ||||||
|  |  | ||||||
| 	to = Client_Search( Req->argv[0] ); |  | ||||||
| 	if(( to ) && ( Client_Type( to ) == CLIENT_USER )) |  | ||||||
| 	{ |  | ||||||
| 		/* Okay, Ziel ist ein User */ |  | ||||||
| 		return IRC_WriteStrClientPrefix( to, from, "NOTICE %s :%s", Client_ID( to ), Req->argv[1] ); |  | ||||||
| 	} |  | ||||||
| 	else return CONNECTED; |  | ||||||
| } /* IRC_NOTICE */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_NAMES( CLIENT *Client, REQUEST *Req ) |  | ||||||
| { |  | ||||||
| 	CHAR rpl[COMMAND_LEN], *ptr; |  | ||||||
| 	CLIENT *target, *from, *c; |  | ||||||
| 	CHANNEL *chan; |  | ||||||
| 	 |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Req != NULL ); |  | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ |  | ||||||
| 	if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
|  |  | ||||||
| 	/* From aus Prefix ermitteln */ |  | ||||||
| 	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); |  | ||||||
| 	else from = Client; |  | ||||||
| 	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix ); |  | ||||||
| 	 |  | ||||||
| 	if( Req->argc == 2 ) |  | ||||||
| 	{ |  | ||||||
| 		/* an anderen Server forwarden */ |  | ||||||
| 		target = Client_Search( Req->argv[1] ); |  | ||||||
| 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] ); |  | ||||||
|  |  | ||||||
| 		if( target != Client_ThisServer( )) |  | ||||||
| 		{ |  | ||||||
| 			/* Ok, anderer Server ist das Ziel: forwarden */ |  | ||||||
| 			return IRC_WriteStrClientPrefix( target, from, "NAMES %s :%s", Req->argv[0], Req->argv[1] ); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if( Req->argc > 0 ) |  | ||||||
| 	{ |  | ||||||
| 		/* bestimmte Channels durchgehen */ |  | ||||||
| 		ptr = strtok( Req->argv[0], "," ); |  | ||||||
| 		while( ptr ) |  | ||||||
| 		{ |  | ||||||
| 			chan = Channel_Search( ptr ); |  | ||||||
| 			if( chan ) |  | ||||||
| 			{ |  | ||||||
| 				/* Namen ausgeben */ |  | ||||||
| 				if( ! IRC_Send_NAMES( from, chan )) return DISCONNECTED; |  | ||||||
| 			} |  | ||||||
| 			if( ! IRC_WriteStrClient( from, RPL_ENDOFNAMES_MSG, Client_ID( from ), ptr )) return DISCONNECTED; |  | ||||||
| 			 |  | ||||||
| 			/* naechsten Namen ermitteln */ |  | ||||||
| 			ptr = strtok( NULL, "," ); |  | ||||||
| 		} |  | ||||||
| 		return CONNECTED; |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	/* alle Channels durchgehen */ |  | ||||||
| 	chan = Channel_First( ); |  | ||||||
| 	while( chan ) |  | ||||||
| 	{ |  | ||||||
| 		/* Namen ausgeben */ |  | ||||||
| 		if( ! IRC_Send_NAMES( from, chan )) return DISCONNECTED; |  | ||||||
|  |  | ||||||
| 		/* naechster Channel */ |  | ||||||
| 		chan = Channel_Next( chan ); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* Nun noch alle Clients ausgeben, die in keinem Channel sind */ |  | ||||||
| 	c = Client_First( ); |  | ||||||
| 	sprintf( rpl, RPL_NAMREPLY_MSG, Client_ID( from ), "*", "*" ); |  | ||||||
| 	while( c ) |  | ||||||
| 	{ |  | ||||||
| 		if(( Client_Type( c ) == CLIENT_USER ) && ( Channel_FirstChannelOf( c ) == NULL ) && ( ! strchr( Client_Modes( c ), 'i' ))) |  | ||||||
| 		{ |  | ||||||
| 			/* Okay, das ist ein User: anhaengen */ |  | ||||||
| 			if( rpl[strlen( rpl ) - 1] != ':' ) strcat( rpl, " " ); |  | ||||||
| 			strcat( rpl, Client_ID( c )); |  | ||||||
|  |  | ||||||
| 			if( strlen( rpl ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 )) |  | ||||||
| 			{ |  | ||||||
| 				/* Zeile wird zu lang: senden! */ |  | ||||||
| 				if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED; |  | ||||||
| 				sprintf( rpl, RPL_NAMREPLY_MSG, Client_ID( from ), "*", "*" ); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		/* naechster Client */ |  | ||||||
| 		c = Client_Next( c ); |  | ||||||
| 	} |  | ||||||
| 	if( rpl[strlen( rpl ) - 1] != ':') |  | ||||||
| 	{ |  | ||||||
| 		/* es wurden User gefunden */ |  | ||||||
| 		if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED; |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	return IRC_WriteStrClient( from, RPL_ENDOFNAMES_MSG, Client_ID( from ), "*" ); |  | ||||||
| } /* IRC_NAMES */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_ISON( CLIENT *Client, REQUEST *Req ) |  | ||||||
| { |  | ||||||
| 	CHAR rpl[COMMAND_LEN]; |  | ||||||
| 	CLIENT *c; |  | ||||||
| 	CHAR *ptr; |  | ||||||
| 	INT i; |  | ||||||
| 	 |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Req != NULL ); |  | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ |  | ||||||
| 	if(( Req->argc < 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( 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_Search( ptr ); |  | ||||||
| 			if( c && ( Client_Type( c ) == 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, "%s", rpl, Client_ID( Client ) ); |  | ||||||
| } /* IRC_ISON */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_WHOIS( CLIENT *Client, REQUEST *Req ) |  | ||||||
| { |  | ||||||
| 	CLIENT *from, *target, *c; |  | ||||||
| 	CHAR str[LINE_LEN + 1], *ptr = NULL; |  | ||||||
| 	CL2CHAN *cl2chan; |  | ||||||
| 	CHANNEL *chan; |  | ||||||
| 	 |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Req != NULL ); |  | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ |  | ||||||
| 	if(( Req->argc < 1 ) || ( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
|  |  | ||||||
| 	/* Client suchen */ |  | ||||||
| 	c = Client_Search( Req->argv[Req->argc - 1] ); |  | ||||||
| 	if(( ! c ) || ( Client_Type( c ) != CLIENT_USER )) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[Req->argc - 1] ); |  | ||||||
|  |  | ||||||
| 	/* Empfaenger des WHOIS suchen */ |  | ||||||
| 	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); |  | ||||||
| 	else from = Client; |  | ||||||
| 	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); |  | ||||||
| 	 |  | ||||||
| 	/* Forwarden an anderen Server? */ |  | ||||||
| 	if( Req->argc > 1 ) |  | ||||||
| 	{ |  | ||||||
| 		/* angegebenen Ziel-Server suchen */ |  | ||||||
| 		target = Client_Search( Req->argv[1] ); |  | ||||||
| 		if( ! target ) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( from ), Req->argv[1] ); |  | ||||||
| 		ptr = Req->argv[1]; |  | ||||||
| 	} |  | ||||||
| 	else target = Client_ThisServer( ); |  | ||||||
|  |  | ||||||
| 	assert( target != NULL ); |  | ||||||
| 	 |  | ||||||
| 	if(( Client_NextHop( target ) != Client_ThisServer( )) && ( Client_Type( Client_NextHop( target )) == CLIENT_SERVER )) return IRC_WriteStrClientPrefix( target, from, "WHOIS %s :%s", Req->argv[0], ptr ); |  | ||||||
| 	 |  | ||||||
| 	/* Nick, User und Name */ |  | ||||||
| 	if( ! IRC_WriteStrClient( from, RPL_WHOISUSER_MSG, Client_ID( from ), Client_ID( c ), Client_User( c ), Client_Hostname( c ), Client_Info( c ))) return DISCONNECTED; |  | ||||||
|  |  | ||||||
| 	/* Server */ |  | ||||||
| 	if( ! IRC_WriteStrClient( from, RPL_WHOISSERVER_MSG, Client_ID( from ), Client_ID( c ), Client_ID( Client_Introducer( c )), Client_Info( Client_Introducer( c )))) return DISCONNECTED; |  | ||||||
|  |  | ||||||
| 	/* Channels */ |  | ||||||
| 	sprintf( str, RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c )); |  | ||||||
| 	cl2chan = Channel_FirstChannelOf( c ); |  | ||||||
| 	while( cl2chan ) |  | ||||||
| 	{ |  | ||||||
| 		chan = Channel_GetChannel( cl2chan ); |  | ||||||
| 		assert( chan != NULL ); |  | ||||||
| 		 |  | ||||||
| 		/* Channel-Name anhaengen */ |  | ||||||
| 		if( str[strlen( str ) - 1] != ':' ) strcat( str, " " ); |  | ||||||
| 		if( strchr( Channel_UserModes( chan, c ), 'o' )) strcat( str, "@" ); |  | ||||||
| 		else if( strchr( Channel_UserModes( chan, c ), 'v' )) strcat( str, "+" ); |  | ||||||
| 		strcat( str, Channel_Name( chan )); |  | ||||||
|  |  | ||||||
| 		if( strlen( str ) > ( LINE_LEN - CHANNEL_NAME_LEN - 4 )) |  | ||||||
| 		{ |  | ||||||
| 			/* Zeile wird zu lang: senden! */ |  | ||||||
| 			if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; |  | ||||||
| 			sprintf( str, RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c )); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		/* naechstes Mitglied suchen */ |  | ||||||
| 		cl2chan = Channel_NextChannelOf( c, cl2chan ); |  | ||||||
| 	} |  | ||||||
| 	if( str[strlen( str ) - 1] != ':') |  | ||||||
| 	{ |  | ||||||
| 		/* Es sind noch Daten da, die gesendet werden muessen */ |  | ||||||
| 		if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	/* IRC-Operator? */ |  | ||||||
| 	if( Client_HasMode( c, 'o' )) |  | ||||||
| 	{ |  | ||||||
| 		if( ! IRC_WriteStrClient( from, RPL_WHOISOPERATOR_MSG, Client_ID( from ), Client_ID( c ))) return DISCONNECTED; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* Idle (nur lokale Clients) */ |  | ||||||
| 	if( Client_Conn( c ) > NONE ) |  | ||||||
| 	{ |  | ||||||
| 		if( ! IRC_WriteStrClient( from, RPL_WHOISIDLE_MSG, Client_ID( from ), Client_ID( c ), Conn_GetIdle( Client_Conn ( c )))) return DISCONNECTED; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* Away? */ |  | ||||||
| 	if( Client_HasMode( c, 'a' )) |  | ||||||
| 	{ |  | ||||||
| 		if( ! IRC_WriteStrClient( from, RPL_AWAY_MSG, Client_ID( from ), Client_ID( c ), Client_Away( c ))) return DISCONNECTED; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* End of Whois */ |  | ||||||
| 	return IRC_WriteStrClient( from, RPL_ENDOFWHOIS_MSG, Client_ID( from ), Client_ID( c )); |  | ||||||
| } /* IRC_WHOIS */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_WHOWAS( CLIENT *Client, REQUEST *Req ) |  | ||||||
| { |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Req != NULL ); |  | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ |  | ||||||
| 	if(( Req->argc < 1 ) || ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
|  |  | ||||||
| 	/* ... */ |  | ||||||
|  |  | ||||||
| 	return CONNECTED; |  | ||||||
| } /* IRC_WHOWAS */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_WHO( CLIENT *Client, REQUEST *Req ) |  | ||||||
| { |  | ||||||
| 	BOOLEAN ok, only_ops; |  | ||||||
| 	CHAR flags[8], *ptr; |  | ||||||
| 	CL2CHAN *cl2chan; |  | ||||||
| 	CHANNEL *chan; |  | ||||||
| 	CLIENT *c; |  | ||||||
| 	 |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Req != NULL ); |  | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ |  | ||||||
| 	if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
|  |  | ||||||
| 	only_ops = FALSE; |  | ||||||
| 	chan = NULL; |  | ||||||
|  |  | ||||||
| 	if( Req->argc == 2 ) |  | ||||||
| 	{ |  | ||||||
| 		/* Nur OPs anzeigen? */ |  | ||||||
| 		if( strcmp( Req->argv[1], "o" ) == 0 ) only_ops = TRUE; |  | ||||||
| #ifdef STRICT_RFC |  | ||||||
| 		else return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
| #endif |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	if( Req->argc >= 1 ) |  | ||||||
| 	{ |  | ||||||
| 		/* wurde ein Channel oder Nick-Mask angegeben? */ |  | ||||||
| 		chan = Channel_Search( Req->argv[0] ); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if( chan ) |  | ||||||
| 	{ |  | ||||||
| 		/* User eines Channels ausgeben */ |  | ||||||
| 		if( ! IRC_Send_WHO( Client, chan, only_ops )) return DISCONNECTED; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	c = Client_First( ); |  | ||||||
| 	while( c ) |  | ||||||
| 	{ |  | ||||||
| 		if(( Client_Type( c ) == CLIENT_USER ) && ( ! strchr( Client_Modes( c ), 'i' ))) |  | ||||||
| 		{ |  | ||||||
| 			ok = FALSE; |  | ||||||
| 			if( Req->argc == 0 ) ok = TRUE; |  | ||||||
| 			else |  | ||||||
| 			{ |  | ||||||
| 				if( strcasecmp( Req->argv[0], Client_ID( c )) == 0 ) ok = TRUE; |  | ||||||
| 				else if( strcmp( Req->argv[0], "0" ) == 0 ) ok = TRUE; |  | ||||||
| 			} |  | ||||||
| 				 |  | ||||||
| 			if( ok && (( ! only_ops ) || ( strchr( Client_Modes( c ), 'o' )))) |  | ||||||
| 			{ |  | ||||||
| 				/* Flags zusammenbasteln */ |  | ||||||
| 				strcpy( flags, "H" ); |  | ||||||
| 				if( strchr( Client_Modes( c ), 'o' )) strcat( flags, "*" ); |  | ||||||
|  |  | ||||||
| 				/* ausgeben */ |  | ||||||
| 				cl2chan = Channel_FirstChannelOf( c ); |  | ||||||
| 				if( cl2chan ) ptr = Channel_Name( Channel_GetChannel( cl2chan )); |  | ||||||
| 				else ptr = "*"; |  | ||||||
| 				if( ! IRC_WriteStrClient( Client, RPL_WHOREPLY_MSG, Client_ID( Client ), ptr, Client_User( c ), Client_Hostname( c ), Client_ID( Client_Introducer( c )), Client_ID( c ), flags, Client_Hops( c ), Client_Info( c ))) return DISCONNECTED; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		/* naechster Client */ |  | ||||||
| 		c = Client_Next( c ); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if( chan ) return IRC_WriteStrClient( Client, RPL_ENDOFWHO_MSG, Client_ID( Client ), Channel_Name( chan )); |  | ||||||
| 	else if( Req->argc == 0 ) return IRC_WriteStrClient( Client, RPL_ENDOFWHO_MSG, Client_ID( Client ), "*" ); |  | ||||||
| 	else return IRC_WriteStrClient( Client, RPL_ENDOFWHO_MSG, Client_ID( Client ), Req->argv[0] ); |  | ||||||
| } /* IRC_WHO */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_USERHOST( CLIENT *Client, REQUEST *Req ) |  | ||||||
| { |  | ||||||
| 	CHAR rpl[COMMAND_LEN]; |  | ||||||
| 	CLIENT *c; |  | ||||||
| 	INT max, i; |  | ||||||
|  |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Req != NULL ); |  | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ |  | ||||||
| 	if(( Req->argc < 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( 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_Search( Req->argv[i] ); |  | ||||||
| 		if( c && ( Client_Type( c ) == CLIENT_USER )) |  | ||||||
| 		{ |  | ||||||
| 			/* Dieser Nick ist "online" */ |  | ||||||
| 			strcat( rpl, Client_ID( c )); |  | ||||||
| 			if( Client_HasMode( c, 'o' )) strcat( rpl, "*" ); |  | ||||||
| 			strcat( rpl, "=" ); |  | ||||||
| 			if( Client_HasMode( c, 'a' )) strcat( rpl, "-" ); |  | ||||||
| 			else strcat( rpl, "+" ); |  | ||||||
| 			strcat( rpl, Client_User( c )); |  | ||||||
| 			strcat( rpl, "@" ); |  | ||||||
| 			strcat( rpl, Client_Hostname( c )); |  | ||||||
| 			strcat( rpl, " " ); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0'; |  | ||||||
|  |  | ||||||
| 	return IRC_WriteStrClient( Client, "%s", rpl, Client_ID( Client ) ); |  | ||||||
| } /* IRC_USERHOST */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_ERROR( CLIENT *Client, REQUEST *Req ) |  | ||||||
| { |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Req != NULL ); |  | ||||||
|  |  | ||||||
| 	if( Req->argc < 1 ) Log( LOG_NOTICE, "Got ERROR from \"%s\"!", Client_Mask( Client )); |  | ||||||
| 	else Log( LOG_NOTICE, "Got ERROR from \"%s\": %s!", Client_Mask( Client ), Req->argv[0] ); |  | ||||||
|  |  | ||||||
| 	return CONNECTED; |  | ||||||
| } /* IRC_ERROR */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_LUSERS( CLIENT *Client, REQUEST *Req ) |  | ||||||
| { |  | ||||||
| 	CLIENT *target, *from; |  | ||||||
| 	 |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Req != NULL ); |  | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ |  | ||||||
| 	if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
|  |  | ||||||
| 	/* Absender ermitteln */ |  | ||||||
| 	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); |  | ||||||
| 	else from = Client; |  | ||||||
| 	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); |  | ||||||
|  |  | ||||||
| 	/* An anderen Server forwarden? */ |  | ||||||
| 	if( Req->argc == 2 ) |  | ||||||
| 	{ |  | ||||||
| 		target = Client_Search( Req->argv[1] ); |  | ||||||
| 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] ); |  | ||||||
| 		else if( target != Client_ThisServer( )) return IRC_WriteStrClientPrefix( target, from, "LUSERS %s %s", Req->argv[0], Req->argv[1] ); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* Wer ist der Absender? */ |  | ||||||
| 	if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix ); |  | ||||||
| 	else target = Client; |  | ||||||
| 	if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); |  | ||||||
| 	 |  | ||||||
| 	IRC_Send_LUSERS( target ); |  | ||||||
|  |  | ||||||
| 	return CONNECTED; |  | ||||||
| } /* IRC_LUSERS */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_LINKS( CLIENT *Client, REQUEST *Req ) |  | ||||||
| { |  | ||||||
| 	CLIENT *target, *from, *c; |  | ||||||
| 	CHAR *mask; |  | ||||||
| 	 |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Req != NULL ); |  | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ |  | ||||||
| 	if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
|  |  | ||||||
| 	/* Server-Mask ermitteln */ |  | ||||||
| 	if( Req->argc > 0 ) mask = Req->argv[Req->argc - 1]; |  | ||||||
| 	else mask = "*"; |  | ||||||
|  |  | ||||||
| 	/* Absender ermitteln */ |  | ||||||
| 	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); |  | ||||||
| 	else from = Client; |  | ||||||
| 	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); |  | ||||||
| 	 |  | ||||||
| 	/* An anderen Server forwarden? */ |  | ||||||
| 	if( Req->argc == 2 ) |  | ||||||
| 	{ |  | ||||||
| 		target = Client_Search( Req->argv[0] ); |  | ||||||
| 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] ); |  | ||||||
| 		else if( target != Client_ThisServer( )) return IRC_WriteStrClientPrefix( target, from, "LINKS %s %s", Req->argv[0], Req->argv[1] ); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* Wer ist der Absender? */ |  | ||||||
| 	if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix ); |  | ||||||
| 	else target = Client; |  | ||||||
| 	if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); |  | ||||||
| 	 |  | ||||||
| 	c = Client_First( ); |  | ||||||
| 	while( c ) |  | ||||||
| 	{ |  | ||||||
| 		if( Client_Type( c ) == CLIENT_SERVER ) |  | ||||||
| 		{ |  | ||||||
| 			if( ! IRC_WriteStrClient( target, RPL_LINKS_MSG, Client_ID( target ), Client_ID( c ), Client_ID( Client_TopServer( c ) ? Client_TopServer( c ) : Client_ThisServer( )), Client_Hops( c ), Client_Info( c ))) return DISCONNECTED; |  | ||||||
| 		} |  | ||||||
| 		c = Client_Next( c ); |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	return IRC_WriteStrClient( target, RPL_ENDOFLINKS_MSG, Client_ID( target ), mask ); |  | ||||||
| } /* IRC_LINKS */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_VERSION( CLIENT *Client, REQUEST *Req ) |  | ||||||
| { |  | ||||||
| 	CLIENT *target, *prefix; |  | ||||||
| 	 |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Req != NULL ); |  | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ |  | ||||||
| 	if(( Req->argc > 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
|  |  | ||||||
| 	/* Ziel suchen */ |  | ||||||
| 	if( Req->argc == 1 ) target = Client_Search( Req->argv[0] ); |  | ||||||
| 	else target = Client_ThisServer( ); |  | ||||||
|  |  | ||||||
| 	/* Prefix ermitteln */ |  | ||||||
| 	if( Client_Type( Client ) == CLIENT_SERVER ) prefix = Client_Search( Req->prefix ); |  | ||||||
| 	else prefix = Client; |  | ||||||
| 	if( ! prefix ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix ); |  | ||||||
| 	 |  | ||||||
| 	/* An anderen Server weiterleiten? */ |  | ||||||
| 	if( target != Client_ThisServer( )) |  | ||||||
| 	{ |  | ||||||
| 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] ); |  | ||||||
|  |  | ||||||
| 		/* forwarden */ |  | ||||||
| 		IRC_WriteStrClientPrefix( target, prefix, "VERSION %s", Req->argv[0] ); |  | ||||||
| 		return CONNECTED; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* mit Versionsinfo antworten */ |  | ||||||
| 	return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE, VERSION, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( )); |  | ||||||
| } /* IRC_VERSION */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_KILL( CLIENT *Client, REQUEST *Req ) |  | ||||||
| { |  | ||||||
| 	CLIENT *prefix, *c; |  | ||||||
| 	 |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Req != NULL ); |  | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ |  | ||||||
| 	if(( Req->argc != 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
|  |  | ||||||
| 	prefix = Client_Search( Req->prefix ); |  | ||||||
| 	if( ! prefix ) |  | ||||||
| 	{ |  | ||||||
| 		Log( LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!", Req->prefix ); |  | ||||||
| 		prefix = Client_ThisServer( ); |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	Log( LOG_NOTICE, "Got KILL command from \"%s\" for \"%s\": %s", Client_Mask( prefix ), Req->argv[0], Req->argv[1] ); |  | ||||||
| 	 |  | ||||||
| 	/* andere Server benachrichtigen */ |  | ||||||
| 	IRC_WriteStrServersPrefix( Client, prefix, "KILL %s :%s", Req->argv[0], Req->argv[1] ); |  | ||||||
|  |  | ||||||
| 	/* haben wir selber einen solchen Client? */ |  | ||||||
| 	c = Client_Search( Req->argv[0] ); |  | ||||||
| 	if( c ) |  | ||||||
| 	{ |  | ||||||
| 		/* Ja, wir haben einen solchen Client */ |  | ||||||
| 		if( Client_Conn( c ) != NONE ) Conn_Close( Client_Conn( c ), NULL, Req->argv[1], TRUE ); |  | ||||||
| 		else Client_Destroy( c, NULL, Req->argv[1], TRUE ); |  | ||||||
| 	} |  | ||||||
| 	else Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] ); |  | ||||||
|  |  | ||||||
| 	return CONNECTED; |  | ||||||
| } /* IRC_KILL */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_ADMIN(CLIENT *Client, REQUEST *Req ) |  | ||||||
| { |  | ||||||
| 	CLIENT *target, *prefix; |  | ||||||
|  |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Req != NULL ); |  | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ |  | ||||||
| 	if(( Req->argc > 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
|  |  | ||||||
| 	/* Ziel suchen */ |  | ||||||
| 	if( Req->argc == 1 ) target = Client_Search( Req->argv[0] ); |  | ||||||
| 	else target = Client_ThisServer( ); |  | ||||||
|  |  | ||||||
| 	/* Prefix ermitteln */ |  | ||||||
| 	if( Client_Type( Client ) == CLIENT_SERVER ) prefix = Client_Search( Req->prefix ); |  | ||||||
| 	else prefix = Client; |  | ||||||
| 	if( ! prefix ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix ); |  | ||||||
|  |  | ||||||
| 	/* An anderen Server weiterleiten? */ |  | ||||||
| 	if( target != Client_ThisServer( )) |  | ||||||
| 	{ |  | ||||||
| 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] ); |  | ||||||
|  |  | ||||||
| 		/* forwarden */ |  | ||||||
| 		IRC_WriteStrClientPrefix( target, prefix, "ADMIN %s", Req->argv[0] ); |  | ||||||
| 		return CONNECTED; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* mit Versionsinfo antworten */ |  | ||||||
| 	if( ! IRC_WriteStrClient( Client, RPL_ADMINME_MSG, Client_ID( prefix ), Conf_ServerName )) return DISCONNECTED; |  | ||||||
| 	if( ! IRC_WriteStrClient( Client, RPL_ADMINLOC1_MSG, Client_ID( prefix ), Conf_ServerAdmin1 )) return DISCONNECTED; |  | ||||||
| 	if( ! IRC_WriteStrClient( Client, RPL_ADMINLOC2_MSG, Client_ID( prefix ), Conf_ServerAdmin2 )) return DISCONNECTED; |  | ||||||
| 	if( ! IRC_WriteStrClient( Client, RPL_ADMINEMAIL_MSG, Client_ID( prefix ), Conf_ServerAdminMail )) return DISCONNECTED; |  | ||||||
|  |  | ||||||
| 	return CONNECTED; |  | ||||||
| } /* IRC_ADMIN */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_TIME( CLIENT *Client, REQUEST *Req ) |  | ||||||
| { |  | ||||||
| 	CLIENT *from, *target; |  | ||||||
| 	CHAR t_str[64]; |  | ||||||
| 	time_t t; |  | ||||||
|  |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Req != NULL ); |  | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ |  | ||||||
| 	if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
|  |  | ||||||
| 	/* From aus Prefix ermitteln */ |  | ||||||
| 	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); |  | ||||||
| 	else from = Client; |  | ||||||
| 	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix ); |  | ||||||
| 	 |  | ||||||
| 	if( Req->argc == 1 ) |  | ||||||
| 	{ |  | ||||||
| 		/* an anderen Server forwarden */ |  | ||||||
| 		target = Client_Search( Req->argv[0] ); |  | ||||||
| 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] ); |  | ||||||
|  |  | ||||||
| 		if( target != Client_ThisServer( )) |  | ||||||
| 		{ |  | ||||||
| 			/* Ok, anderer Server ist das Ziel: forwarden */ |  | ||||||
| 			return IRC_WriteStrClientPrefix( target, from, "TIME %s", Req->argv[0] ); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	t = time( NULL ); |  | ||||||
| 	(VOID)strftime( t_str, 60, "%A %B %d %Y -- %H:%M %z", localtime( &t )); |  | ||||||
| 	return IRC_WriteStrClient( from, RPL_TIME_MSG, Client_ID( from ), Client_ID( Client_ThisServer( )), t_str ); |  | ||||||
| } /* IRC_TIME */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_Show_MOTD( CLIENT *Client ) |  | ||||||
| { |  | ||||||
| 	BOOLEAN ok; |  | ||||||
| 	CHAR line[127]; |  | ||||||
| 	FILE *fd; |  | ||||||
| 	 |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
|  |  | ||||||
| 	fd = fopen( Conf_MotdFile, "r" ); |  | ||||||
| 	if( ! fd ) |  | ||||||
| 	{ |  | ||||||
| 		Log( LOG_WARNING, "Can't read MOTD file \"%s\": %s", Conf_MotdFile, strerror( errno )); |  | ||||||
| 		return IRC_WriteStrClient( Client, ERR_NOMOTD_MSG, Client_ID( Client ) ); |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( ))); |  | ||||||
| 	while( TRUE ) |  | ||||||
| 	{ |  | ||||||
| 		if( ! fgets( line, 126, fd )) break; |  | ||||||
| 		if( line[strlen( line ) - 1] == '\n' ) line[strlen( line ) - 1] = '\0'; |  | ||||||
| 		if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), line )) |  | ||||||
| 		{ |  | ||||||
| 			fclose( fd ); |  | ||||||
| 			return FALSE; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	ok = IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ) ); |  | ||||||
|  |  | ||||||
| 	fclose( fd ); |  | ||||||
| 	 |  | ||||||
| 	return ok; |  | ||||||
| } /* IRC_Show_MOTD */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan ) |  | ||||||
| { |  | ||||||
| 	BOOLEAN is_visible, is_member; |  | ||||||
| 	CHAR str[LINE_LEN + 1]; |  | ||||||
| 	CL2CHAN *cl2chan; |  | ||||||
| 	CLIENT *cl; |  | ||||||
| 	 |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Chan != NULL ); |  | ||||||
|  |  | ||||||
| 	if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE; |  | ||||||
| 	else is_member = FALSE; |  | ||||||
| 			  |  | ||||||
| 	/* Alle Mitglieder suchen */ |  | ||||||
| 	sprintf( str, RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan )); |  | ||||||
| 	cl2chan = Channel_FirstMember( Chan ); |  | ||||||
| 	while( cl2chan ) |  | ||||||
| 	{ |  | ||||||
| 		cl = Channel_GetClient( cl2chan ); |  | ||||||
|  |  | ||||||
| 		if( strchr( Client_Modes( cl ), 'i' )) is_visible = FALSE; |  | ||||||
| 		else is_visible = TRUE; |  | ||||||
|  |  | ||||||
| 		if( is_member || is_visible ) |  | ||||||
| 		{ |  | ||||||
| 			/* Nick anhaengen */ |  | ||||||
| 			if( str[strlen( str ) - 1] != ':' ) strcat( str, " " ); |  | ||||||
| 			if( strchr( Channel_UserModes( Chan, cl ), 'o' )) strcat( str, "@" ); |  | ||||||
| 			else if( strchr( Channel_UserModes( Chan, cl ), 'v' )) strcat( str, "+" ); |  | ||||||
| 			strcat( str, Client_ID( cl )); |  | ||||||
| 	 |  | ||||||
| 			if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 )) |  | ||||||
| 			{ |  | ||||||
| 				/* Zeile wird zu lang: senden! */ |  | ||||||
| 				if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; |  | ||||||
| 				sprintf( str, RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan )); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		/* naechstes Mitglied suchen */ |  | ||||||
| 		cl2chan = Channel_NextMember( Chan, cl2chan ); |  | ||||||
| 	} |  | ||||||
| 	if( str[strlen( str ) - 1] != ':') |  | ||||||
| 	{ |  | ||||||
| 		/* Es sind noch Daten da, die gesendet werden muessen */ |  | ||||||
| 		if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return CONNECTED; |  | ||||||
| } /* IRC_Send_NAMES */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps ) |  | ||||||
| { |  | ||||||
| 	BOOLEAN is_visible, is_member; |  | ||||||
| 	CL2CHAN *cl2chan; |  | ||||||
| 	CHAR flags[8]; |  | ||||||
| 	CLIENT *c; |  | ||||||
|  |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Chan != NULL ); |  | ||||||
|  |  | ||||||
| 	if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE; |  | ||||||
| 	else is_member = FALSE; |  | ||||||
|  |  | ||||||
| 	/* Alle Mitglieder suchen */ |  | ||||||
| 	cl2chan = Channel_FirstMember( Chan ); |  | ||||||
| 	while( cl2chan ) |  | ||||||
| 	{ |  | ||||||
| 		c = Channel_GetClient( cl2chan ); |  | ||||||
|  |  | ||||||
| 		if( strchr( Client_Modes( c ), 'i' )) is_visible = FALSE; |  | ||||||
| 		else is_visible = TRUE; |  | ||||||
|  |  | ||||||
| 		if( is_member || is_visible ) |  | ||||||
| 		{ |  | ||||||
| 			/* Flags zusammenbasteln */ |  | ||||||
| 			strcpy( flags, "H" ); |  | ||||||
| 			if( strchr( Client_Modes( c ), 'o' )) strcat( flags, "*" ); |  | ||||||
| 			if( strchr( Channel_UserModes( Chan, c ), 'o' )) strcat( flags, "@" ); |  | ||||||
| 			else if( strchr( Channel_UserModes( Chan, c ), 'v' )) strcat( flags, "+" ); |  | ||||||
| 			 |  | ||||||
| 			/* ausgeben */ |  | ||||||
| 			if(( ! OnlyOps ) || ( strchr( Client_Modes( c ), 'o' ))) |  | ||||||
| 			{ |  | ||||||
| 				if( ! IRC_WriteStrClient( Client, RPL_WHOREPLY_MSG, Client_ID( Client ), Channel_Name( Chan ), Client_User( c ), Client_Hostname( c ), Client_ID( Client_Introducer( c )), Client_ID( c ), flags, Client_Hops( c ), Client_Info( c ))) return DISCONNECTED; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		/* naechstes Mitglied suchen */ |  | ||||||
| 		cl2chan = Channel_NextMember( Chan, cl2chan ); |  | ||||||
| 	} |  | ||||||
| 	return CONNECTED; |  | ||||||
| } /* IRC_Send_WHO */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN |  | ||||||
| IRC_Send_LUSERS( CLIENT *Client ) |  | ||||||
| { |  | ||||||
| 	LONG cnt; |  | ||||||
|  |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
|  |  | ||||||
| 	/* Users, Services und Serevr im Netz */ |  | ||||||
| 	if( ! IRC_WriteStrClient( Client, RPL_LUSERCLIENT_MSG, Client_ID( Client ), Client_UserCount( ), Client_ServiceCount( ), Client_ServerCount( ))) return DISCONNECTED; |  | ||||||
|  |  | ||||||
| 	/* IRC-Operatoren im Netz */ |  | ||||||
| 	cnt = Client_OperCount( ); |  | ||||||
| 	if( cnt > 0 ) |  | ||||||
| 	{ |  | ||||||
| 		if( ! IRC_WriteStrClient( Client, RPL_LUSEROP_MSG, Client_ID( Client ), cnt )) return DISCONNECTED; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* Unbekannt Verbindungen */ |  | ||||||
| 	cnt = Client_UnknownCount( ); |  | ||||||
| 	if( cnt > 0 ) |  | ||||||
| 	{ |  | ||||||
| 		if( ! IRC_WriteStrClient( Client, RPL_LUSERUNKNOWN_MSG, Client_ID( Client ), cnt )) return DISCONNECTED; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* Channels im Netz */ |  | ||||||
| 	if( ! IRC_WriteStrClient( Client, RPL_LUSERCHANNELS_MSG, Client_ID( Client ), Channel_Count( ))) return DISCONNECTED; |  | ||||||
|  |  | ||||||
| 	/* Channels im Netz */ |  | ||||||
| 	if( ! IRC_WriteStrClient( Client, RPL_LUSERME_MSG, Client_ID( Client ), Client_MyUserCount( ), Client_MyServiceCount( ), Client_MyServerCount( ))) return DISCONNECTED; |  | ||||||
| 	 |  | ||||||
| 	return CONNECTED; |  | ||||||
| } /* IRC_Send_LUSERS */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* -eof- */ | /* -eof- */ | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste |  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||||
|  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. |  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||||
|  * |  * | ||||||
|  * $Id: irc.h,v 1.34 2002/11/24 18:45:53 alex Exp $ |  * $Id: irc.h,v 1.35 2002/11/30 17:39:56 alex Exp $ | ||||||
|  * |  * | ||||||
|  * irc.h: IRC-Befehle (Header) |  * irc.h: IRC-Befehle (Header) | ||||||
|  */ |  */ | ||||||
| @@ -19,30 +19,10 @@ | |||||||
| #define __irc_h__ | #define __irc_h__ | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN IRC_MOTD PARAMS(( CLIENT *Client, REQUEST *Req )); |  | ||||||
| GLOBAL BOOLEAN IRC_LUSERS PARAMS(( CLIENT *Client, REQUEST *Req )); |  | ||||||
| GLOBAL BOOLEAN IRC_LINKS PARAMS(( CLIENT *Client, REQUEST *Req )); |  | ||||||
| GLOBAL BOOLEAN IRC_VERSION PARAMS(( CLIENT *Client, REQUEST *Req )); |  | ||||||
| GLOBAL BOOLEAN IRC_ADMIN PARAMS(( CLIENT *Client, REQUEST *Req )); |  | ||||||
| GLOBAL BOOLEAN IRC_TIME PARAMS(( CLIENT *Client, REQUEST *Req )); |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN IRC_PRIVMSG PARAMS(( CLIENT *Client, REQUEST *Req )); |  | ||||||
| GLOBAL BOOLEAN IRC_NOTICE PARAMS(( CLIENT *Client, REQUEST *Req )); |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN IRC_NAMES PARAMS(( CLIENT *Client, REQUEST *Req )); |  | ||||||
| GLOBAL BOOLEAN IRC_ISON PARAMS(( CLIENT *Client, REQUEST *Req )); |  | ||||||
| GLOBAL BOOLEAN IRC_WHOIS PARAMS(( CLIENT *Client, REQUEST *Req )); |  | ||||||
| GLOBAL BOOLEAN IRC_WHOWAS PARAMS(( CLIENT *Client, REQUEST *Req )); |  | ||||||
| GLOBAL BOOLEAN IRC_USERHOST PARAMS(( CLIENT *Client, REQUEST *Req )); |  | ||||||
| GLOBAL BOOLEAN IRC_WHO PARAMS(( CLIENT *Client, REQUEST *Req )); |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN IRC_ERROR PARAMS(( CLIENT *Client, REQUEST *Req )); | GLOBAL BOOLEAN IRC_ERROR PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
| GLOBAL BOOLEAN IRC_KILL PARAMS(( CLIENT *Client, REQUEST *Req )); | GLOBAL BOOLEAN IRC_KILL PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
|  | GLOBAL BOOLEAN IRC_NOTICE PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
| GLOBAL BOOLEAN IRC_Send_NAMES PARAMS(( CLIENT *Client, CHANNEL *Chan )); | GLOBAL BOOLEAN IRC_PRIVMSG PARAMS(( CLIENT *Client, REQUEST *Req )); | ||||||
| GLOBAL BOOLEAN IRC_Send_LUSERS PARAMS(( CLIENT *Client )); |  | ||||||
| GLOBAL BOOLEAN IRC_Show_MOTD PARAMS(( CLIENT *Client )); |  | ||||||
| GLOBAL BOOLEAN IRC_Send_WHO PARAMS(( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )); |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste |  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||||
|  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. |  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||||
|  * |  * | ||||||
|  * $Id: parse.c,v 1.48 2002/11/30 15:04:57 alex Exp $ |  * $Id: parse.c,v 1.49 2002/11/30 17:39:56 alex Exp $ | ||||||
|  * |  * | ||||||
|  * parse.c: Parsen der Client-Anfragen |  * parse.c: Parsen der Client-Anfragen | ||||||
|  */ |  */ | ||||||
| @@ -38,6 +38,7 @@ | |||||||
| #include "imp.h" | #include "imp.h" | ||||||
| #include "irc.h" | #include "irc.h" | ||||||
| #include "irc-channel.h" | #include "irc-channel.h" | ||||||
|  | #include "irc-info.h" | ||||||
| #include "irc-login.h" | #include "irc-login.h" | ||||||
| #include "irc-mode.h" | #include "irc-mode.h" | ||||||
| #include "irc-op.h" | #include "irc-op.h" | ||||||
| @@ -89,6 +90,7 @@ COMMAND My_Commands[] = | |||||||
| 	{ "RESTART", IRC_RESTART, CLIENT_USER, 0 }, | 	{ "RESTART", IRC_RESTART, CLIENT_USER, 0 }, | ||||||
| 	{ "SERVER", IRC_SERVER, 0xFFFF, 0 }, | 	{ "SERVER", IRC_SERVER, 0xFFFF, 0 }, | ||||||
| 	{ "SQUIT", IRC_SQUIT, CLIENT_SERVER, 0 }, | 	{ "SQUIT", IRC_SQUIT, CLIENT_SERVER, 0 }, | ||||||
|  | 	{ "STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0 }, | ||||||
| 	{ "TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0 }, | 	{ "TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0 }, | ||||||
| 	{ "TOPIC", IRC_TOPIC, CLIENT_USER|CLIENT_SERVER, 0 }, | 	{ "TOPIC", IRC_TOPIC, CLIENT_USER|CLIENT_SERVER, 0 }, | ||||||
| 	{ "USER", IRC_USER, 0xFFFF, 0 }, | 	{ "USER", IRC_USER, 0xFFFF, 0 }, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Alexander Barton
					Alexander Barton