Boolean
-getNumberValue(int* numberVal, const void* numberKey)
+getDictValue(CFTypeRef* value, CFStringRef key)
{
- assert(numberVal != NULL);
- assert(numberKey != NULL);
+ assert(value != NULL);
+ assert(key != NULL);
Boolean result;
CFDictionaryRef dictRef;
- CFNumberRef numberRef;
-
-
dictRef = SCDynamicStoreCopyProxies((SCDynamicStoreRef)NULL);
result = (dictRef != NULL);
if(result) {
- numberRef = (CFNumberRef)CFDictionaryGetValue(dictRef, numberKey);
- result = (numberRef != NULL &&
- CFGetTypeID(numberRef) == CFNumberGetTypeID());
+ *value = (CFNumberRef)CFDictionaryGetValue(dictRef, key);
}
- if(result) {
- result = CFNumberGetValue(numberRef, kCFNumberIntType, numberVal);
+ if(*value != NULL) {
+ CFRetain(*value);
}
-
if(dictRef != NULL) {
CFRelease(dictRef);
}
if(!result) {
- *numberVal = 0;
+ *value = NULL;
}
return result;
}
Boolean
-getStringValue(char* strVal, size_t strSize, const void* strKey)
+printNumber(CFNumberRef numberRef)
{
- assert(strVal != NULL);
- assert(strKey != NULL);
-
- Boolean result;
- CFDictionaryRef dictRef;
- CFStringRef strRef;
-
+ assert(numberRef != NULL);
- dictRef = SCDynamicStoreCopyProxies((SCDynamicStoreRef)NULL);
- result = (dictRef != NULL);
-
- if(result) {
- strRef = (CFStringRef)CFDictionaryGetValue(dictRef, strKey);
- result = (strRef != NULL) &&
- (CFGetTypeID(strRef) == CFStringGetTypeID());
- }
- if(result) {
- result = CFStringGetCString(strRef, strVal, (CFIndex)strSize,
- kCFStringEncodingASCII);
+ int numberVal = 0;
+ if(CFNumberGetValue(numberRef, kCFNumberIntType, &numberVal)) {
+ printf("%d\n", numberVal);
+ return TRUE;
}
+ return FALSE;
+}
-
- if(dictRef != NULL) {
- CFRelease(dictRef);
- }
- if(!result) {
- *strVal = 0;
+Boolean
+printString(CFStringRef strRef)
+{
+ assert(strRef != NULL);
+
+ char strVal[1024];
+ if(CFStringGetCString(strRef, strVal, (CFIndex)1024,
+ kCFStringEncodingASCII))
+ {
+ printf("%s\n", strVal);
+ return TRUE;
}
- return result;
+ return FALSE;
}
CFStringRef
void
usage(const char* program)
{
- fprintf(stderr, "Usage: %s (-n NumberKey) | (-s StringKey)\n", program);
+ fprintf(stderr, "Usage: %s [-q] key\n", program);
fprintf(stderr, "Look in %s for keys. Eg, HTTPProxy\n\n", KEYFILE);
}
int
main(int argc, char** argv)
{
- if(argc != 3) {
+ int quiet = 0;
+ const char* key;
+ if(argc == 2) {
+ key = argv[1];
+ } else if(argc == 3 && strcmp("-q", argv[1]) == 0) {
+ quiet = 1;
+ key = argv[2];
+ } else {
usage(argv[0]);
return 1;
}
- CFStringRef keyRef = createCFString(argv[2]);
+
+ CFStringRef keyRef = createCFString(argv[1]);
if(keyRef == NULL) {
fprintf(stderr, "Fatal error: Couldn't create CFStringRef from arg2\n");
return 1;
}
- Boolean result;
- if(strcmp("-n", argv[1]) == 0) {
- int var = 0;
- result = getNumberValue(&var, keyRef);
- if(result) {
- printf("%d\n", var);
- }
- } else if(strcmp("-s", argv[1]) == 0) {
- char str[1024];
- result = getStringValue(str, 1024, keyRef);
- if(result) {
- printf("%s\n", str);
+ CFTypeRef valueRef = NULL;
+ if(!getDictValue(&valueRef, keyRef)) {
+ fprintf(stderr, "Fatal error: Error accessing dictionary\n");
+ return 1;
+ }
+
+ if(valueRef == NULL) {
+ if(!quiet) {
+ fprintf(stderr, "No value for that key\n");
}
+ return 0;
+ }
+ else if(CFStringGetTypeID() == CFGetTypeID(valueRef)) {
+ printString((CFStringRef)valueRef);
+ }
+ else if(CFNumberGetTypeID() == CFGetTypeID(valueRef)) {
+ printNumber((CFNumberRef)valueRef);
}
else {
- usage(argv[0]);
+ fprintf(stderr, "Fatal error: Unsupported value type in dictionary\n");
+ CFRelease(valueRef);
return 1;
}
+ CFRelease(valueRef);
return 0;
}