#include <sys/types.h>
#include "scutil.h"
static CFComparisonResult
sort_keys(const void *p1, const void *p2, void *context) {
CFStringRef key1 = (CFStringRef)p1;
CFStringRef key2 = (CFStringRef)p2;
return CFStringCompare(key1, key2, 0);
}
void
do_list(int argc, char **argv)
{
int i;
CFStringRef pattern;
CFArrayRef list;
CFIndex listCnt;
CFMutableArrayRef sortedList;
pattern = CFStringCreateWithCString(NULL,
(argc >= 1) ? argv[0] : ".*",
kCFStringEncodingMacRoman);
list = SCDynamicStoreCopyKeyList(store, pattern);
CFRelease(pattern);
if (!list) {
if (SCError() != kSCStatusOK) {
SCPrint(TRUE, stdout, CFSTR(" %s\n"), SCErrorString(SCError()));
} else {
SCPrint(TRUE, stdout, CFSTR(" no keys.\n"));
}
return;
}
listCnt = CFArrayGetCount(list);
sortedList = CFArrayCreateMutableCopy(NULL, listCnt, list);
CFRelease(list);
CFArraySortValues(sortedList,
CFRangeMake(0, listCnt),
sort_keys,
NULL);
if (listCnt > 0) {
for (i=0; i<listCnt; i++) {
SCPrint(TRUE,
stdout,
CFSTR(" subKey [%d] = %@\n"),
i,
CFArrayGetValueAtIndex(sortedList, i));
}
} else {
SCPrint(TRUE, stdout, CFSTR(" no keys.\n"));
}
CFRelease(sortedList);
return;
}
void
do_add(int argc, char **argv)
{
CFStringRef key;
key = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingMacRoman);
if (argc < 2) {
if (!SCDynamicStoreAddValue(store, key, value)) {
SCPrint(TRUE, stdout, CFSTR(" %s\n"), SCErrorString(SCError()));
}
} else {
if (!SCDynamicStoreAddTemporaryValue(store, key, value)) {
SCPrint(TRUE, stdout, CFSTR(" %s\n"), SCErrorString(SCError()));
}
}
CFRelease(key);
return;
}
void
do_get(int argc, char **argv)
{
CFStringRef key;
CFPropertyListRef newValue;
key = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingMacRoman);
newValue = SCDynamicStoreCopyValue(store, key);
CFRelease(key);
if (!newValue) {
SCPrint(TRUE, stdout, CFSTR(" %s\n"), SCErrorString(SCError()));
return;
}
if (value != NULL) {
CFRelease(value);
}
value = newValue;
return;
}
void
do_set(int argc, char **argv)
{
CFStringRef key;
key = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingMacRoman);
if (!SCDynamicStoreSetValue(store, key, value)) {
SCPrint(TRUE, stdout, CFSTR(" %s\n"), SCErrorString(SCError()));
}
CFRelease(key);
return;
}
void
do_show(int argc, char **argv)
{
CFStringRef key;
CFPropertyListRef newValue;
key = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingMacRoman);
newValue = SCDynamicStoreCopyValue(store, key);
CFRelease(key);
if (!newValue) {
SCPrint(TRUE, stdout, CFSTR(" %s\n"), SCErrorString(SCError()));
return;
}
SCPrint(TRUE, stdout, CFSTR("%@\n"), newValue);
CFRelease(newValue);
return;
}
void
do_remove(int argc, char **argv)
{
CFStringRef key;
key = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingMacRoman);
if (!SCDynamicStoreRemoveValue(store, key)) {
SCPrint(TRUE, stdout, CFSTR(" %s\n"), SCErrorString(SCError()));
}
CFRelease(key);
return;
}
void
do_notify(int argc, char **argv)
{
CFStringRef key;
key = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingMacRoman);
if (!SCDynamicStoreNotifyValue(store, key)) {
SCPrint(TRUE, stdout, CFSTR(" %s\n"), SCErrorString(SCError()));
}
CFRelease(key);
return;
}
void
do_touch(int argc, char **argv)
{
CFStringRef key;
key = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingMacRoman);
if (!SCDynamicStoreTouchValue(store, key)) {
SCPrint(TRUE, stdout, CFSTR(" %s\n"), SCErrorString(SCError()));
}
CFRelease(key);
return;
}