1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
from ptrace.cpu_info import CPU_WORD_SIZE
from ptrace.ctypes_tools import ntoh_ushort, ntoh_uint # noqa
from ptrace.syscall import SYSCALL_PROTOTYPES
from ptrace.syscall.socketcall_constants import SOCKETCALL, SOCKET_FAMILY # noqa
from ptrace.syscall.socketcall_struct import sockaddr, sockaddr_in, sockaddr_in6, sockaddr_un
from ctypes import c_int
from ptrace.os_tools import RUNNING_LINUX
from socket import AF_INET, AF_INET6, inet_ntoa # noqa
if RUNNING_LINUX:
from socket import AF_NETLINK
from ptrace.syscall.socketcall_struct import sockaddr_nl
AF_FILE = 1
def formatOptVal(argument):
function = argument.function
optlen = function["optlen"].value
if optlen == 4:
addr = argument.value
text = function.process.readStruct(addr, c_int)
return argument.formatPointer("<%s>" % text, addr)
else:
return None
def formatSockaddr(argument, argtype):
address = argument.value
value = argument.function.process.readStruct(address, sockaddr)
family = value.family
if family == AF_INET:
return argument.readStruct(address, sockaddr_in)
if family == AF_INET6:
return argument.readStruct(address, sockaddr_in6)
if family == AF_FILE:
return argument.readStruct(address, sockaddr_un)
if RUNNING_LINUX:
if family == AF_NETLINK:
return argument.readStruct(address, sockaddr_nl)
family = SOCKET_FAMILY.get(family, family)
return argument.formatPointer("<sockaddr family=%s>" % family, address)
def setupSocketCall(function, process, socketcall, address):
# Reset function call
function.clearArguments()
# function.argument_class = SocketCallArgument
# Setup new function call
function.process = process
function.name = socketcall.getText()
# Create arguments
function.restype, formats = SYSCALL_PROTOTYPES[function.name]
for argtype, argname in formats:
value = process.readWord(address)
function.addArgument(value, argname, argtype)
address += CPU_WORD_SIZE
def formatSockaddrInStruct(argument, name, value):
if name == "sin_port":
return ntoh_ushort(value)
return None
def formatSockaddrIn6Struct(argument, name, value):
if name == "sin6_port":
return ntoh_ushort(value)
# if name == "sin6_addr":
# FIXME: ...
return None
|