X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=fs.c;h=c15b8ba00f4f235225ea7c9a650903b5788104d4;hp=f4f1e55fdf752a5dd6e6c304b270d430a026a508;hb=27b8e67dec8c8084ba38ed8201dc54ccd46fdb23;hpb=8e3274ed87c256d3122f56a5275180ef08439b2a diff --git a/fs.c b/fs.c index f4f1e55f..c15b8ba0 100644 --- a/fs.c +++ b/fs.c @@ -1212,7 +1212,7 @@ static qboolean FS_AddPack_Fullpath(const char *pakfile, const char *shortname, } else { - Con_Errorf("unable to load pak \"%s\"\n", pakfile); + Con_Printf(CON_ERROR "unable to load pak \"%s\"\n", pakfile); return false; } } @@ -1474,8 +1474,8 @@ void FS_Rescan (void) else Cvar_SetQuick (&scr_screenshot_name, gamescreenshotname); - if((i = COM_CheckParm("-modname")) && i < com_argc - 1) - strlcpy(com_modname, com_argv[i+1], sizeof(com_modname)); + if((i = COM_CheckParm("-modname")) && i < sys.argc - 1) + strlcpy(com_modname, sys.argv[i+1], sizeof(com_modname)); // If "-condebug" is in the command line, remove the previous log file if (COM_CheckParm ("-condebug") != 0) @@ -1761,11 +1761,11 @@ static void COM_InsertFlags(const char *buf) { const char **new_argv; int i = 0; int args_left = 256; - new_argv = (const char **)Mem_Alloc(fs_mempool, sizeof(*com_argv) * (com_argc + args_left + 2)); - if(com_argc == 0) + new_argv = (const char **)Mem_Alloc(fs_mempool, sizeof(*sys.argv) * (sys.argc + args_left + 2)); + if(sys.argc == 0) new_argv[0] = "dummy"; // Can't really happen. else - new_argv[0] = com_argv[0]; + new_argv[0] = sys.argv[0]; ++i; p = buf; while(COM_ParseToken_Console(&p)) @@ -1779,57 +1779,15 @@ static void COM_InsertFlags(const char *buf) { ++i; } // Now: i <= args_left + 1. - if (com_argc >= 1) + if (sys.argc >= 1) { - memcpy((char *)(&new_argv[i]), &com_argv[1], sizeof(*com_argv) * (com_argc - 1)); - i += com_argc - 1; + memcpy((char *)(&new_argv[i]), &sys.argv[1], sizeof(*sys.argv) * (sys.argc - 1)); + i += sys.argc - 1; } - // Now: i <= args_left + (com_argc || 1). + // Now: i <= args_left + (sys.argc || 1). new_argv[i] = NULL; - com_argv = new_argv; - com_argc = i; -} - -/* -================ -FS_Init_SelfPack -================ -*/ -void FS_Init_SelfPack (void) -{ - PK3_OpenLibrary (); - fs_mempool = Mem_AllocPool("file management", 0, NULL); - - // Load darkplaces.opt from the FS. - if (!COM_CheckParm("-noopt")) - { - char *buf = (char *) FS_SysLoadFile("darkplaces.opt", tempmempool, true, NULL); - if(buf) - COM_InsertFlags(buf); - Mem_Free(buf); - } - -#ifndef USE_RWOPS - // Provide the SelfPack. - if (!COM_CheckParm("-noselfpack")) - { - if (com_selffd >= 0) - { - fs_selfpack = FS_LoadPackPK3FromFD(com_argv[0], com_selffd, true); - if(fs_selfpack) - { - FS_AddSelfPack(); - if (!COM_CheckParm("-noopt")) - { - char *buf = (char *) FS_LoadFile("darkplaces.opt", tempmempool, true, NULL); - if(buf) - COM_InsertFlags(buf); - Mem_Free(buf); - } - } - } - } -#endif + sys.argv = new_argv; + sys.argc = i; } static int FS_ChooseUserDir(userdirmode_t userdirmode, char *userdir, size_t userdirsize) @@ -2003,12 +1961,21 @@ static int FS_ChooseUserDir(userdirmode_t userdirmode, char *userdir, size_t use #endif } -/* -================ -FS_Init -================ -*/ -void FS_Init (void) +void FS_Init_Commands(void) +{ + Cvar_RegisterVariable (&scr_screenshot_name); + Cvar_RegisterVariable (&fs_empty_files_in_pack_mark_deletions); + Cvar_RegisterVariable (&cvar_fs_gamedir); + + Cmd_AddCommand(CMD_SHARED, "gamedir", FS_GameDir_f, "changes active gamedir list (can take multiple arguments), not including base directory (example usage: gamedir ctf)"); + Cmd_AddCommand(CMD_SHARED, "fs_rescan", FS_Rescan_f, "rescans filesystem for new pack archives and any other changes"); + Cmd_AddCommand(CMD_SHARED, "path", FS_Path_f, "print searchpath (game directories and archives)"); + Cmd_AddCommand(CMD_SHARED, "dir", FS_Dir_f, "list files in searchpath matching an * filename pattern, one per line"); + Cmd_AddCommand(CMD_SHARED, "ls", FS_Ls_f, "list files in searchpath matching an * filename pattern, multiple per line"); + Cmd_AddCommand(CMD_SHARED, "which", FS_Which_f, "accepts a file name as argument and reports where the file is taken from"); +} + +static void FS_Init_Dir (void) { const char *p; int i; @@ -2021,9 +1988,9 @@ void FS_Init (void) // Overrides the system supplied base directory (under GAMENAME) // COMMANDLINEOPTION: Filesystem: -basedir chooses what base directory the game data is in, inside this there should be a data directory for the game (for example id1) i = COM_CheckParm ("-basedir"); - if (i && i < com_argc-1) + if (i && i < sys.argc-1) { - strlcpy (fs_basedir, com_argv[i+1], sizeof (fs_basedir)); + strlcpy (fs_basedir, sys.argv[i+1], sizeof (fs_basedir)); i = (int)strlen (fs_basedir); if (i > 0 && (fs_basedir[i-1] == '\\' || fs_basedir[i-1] == '/')) fs_basedir[i-1] = 0; @@ -2037,10 +2004,10 @@ void FS_Init (void) dpsnprintf(fs_basedir, sizeof(fs_basedir), "/sdcard/%s/", gameuserdirname); #elif defined(MACOSX) // FIXME: is there a better way to find the directory outside the .app, without using Objective-C? - if (strstr(com_argv[0], ".app/")) + if (strstr(sys.argv[0], ".app/")) { char *split; - strlcpy(fs_basedir, com_argv[0], sizeof(fs_basedir)); + strlcpy(fs_basedir, sys.argv[0], sizeof(fs_basedir)); split = strstr(fs_basedir, ".app/"); if (split) { @@ -2074,8 +2041,8 @@ void FS_Init (void) strlcat(fs_basedir, "/", sizeof(fs_basedir)); // Add the personal game directory - if((i = COM_CheckParm("-userdir")) && i < com_argc - 1) - dpsnprintf(fs_userdir, sizeof(fs_userdir), "%s/", com_argv[i+1]); + if((i = COM_CheckParm("-userdir")) && i < sys.argc - 1) + dpsnprintf(fs_userdir, sizeof(fs_userdir), "%s/", sys.argv[i+1]); else if (COM_CheckParm("-nohome")) *fs_userdir = 0; // user wants roaming installation, no userdir else @@ -2134,32 +2101,32 @@ void FS_Init (void) p = FS_CheckGameDir(gamedirname1); if(!p || p == fs_checkgamedir_missing) - Con_Warnf("WARNING: base gamedir %s%s/ not found!\n", fs_basedir, gamedirname1); + Con_Printf(CON_WARN "WARNING: base gamedir %s%s/ not found!\n", fs_basedir, gamedirname1); if(gamedirname2) { p = FS_CheckGameDir(gamedirname2); if(!p || p == fs_checkgamedir_missing) - Con_Warnf("WARNING: base gamedir %s%s/ not found!\n", fs_basedir, gamedirname2); + Con_Printf(CON_WARN "WARNING: base gamedir %s%s/ not found!\n", fs_basedir, gamedirname2); } // -game // Adds basedir/gamedir as an override game // LadyHavoc: now supports multiple -game directories - for (i = 1;i < com_argc && fs_numgamedirs < MAX_GAMEDIRS;i++) + for (i = 1;i < sys.argc && fs_numgamedirs < MAX_GAMEDIRS;i++) { - if (!com_argv[i]) + if (!sys.argv[i]) continue; - if (!strcmp (com_argv[i], "-game") && i < com_argc-1) + if (!strcmp (sys.argv[i], "-game") && i < sys.argc-1) { i++; - p = FS_CheckGameDir(com_argv[i]); + p = FS_CheckGameDir(sys.argv[i]); if(!p) - Sys_Error("Nasty -game name rejected: %s", com_argv[i]); + Sys_Error("Nasty -game name rejected: %s", sys.argv[i]); if(p == fs_checkgamedir_missing) - Con_Warnf("WARNING: -game %s%s/ not found!\n", fs_basedir, com_argv[i]); + Con_Printf(CON_WARN "WARNING: -game %s%s/ not found!\n", fs_basedir, sys.argv[i]); // add the gamedir to the list of active gamedirs - strlcpy (fs_gamedirs[fs_numgamedirs], com_argv[i], sizeof(fs_gamedirs[fs_numgamedirs])); + strlcpy (fs_gamedirs[fs_numgamedirs], sys.argv[i], sizeof(fs_gamedirs[fs_numgamedirs])); fs_numgamedirs++; } } @@ -2171,25 +2138,69 @@ void FS_Init (void) fs_mutex = Thread_CreateMutex(); } -void FS_Init_Commands(void) +/* +================ +FS_Init_SelfPack +================ +*/ +void FS_Init_SelfPack (void) { - Cvar_RegisterVariable (&scr_screenshot_name); - Cvar_RegisterVariable (&fs_empty_files_in_pack_mark_deletions); - Cvar_RegisterVariable (&cvar_fs_gamedir); + char *buf; + + // Load darkplaces.opt from the FS. + if (!COM_CheckParm("-noopt")) + { + buf = (char *) FS_SysLoadFile("darkplaces.opt", tempmempool, true, NULL); + if(buf) + { + COM_InsertFlags(buf); + Mem_Free(buf); + } + } + +#ifndef USE_RWOPS + // Provide the SelfPack. + if (!COM_CheckParm("-noselfpack") && sys.selffd >= 0) + { + fs_selfpack = FS_LoadPackPK3FromFD(sys.argv[0], sys.selffd, true); + if(fs_selfpack) + { + FS_AddSelfPack(); + if (!COM_CheckParm("-noopt")) + { + buf = (char *) FS_LoadFile("darkplaces.opt", tempmempool, true, NULL); + if(buf) + { + COM_InsertFlags(buf); + Mem_Free(buf); + } + } + } + } +#endif +} + +/* +================ +FS_Init +================ +*/ + +void FS_Init(void) +{ + fs_mempool = Mem_AllocPool("file management", 0, NULL); + + FS_Init_Commands(); + + PK3_OpenLibrary (); + + // initialize the self-pack (must be before COM_InitGameType as it may add command line options) + FS_Init_SelfPack(); + + // detect gamemode from commandline options or executable name + COM_InitGameType(); - Cmd_AddCommand(&cmd_client, "gamedir", FS_GameDir_f, "changes active gamedir list (can take multiple arguments), not including base directory (example usage: gamedir ctf)"); - Cmd_AddCommand(&cmd_client, "fs_rescan", FS_Rescan_f, "rescans filesystem for new pack archives and any other changes"); - Cmd_AddCommand(&cmd_client, "path", FS_Path_f, "print searchpath (game directories and archives)"); - Cmd_AddCommand(&cmd_client, "dir", FS_Dir_f, "list files in searchpath matching an * filename pattern, one per line"); - Cmd_AddCommand(&cmd_client, "ls", FS_Ls_f, "list files in searchpath matching an * filename pattern, multiple per line"); - Cmd_AddCommand(&cmd_client, "which", FS_Which_f, "accepts a file name as argument and reports where the file is taken from"); - - Cmd_AddCommand(&cmd_server, "gamedir", FS_GameDir_f, "changes active gamedir list (can take multiple arguments), not including base directory (example usage: gamedir ctf)"); - Cmd_AddCommand(&cmd_server, "fs_rescan", FS_Rescan_f, "rescans filesystem for new pack archives and any other changes"); - Cmd_AddCommand(&cmd_server, "path", FS_Path_f, "print searchpath (game directories and archives)"); - Cmd_AddCommand(&cmd_server, "dir", FS_Dir_f, "list files in searchpath matching an * filename pattern, one per line"); - Cmd_AddCommand(&cmd_server, "ls", FS_Ls_f, "list files in searchpath matching an * filename pattern, multiple per line"); - Cmd_AddCommand(&cmd_server, "which", FS_Which_f, "accepts a file name as argument and reports where the file is taken from"); + FS_Init_Dir(); } /* @@ -2239,7 +2250,7 @@ static filedesc_t FS_SysOpenFiledesc(const char *filepath, const char *mode, qbo opt = O_CREAT | O_APPEND; break; default: - Con_Errorf ("FS_SysOpen(%s, %s): invalid mode\n", filepath, mode); + Con_Printf(CON_ERROR "FS_SysOpen(%s, %s): invalid mode\n", filepath, mode); return FILEDESC_INVALID; } for (ind = 1; mode[ind] != '\0'; ind++) @@ -2256,7 +2267,7 @@ static filedesc_t FS_SysOpenFiledesc(const char *filepath, const char *mode, qbo dolock = true; break; default: - Con_Errorf ("FS_SysOpen(%s, %s): unknown character in mode (%c)\n", + Con_Printf(CON_ERROR "FS_SysOpen(%s, %s): unknown character in mode (%c)\n", filepath, mode, mode[ind]); } } @@ -2366,7 +2377,7 @@ static qfile_t *FS_OpenPackedFile (pack_t* pack, int pack_ind) // No Zlib DLL = no compressed files if (!zlib_dll && (pfile->flags & PACKFILE_FLAG_DEFLATED)) { - Con_Warnf("WARNING: can't open the compressed file %s\n" + Con_Printf(CON_WARN "WARNING: can't open the compressed file %s\n" "You need the Zlib DLL to use compressed files\n", pfile->name); return NULL; @@ -2838,7 +2849,7 @@ fs_offset_t FS_Write (qfile_t* file, const void* data, size_t datasize) { if (FILEDESC_SEEK (file->handle, file->buff_ind - file->buff_len, SEEK_CUR) == -1) { - Con_Warnf("WARNING: could not seek in %s.\n", file->filename); + Con_Printf(CON_WARN "WARNING: could not seek in %s.\n", file->filename); } } @@ -2880,7 +2891,7 @@ fs_offset_t FS_Read (qfile_t* file, void* buffer, size_t buffersize) { fs_offset_t count, done; - if (buffersize == 0) + if (buffersize == 0 || !buffer) return 0; // Get rid of the ungetc character