+/*
+=====================
+Host_PQRcon_f
+
+ProQuake rcon support
+=====================
+*/
+void Host_PQRcon_f (void)
+{
+ int n;
+ const char *e;
+ lhnetaddress_t to;
+ lhnetsocket_t *mysocket;
+ char peer_address[64];
+
+ if (!rcon_password.string || !rcon_password.string[0] || rcon_secure.integer > 0)
+ {
+ Con_Printf ("You must set rcon_password before issuing an pqrcon command, and rcon_secure must be 0.\n");
+ return;
+ }
+
+ e = strchr(rcon_password.string, ' ');
+ n = e ? e-rcon_password.string : (int)strlen(rcon_password.string);
+
+ 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);
+ SZ_Write(&net_message, (void*)rcon_password.string, n);
+ MSG_WriteString (&net_message, Cmd_Args());
+ StoreBigLong(net_message.data, NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK));
+ NetConn_Write(mysocket, net_message.data, net_message.cursize, &to);
+ SZ_Clear (&net_message);
+ }
+}
+