mirror of
https://github.com/osmarks/ngircd.git
synced 2025-05-15 13:44:09 +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:
parent
a64e33b317
commit
c9e26562ce
@ -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 :"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user