diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cl_aastat.c | 4 | ||||
-rw-r--r-- | src/cl_console.c | 2 | ||||
-rw-r--r-- | src/cl_main.c | 6 | ||||
-rw-r--r-- | src/common.c | 2 | ||||
-rw-r--r-- | src/files.c | 64 | ||||
-rw-r--r-- | src/files.h | 3 | ||||
-rw-r--r-- | src/net_common.c | 2 |
7 files changed, 52 insertions, 31 deletions
diff --git a/src/cl_aastat.c b/src/cl_aastat.c index 0b14549..cae2510 100644 --- a/src/cl_aastat.c +++ b/src/cl_aastat.c @@ -302,7 +302,7 @@ static void SCR_ScoreShot_f( void ) { } if( Cmd_Argc() > 1 ) { - f = FS_EasyOpenFile( path, sizeof( path ), FS_MODE_WRITE, + f = FS_EasyOpenFile( path, sizeof( path ), FS_MODE_WRITE | FS_FLAG_TEXT, SCORESHOTS_DIRECTORY "/", Cmd_Argv( 1 ), ".txt" ); if( !f ) { return; @@ -311,7 +311,7 @@ static void SCR_ScoreShot_f( void ) { // find a file name to save it to for( i = 0; i < 1000; i++ ) { Q_snprintf( path, sizeof( path ), SCORESHOTS_DIRECTORY "/quake%03d.txt", i ); - ret = FS_FOpenFile( path, &f, FS_MODE_WRITE|FS_FLAG_EXCL ); + ret = FS_FOpenFile( path, &f, FS_MODE_WRITE | FS_FLAG_TEXT | FS_FLAG_EXCL ); if( f ) { break; } diff --git a/src/cl_console.c b/src/cl_console.c index b3f26d2..d91572b 100644 --- a/src/cl_console.c +++ b/src/cl_console.c @@ -228,7 +228,7 @@ static void Con_Dump_f( void ) { return; } - f = FS_EasyOpenFile( name, sizeof( name ), FS_MODE_WRITE, + f = FS_EasyOpenFile( name, sizeof( name ), FS_MODE_WRITE | FS_FLAG_TEXT, "condumps/", Cmd_Argv( 1 ), ".txt" ); if( !f ) { return; diff --git a/src/cl_main.c b/src/cl_main.c index 726d177..b8dcaf1 100644 --- a/src/cl_main.c +++ b/src/cl_main.c @@ -2024,7 +2024,7 @@ static void dump_program( const char *text, const char *name ) { return; } - if( FS_EasyWriteFile( buffer, sizeof( buffer ), FS_MODE_WRITE, + if( FS_EasyWriteFile( buffer, sizeof( buffer ), FS_MODE_WRITE | FS_FLAG_TEXT, "layouts/", Cmd_Argv( 1 ), ".txt", text, strlen( text ) ) ) { Com_Printf( "Dumped %s program to %s.\n", name, buffer ); @@ -2099,7 +2099,7 @@ static void CL_WriteConfig_f( void ) { mask = CVAR_ARCHIVE; } - f = FS_EasyOpenFile( buffer, sizeof( buffer ), FS_MODE_WRITE, + f = FS_EasyOpenFile( buffer, sizeof( buffer ), FS_MODE_WRITE | FS_FLAG_TEXT, "configs/", cmd_optarg, ".cfg" ); if( !f ) { return; @@ -3241,7 +3241,7 @@ static void CL_WriteConfig( void ) { qhandle_t f; qerror_t ret; - ret = FS_FOpenFile( COM_CONFIG_NAME, &f, FS_MODE_WRITE ); + ret = FS_FOpenFile( COM_CONFIG_NAME, &f, FS_MODE_WRITE | FS_FLAG_TEXT ); if( !f ) { Com_EPrintf( "Couldn't open %s for writing: %s\n", COM_CONFIG_NAME, Q_ErrorString( ret ) ); diff --git a/src/common.c b/src/common.c index 308a566..371accb 100644 --- a/src/common.c +++ b/src/common.c @@ -198,7 +198,7 @@ static void logfile_open( void ) { } } - f = FS_EasyOpenFile( buffer, sizeof( buffer ), mode, + f = FS_EasyOpenFile( buffer, sizeof( buffer ), mode | FS_FLAG_TEXT, "logs/", logfile_name->string, ".log" ); if( !f ) { Cvar_Set( "logfile", "0" ); diff --git a/src/files.c b/src/files.c index efacb60..9441efe 100644 --- a/src/files.c +++ b/src/files.c @@ -691,21 +691,39 @@ void FS_FCloseFile( qhandle_t f ) { static inline FILE *fopen_hack( const char *path, const char *mode ) { #ifndef _GNU_SOURCE - if( !strcmp( mode, "wxb" ) ) { + if (mode[0] == 'w' && mode[1] == 'x') { #ifdef _WIN32 - int fd = _open( path, _O_WRONLY | _O_CREAT | _O_EXCL | _O_BINARY, - _S_IREAD | _S_IWRITE ); - if( fd == -1 ) { - return NULL; - } - return _fdopen( fd, "wb" ); + int flags = _O_WRONLY | _O_CREAT | _O_EXCL | _S_IREAD | _S_IWRITE; + int fd; + FILE *fp; + + if (mode[2] == 'b') + flags |= _O_BINARY; + + fd = _open(path, flags); + if (fd == -1) + return NULL; + + fp = _fdopen(fd, (flags & _O_BINARY) ? "wb" : "w"); + if (fp == NULL) + _close(fd); + + return fp; #else - int fd = open( path, O_WRONLY | O_CREAT | O_EXCL, - S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH ); - if( fd == -1 ) { - return NULL; - } - return fdopen( fd, "wb" ); + int flags = O_WRONLY | O_CREAT | O_EXCL; + int perm = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; + int fd; + FILE *fp; + + fd = open(path, flags, perm); + if (fd == -1) + return NULL; + + fp = fdopen(fd, "wb"); + if (fp == NULL) + close(fd); + + return fp; #endif } #endif // _GNU_SOURCE @@ -716,7 +734,7 @@ static inline FILE *fopen_hack( const char *path, const char *mode ) { static ssize_t open_file_write( file_t *file, const char *name ) { char normalized[MAX_OSPATH], fullpath[MAX_OSPATH]; FILE *fp; - char *modeStr; + char mode_str[8]; unsigned mode; size_t len; long pos; @@ -760,32 +778,34 @@ static ssize_t open_file_write( file_t *file, const char *name ) { mode = file->mode & FS_MODE_MASK; switch( mode ) { case FS_MODE_APPEND: - modeStr = "ab"; + strcpy(mode_str, "a"); break; case FS_MODE_WRITE: - if( file->mode & FS_FLAG_EXCL ) { - modeStr = "wxb"; - } else { - modeStr = "wb"; - } + strcpy(mode_str, "w"); + if (file->mode & FS_FLAG_EXCL) + strcat(mode_str, "x"); break; case FS_MODE_RDWR: // this mode is only used by client downloading code // similar to FS_MODE_APPEND, but does not create // the file if it does not exist - modeStr = "r+b"; + strcpy(mode_str, "r+"); break; default: ret = Q_ERR_INVAL; goto fail1; } + // open in binary mode by default + if (!(file->mode & FS_FLAG_TEXT)) + strcat(mode_str, "b"); + ret = FS_CreatePath( fullpath ); if( ret ) { goto fail1; } - fp = fopen_hack( fullpath, modeStr ); + fp = fopen_hack( fullpath, mode_str ); if( !fp ) { ret = Q_ERR(errno); goto fail1; diff --git a/src/files.h b/src/files.h index 38d4088..926d59a 100644 --- a/src/files.h +++ b/src/files.h @@ -62,9 +62,10 @@ typedef struct file_info_s { #define FS_SEARCH_STRIPEXT 0x00000800 #define FS_SEARCH_DIRSONLY 0x00001000 -// bits 8 - 9, flag +// bits 8 - 10, flag #define FS_FLAG_GZIP 0x00000100 #define FS_FLAG_EXCL 0x00000200 +#define FS_FLAG_TEXT 0x00000400 // // Limit the maximum file size FS_LoadFile can handle, as a protection from diff --git a/src/net_common.c b/src/net_common.c index fee2091..5e1fb25 100644 --- a/src/net_common.c +++ b/src/net_common.c @@ -321,7 +321,7 @@ static void logfile_open( void ) { } } - f = FS_EasyOpenFile( buffer, sizeof( buffer ), mode, + f = FS_EasyOpenFile( buffer, sizeof( buffer ), mode | FS_FLAG_TEXT, "logs/", net_log_name->string, ".log" ); if( !f ) { Cvar_Set( "net_log_enable", "0" ); |