]> code.delx.au - osx-proxyconf/blob - sysconfig.c
Added hgignore
[osx-proxyconf] / sysconfig.c
1 #include <CoreFoundation/CoreFoundation.h>
2 #include <SystemConfiguration/SCDynamicStoreCopySpecific.h>
3
4 const char* KEYFILE = "/System/Library/Frameworks/SystemConfiguration.framework/Headers/SCSchemaDefinitions.h";
5
6 Boolean
7 printCFTypeRef(CFTypeRef value);
8
9
10 Boolean
11 getDictValue(CFTypeRef* value, CFStringRef key)
12 {
13 assert(value != NULL);
14 assert(key != NULL);
15
16 Boolean result;
17 CFDictionaryRef dictRef;
18 dictRef = SCDynamicStoreCopyProxies((SCDynamicStoreRef)NULL);
19 result = (dictRef != NULL);
20 if(result) {
21 *value = (CFNumberRef)CFDictionaryGetValue(dictRef, key);
22 }
23 if(*value != NULL) {
24 CFRetain(*value);
25 }
26
27 if(dictRef != NULL) {
28 CFRelease(dictRef);
29 }
30 if(!result) {
31 *value = NULL;
32 }
33 return result;
34 }
35
36 Boolean
37 printNumber(CFNumberRef numberRef)
38 {
39 assert(numberRef != NULL);
40
41 int numberVal = 0;
42 if(CFNumberGetValue(numberRef, kCFNumberIntType, &numberVal)) {
43 printf("%d\n", numberVal);
44 return TRUE;
45 }
46 return FALSE;
47 }
48
49 Boolean
50 printString(CFStringRef strRef)
51 {
52 assert(strRef != NULL);
53
54 char strVal[1024];
55 if(CFStringGetCString(strRef, strVal, (CFIndex)1024,
56 kCFStringEncodingASCII))
57 {
58 printf("%s\n", strVal);
59 return TRUE;
60 }
61 return FALSE;
62 }
63
64 Boolean
65 printArray(CFArrayRef arrayRef)
66 {
67 assert(arrayRef != NULL);
68
69 int length = CFArrayGetCount(arrayRef);
70 for(int i = 0; i < length; ++i) {
71 if(!printCFTypeRef(CFArrayGetValueAtIndex(arrayRef, i))) {
72 return FALSE;
73 }
74 }
75
76 return TRUE;
77 }
78
79 Boolean
80 printCFTypeRef(CFTypeRef value)
81 {
82 if(value == NULL) {
83 return FALSE;
84 }
85 else if(CFStringGetTypeID() == CFGetTypeID(value)) {
86 return printString((CFStringRef)value);
87 }
88 else if(CFNumberGetTypeID() == CFGetTypeID(value)) {
89 return printNumber((CFNumberRef)value);
90 }
91 else if(CFArrayGetTypeID() == CFGetTypeID(value)) {
92 return printArray((CFArrayRef)value);
93 }
94 else {
95 return FALSE;
96 }
97 }
98
99 CFStringRef
100 createCFString(const char* str)
101 {
102 return CFStringCreateWithCStringNoCopy(NULL, str,
103 kCFStringEncodingASCII,
104 kCFAllocatorNull);
105 }
106
107 void
108 usage(const char* program)
109 {
110 fprintf(stderr, "Usage: %s [-q] key\n", program);
111 fprintf(stderr, "Look in %s for keys. Eg, HTTPProxy\n\n", KEYFILE);
112 }
113
114 int
115 main(int argc, char** argv)
116 {
117 int quiet = 0;
118 const char* key;
119 if(argc == 2) {
120 key = argv[1];
121 } else if(argc == 3 && strcmp("-q", argv[1]) == 0) {
122 quiet = 1;
123 key = argv[2];
124 } else {
125 usage(argv[0]);
126 return 1;
127 }
128
129
130 CFStringRef keyRef = createCFString(key);
131 if(keyRef == NULL) {
132 fprintf(stderr, "Fatal error: Couldn't create CFStringRef from arg2\n");
133 return 1;
134 }
135
136 CFTypeRef valueRef = NULL;
137 if(!getDictValue(&valueRef, keyRef)) {
138 fprintf(stderr, "Fatal error: Error accessing dictionary\n");
139 return 1;
140 }
141
142 if(valueRef == NULL) {
143 if(!quiet) {
144 fprintf(stderr, "No value for that key\n");
145 }
146 return 0;
147 }
148 if(!printCFTypeRef(valueRef)) {
149 fprintf(stderr, "Fatal error: Unsupported value type in dictionary\n");
150 CFRelease(valueRef);
151 return 1;
152 }
153
154 CFRelease(valueRef);
155 return 0;
156 }
157