#define DEBUG_ASSERT_COMPONENT_NAME_STRING "TSystemUtils"
#include <AssertMacros.h>
#include "TSystemUtils.h"
#include <unistd.h>
#include <sys/stat.h>
#include <SystemConfiguration/SystemConfiguration.h>
#define DEBUG 0
#define kAppleLanguagesString "AppleLanguages"
#define kEmptyString ""
CFArrayRef
TSystemUtils::GetPreferredLanguages ( void )
{
CFArrayRef preferredLanguages = NULL;
CFPropertyListRef languages = NULL;
CFStringRef userName = NULL;
CFComparisonResult equal = kCFCompareEqualTo;
uid_t uid = 0;
uid = FindUIDToUse ( );
seteuid ( uid );
userName = ::CFCopyUserName ( );
require ( ( userName != NULL ), ErrorExit );
equal = ::CFStringCompare ( userName, CFSTR ( kEmptyString ), 0 );
require ( ( equal != kCFCompareEqualTo ), ReleaseExit );
languages = ::CFPreferencesCopyValue ( CFSTR ( kAppleLanguagesString ),
kCFPreferencesAnyApplication,
userName,
kCFPreferencesAnyHost );
require ( ( languages != NULL ), ReleaseExit );
require_action ( ( ::CFGetTypeID ( languages ) == ::CFArrayGetTypeID ( ) ),
ReleaseExit,
::CFRelease ( languages ) );
preferredLanguages = ( CFArrayRef ) languages;
ReleaseExit:
::CFRelease ( userName );
ErrorExit:
seteuid ( 0 );
return preferredLanguages;
}
uid_t
TSystemUtils::FindUIDToUse ( void )
{
uid_t uid = 0;
gid_t gid = 0;
CFStringRef userName = NULL;
SCDynamicStoreRef storeRef = NULL;
storeRef = ::SCDynamicStoreCreate ( kCFAllocatorDefault,
CFSTR ( "cddafs.util" ),
NULL,
NULL );
require ( ( storeRef != NULL ), ErrorExit );
userName = ::SCDynamicStoreCopyConsoleUser ( storeRef,
&uid,
&gid );
require ( ( userName != NULL ), ReleaseDynamicStore );
::CFRelease ( userName );
ReleaseDynamicStore:
require_quiet ( ( storeRef != NULL ), ErrorExit );
::CFRelease ( storeRef );
storeRef = NULL;
ErrorExit:
return uid;
}
CFDataRef
TSystemUtils::ReadDataFromURL ( CFURLRef url )
{
CFMutableDataRef data = NULL;
Boolean result = false;
CFNumberRef fileSizeNumber = NULL;
CFIndex fileSize = 0;
UInt8 * dataPtr = NULL;
UInt8 * endPtr = NULL;
CFReadStreamRef readStream = NULL;
CFIndex bytesRead = 0;
result = CFURLCopyResourcePropertyForKey ( url, kCFURLFileSizeKey, &fileSizeNumber, NULL );
require ( result, ErrorExit );
result = CFNumberGetValue ( fileSizeNumber, kCFNumberCFIndexType, &fileSize );
require ( result, ReleaseNumber );
data = CFDataCreateMutable ( kCFAllocatorDefault, fileSize );
require ( data, ReleaseNumber );
CFDataSetLength ( data, fileSize );
dataPtr = CFDataGetMutableBytePtr ( data );
require ( dataPtr, ReleaseNumber );
readStream = CFReadStreamCreateWithFile ( kCFAllocatorDefault, url );
require ( readStream, ErrorExit );
result = CFReadStreamOpen ( readStream );
require ( result, ReleaseStream );
endPtr = ( UInt8 * ) dataPtr + fileSize;
while ( dataPtr < endPtr )
{
bytesRead = CFReadStreamRead ( readStream, dataPtr, endPtr - dataPtr );
if ( bytesRead > 0 )
{
dataPtr += bytesRead;
}
}
CFReadStreamClose ( readStream );
ReleaseStream:
CFRelease ( readStream );
readStream = NULL;
ReleaseNumber:
CFRelease ( fileSizeNumber );
fileSizeNumber = NULL;
ErrorExit:
return data;
}