#include <fcntl.h>
#include <paths.h>
#include <unistd.h>
#include "configd.h"
#include "configd_server.h"
#include "session.h"
#define SNAPSHOT_PATH_STORE _PATH_VARTMP "configd-store.xml"
#define SNAPSHOT_PATH_SESSION _PATH_VARTMP "configd-session.xml"
int
__SCDynamicStoreSnapshot(SCDynamicStoreRef store)
{
int fd;
serverSessionRef mySession;
SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store;
CFDataRef xmlData;
SCLog(_configd_verbose, LOG_DEBUG, CFSTR("__SCDynamicStoreSnapshot:"));
mySession = getSession(storePrivate->server);
if (mySession->callerEUID != 0) {
return kSCStatusAccessError;
}
(void) unlink(SNAPSHOT_PATH_STORE);
fd = open(SNAPSHOT_PATH_STORE, O_WRONLY|O_CREAT|O_TRUNC, 0644);
if (fd < 0) {
return kSCStatusFailed;
}
xmlData = CFPropertyListCreateXMLData(NULL, storeData);
if (!xmlData) {
SCLog(TRUE, LOG_ERR, CFSTR("CFPropertyListCreateXMLData() failed"));
close(fd);
return kSCStatusFailed;
}
(void) write(fd, CFDataGetBytePtr(xmlData), CFDataGetLength(xmlData));
(void) close(fd);
CFRelease(xmlData);
(void) unlink(SNAPSHOT_PATH_SESSION);
fd = open(SNAPSHOT_PATH_SESSION, O_WRONLY|O_CREAT|O_TRUNC, 0644);
if (fd < 0) {
return kSCStatusFailed;
}
xmlData = CFPropertyListCreateXMLData(NULL, sessionData);
if (!xmlData) {
SCLog(TRUE, LOG_ERR, CFSTR("CFPropertyListCreateXMLData() failed"));
close(fd);
return kSCStatusFailed;
}
(void) write(fd, CFDataGetBytePtr(xmlData), CFDataGetLength(xmlData));
(void) close(fd);
CFRelease(xmlData);
return kSCStatusOK;
}
kern_return_t
_snapshot(mach_port_t server, int *sc_status)
{
serverSessionRef mySession = getSession(server);
SCLog(_configd_verbose, LOG_DEBUG, CFSTR("Snapshot configuration database."));
*sc_status = __SCDynamicStoreSnapshot(mySession->store);
if (*sc_status != kSCStatusOK) {
SCLog(_configd_verbose, LOG_DEBUG, CFSTR(" __SCDynamicStoreSnapshot(): %s"), SCErrorString(*sc_status));
}
return KERN_SUCCESS;
}