From 00753391a2870d115009501ce763a6cf5b75341e Mon Sep 17 00:00:00 2001 From: James Bunton Date: Sat, 28 Jul 2007 13:12:04 +1000 Subject: [PATCH] Autodetect value types --- proxyconf.sh | 18 ++++----- sysconfig.c | 112 ++++++++++++++++++++++++++------------------------- 2 files changed, 66 insertions(+), 64 deletions(-) diff --git a/proxyconf.sh b/proxyconf.sh index 61b0f50..78b537c 100755 --- a/proxyconf.sh +++ b/proxyconf.sh @@ -1,17 +1,17 @@ #!/bin/bash -if [ "$(sysconfig -n "HTTPEnable")" -eq 1 ]; then - host="$(sysconfig -s "HTTPProxy")" - port="$(sysconfig -n "HTTPPort")" +if [ "$(sysconfig "HTTPEnable")" -eq 1 ]; then + host="$(sysconfig "HTTPProxy")" + port="$(sysconfig "HTTPPort")" echo "export http_proxy=\"http://${host}:${port}\"" fi -if [ "$(sysconfig -n "HTTPSEnable")" -eq 1 ]; then - host="$(sysconfig -s "HTTPSProxy")" - port="$(sysconfig -n "HTTPSPort")" +if [ "$(sysconfig "HTTPSEnable")" -eq 1 ]; then + host="$(sysconfig "HTTPSProxy")" + port="$(sysconfig "HTTPSPort")" echo "export https_proxy=\"http://${host}:${port}\"" fi -if [ "$(sysconfig -n "FTPEnable")" -eq 1 ]; then - host="$(sysconfig -s "FTPProxy")" - port="$(sysconfig -n "FTPPort")" +if [ "$(sysconfig "FTPEnable")" -eq 1 ]; then + host="$(sysconfig "FTPProxy")" + port="$(sysconfig "FTPPort")" echo "export ftp_proxy=\"http://${host}:${port}\"" fi diff --git a/sysconfig.c b/sysconfig.c index d1028b2..be94662 100644 --- a/sysconfig.c +++ b/sysconfig.c @@ -5,69 +5,57 @@ const char* KEYFILE = "/System/Library/Frameworks/SystemConfiguration.framework/ 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 @@ -81,43 +69,57 @@ createCFString(const char* str) 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; } -- 2.39.2