lookupDSLocalKDC.c [plain text]
#include "lookupDSLocalKDC.h"
#include <CoreFoundation/CoreFoundation.h>
#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
#include <Carbon/Carbon.h>
#include <OpenDirectory/OpenDirectory.h>
OSStatus DSCopyLocalKDC (CFStringRef *realm)
{
OSStatus err = 0;
ODNodeRef cfNodeRef = NULL;
ODRecordRef cfRecord = NULL;
CFArrayRef cfLKDCName = NULL;
CFIndex limit;
CFTypeRef realmName;
if (NULL == realm) { err = paramErr; goto Error; }
*realm = NULL;
cfNodeRef = ODNodeCreateWithNodeType( kCFAllocatorDefault, kODSessionDefault, kODTypeAuthenticationSearchNode, NULL );
if ( NULL == cfNodeRef ) { err = paramErr; goto Error; }
cfRecord = ODNodeCopyRecord( cfNodeRef, CFSTR(kDSStdRecordTypeConfig), CFSTR(kKDCRecordName), NULL, NULL );
if( NULL == cfRecord ) { err = paramErr; goto Error; }
cfLKDCName = ODRecordCopyValues ( cfRecord, CFSTR(kRealmNameKey), NULL);
if ( NULL == cfLKDCName ) { err = paramErr; goto Error; }
limit = CFArrayGetCount (cfLKDCName);
if (1 != limit) { err = paramErr; goto Error; }
realmName = CFArrayGetValueAtIndex (cfLKDCName, 0);
if (CFStringGetTypeID () != CFGetTypeID (realmName)) { err = paramErr; goto Error; }
*realm = CFRetain (realmName);
Error:
if (cfLKDCName) { CFRelease( cfLKDCName ); }
if (cfRecord) { CFRelease( cfRecord ); }
if (cfNodeRef) { CFRelease( cfNodeRef ); }
return err;
}
#else
#warning On Mac OS X 10.4
#define kLocalKDCRealmFile "/var/db/realm.local"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
OSStatus DSCopyLocalKDC (CFStringRef *realm)
{
char *endRealm = NULL, *realmString = NULL;
struct stat realmFileSB;
int fd;
size_t wasRead, realmSize;
if (NULL == realm) { err = paramErr; goto Error; }
*realm = NULL;
if (0 != stat (kLocalKDCRealmFile, &realmFileSB)) { err = paramErr; goto Error; }
if (realmFileSB.st_size > 64) { err = paramErr; goto Error; }
realmSize = realmFileSB.st_size + 1;
realmString = malloc (realmSize);
fd = open (kLocalKDCRealmFile, O_RDONLY);
if (0 == fd || NULL == realmString) { err = paramErr; goto Error; }
wasRead = read (fd, realmString, realmFileSB.st_size);
close (fd);
if (wasRead != realmFileSB.st_size) { err = paramErr; goto Error; }
realmString [realmSize] = '\0';
endRealm = strchr (realmString, '\n');
if (NULL != endRealm) { *endRealm = '\0'; }
*realm = CFStringCreateWithCString (NULL, realmString, kCFStringEncodingASCII);
Error:
if (realmString) { free (realmString); }
return err;
}
#endif