X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=host_cmd.c;h=b3b7b9bb0a8e45e720f31da697c870a7d6cc2f1d;hb=323b17db9329c0c4e1f3832f9cacf9102659b7c5;hp=ccf6c5bc5c87d114caede29c5563e27fdae1747d;hpb=8edc360701506cfa26f8f16952e68d2125a41dcb;p=xonotic%2Fdarkplaces.git diff --git a/host_cmd.c b/host_cmd.c index ccf6c5bc..b3b7b9bb 100644 --- a/host_cmd.c +++ b/host_cmd.c @@ -987,22 +987,30 @@ void Host_Name_f (void) { int i, j; qboolean valid_colors; + const char *newNameSource; char newName[sizeof(host_client->name)]; if (Cmd_Argc () == 1) { - Con_Printf("\"name\" is \"%s\"\n", cl_name.string); + Con_Printf("name: %s\n", cl_name.string); return; } if (Cmd_Argc () == 2) - strlcpy (newName, Cmd_Argv(1), sizeof (newName)); + newNameSource = Cmd_Argv(1); else - strlcpy (newName, Cmd_Args(), sizeof (newName)); + newNameSource = Cmd_Args(); + + strlcpy(newName, newNameSource, sizeof(newName)); if (cmd_source == src_command) { Cvar_Set ("_cl_name", newName); + if (strlen(newNameSource) >= sizeof(newName)) // overflowed + { + Con_Printf("Your name is longer than %i chars! It has been truncated.\n", (int) (sizeof(newName) - 1)); + Con_Printf("name: %s\n", cl_name.string); + } return; } @@ -2339,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] || rcon_secure.integer) + { + Con_Printf ("You must set rcon_password before issuing an pqrcon command, and rcon_secure must be 0.\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 @@ -2391,7 +2456,7 @@ void Host_Rcon_f (void) // credit: taken from QuakeWorld { char buf[1500]; char argbuf[1500]; - dpsnprintf(argbuf, sizeof(argbuf), "%ld %s", (long) time(NULL), Cmd_Args()); + dpsnprintf(argbuf, sizeof(argbuf), "%ld.%06d %s", (long) time(NULL), (int) (rand() % 1000000), Cmd_Args()); memcpy(buf, "\377\377\377\377srcon HMAC-MD4 TIME ", 24); if(HMAC_MDFOUR_16BYTES((unsigned char *) (buf + 24), (unsigned char *) argbuf, strlen(argbuf), (unsigned char *) rcon_password.string, strlen(rcon_password.string))) { @@ -2782,8 +2847,9 @@ void Host_InitCommands (void) Cvar_RegisterVariable (&rcon_password); Cvar_RegisterVariable (&rcon_address); 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)"); - 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"); + 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");