+/*
+=====================
+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);
+ }
+}
+