KerberosPreferences.c [plain text]
#include <CoreServices/CoreServices.h>
#include <CoreFoundation/CoreFoundation.h>
#include <Kerberos/FSpUtils.h>
#define KRB5_PRIVATE 1
#include <k5-int.h>
#include <profile.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <libgen.h>
#include <Kerberos/KerberosPreferences.h>
#define PREFERENCES_UMASK (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
#define kerberosPreferences_FileNameCStr "edu.mit.Kerberos"
#pragma mark -
OSErr KPInitializeWithDefaultKerberosLibraryPreferences (const FSSpec* inPrefsFile)
{
OSStatus err = noErr;
CFBundleRef kerberosBundle = NULL;
CFURLRef defaultPrefsURL = NULL;
CFStringRef defaultPrefsString = NULL;
char initPrefs[PATH_MAX];
char defaultPrefs[PATH_MAX];
int defaultFd = -1;
int initFd = -1;
if (err == noErr) {
kerberosBundle = CFBundleGetBundleWithIdentifier (CFSTR ("edu.mit.Kerberos"));
if (kerberosBundle == NULL) { err = ENOMEM; }
}
if (err == noErr) {
defaultPrefsURL = CFBundleCopyResourceURL (kerberosBundle, CFSTR (kerberosPreferences_FileNameCStr), NULL, NULL);
if (defaultPrefsURL == NULL) { err = ENOMEM; }
}
if (err == noErr) {
defaultPrefsString = CFURLCopyFileSystemPath (defaultPrefsURL, kCFURLPOSIXPathStyle);
if (defaultPrefsString == NULL) { err = ENOMEM; }
}
if (err == noErr) {
Boolean converted = CFStringGetCString (defaultPrefsString, defaultPrefs, PATH_MAX,
CFStringGetSystemEncoding ());
if (!converted) { err = ENOENT; }
}
if (err == noErr) {
err = FSSpecToPOSIXPath (inPrefsFile, initPrefs, PATH_MAX);
}
if (err == noErr) {
defaultFd = open (defaultPrefs, O_RDONLY, 0);
if (defaultFd < 0) { err = errno; }
}
if (err == noErr) {
initFd = open (initPrefs, O_RDWR|O_CREAT|O_TRUNC, 0);
if (initFd < 0) { err = errno; }
}
if (err == noErr) {
err = lseek (defaultFd, 0, SEEK_SET);
}
if (err == noErr) {
err = lseek (initFd, 0, SEEK_SET);
}
if (err == noErr) {
char buffer[BUFSIZ];
while (true) {
int bytesRead = read (initFd, buffer, BUFSIZ);
if (bytesRead < 0) {
if (errno == EINTR) {
continue; } else {
err = errno; break;
}
}
if (bytesRead == 0) {
break; }
int bytesWritten = 0;
int bytesToWrite = bytesRead;
while (bytesToWrite > 0) {
int wrote = write (defaultFd, buffer + bytesWritten, bytesToWrite);
if (wrote <= 0) {
if (errno == EINTR) {
continue; } else {
err = errno; break;
}
}
bytesWritten += wrote;
bytesToWrite -= wrote;
}
}
}
if (defaultFd >= 0) { close (defaultFd); }
if (initFd >= 0) { close (initFd); }
if (kerberosBundle != NULL) { CFRelease (kerberosBundle); }
if (defaultPrefsURL != NULL) { CFRelease (defaultPrefsURL); }
if (defaultPrefsString != NULL) { CFRelease (defaultPrefsString); }
return err;
}
OSErr KPGetListOfPreferencesFiles (UInt32 inUserSystemFlags, FSSpecPtr* thePrefFiles, UInt32* outNumberOfFiles)
{
OSStatus err = noErr;
int secure = ((inUserSystemFlags & kpUserPreferences) == 0);;
profile_filespec_t *pfiles = NULL;
UInt32 tempNumberOfFiles = 0;
FSSpecPtr tempPrefsFiles = NULL;
UInt32 i;
if (err == noErr) {
err = os_get_default_config_files (&pfiles, secure);
}
if (err == noErr) {
for (i = 0; pfiles[i] != NULL; i++) {
tempNumberOfFiles++;
}
}
if (err == noErr) {
tempPrefsFiles = (FSSpecPtr) malloc (tempNumberOfFiles * sizeof (FSSpec));
if (tempPrefsFiles == NULL) { err = ENOMEM; }
}
if (err == noErr) {
for (i = 0; i < tempNumberOfFiles; i++) {
err = POSIXPathToFSSpec (pfiles[i], &tempPrefsFiles[i]);
if (err != noErr) { break; }
}
}
if (err == noErr) {
*thePrefFiles = tempPrefsFiles;
*outNumberOfFiles = tempNumberOfFiles;
} else {
if (tempPrefsFiles != NULL) { free (tempPrefsFiles); }
}
return err;
}
void KPFreeListOfPreferencesFiles (FSSpecPtr thePrefFiles)
{
free (thePrefFiles);
}
OSErr KPPreferencesFileIsReadable (const FSSpec* inPrefsFile)
{
OSStatus err = noErr;
char prefs[PATH_MAX];
if (err == noErr) {
err = FSSpecToPOSIXPath (inPrefsFile, prefs, PATH_MAX);
}
if (err == noErr) {
int fd = open (prefs, O_RDONLY, PREFERENCES_UMASK);
if (fd < 0) {
err = errno;
} else {
close (fd);
}
}
return err;
}
OSErr KPPreferencesFileIsWritable (const FSSpec* inPrefsFile)
{
OSStatus err = noErr;
char prefs[PATH_MAX];
if (err == noErr) {
err = FSSpecToPOSIXPath (inPrefsFile, prefs, PATH_MAX);
}
if (err == noErr) {
int fd = open (prefs, O_RDWR, PREFERENCES_UMASK);
if (fd < 0) {
err = errno;
} else {
close (fd);
}
}
if (err == ENOENT) {
int fd = open (prefs, O_RDWR | O_CREAT, PREFERENCES_UMASK);
if (fd < 0) {
err = errno;
} else {
close (fd);
err = unlink (prefs);
if (err != noErr) { err = errno; }
}
}
return err;
}
OSErr KPCreatePreferencesFile (const FSSpec* inPrefsFile)
{
OSStatus err = noErr;
char path[PATH_MAX];
if (err == noErr) {
err = FSSpecToPOSIXPath (inPrefsFile, path, PATH_MAX);
}
if (err == noErr) {
int fd = open (path, O_RDWR|O_CREAT|O_TRUNC, PREFERENCES_UMASK);
if (fd < 0) {
err = errno;
} else {
close (fd);
}
}
return err;
}