def from_bytes(cls: t.Type[T], data: bytes) -> T: if len(data) < cls.sizeof(): raise Exception("data too small", data) struct = ffi.cast('struct sockaddr_in*', ffi.from_buffer(data)) cls.check_family(AF(struct.sin_family)) return cls(socket.ntohs(struct.sin_port), socket.ntohl(struct.sin_addr.s_addr))
def from_bytes(cls: t.Type[T], data: bytes) -> T: if len(data) < cls.sizeof(): raise Exception("data too small", data) struct = ffi.cast('struct sockaddr_in6*', ffi.from_buffer(data)) cls.check_family(AF(struct.sin6_family)) return cls(socket.ntohs(struct.sin6_port), ipaddress.IPv6Address(bytes(struct.sin6_addr.s6_addr)), struct.sin6_flowinfo, struct.sin6_scope_id)
def from_bytes(cls: t.Type[T], data: bytes) -> T: header = ffi.sizeof('sa_family_t') if len(data) < header: raise Exception("data too smalllll", data) struct = ffi.cast('struct sockaddr_un*', ffi.from_buffer(data)) cls.check_family(AF(struct.sun_family)) if len(data) == header: # unnamed socket, name is empty length = 0 elif struct.sun_path[0] == b'\0': # abstract socket, entire buffer is part of path length = len(data) - header else: # TODO handle the case where there's no null terminator # pathname socket, path is null-terminated length = lib.strlen(struct.sun_path) return cls(bytes(ffi.buffer(struct.sun_path, length)))
def from_bytes(cls: t.Type[T], data: bytes) -> T: if len(data) < cls.sizeof(): raise Exception("data too small", data) struct = ffi.cast('struct sockaddr_nl*', ffi.from_buffer(data)) cls.check_family(AF(struct.nl_family)) return cls(struct.nl_pid, struct.nl_groups)