# define O_NONBLOCK 0
#endif
+// largefile support for Win32
+#ifdef WIN32
+# define lseek _lseeki64
+#endif
/*
char fs_basedir[MAX_OSPATH];
// list of active game directories (empty if not running a mod)
-#define MAX_GAMEDIRS 16
int fs_numgamedirs = 0;
char fs_gamedirs[MAX_GAMEDIRS][MAX_QPATH];
*/
void FS_ClearSearchPath (void)
{
+ // unload all packs and directory information, close all pack files
+ // (if a qfile is still reading a pack it won't be harmed because it used
+ // dup() to get its own handle already)
while (fs_searchpaths)
{
searchpath_t *search = fs_searchpaths;
fs_searchpaths = search->next;
if (search->pack)
{
+ // close the file
+ close(search->pack->handle);
+ // free any memory associated with it
if (search->pack->files)
Mem_Free(search->pack->files);
Mem_Free(search->pack);
}
}
+ // halt demo playback to close the file
+ CL_Disconnect();
+
Host_SaveConfig_f();
fs_numgamedirs = numgamedirs;
// exec the new config
Host_LoadConfig_f();
- // reinitialize the loaded sounds
- S_Reload_f();
+ // unload all sounds so they will be reloaded from the new files as needed
+ S_UnloadAllSounds_f();
// reinitialize renderer (this reloads hud/console background/etc)
R_Modules_Restart();
for (i = 0;i < numgamedirs;i++)
strlcpy(gamedirs[i], Cmd_Argv(i+1), sizeof(gamedirs[i]));
- // allow gamedir change during demo loop
- if (cls.demoplayback)
- CL_Disconnect();
-
- if (cls.state == ca_connected || sv.active)
+ if ((cls.state == ca_connected && !cls.demoplayback) || sv.active)
{
// actually, changing during game would work fine, but would be stupid
Con_Printf("Can not change gamedir while client is connected or server is running!\n");
*/
void FS_Shutdown (void)
{
+ // close all pack files and such
+ // (hopefully there aren't any other open files, but they'll be cleaned up
+ // by the OS anyway)
+ FS_ClearSearchPath();
Mem_FreePool (&fs_mempool);
}
if (file->buff_ind < file->buff_len)
{
count = file->buff_len - file->buff_ind;
+ count = ((fs_offset_t)buffersize > count) ? count : (fs_offset_t)buffersize;
+ done += count;
+ memcpy (buffer, &file->buff[file->buff_ind], count);
+ file->buff_ind += count;
- done += ((fs_offset_t)buffersize > count) ? count : (fs_offset_t)buffersize;
- memcpy (buffer, &file->buff[file->buff_ind], done);
- file->buff_ind += done;
-
- buffersize -= done;
+ buffersize -= count;
if (buffersize == 0)
return done;
}
*/
int FS_Getc (qfile_t* file)
{
- char c;
+ unsigned char c;
if (FS_Read (file, &c, 1) != 1)
return EOF;