Author: Amelia Date: Thu Jun 29 00:33:53 2023 +0200 diff --git a/src/ngircd/irc.c b/src/ngircd/irc.c index ba33e5ae..42b6d0f5 100644 --- a/src/ngircd/irc.c +++ b/src/ngircd/irc.c @@ -217,6 +217,33 @@ IRC_SQUERY(CLIENT *Client, REQUEST *Req) return Send_Message(Client, Req, CLIENT_SERVICE, true); } /* IRC_SQUERY */ +/** + * Handler for the (non-standard) commands to message services. + * + * @param Client The client from which this command has been received. + * @param Req Request structure with prefix and all parameters. + * @return CONNECTED or DISCONNECTED. + */ +GLOBAL bool +IRC_MSGSERV(CLIENT *Client, REQUEST *Req) +{ + char fakecommand[8]; + + assert(Req != NULL); + + if (Req->argc == 1) { + Req->argv[1] = Req->argv[0]; + Req->argc = 2; + } else if (Req->argc == 0) { + Req->argc = 1; + } + + Req->argv[0] = Req->command; + Req->command = strcpy(fakecommand, "SQUERY"); + + return Send_Message(Client, Req, CLIENT_SERVICE, true); +} /* IRC_MSGSERV */ + /* * Handler for the IRC "TRACE" command. * diff --git a/src/ngircd/irc.h b/src/ngircd/irc.h index 03fb0dc4..c33f51c9 100644 --- a/src/ngircd/irc.h +++ b/src/ngircd/irc.h @@ -25,6 +25,7 @@ GLOBAL bool IRC_KILL PARAMS((CLIENT *Client, REQUEST *Req)); GLOBAL bool IRC_NOTICE PARAMS((CLIENT *Client, REQUEST *Req)); GLOBAL bool IRC_PRIVMSG PARAMS((CLIENT *Client, REQUEST *Req)); GLOBAL bool IRC_SQUERY PARAMS((CLIENT *Client, REQUEST *Req)); +GLOBAL bool IRC_MSGSERV PARAMS((CLIENT *Client, REQUEST *Req)); GLOBAL bool IRC_TRACE PARAMS((CLIENT *Client, REQUEST *Req)); GLOBAL bool IRC_HELP PARAMS((CLIENT *Client, REQUEST *Req)); diff --git a/src/ngircd/parse.c b/src/ngircd/parse.c index 7b5d28c2..930ac298 100644 --- a/src/ngircd/parse.c +++ b/src/ngircd/parse.c @@ -99,6 +99,7 @@ static COMMAND My_Commands[] = _CMD("SERVICE", IRC_SERVICE, CLIENT_ANY, 6, 6, 0), _CMD("SERVLIST", IRC_SERVLIST, CLIENT_USER, 0, 2, 1), _CMD("SQUERY", IRC_SQUERY, CLIENT_USER|CLIENT_SERVER, 0, 2, 0), + _CMD("NICKSERV", IRC_MSGSERV, CLIENT_USER|CLIENT_SERVER, 0, 1, 0), _CMD("SQUIT", IRC_SQUIT, CLIENT_USER|CLIENT_SERVER, 2, 2, 0), _CMD("STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0, 2, 2), _CMD("SVSNICK", IRC_SVSNICK, CLIENT_SERVER, 2, 2, 0), @@ -226,7 +227,15 @@ Parse_Request( CONN_ID Idx, char *Request ) /* Arguments, Parameters */ if( ptr ) { - start = ptr + 1; + /* Check for one-arg "aliases" */ + if ( strcasecmp( "NICKSERV", req.command ) == 0 ) + { + req.argv[req.argc++] = ptr + 1; + start = NULL; + } else { + start = ptr + 1; + } + while( start ) { if( start[0] == ':' )