From 099646f29a7521318fd8a9753ee4522769488122 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sun, 18 May 2008 20:09:54 +0000 Subject: MacOSX: ctypes annotation in implementation of getproxies_macosx_sysconf 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 | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/Lib/urllib.py b/Lib/urllib.py index f84ac28..bf5fc97 100644 --- a/Lib/urllib.py +++ b/Lib/urllib.py @@ -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) -- cgit v0.12