From 4b2de85026cee42d3c3c2e2c786077ba36ec876a Mon Sep 17 00:00:00 2001 From: havoc Date: Thu, 11 Jun 2009 02:08:32 +0000 Subject: [PATCH] patch from RocketGuy for pqrcon command, to administrate proquake servers git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9015 d7cf8633-e32d-0410-b094-e92efae38249 --- host_cmd.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ netconn.c | 6 ++++++ netconn.h | 9 +++++++++ 3 files changed, 73 insertions(+) diff --git a/host_cmd.c b/host_cmd.c index 1d474610..cdda57cc 100644 --- a/host_cmd.c +++ b/host_cmd.c @@ -2347,6 +2347,63 @@ static void MaxPlayers_f(void) Cvar_Set ("deathmatch", "1"); } +/* +===================== +Host_PQRcon_f + +ProQuake rcon support +===================== +*/ +void Host_PQRcon_f (void) +{ + int i; + lhnetaddress_t to; + lhnetsocket_t *mysocket; + char peer_address[64]; + + if (!rcon_password.string || !rcon_password.string[0]) + { + Con_Printf ("You must set rcon_password before issuing an rcon command.\n"); + return; + } + + for (i = 0;rcon_password.string[i];i++) + { + if (ISWHITESPACE(rcon_password.string[i])) + { + Con_Printf("rcon_password is not allowed to have any whitespace.\n"); + return; + } + } + + if (cls.netcon) + { + InfoString_GetValue(cls.userinfo, "*ip", peer_address, sizeof(peer_address)); + } + else + { + if (!rcon_address.string[0]) + { + Con_Printf ("You must either be connected, or set the rcon_address cvar to issue rcon commands\n"); + return; + } + strlcpy(peer_address, rcon_address.string, strlen(rcon_address.string)+1); + } + LHNETADDRESS_FromString(&to, peer_address, sv_netport.integer); + mysocket = NetConn_ChooseClientSocketForAddress(&to); + if (mysocket) + { + SZ_Clear(&net_message); + MSG_WriteLong (&net_message, 0); + MSG_WriteByte (&net_message, CCREQ_RCON); + MSG_WriteString (&net_message, rcon_password.string); + MSG_WriteString (&net_message, Cmd_Args()); + *((int *)net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); + NetConn_Write(mysocket, net_message.data, net_message.cursize, &to); + SZ_Clear (&net_message); + } +} + //============================================================================= // QuakeWorld commands @@ -2792,6 +2849,7 @@ void Host_InitCommands (void) Cvar_RegisterVariable (&rcon_secure); Cmd_AddCommand ("rcon", Host_Rcon_f, "sends a command to the server console (if your rcon_password matches the server's rcon_password), or to the address specified by rcon_address when not connected (again rcon_password must match the server's); note: if rcon_secure is set, client and server clocks must be synced e.g. via NTP"); Cmd_AddCommand ("srcon", Host_Rcon_f, "sends a command to the server console (if your rcon_password matches the server's rcon_password), or to the address specified by rcon_address when not connected (again rcon_password must match the server's); this always works as if rcon_secure is set; note: client and server clocks must be synced e.g. via NTP"); + Cmd_AddCommand ("pqrcon", Host_PQRcon_f, "sends a command to a proquake server console (if your rcon_password matches the server's rcon_password), or to the address specified by rcon_address when not connected (again rcon_password must match the server's)"); Cmd_AddCommand ("user", Host_User_f, "prints additional information about a player number or name on the scoreboard"); Cmd_AddCommand ("users", Host_Users_f, "prints additional information about all players on the scoreboard"); Cmd_AddCommand ("fullserverinfo", Host_FullServerinfo_f, "internal use only, sent by server to client to update client's local copy of serverinfo string"); diff --git a/netconn.c b/netconn.c index 2bc262fa..fc2b34c3 100755 --- a/netconn.c +++ b/netconn.c @@ -1851,6 +1851,12 @@ static int NetConn_ClientParsePacket(lhnetsocket_t *mysocket, unsigned char *dat NetConn_ClientParsePacket_ServerList_UpdateCache(n); + break; + case CCREP_RCON: // RocketGuy: ProQuake rcon support + if (developer.integer >= 10) + Con_Printf("Datagram_ParseConnectionless: received CCREP_RCON from %s.\n", addressstring2); + + Con_Printf("%s\n", MSG_ReadString()); break; case CCREP_PLAYER_INFO: // we got a CCREP_PLAYER_INFO?? diff --git a/netconn.h b/netconn.h index aacbcd7e..29670ccb 100755 --- a/netconn.h +++ b/netconn.h @@ -62,6 +62,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // CCREQ_RULE_INFO // string rule // +// CCREQ_RCON +// string password +// string command +// // // // CCREP_ACCEPT @@ -89,6 +93,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // CCREP_RULE_INFO // string rule // string value +// +// CCREP_RCON +// string reply // note: // There are two address forms used above. The short form is just a @@ -104,12 +111,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define CCREQ_SERVER_INFO 0x02 #define CCREQ_PLAYER_INFO 0x03 #define CCREQ_RULE_INFO 0x04 +#define CCREQ_RCON 0x05 // RocketGuy: ProQuake rcon support #define CCREP_ACCEPT 0x81 #define CCREP_REJECT 0x82 #define CCREP_SERVER_INFO 0x83 #define CCREP_PLAYER_INFO 0x84 #define CCREP_RULE_INFO 0x85 +#define CCREP_RCON 0x86 // RocketGuy: ProQuake rcon support typedef struct netconn_s { -- 2.39.2