summaryrefslogtreecommitdiff
path: root/sal/osl
diff options
context:
space:
mode:
authorTor Lillqvist <tml@iki.fi>2013-06-16 11:02:32 +0300
committerTor Lillqvist <tml@iki.fi>2013-06-16 11:19:19 +0300
commitaa539f6c9d37f5eeef56a468f7009c542fddc02a (patch)
tree50492bdbe115946e24738719d3c27d4859962ea1 /sal/osl
parent027d114b832686ab927c7db91ea512d2dcdc77ac (diff)
Don't use deprecated API for OS X alias resolving
Change-Id: Ifaaec1863f12cd73d0a77c3367935f57675157e2
Diffstat (limited to 'sal/osl')
-rw-r--r--sal/osl/unx/system.c74
1 files changed, 43 insertions, 31 deletions
diff --git a/sal/osl/unx/system.c b/sal/osl/unx/system.c
index 1e9e249ad857..a857769f8f69 100644
--- a/sal/osl/unx/system.c
+++ b/sal/osl/unx/system.c
@@ -135,14 +135,11 @@ struct hostent *gethostbyname_r(const char *name, struct hostent *result,
#if defined(MACOSX)
/*
* Add support for resolving Mac native alias files (not the same as unix alias files)
+ * (what are "unix alias files"?)
* returns 0 on success.
*/
int macxp_resolveAlias(char *path, int buflen)
{
- FSRef aFSRef;
- OSStatus nErr;
- Boolean bFolder;
- Boolean bAliased;
char *unprocessedPath = path;
if ( *unprocessedPath == '/' )
@@ -155,50 +152,65 @@ int macxp_resolveAlias(char *path, int buflen)
if ( unprocessedPath )
*unprocessedPath = '\0';
- nErr = noErr;
- bFolder = FALSE;
- bAliased = FALSE;
- if ( FSPathMakeRef( (const UInt8 *)path, &aFSRef, 0 ) == noErr )
+ CFStringRef cfpath = CFStringCreateWithCString( NULL, path, kCFStringEncodingUTF8 );
+ CFURLRef cfurl = CFURLCreateWithFileSystemPath( NULL, cfpath, kCFURLPOSIXPathStyle, false );
+ CFRelease( cfpath );
+ CFErrorRef cferror;
+ CFDataRef cfbookmark = CFURLCreateBookmarkDataFromFile( NULL, cfurl, &cferror );
+ CFRelease( cfurl );
+ if ( cfbookmark == NULL )
{
- nErr = FSResolveAliasFileWithMountFlags( &aFSRef, TRUE, &bFolder, &bAliased, kResolveAliasFileNoUI );
- if ( nErr == nsvErr )
+ CFRelease( cferror );
+ }
+ else
+ {
+ Boolean isStale;
+ cfurl = CFURLCreateByResolvingBookmarkData( NULL, cfbookmark, kCFBookmarkResolutionWithoutUIMask,
+ NULL, NULL, &isStale, &cferror );
+ CFRelease( cfbookmark );
+ if ( cfurl == NULL )
{
- errno = ENOENT;
- nRet = -1;
+ CFRelease( cferror );
}
- else if ( nErr == noErr && bAliased )
+ else
{
- char tmpPath[ PATH_MAX ];
- if ( FSRefMakePath( &aFSRef, (UInt8 *)tmpPath, PATH_MAX ) == noErr )
+ cfpath = CFURLCopyFileSystemPath( cfurl, kCFURLPOSIXPathStyle );
+ CFRelease( cfurl );
+ if ( cfpath != NULL )
{
- int nLen = strlen( tmpPath ) + ( unprocessedPath ? strlen( unprocessedPath + 1 ) + 1 : 0 );
- if ( nLen < buflen && nLen < PATH_MAX )
+ char tmpPath[ PATH_MAX ];
+ if ( CFStringGetCString( cfpath, tmpPath, PATH_MAX, kCFStringEncodingUTF8 ) )
{
- if ( unprocessedPath )
+ int nLen = strlen( tmpPath ) + ( unprocessedPath ? strlen( unprocessedPath + 1 ) + 1 : 0 );
+ if ( nLen < buflen && nLen < PATH_MAX )
{
- int nTmpPathLen = strlen( tmpPath );
- strcat( tmpPath, "/" );
- strcat( tmpPath, unprocessedPath + 1 );
- strcpy( path, tmpPath);
- unprocessedPath = path + nTmpPathLen;
+ if ( unprocessedPath )
+ {
+ int nTmpPathLen = strlen( tmpPath );
+ strcat( tmpPath, "/" );
+ strcat( tmpPath, unprocessedPath + 1 );
+ strcpy( path, tmpPath);
+ unprocessedPath = path + nTmpPathLen;
+ }
+ else if ( !unprocessedPath )
+ {
+ strcpy( path, tmpPath );
+ }
}
- else if ( !unprocessedPath )
+ else
{
- strcpy( path, tmpPath);
+ errno = ENAMETOOLONG;
+ nRet = -1;
}
}
- else
- {
- errno = ENAMETOOLONG;
- nRet = -1;
- }
+ CFRelease( cfpath );
}
}
}
if ( unprocessedPath )
*unprocessedPath++ = '/';
- }
+ }
return nRet;
}