Path: blob/master/thirdparty/wininetpton/win_inet_pton.py
2992 views
#!/usr/bin/env python1# This software released into the public domain. Anyone is free to copy,2# modify, publish, use, compile, sell, or distribute this software,3# either in source code form or as a compiled binary, for any purpose,4# commercial or non-commercial, and by any means.56import socket7import ctypes8import os91011class sockaddr(ctypes.Structure):12_fields_ = [("sa_family", ctypes.c_short),13("__pad1", ctypes.c_ushort),14("ipv4_addr", ctypes.c_byte * 4),15("ipv6_addr", ctypes.c_byte * 16),16("__pad2", ctypes.c_ulong)]1718if hasattr(ctypes, 'windll'):19WSAStringToAddressA = ctypes.windll.ws2_32.WSAStringToAddressA20WSAAddressToStringA = ctypes.windll.ws2_32.WSAAddressToStringA21else:22def not_windows():23raise SystemError(24"Invalid platform. ctypes.windll must be available."25)26WSAStringToAddressA = not_windows27WSAAddressToStringA = not_windows282930def inet_pton(address_family, ip_string):31addr = sockaddr()32addr.sa_family = address_family33addr_size = ctypes.c_int(ctypes.sizeof(addr))3435if WSAStringToAddressA(36ip_string,37address_family,38None,39ctypes.byref(addr),40ctypes.byref(addr_size)41) != 0:42raise socket.error(ctypes.FormatError())4344if address_family == socket.AF_INET:45return ctypes.string_at(addr.ipv4_addr, 4)46if address_family == socket.AF_INET6:47return ctypes.string_at(addr.ipv6_addr, 16)4849raise socket.error('unknown address family')505152def inet_ntop(address_family, packed_ip):53addr = sockaddr()54addr.sa_family = address_family55addr_size = ctypes.c_int(ctypes.sizeof(addr))56ip_string = ctypes.create_string_buffer(128)57ip_string_size = ctypes.c_int(ctypes.sizeof(ip_string))5859if address_family == socket.AF_INET:60if len(packed_ip) != ctypes.sizeof(addr.ipv4_addr):61raise socket.error('packed IP wrong length for inet_ntoa')62ctypes.memmove(addr.ipv4_addr, packed_ip, 4)63elif address_family == socket.AF_INET6:64if len(packed_ip) != ctypes.sizeof(addr.ipv6_addr):65raise socket.error('packed IP wrong length for inet_ntoa')66ctypes.memmove(addr.ipv6_addr, packed_ip, 16)67else:68raise socket.error('unknown address family')6970if WSAAddressToStringA(71ctypes.byref(addr),72addr_size,73None,74ip_string,75ctypes.byref(ip_string_size)76) != 0:77raise socket.error(ctypes.FormatError())7879return ip_string[:ip_string_size.value - 1]8081# Adding our two functions to the socket library82if os.name == 'nt':83socket.inet_pton = inet_pton84socket.inet_ntop = inet_ntop858687