/* NOTE: pszTempDir must be at least HB_PATH_MAX long. */ HB_ERRCODE hb_fsTempDir( char * pszTempDir ) { HB_ERRCODE nResult = ( HB_ERRCODE ) FS_ERROR; pszTempDir[ 0 ] = '\0'; #if defined( HB_OS_UNIX ) { char * pszTempDirEnv = hb_getenv( "TMPDIR" ); if( fsGetTempDirByCase( pszTempDir, pszTempDirEnv, HB_FALSE ) ) nResult = 0; #ifdef P_tmpdir else if( fsGetTempDirByCase( pszTempDir, P_tmpdir, HB_TRUE ) ) nResult = 0; #endif else if( fsGetTempDirByCase( pszTempDir, "/tmp", HB_TRUE ) ) nResult = 0; if( pszTempDirEnv ) hb_xfree( pszTempDirEnv ); } #elif defined( HB_OS_WIN ) { TCHAR lpDir[ HB_PATH_MAX ]; if( GetTempPath( HB_PATH_MAX, lpDir ) ) { nResult = 0; lpDir[ HB_PATH_MAX - 1 ] = TEXT( '\0' ); HB_OSSTRDUP2( lpDir, pszTempDir, HB_PATH_MAX - 1 ); } } #else { #if ! defined( HB_OS_OS2 ) char szBuffer[ L_tmpnam ]; if( tmpnam( szBuffer ) != NULL ) { PHB_FNAME pTempName = hb_fsFNameSplit( szBuffer ); if( fsGetTempDirByCase( pszTempDir, pTempName->szPath, HB_TRUE ) ) nResult = 0; hb_xfree( pTempName ); } if( nResult != 0 ) #endif { static const char * env_tmp[] = { "TEMP", "TMP", "TMPDIR", NULL }; const char ** tmp = env_tmp; while( *tmp && nResult != 0 ) { char * pszTempDirEnv = hb_getenv( *tmp++ ); if( pszTempDirEnv ) { if( fsGetTempDirByCase( pszTempDir, pszTempDirEnv, HB_FALSE ) ) nResult = 0; hb_xfree( pszTempDirEnv ); } } } } #endif if( nResult == 0 && pszTempDir[ 0 ] != '\0' ) { int len = ( int ) strlen( pszTempDir ); if( pszTempDir[ len - 1 ] != HB_OS_PATH_DELIM_CHR && len < HB_PATH_MAX - 1 ) { pszTempDir[ len ] = HB_OS_PATH_DELIM_CHR; pszTempDir[ len + 1 ] = '\0'; } } else { pszTempDir[ 0 ] = '.'; pszTempDir[ 1 ] = HB_OS_PATH_DELIM_CHR; pszTempDir[ 2 ] = '\0'; } return nResult; }
static HB_FHANDLE hb_fsCreateTempLow( const BYTE * pszDir, const BYTE * pszPrefix, ULONG ulAttr, BYTE * pszName, const UCHAR * pszExt ) { /* less attemps */ int iAttemptLeft = 99, iLen; HB_FHANDLE fd; do { pszName[ 0 ] = '\0'; if( pszDir && pszDir[ 0 ] != '\0' ) { strncpy( ( char * ) pszName, ( char * ) pszDir, _POSIX_PATH_MAX ); } else { #if defined(HB_WIN32_IO) if( ! GetTempPathA( ( DWORD ) _POSIX_PATH_MAX, ( LPSTR ) pszName ) ) { pszName[ 0 ] = '.'; pszName[ 1 ] = '\0'; } #else char * pszTmpDir = hb_getenv( "TMPDIR" ); if( !fsGetTempDirByCase( pszName, pszTmpDir ) ) { #ifdef P_tmpdir if( !fsGetTempDirByCase( pszName, P_tmpdir ) ) #endif { pszName[ 0 ] = '.'; pszName[ 1 ] = '\0'; } } if( pszTmpDir ) hb_xfree( pszTmpDir ); #endif } if( pszName[0] != '\0' ) { int len = strlen( ( char * ) pszName ); if( pszName[ len - 1 ] != ( BYTE ) hb_set.HB_SET_DIRSEPARATOR ) { pszName[ len ] = ( BYTE ) hb_set.HB_SET_DIRSEPARATOR; pszName[ len + 1 ] = '\0'; } } if( pszPrefix ) strncat( ( char * ) pszName, ( char * ) pszPrefix, _POSIX_PATH_MAX ); iLen = ( int ) strlen( ( char * ) pszName ); if( iLen > _POSIX_PATH_MAX - 6 ) return FS_ERROR; #if !defined(__WATCOMC__) && ( defined( HB_OS_LINUX ) || defined( HB_OS_BSD ) ) if( hb_set.HB_SET_FILECASE != HB_SET_CASE_LOWER && hb_set.HB_SET_FILECASE != HB_SET_CASE_UPPER && hb_set.HB_SET_DIRCASE != HB_SET_CASE_LOWER && hb_set.HB_SET_DIRCASE != HB_SET_CASE_UPPER && pszExt == NULL ) { strncat( ( char * ) pszName, "XXXXXX", _POSIX_PATH_MAX ); fd = ( HB_FHANDLE ) mkstemp( ( char * ) pszName ); hb_fsSetIOError( fd != ( HB_FHANDLE ) -1, 0 ); } else #endif { int i, n; double d = hb_random_num(), x; for( i = 0; i < 6; i++ ) { d = d * 36; n = ( int ) d; d = modf( d, &x ); pszName[ iLen++ ] = ( BYTE ) ( n + ( n > 9 ? 'a' - 10 : '0' ) ); } pszName[ iLen ] = '\0'; if( pszExt ) strncat( ( char * ) pszName, ( char * ) pszExt, _POSIX_PATH_MAX ); hb_fsNameConv( pszName, NULL ); fd = hb_fsCreateEx( pszName, ulAttr, FO_EXCLUSIVE | FO_EXCL ); } if( fd != ( HB_FHANDLE ) FS_ERROR ) return fd; } while( --iAttemptLeft ); return FS_ERROR; }