#include <mach/mach.h>
#include <mach/mach_error.h>
#include <SystemConfiguration/SystemConfiguration.h>
#include <SystemConfiguration/SCPrivate.h>
#include "SCDynamicStoreInternal.h"
#include "config.h"
Boolean
SCDynamicStoreSetMultiple(SCDynamicStoreRef store,
CFDictionaryRef keysToSet,
CFArrayRef keysToRemove,
CFArrayRef keysToNotify)
{
SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store;
kern_return_t status;
CFDataRef xmlSet = NULL;
xmlData_t mySetRef = NULL;
CFIndex mySetLen = 0;
CFDataRef xmlRemove = NULL;
xmlData_t myRemoveRef = NULL;
CFIndex myRemoveLen = 0;
CFDataRef xmlNotify = NULL;
xmlData_t myNotifyRef = NULL;
CFIndex myNotifyLen = 0;
int sc_status;
SCLog(_sc_verbose, LOG_DEBUG, CFSTR("SCDynamicStoreSetMultiple:"));
SCLog(_sc_verbose, LOG_DEBUG, CFSTR(" keysToSet = %@"), keysToSet);
SCLog(_sc_verbose, LOG_DEBUG, CFSTR(" keysToRemove = %@"), keysToRemove);
SCLog(_sc_verbose, LOG_DEBUG, CFSTR(" keysToNotify = %@"), keysToNotify);
if (!store) {
_SCErrorSet(kSCStatusNoStoreSession);
return NULL;
}
if (storePrivate->server == MACH_PORT_NULL) {
_SCErrorSet(kSCStatusNoStoreServer);
return NULL;
}
if (keysToSet) {
xmlSet = CFPropertyListCreateXMLData(NULL, keysToSet);
mySetRef = (xmlData_t)CFDataGetBytePtr(xmlSet);
mySetLen = CFDataGetLength(xmlSet);
}
if (keysToRemove) {
xmlRemove = CFPropertyListCreateXMLData(NULL, keysToRemove);
myRemoveRef = (xmlData_t)CFDataGetBytePtr(xmlRemove);
myRemoveLen = CFDataGetLength(xmlRemove);
}
if (keysToNotify) {
xmlNotify = CFPropertyListCreateXMLData(NULL, keysToNotify);
myNotifyRef = (xmlData_t)CFDataGetBytePtr(xmlNotify);
myNotifyLen = CFDataGetLength(xmlNotify);
}
status = configset_m(storePrivate->server,
mySetRef,
mySetLen,
myRemoveRef,
myRemoveLen,
myNotifyRef,
myNotifyLen,
(int *)&sc_status);
if (xmlSet) CFRelease(xmlSet);
if (xmlRemove) CFRelease(xmlRemove);
if (xmlNotify) CFRelease(xmlNotify);
if (status != KERN_SUCCESS) {
if (status != MACH_SEND_INVALID_DEST)
SCLog(_sc_verbose, LOG_DEBUG, CFSTR("configset_m(): %s"), mach_error_string(status));
(void) mach_port_destroy(mach_task_self(), storePrivate->server);
storePrivate->server = MACH_PORT_NULL;
_SCErrorSet(status);
return FALSE;
}
if (sc_status != kSCStatusOK) {
_SCErrorSet(sc_status);
return FALSE;
}
return TRUE;
}
Boolean
SCDynamicStoreSetValue(SCDynamicStoreRef store, CFStringRef key, CFPropertyListRef value)
{
SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store;
kern_return_t status;
CFDataRef xmlKey;
xmlData_t myKeyRef;
CFIndex myKeyLen;
CFDataRef xmlData;
xmlData_t myDataRef;
CFIndex myDataLen;
int sc_status;
int newInstance;
SCLog(_sc_verbose, LOG_DEBUG, CFSTR("SCDynamicStoreSetValue:"));
SCLog(_sc_verbose, LOG_DEBUG, CFSTR(" key = %@"), key);
SCLog(_sc_verbose, LOG_DEBUG, CFSTR(" value = %@"), value);
if (!store) {
_SCErrorSet(kSCStatusNoStoreSession);
return FALSE;
}
if (storePrivate->server == MACH_PORT_NULL) {
_SCErrorSet(kSCStatusNoStoreServer);
return FALSE;
}
xmlKey = CFPropertyListCreateXMLData(NULL, key);
myKeyRef = (xmlData_t)CFDataGetBytePtr(xmlKey);
myKeyLen = CFDataGetLength(xmlKey);
xmlData = CFPropertyListCreateXMLData(NULL, value);
myDataRef = (xmlData_t)CFDataGetBytePtr(xmlData);
myDataLen = CFDataGetLength(xmlData);
status = configset(storePrivate->server,
myKeyRef,
myKeyLen,
myDataRef,
myDataLen,
0,
&newInstance,
(int *)&sc_status);
CFRelease(xmlKey);
CFRelease(xmlData);
if (status != KERN_SUCCESS) {
if (status != MACH_SEND_INVALID_DEST)
SCLog(_sc_verbose, LOG_DEBUG, CFSTR("configset(): %s"), mach_error_string(status));
(void) mach_port_destroy(mach_task_self(), storePrivate->server);
storePrivate->server = MACH_PORT_NULL;
_SCErrorSet(status);
return FALSE;
}
if (sc_status != kSCStatusOK) {
_SCErrorSet(sc_status);
return FALSE;
}
return TRUE;
}