#include <mach/mach.h>
#include <mach/mach_error.h>
#include <SystemConfiguration/SCD.h>
#include "config.h"
#include "SCDPrivate.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);
}
SCDStatus
SCDNotifierList(SCDSessionRef session, int regexOptions, CFArrayRef *notifierKeys)
{
SCDSessionPrivateRef sessionPrivate = (SCDSessionPrivateRef)session;
CFIndex keyCnt;
void **keyRefs;
CFArrayRef keys;
CFMutableArrayRef sortedKeys;
SCDLog(LOG_DEBUG, CFSTR("SCDNotifierList:"));
if ((session == NULL) || (sessionPrivate->server == MACH_PORT_NULL)) {
return SCD_NOSESSION;
}
if (regexOptions & kSCDRegexKey) {
keyCnt = CFSetGetCount(sessionPrivate->reKeys);
keyRefs = CFAllocatorAllocate(NULL, keyCnt * sizeof(CFStringRef), 0);
CFSetGetValues(sessionPrivate->reKeys, keyRefs);
keys = CFArrayCreate(NULL, keyRefs, keyCnt, &kCFTypeArrayCallBacks);
CFAllocatorDeallocate(NULL, keyRefs);
} else {
keyCnt = CFSetGetCount(sessionPrivate->keys);
keyRefs = CFAllocatorAllocate(NULL, keyCnt * sizeof(CFStringRef), 0);
CFSetGetValues(sessionPrivate->keys, keyRefs);
keys = CFArrayCreate(NULL, keyRefs, keyCnt, &kCFTypeArrayCallBacks);
CFAllocatorDeallocate(NULL, keyRefs);
}
sortedKeys = CFArrayCreateMutableCopy(NULL, keyCnt, keys);
CFRelease(keys);
CFArraySortValues(sortedKeys, CFRangeMake(0, keyCnt), sort_keys, NULL);
*notifierKeys = sortedKeys;
return SCD_OK;
}