// // FromCurr // // Copying files from savepathtemp to savepath // void FromCurr(void) { DIR *sp2dir = NULL; struct dirent *f = NULL; if(!(sp2dir = opendir(savepathtemp))) I_Error("FromCurr: Couldn't open dir %s", savepathtemp); while((f = readdir(sp2dir))) { byte *filebuffer = NULL; int filelen = 0; char *srcfilename = NULL; char *dstfilename = NULL; // haleyjd: skip "." and ".." without assuming they're the // first two entries like the original code did. if(!strcmp(f->d_name, ".") || !strcmp(f->d_name, "..")) continue; // haleyjd: use M_SafeFilePath, NOT sprintf. srcfilename = M_SafeFilePath(savepathtemp, f->d_name); dstfilename = M_SafeFilePath(savepath, f->d_name); filelen = M_ReadFile(srcfilename, &filebuffer); M_WriteFile(dstfilename, filebuffer, filelen); Z_Free(filebuffer); Z_Free(srcfilename); Z_Free(dstfilename); } closedir(sp2dir); }
// // ClearTmp // // Clear the temporary save directory // void ClearTmp(void) { DIR *sp2dir = NULL; struct dirent *f = NULL; if(savepathtemp == NULL) I_Error("you f****d up savedir man!"); if(!(sp2dir = opendir(savepathtemp))) I_Error("ClearTmp: Couldn't open dir %s", savepathtemp); while((f = readdir(sp2dir))) { char *filepath = NULL; // haleyjd: skip "." and ".." without assuming they're the // first two entries like the original code did. if(!strcmp(f->d_name, ".") || !strcmp(f->d_name, "..")) continue; // haleyjd: use M_SafeFilePath, not sprintf filepath = M_SafeFilePath(savepathtemp, f->d_name); remove(filepath); Z_Free(filepath); } closedir(sp2dir); }
// // ClearSlot // // Clear a single save slot folder // void ClearSlot(void) { DIR *spdir = NULL; struct dirent *f = NULL; if(savepath == NULL) I_Error("userdir is f****d up man!"); if(!(spdir = opendir(savepath))) I_Error("ClearSlot: Couldn't open dir %s", savepath); while((f = readdir(spdir))) { char *filepath = NULL; if(!strcmp(f->d_name, ".") || !strcmp(f->d_name, "..")) continue; // haleyjd: use M_SafeFilePath, not sprintf filepath = M_SafeFilePath(savepath, f->d_name); remove(filepath); Z_Free(filepath); } closedir(spdir); }
// // FromCurr // // Copying files from savepathtemp to savepath // void FromCurr(void) { glob_t *glob; glob = I_StartGlob(savepathtemp, "*", 0); if (glob == NULL) I_Error("FromCurr: Couldn't open dir %s", savepathtemp); for (;;) { byte *filebuffer; int filelen; const char *srcfilename; char *dstfilename; srcfilename = I_NextGlob(glob); if (srcfilename == NULL) { break; } dstfilename = M_SafeFilePath(savepath, M_BaseName(srcfilename)); filelen = M_ReadFile(srcfilename, &filebuffer); M_WriteFile(dstfilename, filebuffer, filelen); Z_Free(filebuffer); Z_Free(dstfilename); } I_EndGlob(glob); }
// // M_SaveMisObj // // Writes the mission objective into the MIS_OBJ file. // boolean M_SaveMisObj(const char *path) { boolean result; char *destpath = NULL; // haleyjd 20110210: use M_SafeFilePath, not sprintf destpath = M_SafeFilePath(path, "mis_obj"); result = M_WriteFile(destpath, mission_objective, OBJECTIVE_LEN); Z_Free(destpath); return result; }
// // M_SaveMoveHereToMap // // Moves the "HERE" save to a map. // void M_SaveMoveHereToMap(void) { char *mapsave = NULL; char *heresave = NULL; char tmpnum[33]; // haleyjd: no itoa available... M_snprintf(tmpnum, sizeof(tmpnum), "%d", gamemap); mapsave = M_SafeFilePath(savepathtemp, tmpnum); heresave = M_SafeFilePath(savepathtemp, "here"); if(M_FileExists(heresave)) { remove(mapsave); rename(heresave, mapsave); } Z_Free(mapsave); Z_Free(heresave); }
// // M_SaveMoveMapToHere // // Moves a map to the "HERE" save. // void M_SaveMoveMapToHere(void) { char *mapsave = NULL; char *heresave = NULL; char tmpnum[33]; // haleyjd: no itoa available... M_snprintf(tmpnum, sizeof(tmpnum), "%d", gamemap); // haleyjd: use M_SafeFilePath, not sprintf mapsave = M_SafeFilePath(savepath, tmpnum); heresave = M_SafeFilePath(savepath, "here"); // haleyjd: use M_FileExists, not access if(M_FileExists(mapsave)) { remove(heresave); rename(mapsave, heresave); } Z_Free(mapsave); Z_Free(heresave); }
// // ToCurr // // Copying files from savepath to savepathtemp // void ToCurr(void) { DIR *spdir = NULL; struct dirent *f = NULL; ClearTmp(); // BUG: Rogue copypasta'd this error message, which is why we don't know // the real original name of this function. if(!(spdir = opendir(savepath))) I_Error("ClearSlot: Couldn't open dir %s", savepath); while((f = readdir(spdir))) { byte *filebuffer = NULL; int filelen = 0; char *srcfilename = NULL; char *dstfilename = NULL; if(!strcmp(f->d_name, ".") || !strcmp(f->d_name, "..")) continue; // haleyjd: use M_SafeFilePath, NOT sprintf. srcfilename = M_SafeFilePath(savepath, f->d_name); dstfilename = M_SafeFilePath(savepathtemp, f->d_name); filelen = M_ReadFile(srcfilename, &filebuffer); M_WriteFile(dstfilename, filebuffer, filelen); Z_Free(filebuffer); Z_Free(srcfilename); Z_Free(dstfilename); } closedir(spdir); }
// // E_Include // // The normal include function. cfg_include is insufficient since it // looks in the current working directory unless provided a full path. // This function interprets paths relative to the current file when // called from a physical input file, and uses the argument as a lump // name otherwise. // int E_Include(cfg_t *cfg, cfg_opt_t *opt, int argc, const char **argv) { char *currentpath = NULL; char *filename = NULL; size_t len = 0; int lumpnum = -1; if(argc != 1) { cfg_error(cfg, "wrong number of args to include()\n"); return 1; } if(!cfg->filename) { cfg_error(cfg, "include: cfg_t filename is undefined\n"); return 1; } // 02/09/05: support both files and lumps in this function, but // only one or the other depending on the calling context switch(cfg_lexer_source_type(cfg)) { case -1: // physical file len = M_StringAlloca(¤tpath, 1, 2, cfg->filename); M_GetFilePath(cfg->filename, currentpath, len); filename = M_SafeFilePath(currentpath, argv[0]); return E_OpenAndCheckInclude(cfg, filename, -1); default: // data source if(strlen(argv[0]) > 8) { cfg_error(cfg, "include: %s is not a valid lump name\n", argv[0]); return 1; } // haleyjd 03/19/10: // find a lump of the requested name in the same data source only if((lumpnum = E_FindLumpInclude(cfg, argv[0])) < 0) { cfg_error(cfg, "include: %s not found\n", argv[0]); return 1; } return E_OpenAndCheckInclude(cfg, argv[0], lumpnum); } }
// // M_ReadMisObj // // Reads the mission objective from the MIS_OBJ file. // void M_ReadMisObj(void) { FILE *f = NULL; char *srcpath = NULL; // haleyjd: use M_SafeFilePath, not sprintf srcpath = M_SafeFilePath(savepathtemp, "mis_obj"); if((f = fopen(srcpath, "rb"))) { fread(mission_objective, 1, OBJECTIVE_LEN, f); fclose(f); } Z_Free(srcpath); }
// // M_ReadMisObj // // Reads the mission objective from the MIS_OBJ file. // void M_ReadMisObj(void) { FILE *f = NULL; char *srcpath = NULL; // haleyjd: use M_SafeFilePath, not sprintf srcpath = M_SafeFilePath(savepathtemp, "mis_obj"); if((f = fopen(srcpath, "rb"))) { int retval = fread(mission_objective, 1, OBJECTIVE_LEN, f); fclose(f); if (retval != OBJECTIVE_LEN) { I_Error("M_ReadMisObj: error while reading mission objective"); } } Z_Free(srcpath); }
// // bex_include // // 12/12/03: New include function that allows EDF to queue // DeHackEd/BEX files for later processing. This helps to // integrate BEX features such as string editing into the // EDF/BEX superlanguage. // // This function interprets paths relative to the current // file. // static int bex_include(cfg_t *cfg, cfg_opt_t *opt, int argc, const char **argv) { char *currentpath; char *filename = NULL; // haleyjd 03/18/10: deprecation warning E_EDFLoggedWarning(0, "Warning: bexinclude is deprecated. " "Please use a GFS or DEHACKED lump instead.\n"); if(argc != 1) { cfg_error(cfg, "wrong number of args to bexinclude()\n"); return 1; } if(!cfg->filename) { cfg_error(cfg, "bexinclude: cfg_t filename is undefined\n"); return 1; } if(cfg_lexer_source_type(cfg) >= 0) { cfg_error(cfg, "bexinclude: cannot call from a wad lump\n"); return 1; } currentpath = (char *)(Z_Alloca(strlen(cfg->filename) + 1)); M_GetFilePath(cfg->filename, currentpath, strlen(cfg->filename) + 1); filename = M_SafeFilePath(currentpath, argv[0]); // queue the file for later processing D_QueueDEH(filename, 0); return 0; }
// // ToCurr // // Copying files from savepath to savepathtemp // void ToCurr(void) { glob_t *glob; ClearTmp(); // BUG: Rogue copypasta'd this error message, which is why we don't know // the real original name of this function. glob = I_StartGlob(savepath, "*", 0); if (glob == NULL) I_Error("ClearSlot: Couldn't open dir %s", savepath); for (;;) { byte *filebuffer; int filelen; const char *srcfilename; char *dstfilename; srcfilename = I_NextGlob(glob); if (srcfilename == NULL) { break; } dstfilename = M_SafeFilePath(savepathtemp, M_BaseName(srcfilename)); filelen = M_ReadFile(srcfilename, &filebuffer); M_WriteFile(dstfilename, filebuffer, filelen); Z_Free(filebuffer); Z_Free(dstfilename); } I_EndGlob(glob); }
// // E_BuildDefaultFn // // Constructs the absolute file name for a default file. Don't cache // the returned pointer, since it points to a static buffer. // const char *E_BuildDefaultFn(const char *filename) { return M_SafeFilePath(basepath, filename); }
void D_IdentifyVersion(void) { // gamemission is set up by the D_FindIWAD function. But if // we specify '-iwad', we have to identify using // IdentifyIWADByName. However, if the iwad does not match // any known IWAD name, we may have a dilemma. Try to // identify by its contents. // STRIFE-TODO: some elaborate checks? for now we assume... // The logic in strife1.exe is simple: // * if strife1.wad is found, set isregistered = true // * if strife0.wad is found, set isdemoversion = true // Make sure gamemode is set up correctly gamemode = commercial; gamemission = strife; isregistered = true; // Load voices.wad if(isregistered) { char *name = D_FindWADByName("voices.wad"); if(!name) // not found? { int p; // haleyjd STRIFE-FIXME: Temporary? // If -iwad was used, check and see if voices.wad exists on the // same filepath. if((p = M_CheckParm("-iwad")) && p < myargc - 1) { char *iwad = myargv[p + 1]; size_t len = strlen(iwad) + 1; char *iwadpath = Z_Malloc(len, PU_STATIC, NULL); char *voiceswad; // extract base path of IWAD parameter M_GetFilePath(iwad, iwadpath, len); // concatenate with /voices.wad voiceswad = M_SafeFilePath(iwadpath, "voices.wad"); Z_Free(iwadpath); if(!M_FileExists(voiceswad)) { disable_voices = 1; Z_Free(voiceswad); } else name = voiceswad; // STRIFE-FIXME: memory leak!! } else disable_voices = 1; } if(disable_voices) // voices disabled? { if(devparm) printf("Voices disabled\n"); return; } D_AddFile(name); } }