xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/asyncio/trsock.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Workerimport socket
2*cda5da8dSAndroid Build Coastguard Worker
3*cda5da8dSAndroid Build Coastguard Worker
4*cda5da8dSAndroid Build Coastguard Workerclass TransportSocket:
5*cda5da8dSAndroid Build Coastguard Worker
6*cda5da8dSAndroid Build Coastguard Worker    """A socket-like wrapper for exposing real transport sockets.
7*cda5da8dSAndroid Build Coastguard Worker
8*cda5da8dSAndroid Build Coastguard Worker    These objects can be safely returned by APIs like
9*cda5da8dSAndroid Build Coastguard Worker    `transport.get_extra_info('socket')`.  All potentially disruptive
10*cda5da8dSAndroid Build Coastguard Worker    operations (like "socket.close()") are banned.
11*cda5da8dSAndroid Build Coastguard Worker    """
12*cda5da8dSAndroid Build Coastguard Worker
13*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ('_sock',)
14*cda5da8dSAndroid Build Coastguard Worker
15*cda5da8dSAndroid Build Coastguard Worker    def __init__(self, sock: socket.socket):
16*cda5da8dSAndroid Build Coastguard Worker        self._sock = sock
17*cda5da8dSAndroid Build Coastguard Worker
18*cda5da8dSAndroid Build Coastguard Worker    @property
19*cda5da8dSAndroid Build Coastguard Worker    def family(self):
20*cda5da8dSAndroid Build Coastguard Worker        return self._sock.family
21*cda5da8dSAndroid Build Coastguard Worker
22*cda5da8dSAndroid Build Coastguard Worker    @property
23*cda5da8dSAndroid Build Coastguard Worker    def type(self):
24*cda5da8dSAndroid Build Coastguard Worker        return self._sock.type
25*cda5da8dSAndroid Build Coastguard Worker
26*cda5da8dSAndroid Build Coastguard Worker    @property
27*cda5da8dSAndroid Build Coastguard Worker    def proto(self):
28*cda5da8dSAndroid Build Coastguard Worker        return self._sock.proto
29*cda5da8dSAndroid Build Coastguard Worker
30*cda5da8dSAndroid Build Coastguard Worker    def __repr__(self):
31*cda5da8dSAndroid Build Coastguard Worker        s = (
32*cda5da8dSAndroid Build Coastguard Worker            f"<asyncio.TransportSocket fd={self.fileno()}, "
33*cda5da8dSAndroid Build Coastguard Worker            f"family={self.family!s}, type={self.type!s}, "
34*cda5da8dSAndroid Build Coastguard Worker            f"proto={self.proto}"
35*cda5da8dSAndroid Build Coastguard Worker        )
36*cda5da8dSAndroid Build Coastguard Worker
37*cda5da8dSAndroid Build Coastguard Worker        if self.fileno() != -1:
38*cda5da8dSAndroid Build Coastguard Worker            try:
39*cda5da8dSAndroid Build Coastguard Worker                laddr = self.getsockname()
40*cda5da8dSAndroid Build Coastguard Worker                if laddr:
41*cda5da8dSAndroid Build Coastguard Worker                    s = f"{s}, laddr={laddr}"
42*cda5da8dSAndroid Build Coastguard Worker            except socket.error:
43*cda5da8dSAndroid Build Coastguard Worker                pass
44*cda5da8dSAndroid Build Coastguard Worker            try:
45*cda5da8dSAndroid Build Coastguard Worker                raddr = self.getpeername()
46*cda5da8dSAndroid Build Coastguard Worker                if raddr:
47*cda5da8dSAndroid Build Coastguard Worker                    s = f"{s}, raddr={raddr}"
48*cda5da8dSAndroid Build Coastguard Worker            except socket.error:
49*cda5da8dSAndroid Build Coastguard Worker                pass
50*cda5da8dSAndroid Build Coastguard Worker
51*cda5da8dSAndroid Build Coastguard Worker        return f"{s}>"
52*cda5da8dSAndroid Build Coastguard Worker
53*cda5da8dSAndroid Build Coastguard Worker    def __getstate__(self):
54*cda5da8dSAndroid Build Coastguard Worker        raise TypeError("Cannot serialize asyncio.TransportSocket object")
55*cda5da8dSAndroid Build Coastguard Worker
56*cda5da8dSAndroid Build Coastguard Worker    def fileno(self):
57*cda5da8dSAndroid Build Coastguard Worker        return self._sock.fileno()
58*cda5da8dSAndroid Build Coastguard Worker
59*cda5da8dSAndroid Build Coastguard Worker    def dup(self):
60*cda5da8dSAndroid Build Coastguard Worker        return self._sock.dup()
61*cda5da8dSAndroid Build Coastguard Worker
62*cda5da8dSAndroid Build Coastguard Worker    def get_inheritable(self):
63*cda5da8dSAndroid Build Coastguard Worker        return self._sock.get_inheritable()
64*cda5da8dSAndroid Build Coastguard Worker
65*cda5da8dSAndroid Build Coastguard Worker    def shutdown(self, how):
66*cda5da8dSAndroid Build Coastguard Worker        # asyncio doesn't currently provide a high-level transport API
67*cda5da8dSAndroid Build Coastguard Worker        # to shutdown the connection.
68*cda5da8dSAndroid Build Coastguard Worker        self._sock.shutdown(how)
69*cda5da8dSAndroid Build Coastguard Worker
70*cda5da8dSAndroid Build Coastguard Worker    def getsockopt(self, *args, **kwargs):
71*cda5da8dSAndroid Build Coastguard Worker        return self._sock.getsockopt(*args, **kwargs)
72*cda5da8dSAndroid Build Coastguard Worker
73*cda5da8dSAndroid Build Coastguard Worker    def setsockopt(self, *args, **kwargs):
74*cda5da8dSAndroid Build Coastguard Worker        self._sock.setsockopt(*args, **kwargs)
75*cda5da8dSAndroid Build Coastguard Worker
76*cda5da8dSAndroid Build Coastguard Worker    def getpeername(self):
77*cda5da8dSAndroid Build Coastguard Worker        return self._sock.getpeername()
78*cda5da8dSAndroid Build Coastguard Worker
79*cda5da8dSAndroid Build Coastguard Worker    def getsockname(self):
80*cda5da8dSAndroid Build Coastguard Worker        return self._sock.getsockname()
81*cda5da8dSAndroid Build Coastguard Worker
82*cda5da8dSAndroid Build Coastguard Worker    def getsockbyname(self):
83*cda5da8dSAndroid Build Coastguard Worker        return self._sock.getsockbyname()
84*cda5da8dSAndroid Build Coastguard Worker
85*cda5da8dSAndroid Build Coastguard Worker    def settimeout(self, value):
86*cda5da8dSAndroid Build Coastguard Worker        if value == 0:
87*cda5da8dSAndroid Build Coastguard Worker            return
88*cda5da8dSAndroid Build Coastguard Worker        raise ValueError(
89*cda5da8dSAndroid Build Coastguard Worker            'settimeout(): only 0 timeout is allowed on transport sockets')
90*cda5da8dSAndroid Build Coastguard Worker
91*cda5da8dSAndroid Build Coastguard Worker    def gettimeout(self):
92*cda5da8dSAndroid Build Coastguard Worker        return 0
93*cda5da8dSAndroid Build Coastguard Worker
94*cda5da8dSAndroid Build Coastguard Worker    def setblocking(self, flag):
95*cda5da8dSAndroid Build Coastguard Worker        if not flag:
96*cda5da8dSAndroid Build Coastguard Worker            return
97*cda5da8dSAndroid Build Coastguard Worker        raise ValueError(
98*cda5da8dSAndroid Build Coastguard Worker            'setblocking(): transport sockets cannot be blocking')
99