Don't use deprecated API for OS X alias resolving

Change-Id: Ifaaec1863f12cd73d0a77c3367935f57675157e2
This commit is contained in:
Tor Lillqvist
2013-06-16 11:02:32 +03:00
parent 027d114b83
commit aa539f6c9d

View File

@@ -135,14 +135,11 @@ struct hostent *gethostbyname_r(const char *name, struct hostent *result,
#if defined(MACOSX) #if defined(MACOSX)
/* /*
* Add support for resolving Mac native alias files (not the same as unix alias files) * Add support for resolving Mac native alias files (not the same as unix alias files)
* (what are "unix alias files"?)
* returns 0 on success. * returns 0 on success.
*/ */
int macxp_resolveAlias(char *path, int buflen) int macxp_resolveAlias(char *path, int buflen)
{ {
FSRef aFSRef;
OSStatus nErr;
Boolean bFolder;
Boolean bAliased;
char *unprocessedPath = path; char *unprocessedPath = path;
if ( *unprocessedPath == '/' ) if ( *unprocessedPath == '/' )
@@ -155,50 +152,65 @@ int macxp_resolveAlias(char *path, int buflen)
if ( unprocessedPath ) if ( unprocessedPath )
*unprocessedPath = '\0'; *unprocessedPath = '\0';
nErr = noErr; CFStringRef cfpath = CFStringCreateWithCString( NULL, path, kCFStringEncodingUTF8 );
bFolder = FALSE; CFURLRef cfurl = CFURLCreateWithFileSystemPath( NULL, cfpath, kCFURLPOSIXPathStyle, false );
bAliased = FALSE; CFRelease( cfpath );
if ( FSPathMakeRef( (const UInt8 *)path, &aFSRef, 0 ) == noErr ) CFErrorRef cferror;
CFDataRef cfbookmark = CFURLCreateBookmarkDataFromFile( NULL, cfurl, &cferror );
CFRelease( cfurl );
if ( cfbookmark == NULL )
{ {
nErr = FSResolveAliasFileWithMountFlags( &aFSRef, TRUE, &bFolder, &bAliased, kResolveAliasFileNoUI ); CFRelease( cferror );
if ( nErr == nsvErr ) }
else
{
Boolean isStale;
cfurl = CFURLCreateByResolvingBookmarkData( NULL, cfbookmark, kCFBookmarkResolutionWithoutUIMask,
NULL, NULL, &isStale, &cferror );
CFRelease( cfbookmark );
if ( cfurl == NULL )
{ {
errno = ENOENT; CFRelease( cferror );
nRet = -1;
} }
else if ( nErr == noErr && bAliased ) else
{ {
char tmpPath[ PATH_MAX ]; cfpath = CFURLCopyFileSystemPath( cfurl, kCFURLPOSIXPathStyle );
if ( FSRefMakePath( &aFSRef, (UInt8 *)tmpPath, PATH_MAX ) == noErr ) CFRelease( cfurl );
if ( cfpath != NULL )
{ {
int nLen = strlen( tmpPath ) + ( unprocessedPath ? strlen( unprocessedPath + 1 ) + 1 : 0 ); char tmpPath[ PATH_MAX ];
if ( nLen < buflen && nLen < 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 ); if ( unprocessedPath )
strcat( tmpPath, "/" ); {
strcat( tmpPath, unprocessedPath + 1 ); int nTmpPathLen = strlen( tmpPath );
strcpy( path, tmpPath); strcat( tmpPath, "/" );
unprocessedPath = path + nTmpPathLen; 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 CFRelease( cfpath );
{
errno = ENAMETOOLONG;
nRet = -1;
}
} }
} }
} }
if ( unprocessedPath ) if ( unprocessedPath )
*unprocessedPath++ = '/'; *unprocessedPath++ = '/';
} }
return nRet; return nRet;
} }