#include <fcntl.h>
#include <paths.h>
#include <unistd.h>
#include "configd.h"
#include "configd_server.h"
#include "session.h"
#define SNAPSHOT_PATH_CACHE _PATH_VARTMP "configd-cache.xml"
#define SNAPSHOT_PATH_SESSION _PATH_VARTMP "configd-session.xml"
SCDStatus
_SCDSnapshot(SCDSessionRef session)
{
int fd;
CFDataRef xmlData;
SCDLog(LOG_DEBUG, CFSTR("_SCDSnapshot:"));
(void) unlink(SNAPSHOT_PATH_CACHE);
fd = open(SNAPSHOT_PATH_CACHE, O_WRONLY|O_CREAT|O_TRUNC, 0644);
if (fd < 0) {
return SCD_FAILED;
}
xmlData = CFPropertyListCreateXMLData(NULL, cacheData);
(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 SCD_FAILED;
}
xmlData = CFPropertyListCreateXMLData(NULL, sessionData);
(void) write(fd, CFDataGetBytePtr(xmlData), CFDataGetLength(xmlData));
(void) close(fd);
CFRelease(xmlData);
return SCD_OK;
}
kern_return_t
_snapshot(mach_port_t server, int *scd_status)
{
serverSessionRef mySession = getSession(server);
SCDLog(LOG_DEBUG, CFSTR("Snapshot configuration database."));
*scd_status = _SCDSnapshot(mySession->session);
if (*scd_status != SCD_OK) {
SCDLog(LOG_DEBUG, CFSTR(" SCDUnlock(): %s"), SCDError(*scd_status));
}
return KERN_SUCCESS;
}