| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- # ctypes version of win32icmp
- # so I don't have to recompile for future versions of python.
- # you're welcome.
- #
- # The contents of this file are subject to the Python Software Foundation
- # License Version 2.3 (the License). You may not copy or use this file, in
- # either source code or executable form, except in compliance with the License.
- # You may obtain a copy of the License at http://www.python.org/license.
- #
- # Software distributed under the License is distributed on an AS IS basis,
- # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- # for the specific language governing rights and limitations under the
- # License.
- #
- # by Greg Hazel
- import ctypes
- from BTL.iptypes import IPAddr, inet_addr
- icmp = ctypes.windll.icmp
- IcmpCreateFile = icmp.IcmpCreateFile
- IcmpCloseHandle = icmp.IcmpCloseHandle
- class IP_OPTION_INFORMATION(ctypes.Structure):
- _fields_ = [ ("Ttl", ctypes.c_ubyte),
- ("Tos", ctypes.c_ubyte),
- ("Flags", ctypes.c_ubyte),
- ("OptionsSize", ctypes.c_ubyte),
- ("OptionsData", ctypes.POINTER(ctypes.c_ubyte)),
- ]
- Options = IP_OPTION_INFORMATION
- class ICMP_ECHO_REPLY(ctypes.Structure):
- _fields_ = [ ("Address", IPAddr),
- ("Status", ctypes.c_ulong),
- ("RoundTripTime", ctypes.c_ulong),
- ("DataSize", ctypes.c_ushort),
- ("Reserved", ctypes.c_ushort),
- ("Data", ctypes.c_void_p),
- ("Options", IP_OPTION_INFORMATION),
- ]
- def IcmpSendEcho(handle, addr, data, options, timeout):
- reply = ICMP_ECHO_REPLY()
- data = data or ''
- if options:
- options = ctypes.byref(options)
- r = icmp.IcmpSendEcho(handle, inet_addr(addr),
- data, len(data),
- options,
- ctypes.byref(reply),
- ctypes.sizeof(ICMP_ECHO_REPLY) + len(data),
- timeout)
- return str(reply.Address), reply.Status, reply.RoundTripTime
- IP_STATUS_BASE = 11000
- IP_SUCCESS = 0
- IP_BUF_TOO_SMALL = (IP_STATUS_BASE + 1)
- IP_DEST_NET_UNREACHABLE = (IP_STATUS_BASE + 2)
- IP_DEST_HOST_UNREACHABLE = (IP_STATUS_BASE + 3)
- IP_DEST_PROT_UNREACHABLE = (IP_STATUS_BASE + 4)
- IP_DEST_PORT_UNREACHABLE = (IP_STATUS_BASE + 5)
- IP_NO_RESOURCES = (IP_STATUS_BASE + 6)
- IP_BAD_OPTION = (IP_STATUS_BASE + 7)
- IP_HW_ERROR = (IP_STATUS_BASE + 8)
- IP_PACKET_TOO_BIG = (IP_STATUS_BASE + 9)
- IP_REQ_TIMED_OUT = (IP_STATUS_BASE + 10)
- IP_BAD_REQ = (IP_STATUS_BASE + 11)
- IP_BAD_ROUTE = (IP_STATUS_BASE + 12)
- IP_TTL_EXPIRED_TRANSIT = (IP_STATUS_BASE + 13)
- IP_TTL_EXPIRED_REASSEM = (IP_STATUS_BASE + 14)
- IP_PARAM_PROBLEM = (IP_STATUS_BASE + 15)
- IP_SOURCE_QUENCH = (IP_STATUS_BASE + 16)
- IP_OPTION_TOO_BIG = (IP_STATUS_BASE + 17)
- IP_BAD_DESTINATION = (IP_STATUS_BASE + 18)
- status = {}
- for k, v in dict(globals()).iteritems():
- if k.startswith("IP_"):
- status[v] = k
|