| Index: third_party/openvr/src/src/vrcommon/dirtools_public.cpp
|
| diff --git a/third_party/openvr/src/src/vrcommon/dirtools_public.cpp b/third_party/openvr/src/src/vrcommon/dirtools_public.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b6489b70050aa067e7a8dd75599e746e707bbc84
|
| --- /dev/null
|
| +++ b/third_party/openvr/src/src/vrcommon/dirtools_public.cpp
|
| @@ -0,0 +1,101 @@
|
| +//========= Copyright Valve Corporation ============//
|
| +#include "dirtools_public.h"
|
| +#include "strtools_public.h"
|
| +#include "pathtools_public.h"
|
| +
|
| +#include <errno.h>
|
| +#include <string.h>
|
| +
|
| +#ifdef _WIN32
|
| +#include "windows.h"
|
| +#else
|
| +#include <stdlib.h>
|
| +#include <stdio.h>
|
| +#include <sys/stat.h>
|
| +#include <sys/types.h>
|
| +#endif
|
| +
|
| +#if defined( OSX )
|
| +#include <sys/syslimits.h>
|
| +#endif
|
| +
|
| +
|
| +//-----------------------------------------------------------------------------
|
| +// Purpose: utility function to create dirs & subdirs
|
| +//-----------------------------------------------------------------------------
|
| +bool BCreateDirectoryRecursive( const char *pchPath )
|
| +{
|
| + // Does it already exist?
|
| + if ( Path_IsDirectory( pchPath ) )
|
| + return true;
|
| +
|
| + // copy the path into something we can munge
|
| + int len = (int)strlen( pchPath );
|
| + char *path = (char *)malloc( len + 1 );
|
| + strcpy( path, pchPath );
|
| +
|
| + // Walk backwards to first non-existing dir that we find
|
| + char *s = path + len - 1;
|
| +
|
| + const char slash = Path_GetSlash();
|
| + while ( s > path )
|
| + {
|
| + if ( *s == slash )
|
| + {
|
| + *s = '\0';
|
| + bool bExists = Path_IsDirectory( path );
|
| + *s = slash;
|
| +
|
| + if ( bExists )
|
| + {
|
| + ++s;
|
| + break;
|
| + }
|
| + }
|
| + --s;
|
| + }
|
| +
|
| + // and then move forwards from there
|
| +
|
| + while ( *s )
|
| + {
|
| + if ( *s == slash )
|
| + {
|
| + *s = '\0';
|
| + BCreateDirectory( path );
|
| + *s = slash;
|
| + }
|
| + s++;
|
| + }
|
| +
|
| + bool bRetVal = BCreateDirectory( path );
|
| + free( path );
|
| + return bRetVal;
|
| +}
|
| +
|
| +
|
| +//-----------------------------------------------------------------------------
|
| +// Purpose: Creates the directory, returning true if it is created, or if it already existed
|
| +//-----------------------------------------------------------------------------
|
| +bool BCreateDirectory( const char *pchPath )
|
| +{
|
| +#ifdef WIN32
|
| + std::wstring wPath = UTF8to16( pchPath );
|
| + if ( ::CreateDirectoryW( wPath.c_str(), NULL ) )
|
| + return true;
|
| +
|
| + if ( ::GetLastError() == ERROR_ALREADY_EXISTS )
|
| + return true;
|
| +
|
| + return false;
|
| +#else
|
| + int i = mkdir( pchPath, S_IRWXU | S_IRWXG | S_IRWXO );
|
| + if ( i == 0 )
|
| + return true;
|
| + if ( errno == EEXIST )
|
| + return true;
|
| +
|
| + return false;
|
| +#endif
|
| +}
|
| +
|
|
|