def test_addr_raw_packet(): from pypy.module._socket.interp_socket import addr_as_object if not hasattr(rsocket._c, 'sockaddr_ll'): pytest.skip("posix specific test") # HACK: To get the correct interface number of lo, which in most cases is 1, # but can be anything (i.e. 39), we need to call the libc function # if_nametoindex to get the correct index import ctypes libc = ctypes.CDLL(ctypes.util.find_library('c')) ifnum = libc.if_nametoindex('lo') c_addr_ll = lltype.malloc(rsocket._c.sockaddr_ll, flavor='raw') addrlen = rffi.sizeof(rsocket._c.sockaddr_ll) c_addr = rffi.cast(lltype.Ptr(rsocket._c.sockaddr), c_addr_ll) rffi.setintfield(c_addr_ll, 'c_sll_ifindex', ifnum) rffi.setintfield(c_addr_ll, 'c_sll_protocol', 8) rffi.setintfield(c_addr_ll, 'c_sll_pkttype', 13) rffi.setintfield(c_addr_ll, 'c_sll_hatype', 0) rffi.setintfield(c_addr_ll, 'c_sll_halen', 3) c_addr_ll.c_sll_addr[0] = 'a' c_addr_ll.c_sll_addr[1] = 'b' c_addr_ll.c_sll_addr[2] = 'c' rffi.setintfield(c_addr, 'c_sa_family', socket.AF_PACKET) # fd needs to be somehow valid s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) fd = s.fileno() w_obj = addr_as_object(rsocket.make_address(c_addr, addrlen), fd, space) lltype.free(c_addr_ll, flavor='raw') assert space.is_true(space.eq(w_obj, space.newtuple([ space.wrap('lo'), space.wrap(socket.ntohs(8)), space.wrap(13), space.wrap(False), space.wrap("abc"), ])))
def test_addr_raw_packet(): from pypy.module._socket.interp_socket import addr_as_object if not hasattr(rsocket._c, 'sockaddr_ll'): py.test.skip("posix specific test") # HACK: To get the correct interface numer of lo, which in most cases is 1, # but can be anything (i.e. 39), we need to call the libc function # if_nametoindex to get the correct index import ctypes libc = ctypes.CDLL(ctypes.util.find_library('c')) ifnum = libc.if_nametoindex('lo') c_addr_ll = lltype.malloc(rsocket._c.sockaddr_ll, flavor='raw') addrlen = rffi.sizeof(rsocket._c.sockaddr_ll) c_addr = rffi.cast(lltype.Ptr(rsocket._c.sockaddr), c_addr_ll) rffi.setintfield(c_addr_ll, 'c_sll_ifindex', ifnum) rffi.setintfield(c_addr_ll, 'c_sll_protocol', 8) rffi.setintfield(c_addr_ll, 'c_sll_pkttype', 13) rffi.setintfield(c_addr_ll, 'c_sll_hatype', 0) rffi.setintfield(c_addr_ll, 'c_sll_halen', 3) c_addr_ll.c_sll_addr[0] = 'a' c_addr_ll.c_sll_addr[1] = 'b' c_addr_ll.c_sll_addr[2] = 'c' rffi.setintfield(c_addr, 'c_sa_family', socket.AF_PACKET) # fd needs to be somehow valid s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) fd = s.fileno() w_obj = addr_as_object(rsocket.make_address(c_addr, addrlen), fd, space) lltype.free(c_addr_ll, flavor='raw') assert space.is_true(space.eq(w_obj, space.newtuple([ space.wrap('lo'), space.wrap(socket.ntohs(8)), space.wrap(13), space.wrap(False), space.wrap("abc"), ])))
def test_unknown_addr_as_object(): from pypy.module._socket.interp_socket import addr_as_object c_addr = lltype.malloc(rsocket._c.sockaddr, flavor='raw', track_allocation=False) c_addr.c_sa_data[0] = 'c' rffi.setintfield(c_addr, 'c_sa_family', 15) # XXX what size to pass here? for the purpose of this test it has # to be short enough so we have some data, 1 sounds good enough # + sizeof USHORT w_obj = addr_as_object(rsocket.Address(c_addr, 1 + 2), -1, space) assert space.isinstance_w(w_obj, space.w_tuple) assert space.int_w(space.getitem(w_obj, space.wrap(0))) == 15 assert space.str_w(space.getitem(w_obj, space.wrap(1))) == 'c'
def test_unknown_addr_as_object(): from pypy.module._socket.interp_socket import addr_as_object c_addr = lltype.malloc(rsocket._c.sockaddr, flavor='raw', track_allocation=False) c_addr.c_sa_data[0] = 'c' rffi.setintfield(c_addr, 'c_sa_family', 15) # XXX what size to pass here? for the purpose of this test it has # to be short enough so we have some data, 1 sounds good enough # + sizeof USHORT w_obj = addr_as_object(rsocket.Address(c_addr, 1 + 2), -1, space) assert space.isinstance_w(w_obj, space.w_tuple) assert space.int_w(space.getitem(w_obj, space.wrap(0))) == 15 assert space.str_w(space.getitem(w_obj, space.wrap(1))) == 'c'
def getaddrinfo(space, w_host, w_port, family=rsocket.AF_UNSPEC, type=0, proto=0, flags=0): """getaddrinfo(host, port [, family, type, proto, flags]) -> list of (family, type, proto, canonname, sockaddr) Resolve host and port into addrinfo struct. """ socktype = type # host can be None, string or unicode if space.is_w(w_host, space.w_None): host = None elif space.isinstance_w(w_host, space.w_bytes): host = space.bytes_w(w_host) elif space.isinstance_w(w_host, space.w_unicode): host = encode_idna(space, w_host) else: raise oefmt(space.w_TypeError, "getaddrinfo() argument 1 must be string or None") # port can be None, int or string if space.is_w(w_port, space.w_None): port = None elif space.isinstance_w(w_port, space.w_int): port = str(space.int_w(w_port)) elif space.isinstance_w(w_port, space.w_bytes): port = space.bytes_w(w_port) elif space.isinstance_w(w_port, space.w_unicode): port = space.bytes_w( space.encode_unicode_object(w_port, 'utf-8', 'strict')) else: raise oefmt(space.w_TypeError, "getaddrinfo() argument 2 must be integer or string") try: lst = rsocket.getaddrinfo(host, port, family, socktype, proto, flags) except SocketError as e: raise converted_error(space, e) lst1 = [ space.newtuple([ space.newint(family), space.newint(socktype), space.newint(protocol), space.newtext(canonname), addr_as_object(addr, INVALID_SOCKET, space) ]) # -1 as per cpython for (family, socktype, protocol, canonname, addr) in lst ] return space.newlist(lst1)
def getaddrinfo(space, w_host, w_port, family=rsocket.AF_UNSPEC, socktype=0, proto=0, flags=0): """getaddrinfo(host, port [, family, socktype, proto, flags]) -> list of (family, socktype, proto, canonname, sockaddr) Resolve host and port into addrinfo struct. """ # host can be None, string or unicode if space.is_w(w_host, space.w_None): host = None elif space.isinstance_w(w_host, space.w_str): host = space.bytes_w(w_host) elif space.isinstance_w(w_host, space.w_unicode): w_shost = space.call_method(w_host, "encode", space.wrap("idna")) host = space.bytes_w(w_shost) else: raise oefmt(space.w_TypeError, "getaddrinfo() argument 1 must be string or None") # port can be None, int or string if space.is_w(w_port, space.w_None): port = None elif space.isinstance_w(w_port, space.w_int) or space.isinstance_w(w_port, space.w_long): port = str(space.int_w(w_port)) elif space.isinstance_w(w_port, space.w_str): port = space.bytes_w(w_port) else: raise oefmt(space.w_TypeError, "getaddrinfo() argument 2 must be integer or string") try: lst = rsocket.getaddrinfo(host, port, family, socktype, proto, flags) except SocketError as e: raise converted_error(space, e) lst1 = [space.newtuple([space.wrap(family), space.wrap(socktype), space.wrap(protocol), space.wrap(canonname), addr_as_object(addr, INVALID_SOCKET, space)]) # -1 as per cpython for (family, socktype, protocol, canonname, addr) in lst] return space.newlist(lst1)
elif space.isinstance_w(w_port, space.w_str): port = space.str_w(w_port) else: raise OperationError(space.w_TypeError, space.wrap( "getaddrinfo() argument 2 must be integer or string")) try: lst = rsocket.getaddrinfo(host, port, family, socktype, proto, flags) except SocketError, e: raise converted_error(space, e) lst1 = [space.newtuple([space.wrap(family), space.wrap(socktype), space.wrap(protocol), space.wrap(canonname), addr_as_object(addr, INVALID_SOCKET, space)]) # -1 as per cpython for (family, socktype, protocol, canonname, addr) in lst] return space.newlist(lst1) def getdefaulttimeout(space): """getdefaulttimeout() -> timeout Returns the default timeout in floating seconds for new socket objects. A value of None indicates that new socket objects have no timeout. When the socket module is first imported, the default is None. """ timeout = rsocket.getdefaulttimeout() if timeout < 0.0: return space.w_None return space.wrap(timeout)
elif space.isinstance_w(w_port, space.w_str): port = space.str_w(w_port) else: raise OperationError(space.w_TypeError, space.wrap( "getaddrinfo() argument 2 must be integer or string")) try: lst = rsocket.getaddrinfo(host, port, family, socktype, proto, flags) except SocketError, e: raise converted_error(space, e) lst1 = [space.newtuple([space.wrap(family), space.wrap(socktype), space.wrap(protocol), space.wrap(canonname), addr_as_object(addr, INVALID_SOCKET, space)]) # -1 as per cpython for (family, socktype, protocol, canonname, addr) in lst] return space.newlist(lst1) def getdefaulttimeout(space): """getdefaulttimeout() -> timeout Returns the default timeout in floating seconds for new socket objects. A value of None indicates that new socket objects have no timeout. When the socket module is first imported, the default is None. """ timeout = rsocket.getdefaulttimeout() if timeout < 0.0: return space.w_None return space.wrap(timeout)
elif space.isinstance_w(w_port, space.w_str): port = space.str_w(w_port) else: raise OperationError(space.w_TypeError, space.wrap("getaddrinfo() argument 2 must be integer or string")) try: lst = rsocket.getaddrinfo(host, port, family, socktype, proto, flags) except SocketError, e: raise converted_error(space, e) lst1 = [ space.newtuple( [ space.wrap(family), space.wrap(socktype), space.wrap(protocol), space.wrap(canonname), addr_as_object(addr, INVALID_SOCKET, space), ] ) # -1 as per cpython for (family, socktype, protocol, canonname, addr) in lst ] return space.newlist(lst1) def getdefaulttimeout(space): """getdefaulttimeout() -> timeout Returns the default timeout in floating seconds for new socket objects. A value of None indicates that new socket objects have no timeout. When the socket module is first imported, the default is None. """ timeout = rsocket.getdefaulttimeout()
port = space.str_w(w_port) else: raise OperationError( space.w_TypeError, space.wrap("getaddrinfo() argument 2 must be integer or string")) try: lst = rsocket.getaddrinfo(host, port, family, socktype, proto, flags) except SocketError, e: raise converted_error(space, e) lst1 = [ space.newtuple([ space.wrap(family), space.wrap(socktype), space.wrap(protocol), space.wrap(canonname), addr_as_object(addr, INVALID_SOCKET, space) ]) # -1 as per cpython for (family, socktype, protocol, canonname, addr) in lst ] return space.newlist(lst1) def getdefaulttimeout(space): """getdefaulttimeout() -> timeout Returns the default timeout in floating seconds for new socket objects. A value of None indicates that new socket objects have no timeout. When the socket module is first imported, the default is None. """ timeout = rsocket.getdefaulttimeout() if timeout < 0.0: