// if an unknown command with parameters was encountered when loading // config.cfg, assume it's a cvar set and spawn a temp var qbool Cvar_CreateTempVar (void) { const char *name = Cmd_Argv(0); // FIXME, make sure it's a valid cvar name, return false if not Cvar_Get (name, Cmd_MakeArgs(1), CVAR_TEMP); return true; }
qbool Cvar_Command (void) { cvar_t *v; // check variables if (!(v = Cvar_Find (Cmd_Argv(0)))) return false; if (Cmd_Argc() == 1) { if (cvar_viewhelp.value) Help_DescribeCvar (v); if (cvar_viewdefault.value) { char *spaces = CreateSpaces(strlen(v->name) + 2); Com_Printf ("%s : default value is \"%s\"\n", v->name, v->defaultvalue); Com_Printf ("%s current value is \"%s\"\n", spaces, v->string); if ((v->flags & CVAR_AUTO) && v->autoString) { Com_Printf ("%s auto value is \"%s\"\n", spaces, v->autoString); } if (cvar_viewlatched.integer && v->latchedString) { Com_Printf ("%s latched value is \"%s\"\n", spaces, v->latchedString); } } else { Com_Printf ("\"%s\" is \"%s\"\n", v->name, v->string); if ((v->flags & CVAR_AUTO) && v->autoString) { Com_Printf ("auto: \"%s\"\n", v->autoString); } if (cvar_viewlatched.integer && v->latchedString) { Com_Printf ("latched: \"%s\"\n", v->latchedString); } } } else { // RestrictTriggers means that advanced (possibly cheaty) scripts are not allowed // So we will force the usage of user-created variables to go through the set command if ((v->flags & CVAR_USER_CREATED) && Rulesets_RestrictTriggers()) { Com_Printf ("Current ruleset requires \"set\" with user created variables\n"); return true; } Cvar_Set (v, Cmd_MakeArgs(1)); } return true; }
/* =============== Cmd_Alias_f Creates a new command that executes a command string (possibly ; separated) =============== */ void Cmd_Alias_f (void) { cmd_alias_t *a; int key; char *name; if (Cmd_Argc() == 1) { Com_Printf ("alias <name> <command> : create or modify an alias\n"); Com_Printf ("aliaslist : list all aliases\n"); return; } name = Cmd_Argv(1); // see if there's already an alias by that name a = Cmd_FindAlias(name); if (a) { // reuse it Q_free (a->name); Q_free (a->value); } else { // allocate a new one a = Q_malloc (sizeof(cmd_alias_t)); a->flags = 0; // link it in a->next = cmd_alias; cmd_alias = a; key = Com_HashKey(name); a->hash_next = cmd_alias_hash[key]; cmd_alias_hash[key] = a; } a->name = Q_strdup(name); a->value = Q_strdup(Cmd_MakeArgs(2)); // copy the rest of the command line #ifndef SERVERONLY if (cbuf_current == &cbuf_svc) a->flags |= ALIAS_STUFFED; else a->flags &= ALIAS_STUFFED; #endif if (!Q_stricmp(Cmd_Argv(0), "aliasa")) a->flags |= ALIAS_ARCHIVE; }
void Cvar_Set_Eval_f(void) { if (Cmd_Argc() < 3) { Com_Printf("Usage:\n" "set_eval <variable> <expression>\n" "set_eval is similar to set_calc but supports richer expressions\n"); return; } else { const char *expression; char *var_name; cvar_t *var; int errn; expr_val result; var_name = Cmd_Argv (1); var = Cvar_Find (var_name); if (!var) var = Cvar_Create (var_name, Cmd_Argv (1), 0); expression = Cmd_MakeArgs(2); result = Expr_Eval(expression, NULL, &errn); if (errn == EXPR_EVAL_SUCCESS) { switch (result.type) { case ET_INT: Cvar_SetValue(var, result.i_val); break; case ET_DBL: Cvar_SetValue(var, result.d_val); break; case ET_BOOL: Cvar_SetValue(var, result.b_val ? 1 : 0); break; case ET_STR: Cvar_Set(var, result.s_val); free(result.s_val); break; } } else { Com_Printf("Error in expression: %s\n", Parser_Error_Description(errn)); } } }
/* =============== SVC_RemoteCommand A client issued an rcon command. Shift down the remaining args Redirect all printfs =============== */ void SVC_RemoteCommand (void) { if (!Rcon_Validate ()) { Com_Printf ("Bad rcon from %s:\n%s\n", NET_AdrToString (net_from), net_message.data+4); SV_BeginRedirect (RD_PACKET); Com_Printf ("Bad rcon_password\n"); } else { Com_Printf ("Rcon from %s:\n%s\n", NET_AdrToString (net_from), net_message.data+4); SV_BeginRedirect (RD_PACKET); Cmd_ExecuteString (Cmd_MakeArgs(2)); } SV_EndRedirect (); }
/* ============ Cvar_Command Handles variable inspection and changing from the console ============ */ qbool Cvar_Command (void) { cvar_t *var; // check variables var = Cvar_Find (Cmd_Argv(0)); if (!var) return false; // perform a variable print or set if (Cmd_Argc() == 1) { Com_Printf ("\"%s\" is \"%s\"\n", var->name, var->string); return true; } Cvar_Set (var, Cmd_MakeArgs(1)); return true; }
/* ===================== CL_Rcon_f Send the rest of the command line over as an unconnected command. ===================== */ void CL_Rcon_f (void) { char message[1024]; netadr_t to; extern cvar_t cl_rconAddress; extern cvar_t *cl_rconPassword; message[0] = 255; message[1] = 255; message[2] = 255; message[3] = 255; message[4] = 0; strcat (message, "rcon "); if (cl_rconPassword->string[0]) { strcat (message, cl_rconPassword->string); strcat (message, " "); } strlcat (message, Cmd_MakeArgs(1), sizeof(message)); if (cls.state >= ca_connected) to = cls.netchan.remote_address; else { if (!strlen(cl_rconAddress.string)) { Com_Printf ("You must either be connected,\n" "or set the 'rcon_address' cvar\n" "to issue rcon commands\n"); return; } NET_StringToAdr (cl_rconAddress.string, &to); if (to.port == 0) to.port = BigShort (PORT_SERVER); } NET_SendPacket (NS_CLIENT, strlen(message)+1, message , to); }
void SList_Load (void) { char line[128]; char filename[MAX_OSPATH] = {0}; char *desc, *addr; unsigned int len; int c, argc, count; FILE *f; snprintf(&filename[0], sizeof(filename), "%s/servers.txt", com_basedir); if (!(f = fopen(filename, "r"))) return; count = len = 0; while ((c = getc(f))) { if (c == '\n' || c == '\r' || c == EOF) { if (c == '\r' && (c = getc(f)) != '\n' && c != EOF) ungetc(c, f); line[len] = 0; len = 0; Cmd_TokenizeString(line); if ((argc = Cmd_Argc()) >= 1) { addr = Cmd_Argv(0); desc = (argc >= 2) ? Cmd_MakeArgs(1) : "Unknown"; SList_Set (count, addr, desc); if (++count == MAX_SERVER_LIST) break; } if (c == EOF) break; //just in case an EOF follows a '\r' } else { if (len + 1 < sizeof(line)) line[len++] = c; } } fclose (f); slist_initialised = true; }