]> granicus.if.org Git - python/commitdiff
MacOSX: ctypes annotation in implementation of getproxies_macosx_sysconf
authorRonald Oussoren <ronaldoussoren@mac.com>
Sun, 18 May 2008 20:09:54 +0000 (20:09 +0000)
committerRonald Oussoren <ronaldoussoren@mac.com>
Sun, 18 May 2008 20:09:54 +0000 (20:09 +0000)
getproxies_macosx_sysconf uses ctypes to call SystemConfiguration APIs. This
checkin adds ctypes annotation to specify the right argument types for the
API's that are used.

This is needed to be able to use urllib on a 64-bit system, without
annotations you'd get a hard crash.

Lib/urllib.py

index f84ac282223bf700f1f16c1c37501aa7d9a91756..bf5fc972a45f0493322599bee7b82f627f75c4d5 100644 (file)
@@ -1321,6 +1321,24 @@ def proxy_bypass_environment(host):
 
 
 if sys.platform == 'darwin':
+
+    def _CFSetup(sc):
+        from ctypes import c_int32, c_void_p, c_char_p, c_int
+        sc.CFStringCreateWithCString.argtypes = [ c_void_p, c_char_p, c_int32 ]
+        sc.CFStringCreateWithCString.restype = c_void_p
+        sc.SCDynamicStoreCopyProxies.argtypes = [ c_void_p ]
+        sc.SCDynamicStoreCopyProxies.restype = c_void_p
+        sc.CFDictionaryGetValue.argtypes = [ c_void_p, c_void_p ]
+        sc.CFDictionaryGetValue.restype = c_void_p
+        sc.CFStringGetLength.argtypes = [ c_void_p ]
+        sc.CFStringGetLength.restype = c_int32
+        sc.CFStringGetCString.argtypes = [ c_void_p, c_char_p, c_int32, c_int32 ]
+        sc.CFStringGetCString.restype = c_int32
+        sc.CFNumberGetValue.argtypes = [ c_void_p, c_int, c_void_p ]
+        sc.CFNumberGetValue.restype = c_int32
+        sc.CFRelease.argtypes = [ c_void_p ]
+        sc.CFRelease.restype = None
+
     def _CStringFromCFString(sc, value):
         from ctypes import create_string_buffer
         length = sc.CFStringGetLength(value) + 1
@@ -1357,6 +1375,7 @@ if sys.platform == 'darwin':
             return (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3]
 
         sc = cdll.LoadLibrary(find_library("SystemConfiguration"))
+        _CFSetup(sc)
 
         hostIP = None
 
@@ -1369,6 +1388,8 @@ if sys.platform == 'darwin':
 
 
         proxyDict = sc.SCDynamicStoreCopyProxies(None)
+        if proxyDict is None:
+            return False
 
         try:
             # Check for simple host names:
@@ -1422,11 +1443,11 @@ if sys.platform == 'darwin':
         from ctypes.util import find_library
 
         sc = cdll.LoadLibrary(find_library("SystemConfiguration"))
+        _CFSetup(sc)
 
         if not sc:
             return {}
 
-
         kSCPropNetProxiesHTTPEnable = sc.CFStringCreateWithCString(0, "HTTPEnable", 0)
         kSCPropNetProxiesHTTPProxy = sc.CFStringCreateWithCString(0, "HTTPProxy", 0)
         kSCPropNetProxiesHTTPPort = sc.CFStringCreateWithCString(0, "HTTPPort", 0)