X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=blobdiff_plain;f=tools%2Fquake3%2Fcommon%2Fcmdlib.c;h=41fd1ca140c7b15389c706e447d76e200379b14c;hp=35f4d75bd68dcb0767c820e73963420a8607c1c8;hb=b7e36c120eb1546a6c6f97f30e42ab7f9a559c61;hpb=686a211fc38285905245e537acf9d96e66b9675c;ds=sidebyside diff --git a/tools/quake3/common/cmdlib.c b/tools/quake3/common/cmdlib.c index 35f4d75b..41fd1ca1 100644 --- a/tools/quake3/common/cmdlib.c +++ b/tools/quake3/common/cmdlib.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1999-2007 id Software, Inc. and contributors. + Copyright (C) 1999-2006 Id Software, Inc. and contributors. For a list of contributors, see the accompanying CONTRIBUTORS file. This file is part of GtkRadiant. @@ -34,7 +34,7 @@ #include #include -#ifdef _WIN32 +#ifdef WIN32 #include #include #endif @@ -188,7 +188,7 @@ void SetQdirFromPath( const char *path ){ } strncpy( qdir, path, c + len + count - path ); Sys_Printf( "qdir: %s\n", qdir ); - for ( i = 0; i < strlen( qdir ); i++ ) + for ( i = 0; i < (int) strlen( qdir ); i++ ) { if ( qdir[i] == '\\' ) { qdir[i] = '/'; @@ -201,7 +201,7 @@ void SetQdirFromPath( const char *path ){ if ( *c == '/' || *c == '\\' ) { strncpy( gamedir, path, c + 1 - path ); - for ( i = 0; i < strlen( gamedir ); i++ ) + for ( i = 0; i < (int) strlen( gamedir ); i++ ) { if ( gamedir[i] == '\\' ) { gamedir[i] = '/'; @@ -244,7 +244,7 @@ char *ExpandArg( const char *path ){ char *ExpandPath( const char *path ){ static char full[1024]; - if ( !qdir[0] ) { + if ( !qdir ) { Error( "ExpandPath called without qdir set" ); } if ( path[0] == '/' || path[0] == '\\' || path[1] == ':' ) { @@ -257,8 +257,8 @@ char *ExpandPath( const char *path ){ char *ExpandGamePath( const char *path ){ static char full[1024]; - if ( !qdir[0] ) { - Error( "ExpandGamePath called without qdir set" ); + if ( !gamedir[0] ) { + Error( "ExpandGamePath called without gamedir set" ); } if ( path[0] == '/' || path[0] == '\\' || path[1] == ':' ) { strcpy( full, path ); @@ -327,7 +327,9 @@ void Q_getwd( char *out ){ strcat( out, "\\" ); #else // Gef: Changed from getwd() to getcwd() to avoid potential buffer overflow - getcwd( out, 256 ); + if ( !getcwd( out, 256 ) ) { + *out = 0; + } strcat( out, "/" ); #endif while ( out[i] != 0 ) @@ -341,15 +343,42 @@ void Q_getwd( char *out ){ void Q_mkdir( const char *path ){ + char parentbuf[256]; + const char *p = NULL; + int retry = 2; + while ( retry-- ) + { #ifdef WIN32 - if ( _mkdir( path ) != -1 ) { - return; - } + const char *q = NULL; + if ( _mkdir( path ) != -1 ) { + return; + } + if ( errno == ENOENT ) { + p = strrchr( path, '/' ); + q = strrchr( path, '\\' ); + if ( q && ( !p || q < p ) ) { + p = q; + } + } #else - if ( mkdir( path, 0777 ) != -1 ) { - return; - } + if ( mkdir( path, 0777 ) != -1 ) { + return; + } + if ( errno == ENOENT ) { + p = strrchr( path, '/' ); + } #endif + if ( p ) { + strncpy( parentbuf, path, sizeof( parentbuf ) ); + if ( (int) ( p - path ) < (int) sizeof( parentbuf ) ) { + parentbuf[p - path] = 0; + Sys_Printf( "mkdir: %s: creating parent %s first\n", path, parentbuf ); + Q_mkdir( parentbuf ); + continue; + } + } + break; + } if ( errno != EEXIST ) { Error( "mkdir %s: %s",path, strerror( errno ) ); }