mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-10-31 05:52:59 +00:00 
			
		
		
		
	Changed Numerics 265 and 266 to follow ircd 2.11.x "standards". [from HEAD]
Allow PASS syntax defined in RFC 1459 for server links, too. [from HEAD] Enhanced ISUPPORT message (005 numeric). [from HEAD]
This commit is contained in:
		| @@ -14,6 +14,9 @@ ngIRCd 0.10.x | |||||||
|  |  | ||||||
|   - Fixed validation of server names containing digits. |   - Fixed validation of server names containing digits. | ||||||
|   - Update info text of local server after re-reading configuration. |   - Update info text of local server after re-reading configuration. | ||||||
|  |   - Changed Numerics 265 and 266 to follow ircd 2.11.x "standards". | ||||||
|  |   - Allow PASS syntax defined in RFC 1459 for server links, too. | ||||||
|  |   - Enhanced ISUPPORT message (005 numeric). | ||||||
|   - New configuration option "PredefChannelsOnly": if set, clients can |   - New configuration option "PredefChannelsOnly": if set, clients can | ||||||
|    only join predefined channels. |    only join predefined channels. | ||||||
|  |  | ||||||
| @@ -668,4 +671,4 @@ ngIRCd 0.0.1, 31.12.2001 | |||||||
|  |  | ||||||
|  |  | ||||||
| --  | --  | ||||||
| $Id: ChangeLog,v 1.302.2.7 2006/12/02 13:10:44 fw Exp $ | $Id: ChangeLog,v 1.302.2.8 2006/12/02 14:26:52 fw Exp $ | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ | |||||||
|  * (at your option) any later version. |  * (at your option) any later version. | ||||||
|  * Please read the file COPYING, README and AUTHORS for more information. |  * Please read the file COPYING, README and AUTHORS for more information. | ||||||
|  * |  * | ||||||
|  * $Id: client.h,v 1.42.2.1 2006/12/02 14:00:00 fw Exp $ |  * $Id: client.h,v 1.42.2.2 2006/12/02 14:26:53 fw Exp $ | ||||||
|  * |  * | ||||||
|  * Client management (header) |  * Client management (header) | ||||||
|  */ |  */ | ||||||
| @@ -23,10 +23,9 @@ | |||||||
| #define CLIENT_GOTNICK 4		/* client did send NICK */ | #define CLIENT_GOTNICK 4		/* client did send NICK */ | ||||||
| #define CLIENT_GOTUSER 8		/* client did send USER */ | #define CLIENT_GOTUSER 8		/* client did send USER */ | ||||||
| #define CLIENT_USER 16			/* client is an IRC user */ | #define CLIENT_USER 16			/* client is an IRC user */ | ||||||
| #define CLIENT_UNKNOWNSERVER 32		/* unregistered server connection */ | #define CLIENT_SERVER 32		/* client is a server */ | ||||||
| #define CLIENT_GOTPASSSERVER 64		/* client did send PASS in "server style" */ | #define CLIENT_SERVICE 64		/* client is a service */ | ||||||
| #define CLIENT_SERVER 128		/* client is a server */ | #define CLIENT_UNKNOWNSERVER 128	/* unregistered server connection */ | ||||||
| #define CLIENT_SERVICE 256		/* client is a service */ |  | ||||||
|  |  | ||||||
| #define CLIENT_TYPE int | #define CLIENT_TYPE int | ||||||
|  |  | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ | |||||||
|  |  | ||||||
| #include "portab.h" | #include "portab.h" | ||||||
|  |  | ||||||
| static char UNUSED id[] = "$Id: irc-info.c,v 1.33.2.1 2006/09/16 13:49:15 alex Exp $"; | static char UNUSED id[] = "$Id: irc-info.c,v 1.33.2.2 2006/12/02 14:26:53 fw Exp $"; | ||||||
|  |  | ||||||
| #include "imp.h" | #include "imp.h" | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| @@ -542,7 +542,8 @@ GLOBAL bool | |||||||
| IRC_WHO( CLIENT *Client, REQUEST *Req ) | IRC_WHO( CLIENT *Client, REQUEST *Req ) | ||||||
| { | { | ||||||
| 	bool ok, only_ops; | 	bool ok, only_ops; | ||||||
| 	char flags[8], *ptr; | 	char flags[8]; | ||||||
|  | 	const char *ptr; | ||||||
| 	CL2CHAN *cl2chan; | 	CL2CHAN *cl2chan; | ||||||
| 	CHANNEL *chan, *cn; | 	CHANNEL *chan, *cn; | ||||||
| 	CLIENT *c; | 	CLIENT *c; | ||||||
| @@ -832,7 +833,10 @@ IRC_WHOWAS( CLIENT *Client, REQUEST *Req ) | |||||||
| GLOBAL bool | GLOBAL bool | ||||||
| IRC_Send_LUSERS( CLIENT *Client ) | IRC_Send_LUSERS( CLIENT *Client ) | ||||||
| { | { | ||||||
| 	long cnt; | 	unsigned long cnt; | ||||||
|  | #ifndef STRICT_RFC | ||||||
|  | 	unsigned long max; | ||||||
|  | #endif | ||||||
|  |  | ||||||
| 	assert( Client != NULL ); | 	assert( Client != NULL ); | ||||||
|  |  | ||||||
| @@ -861,9 +865,17 @@ IRC_Send_LUSERS( CLIENT *Client ) | |||||||
|  |  | ||||||
| #ifndef STRICT_RFC | #ifndef STRICT_RFC | ||||||
| 	/* Maximum number of local users */ | 	/* Maximum number of local users */ | ||||||
| 	if( ! IRC_WriteStrClient( Client, RPL_LOCALUSERS_MSG, Client_ID( Client ), Client_MyUserCount( ), Client_MyMaxUserCount( ))) return DISCONNECTED; | 	cnt = Client_MyUserCount(); | ||||||
|  | 	max = Client_MyMaxUserCount(); | ||||||
|  | 	if (! IRC_WriteStrClient(Client, RPL_LOCALUSERS_MSG, Client_ID(Client), | ||||||
|  | 			cnt, max, cnt, max)) | ||||||
|  | 		return DISCONNECTED; | ||||||
| 	/* Maximum number of users in the network */ | 	/* Maximum number of users in the network */ | ||||||
| 	if( ! IRC_WriteStrClient( Client, RPL_NETUSERS_MSG, Client_ID( Client ), Client_UserCount( ), Client_MaxUserCount( ))) return DISCONNECTED; | 	cnt = Client_UserCount(); | ||||||
|  | 	max = Client_MaxUserCount(); | ||||||
|  | 	if(! IRC_WriteStrClient(Client, RPL_NETUSERS_MSG, Client_ID(Client), | ||||||
|  | 			cnt, max, cnt, max)) | ||||||
|  | 		return DISCONNECTED; | ||||||
| #endif | #endif | ||||||
| 	 | 	 | ||||||
| 	return CONNECTED; | 	return CONNECTED; | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ | |||||||
|  |  | ||||||
| #include "portab.h" | #include "portab.h" | ||||||
|  |  | ||||||
| static char UNUSED id[] = "$Id: irc-login.c,v 1.49.2.1 2006/12/02 13:54:10 fw Exp $"; | static char UNUSED id[] = "$Id: irc-login.c,v 1.49.2.2 2006/12/02 14:26:53 fw Exp $"; | ||||||
|  |  | ||||||
| #include "imp.h" | #include "imp.h" | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| @@ -44,6 +44,7 @@ static char UNUSED id[] = "$Id: irc-login.c,v 1.49.2.1 2006/12/02 13:54:10 fw Ex | |||||||
| static bool Hello_User PARAMS(( CLIENT *Client )); | static bool Hello_User PARAMS(( CLIENT *Client )); | ||||||
| static void Kill_Nick PARAMS(( char *Nick, char *Reason )); | static void Kill_Nick PARAMS(( char *Nick, char *Reason )); | ||||||
|  |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Handler for the IRC command "PASS". |  * Handler for the IRC command "PASS". | ||||||
|  * See RFC 2813 section 4.1.1, and RFC 2812 section 3.1.1. |  * See RFC 2813 section 4.1.1, and RFC 2812 section 3.1.1. | ||||||
| @@ -51,13 +52,16 @@ static void Kill_Nick PARAMS(( char *Nick, char *Reason )); | |||||||
| GLOBAL bool | GLOBAL bool | ||||||
| IRC_PASS( CLIENT *Client, REQUEST *Req ) | IRC_PASS( CLIENT *Client, REQUEST *Req ) | ||||||
| { | { | ||||||
|  | 	char *type, *orig_flags; | ||||||
|  | 	int protohigh, protolow; | ||||||
|  |  | ||||||
| 	assert( Client != NULL ); | 	assert( Client != NULL ); | ||||||
| 	assert( Req != NULL ); | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
| 	/* Return an error if this is not a local client */ | 	/* Return an error if this is not a local client */ | ||||||
| 	if (Client_Conn(Client) <= NONE) | 	if (Client_Conn(Client) <= NONE) | ||||||
| 		return IRC_WriteStrClient(Client, ERR_UNKNOWNCOMMAND_MSG, | 		return IRC_WriteStrClient(Client, ERR_UNKNOWNCOMMAND_MSG, | ||||||
| 					Client_ID(Client), Req->command); | 					  Client_ID(Client), Req->command); | ||||||
| 	 | 	 | ||||||
| 	if (Client_Type(Client) == CLIENT_UNKNOWN && Req->argc == 1) { | 	if (Client_Type(Client) == CLIENT_UNKNOWN && Req->argc == 1) { | ||||||
| 		/* Not yet registered "unknown" connection, PASS with one | 		/* Not yet registered "unknown" connection, PASS with one | ||||||
| @@ -65,54 +69,67 @@ IRC_PASS( CLIENT *Client, REQUEST *Req ) | |||||||
| 		 * using the old RFC 1459 section 4.1.1 syntax. */ | 		 * using the old RFC 1459 section 4.1.1 syntax. */ | ||||||
| 		LogDebug("Connection %d: got PASS command ...", | 		LogDebug("Connection %d: got PASS command ...", | ||||||
| 			 Client_Conn(Client)); | 			 Client_Conn(Client)); | ||||||
|  | 	} else if ((Client_Type(Client) == CLIENT_UNKNOWN || | ||||||
| 		Client_SetPassword( Client, Req->argv[0] ); | 		    Client_Type(Client) == CLIENT_UNKNOWNSERVER) && | ||||||
|  | 		   (Req->argc == 3 || Req->argc == 4)) { | ||||||
| 		Client_SetType( Client, CLIENT_GOTPASS ); | 		/* Not yet registered "unknown" connection or outgoing server | ||||||
| 		return CONNECTED; | 		 * link, PASS with three or four argument: server using the | ||||||
|  | 		 * RFC 2813 section 4.1.1 syntax. */ | ||||||
|  | 		LogDebug("Connection %d: got PASS command (new server link) ...", | ||||||
|  | 			 Client_Conn(Client)); | ||||||
|  | 	} else if (Client_Type(Client) == CLIENT_UNKNOWN || | ||||||
|  | 		   Client_Type(Client) == CLIENT_UNKNOWNSERVER) { | ||||||
|  | 		/* Unregistered connection, but wrong number of arguments: */ | ||||||
|  | 		return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, | ||||||
|  | 					  Client_ID(Client), Req->command); | ||||||
|  | 	} else { | ||||||
|  | 		/* Registered connection, PASS command is not allowed! */ | ||||||
|  | 		return IRC_WriteStrClient(Client, ERR_ALREADYREGISTRED_MSG, | ||||||
|  | 					  Client_ID(Client)); | ||||||
| 	} | 	} | ||||||
| 	else if((( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) && (( Req->argc == 3 ) || ( Req->argc == 4 ))) |  | ||||||
| 	{ |  | ||||||
| 		char c2, c4, *type, *impl, *serverver, *flags, *ptr, *ircflags; |  | ||||||
| 		int protohigh, protolow; |  | ||||||
|  |  | ||||||
| 		/* noch nicht registrierte Server-Verbindung */ | 	Client_SetPassword(Client, Req->argv[0]); | ||||||
| 		Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client )); | 	Client_SetType(Client, CLIENT_GOTPASS); | ||||||
|  |  | ||||||
| 		/* Passwort speichern */ | 	/* Protocol version */ | ||||||
| 		Client_SetPassword( Client, Req->argv[0] ); | 	if (Req->argc >= 2 && strlen(Req->argv[1]) >= 4) { | ||||||
|  | 		int c2, c4; | ||||||
|  |  | ||||||
| 		/* Protokollversion ermitteln */ | 		c2 = Req->argv[1][2]; | ||||||
| 		if( strlen( Req->argv[1] ) >= 4 ) | 		c4 = Req->argv[1][4]; | ||||||
| 		{ |  | ||||||
| 			c2 = Req->argv[1][2]; |  | ||||||
| 			c4 = Req->argv[1][4]; |  | ||||||
|  |  | ||||||
| 			Req->argv[1][4] = '\0'; | 		Req->argv[1][4] = '\0'; | ||||||
| 			protolow = atoi( &Req->argv[1][2] ); | 		protolow = atoi(&Req->argv[1][2]); | ||||||
| 			Req->argv[1][2] = '\0'; | 		Req->argv[1][2] = '\0'; | ||||||
| 			protohigh = atoi( Req->argv[1] ); | 		protohigh = atoi(Req->argv[1]); | ||||||
| 			 | 			 | ||||||
| 			Req->argv[1][2] = c2; | 		Req->argv[1][2] = c2; | ||||||
| 			Req->argv[1][4] = c4; | 		Req->argv[1][4] = c4; | ||||||
| 		}			 | 	} else | ||||||
| 		else protohigh = protolow = 0; | 		protohigh = protolow = 0; | ||||||
|  |  | ||||||
| 		/* Protokoll-Typ */ | 	/* Protocol type, see doc/Protocol.txt */ | ||||||
| 		if( strlen( Req->argv[1] ) > 4 ) type = &Req->argv[1][4]; | 	if (Req->argc >= 2 && strlen(Req->argv[1]) > 4) | ||||||
| 		else type = NULL; | 		type = &Req->argv[1][4]; | ||||||
|  | 	else | ||||||
|  | 		type = NULL; | ||||||
|  | 	 | ||||||
|  | 	/* Protocol flags/options */ | ||||||
|  | 	if (Req->argc >= 4) | ||||||
|  | 		orig_flags = Req->argv[3]; | ||||||
|  | 	else | ||||||
|  | 		orig_flags = ""; | ||||||
|  |  | ||||||
| 		/* IRC-Flags (nach RFC 2813) */ | 	/* Implementation, version and IRC+ flags */ | ||||||
| 		if( Req->argc >= 4 ) ircflags = Req->argv[3]; | 	if (Req->argc >= 3) { | ||||||
| 		else ircflags = ""; | 		char *impl, *ptr, *serverver, *flags; | ||||||
|  |  | ||||||
| 		/* Implementation, Version und ngIRCd-Flags */ |  | ||||||
| 		impl = Req->argv[2]; | 		impl = Req->argv[2]; | ||||||
| 		ptr = strchr(impl, '|'); | 		ptr = strchr(impl, '|'); | ||||||
| 		if (ptr) | 		if (ptr) | ||||||
| 			*ptr = '\0'; | 			*ptr = '\0'; | ||||||
|  |  | ||||||
| 		if (type && (strcmp( type, PROTOIRCPLUS ) == 0)) { | 		if (type && strcmp(type, PROTOIRCPLUS) == 0) { | ||||||
| 			/* The peer seems to be a server which supports the | 			/* The peer seems to be a server which supports the | ||||||
| 			 * IRC+ protocol (see doc/Protocol.txt). */ | 			 * IRC+ protocol (see doc/Protocol.txt). */ | ||||||
| 			serverver = ptr + 1; | 			serverver = ptr + 1; | ||||||
| @@ -123,30 +140,24 @@ IRC_PASS( CLIENT *Client, REQUEST *Req ) | |||||||
| 			} else | 			} else | ||||||
| 				flags = ""; | 				flags = ""; | ||||||
| 			Log(LOG_INFO, | 			Log(LOG_INFO, | ||||||
| 			"Peer announces itself as %s-%s using protocol %d.%d/IRC+ (flags: \"%s\").", impl, serverver, protohigh, protolow, flags ); | 			    "Peer announces itself as %s-%s using protocol %d.%d/IRC+ (flags: \"%s\").", | ||||||
|  | 			    impl, serverver, protohigh, protolow, flags); | ||||||
| 		} else { | 		} else { | ||||||
| 			/* The peer seems to be a server supporting the | 			/* The peer seems to be a server supporting the | ||||||
| 			 * "original" IRC protocol (RFC 2813). */ | 			 * "original" IRC protocol (RFC 2813). */ | ||||||
| 			serverver = ""; | 			serverver = ""; | ||||||
| 			if (strchr(ircflags, 'Z' )) | 			if (strchr(orig_flags, 'Z')) | ||||||
| 				flags = "Z"; | 				flags = "Z"; | ||||||
| 			else | 			else | ||||||
| 				flags = ""; | 				flags = ""; | ||||||
| 			Log(LOG_INFO, | 			Log(LOG_INFO, | ||||||
| 				"Peer announces itself as \"%s\" using protocol %d.%d (flags: \"%s\").", impl, protohigh, protolow, flags ); | 			    "Peer announces itself as \"%s\" using protocol %d.%d (flags: \"%s\").", | ||||||
|  | 			    impl, protohigh, protolow, flags); | ||||||
| 		} | 		} | ||||||
|  | 		Client_SetFlags(Client, flags); | ||||||
| 		Client_SetType( Client, CLIENT_GOTPASSSERVER ); |  | ||||||
| 		Client_SetFlags( Client, flags ); |  | ||||||
|  |  | ||||||
| 		return CONNECTED; |  | ||||||
| 	} | 	} | ||||||
| 	else if(( Client_Type( Client ) == CLIENT_UNKNOWN  ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) |  | ||||||
| 	{ | 	return CONNECTED; | ||||||
| 		/* Falsche Anzahl Parameter? */ |  | ||||||
| 		return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
| 	} |  | ||||||
| 	else return IRC_WriteStrClient( Client, ERR_ALREADYREGISTRED_MSG, Client_ID( Client )); |  | ||||||
| } /* IRC_PASS */ | } /* IRC_PASS */ | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -607,8 +618,13 @@ Hello_User( CLIENT *Client ) | |||||||
|  |  | ||||||
| 	/* Features supported by this server (005 numeric, ISUPPORT), | 	/* Features supported by this server (005 numeric, ISUPPORT), | ||||||
| 	 * see <http://www.irc.org/tech_docs/005.html> for details. */ | 	 * see <http://www.irc.org/tech_docs/005.html> for details. */ | ||||||
| 	if( ! IRC_WriteStrClient( Client, RPL_ISUPPORT_MSG, Client_ID( Client ), CLIENT_NICK_LEN - 1, | 	if (! IRC_WriteStrClient(Client, RPL_ISUPPORT1_MSG, Client_ID(Client), | ||||||
| 			COMMAND_LEN - 23, CLIENT_AWAY_LEN - 1, Conf_MaxJoins )) return DISCONNECTED; | 			Conf_MaxJoins)) | ||||||
|  | 		return DISCONNECTED; | ||||||
|  | 	if (! IRC_WriteStrClient(Client, RPL_ISUPPORT2_MSG, Client_ID(Client), | ||||||
|  | 			CHANNEL_NAME_LEN-1, CLIENT_NICK_LEN-1, COMMAND_LEN-23, | ||||||
|  | 			CLIENT_AWAY_LEN-1, COMMAND_LEN-113)) | ||||||
|  | 		return DISCONNECTED; | ||||||
|  |  | ||||||
| 	Client_SetType( Client, CLIENT_USER ); | 	Client_SetType( Client, CLIENT_USER ); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ | |||||||
|  |  | ||||||
| #include "portab.h" | #include "portab.h" | ||||||
|  |  | ||||||
| static char UNUSED id[] = "$Id: irc-server.c,v 1.39.2.1 2006/12/02 14:21:26 fw Exp $"; | static char UNUSED id[] = "$Id: irc-server.c,v 1.39.2.2 2006/12/02 14:26:53 fw Exp $"; | ||||||
|  |  | ||||||
| #include "imp.h" | #include "imp.h" | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| @@ -64,7 +64,7 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req ) | |||||||
| 		return IRC_WriteStrClient(Client, ERR_UNKNOWNCOMMAND_MSG, | 		return IRC_WriteStrClient(Client, ERR_UNKNOWNCOMMAND_MSG, | ||||||
| 					  Client_ID(Client), Req->command); | 					  Client_ID(Client), Req->command); | ||||||
|  |  | ||||||
| 	if (Client_Type(Client) == CLIENT_GOTPASSSERVER) { | 	if (Client_Type(Client) == CLIENT_GOTPASS) { | ||||||
| 		/* We got a PASS command from the peer, and now a SERVER | 		/* We got a PASS command from the peer, and now a SERVER | ||||||
| 		 * command: the peer tries to register itself as a server. */ | 		 * command: the peer tries to register itself as a server. */ | ||||||
| 		LogDebug("Connection %d: got SERVER command (new server link) ...", | 		LogDebug("Connection %d: got SERVER command (new server link) ...", | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ | |||||||
|  * (at your option) any later version. |  * (at your option) any later version. | ||||||
|  * Please read the file COPYING, README and AUTHORS for more information. |  * Please read the file COPYING, README and AUTHORS for more information. | ||||||
|  * |  * | ||||||
|  * $Id: messages.h,v 1.67.2.1 2006/12/02 14:21:26 fw Exp $ |  * $Id: messages.h,v 1.67.2.2 2006/12/02 14:26:53 fw Exp $ | ||||||
|  * |  * | ||||||
|  * IRC numerics (Header) |  * IRC numerics (Header) | ||||||
|  */ |  */ | ||||||
| @@ -22,7 +22,8 @@ | |||||||
| #define RPL_YOURHOST_MSG		"002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)" | #define RPL_YOURHOST_MSG		"002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)" | ||||||
| #define RPL_CREATED_MSG			"003 %s :This server has been started %s" | #define RPL_CREATED_MSG			"003 %s :This server has been started %s" | ||||||
| #define RPL_MYINFO_MSG			"004 %s %s ngircd-%s %s %s" | #define RPL_MYINFO_MSG			"004 %s %s ngircd-%s %s %s" | ||||||
| #define RPL_ISUPPORT_MSG		"005 %s NICKLEN=%d TOPICLEN=%d AWAYLEN=%d MAXCHANNELS=%d :are supported on this server" | #define RPL_ISUPPORT1_MSG		"005 %s RFC2812 CASEMAPPING=ascii PREFIX=(ov)@+ CHANTYPES=# CHANMODES=bI,k,l,imnPst CHANLIMIT=#:%d :are supported on this server" | ||||||
|  | #define RPL_ISUPPORT2_MSG		"005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d PENALTY :are supported on this server" | ||||||
|  |  | ||||||
| #define RPL_TRACELINK_MSG		"200 %s Link %s-%s %s %s V%s %ld %d %d" | #define RPL_TRACELINK_MSG		"200 %s Link %s-%s %s %s V%s %ld %d %d" | ||||||
| #define RPL_TRACEOPERATOR_MSG		"204 %s Oper 2 :%s" | #define RPL_TRACEOPERATOR_MSG		"204 %s Oper 2 :%s" | ||||||
| @@ -41,8 +42,8 @@ | |||||||
| #define RPL_ADMINLOC2_MSG		"258 %s :%s" | #define RPL_ADMINLOC2_MSG		"258 %s :%s" | ||||||
| #define RPL_ADMINEMAIL_MSG		"259 %s :%s" | #define RPL_ADMINEMAIL_MSG		"259 %s :%s" | ||||||
| #define RPL_TRACEEND_MSG		"262 %s %s %s-%s.%s :End of TRACE" | #define RPL_TRACEEND_MSG		"262 %s %s %s-%s.%s :End of TRACE" | ||||||
| #define RPL_LOCALUSERS_MSG		"265 %s :Current local users: %lu, Max: %lu" | #define RPL_LOCALUSERS_MSG		"265 %s %lu %lu :Current local users: %lu, Max: %lu" | ||||||
| #define RPL_NETUSERS_MSG		"266 %s :Current global users: %lu, Max: %lu" | #define RPL_NETUSERS_MSG		"266 %s %lu %lu :Current global users: %lu, Max: %lu" | ||||||
|  |  | ||||||
| #define RPL_AWAY_MSG			"301 %s %s :%s" | #define RPL_AWAY_MSG			"301 %s %s :%s" | ||||||
| #define RPL_USERHOST_MSG		"302 %s :" | #define RPL_USERHOST_MSG		"302 %s :" | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Florian Westphal
					Florian Westphal