summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cl_aastat.c4
-rw-r--r--src/cl_console.c2
-rw-r--r--src/cl_main.c6
-rw-r--r--src/common.c2
-rw-r--r--src/files.c64
-rw-r--r--src/files.h3
-rw-r--r--src/net_common.c2
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" );