static void SV_Loadgame_f(void) { char *dir; if (Cmd_Argc() != 2) { Com_Printf("Usage: %s <directory>\n", Cmd_Argv(0)); return; } if (dedicated->integer) { Com_Printf("Savegames are for listen servers only.\n"); return; } dir = Cmd_Argv(1); if (!COM_IsPath(dir)) { Com_Printf("Bad savedir.\n"); return; } // make sure the server files exist if (!FS_FileExistsEx(va("save/%s/server.ssv", dir), FS_TYPE_REAL | FS_PATH_GAME) || !FS_FileExistsEx(va("save/%s/game.ssv", dir), FS_TYPE_REAL | FS_PATH_GAME)) { Com_Printf ("No such savegame: %s\n", dir); return; } // clear whatever savegames are there if (wipe_save_dir(SAVE_CURRENT)) { Com_Printf("Couldn't wipe '%s' directory.\n", SAVE_CURRENT); return; } // copy it off if (copy_save_dir(dir, SAVE_CURRENT)) { Com_Printf("Couldn't read '%s' directory.\n", dir); return; } // read server state if (read_server_file()) { Com_Printf("Couldn't read server file.\n"); return; } }
// Validate a path supplied by a filelist. static void check_and_queue_download(char *path) { size_t len; char *ext; dltype_t type; unsigned flags; int valid; len = strlen(path); if (len >= MAX_QPATH) return; ext = strrchr(path, '.'); if (!ext) return; ext++; if (!ext[0]) return; Q_strlwr(ext); if (!strcmp(ext, "pak") || !strcmp(ext, "pkz")) { Com_Printf("[HTTP] Filelist is requesting a .%s file '%s'\n", ext, path); type = DL_PAK; } else { type = DL_OTHER; if (!CL_CheckDownloadExtension(ext)) { Com_WPrintf("[HTTP] Illegal file type '%s' in filelist.\n", path); return; } } if (path[0] == '@') { if (type == DL_PAK) { Com_WPrintf("[HTTP] '@' prefix used on a pak file '%s' in filelist.\n", path); return; } flags = FS_PATH_GAME; path++; len--; } else if (type == DL_PAK) { //by definition paks are game-local flags = FS_PATH_GAME | FS_TYPE_REAL; } else { flags = 0; } len = FS_NormalizePath(path, path); if (len == 0) return; valid = FS_ValidatePath(path); if (valid == PATH_INVALID || !Q_ispath(path[0]) || !Q_ispath(path[len - 1]) || strstr(path, "..") || (type == DL_OTHER && !strchr(path, '/')) || (type == DL_PAK && strchr(path, '/'))) { Com_WPrintf("[HTTP] Illegal path '%s' in filelist.\n", path); return; } if (FS_FileExistsEx(path, flags)) return; if (valid == PATH_MIXED_CASE) Q_strlwr(path); if (CL_IgnoreDownload(path)) return; CL_QueueDownload(path, type); }