Merge remote-tracking branch 'github/master'
[xonotic/netradiant.git] / tools / quake3 / common / cmdlib.c
index 35f4d75bd68dcb0767c820e73963420a8607c1c8..41fd1ca140c7b15389c706e447d76e200379b14c 100644 (file)
@@ -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 <sys/types.h>
 #include <sys/stat.h>
 
-#ifdef _WIN32
+#ifdef WIN32
 #include <direct.h>
 #include <windows.h>
 #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 ) );
        }