From ab6b874d00c91278339289ae190a90a7257366ce Mon Sep 17 00:00:00 2001 From: Taylor Richards Date: Fri, 12 Aug 2005 08:50:09 +0000 Subject: [PATCH] recursively create directories (hurt more on OSX) and update all _mkdir() calls accordingly --- include/unix.h | 2 +- src/cfile/cfile.cpp | 9 +++------ src/freespace2/unixmain.cpp | 4 ++-- src/inetfile/inetgetfile.cpp | 9 ++++----- src/platform/unix.cpp | 36 ++++++++++++++++++++++++++++++++++++ 5 files changed, 46 insertions(+), 14 deletions(-) diff --git a/include/unix.h b/include/unix.h index 94f595d..fe3588a 100644 --- a/include/unix.h +++ b/include/unix.h @@ -29,7 +29,6 @@ #define _chdir chdir #define _strlwr strlwr #define _unlink unlink -#define _mkdir mkdir #define _hypot hypot #define _access access #define byte unsigned char @@ -55,6 +54,7 @@ extern void Sleep (int miliseconds); extern unsigned long _beginthread (void (*pfuncStart)(void *), unsigned unStackSize, void* pArgList); extern void OutputDebugString (const char *); extern int WSAGetLastError (); +extern int _mkdir(const char *path); extern void _splitpath (const char *path, char *drive, char *dir, char *fname, char *ext); typedef struct FILETIME_s { diff --git a/src/cfile/cfile.cpp b/src/cfile/cfile.cpp index de984ec..1573346 100644 --- a/src/cfile/cfile.cpp +++ b/src/cfile/cfile.cpp @@ -15,6 +15,9 @@ * Utilities for operating on files * * $Log$ + * Revision 1.12 2005/08/12 08:50:09 taylor + * recursively create directories (hurt more on OSX) and update all _mkdir() calls accordingly + * * Revision 1.11 2004/07/04 11:27:29 taylor * cleanup CFILE code a little, warning fixes, remove redundant dir checks, amd64 support * @@ -761,15 +764,9 @@ void cf_create_directory( int dir_type ) for (i=num_dirs-1; i>=0; i-- ) { cf_create_default_path_string( longname, dir_tree[i], NULL ); -#ifdef PLAT_UNIX - if ( _mkdir(longname, 0700)==0 ) { - mprintf(( "CFILE: Created new directory '%s'\n", longname )); - } -#else if ( _mkdir(longname)==0 ) { mprintf(( "CFILE: Created new directory '%s'\n", longname )); } -#endif } diff --git a/src/freespace2/unixmain.cpp b/src/freespace2/unixmain.cpp index 350441c..5dcf10e 100644 --- a/src/freespace2/unixmain.cpp +++ b/src/freespace2/unixmain.cpp @@ -20,8 +20,8 @@ int main(int argc, char **argv) char userdir[MAX_PATH]; // create user game directory - snprintf(userdir, MAX_PATH, "%s/%s", detect_home(), Osreg_user_dir); - _mkdir(userdir, 0700); + snprintf(userdir, MAX_PATH, "%s/%s/", detect_home(), Osreg_user_dir); + _mkdir(userdir); char *argptr = NULL; int i; diff --git a/src/inetfile/inetgetfile.cpp b/src/inetfile/inetgetfile.cpp index 6862a6b..fd48ce1 100644 --- a/src/inetfile/inetgetfile.cpp +++ b/src/inetfile/inetgetfile.cpp @@ -15,6 +15,9 @@ * InternetGetFile Class * * $Log$ + * Revision 1.6 2005/08/12 08:50:09 taylor + * recursively create directories (hurt more on OSX) and update all _mkdir() calls accordingly + * * Revision 1.5 2002/06/09 04:41:21 relnev * added copyright header * @@ -111,11 +114,7 @@ InetGetFile::InetGetFile(char *URL,char *localfile) } *end = '\0'; -#ifndef PLAT_UNIX - if ( _mkdir(dir_name)==0 ) { -#else - if ( _mkdir(dir_name, 0777)==0 ) { -#endif + if ( _mkdir(dir_name)==0 ) { mprintf(( "CFILE: Created new directory '%s'\n", dir_name )); } } diff --git a/src/platform/unix.cpp b/src/platform/unix.cpp index cd2fab2..69aa55b 100644 --- a/src/platform/unix.cpp +++ b/src/platform/unix.cpp @@ -59,6 +59,42 @@ int WSAGetLastError() return errno; } +// make specified directory, recursively +// NOTE: since this is for use with CFILE this code assumes that there will be a trailing '/' +// or a trailing filename. any directory name not followed by a '/' will be considered a file +int _mkdir(const char *path) +{ + int status = 1; // if we don't ever call mkdir() to update this then assume we are in error + char *c, tmp_path[MAX_PATH]; + + memset(tmp_path, 0, MAX_PATH); + strncpy(tmp_path, path, MAX_PATH-1); + + c = &tmp_path[1]; + + while (c++) { + c = strchr(c, '/'); + + if (c) { + *c = '\0'; + + status = mkdir(tmp_path, 0700); + +#ifndef NDEBUG + int m_error = errno; + + if (status && (m_error != EEXIST) ) { + Warning(__FILE__, __LINE__, "Cannot mkdir %s: %s", tmp_path, strerror(m_error)); + } +#endif + + *c = '/'; + } + } + + return status; +} + void _splitpath (const char *path, char *drive, char *dir, char *fname, char *ext) { if (path == NULL) -- 2.39.2