1
+ # Copyright 2016 Google Inc. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from '__go__/net' import (
16
+ IPv4 as _IPv4 , IP as _IP , LookupAddr as _LookupAddr , LookupIP as
17
+ _LookupIP , ParseIP as _ParseIP )
18
+ from '__go__/syscall' import (
19
+ AF_INET ,
20
+ AF_INET6 ,
21
+ AF_UNIX ,
22
+ SHUT_RD ,
23
+ SHUT_RDWR ,
24
+ SHUT_WR ,
25
+ SO_REUSEADDR ,
26
+ SOL_SOCKET ,
27
+ SOCK_DGRAM ,
28
+ SOCK_RAW ,
29
+ SOCK_SEQPACKET ,
30
+ SOCK_STREAM ,
31
+ Accept as _Accept ,
32
+ Bind as _Bind ,
33
+ Close as _Close ,
34
+ Connect as _Connect ,
35
+ Getpeername as _Getpeername ,
36
+ Getsockname as _Getsockname ,
37
+ Listen as _Listen ,
38
+ Recvfrom as _Recvfrom ,
39
+ Sendto as _Sendto ,
40
+ SetNonblock as _SetNonblock ,
41
+ SetsockoptInt as _SetsockoptInt ,
42
+ SetsockoptTimeval as _SetsockoptTimeval ,
43
+ Shutdown as _Shutdown ,
44
+ SockaddrInet4 as _SockaddrInet4 ,
45
+ SockaddrInet6 as _SockaddrInet6 ,
46
+ SockaddrUnix as _SockaddrUnix ,
47
+ Socket as _Socket ,
48
+ Timespec as _Timespec )
49
+ import math
50
+
51
+
52
+ #TIPC_*
53
+ #has_ipv6 # boolean value indicating if IPv6 is supported
54
+ # UNIX
55
+ #SO_*
56
+ #SOMAXCONN
57
+ #MSG_*
58
+ #SOL_*
59
+ #IPPROTO_*
60
+ #IPPORT_*
61
+ #INADDR_*
62
+ #IP_*
63
+ #IPV6_*
64
+ #EAI_*
65
+ #AI_*
66
+ #NI_*
67
+ #TCP_*
68
+ # Windows
69
+ #SIO_*
70
+ #RCVALL_*
71
+
72
+ #SHUT_RD
73
+ #SHUT_WR
74
+ #SHUT_RDWR
75
+
76
+
77
+ class error (IOError ):
78
+ pass
79
+
80
+
81
+ class gaierror (error ):
82
+ pass
83
+
84
+
85
+ class herror (error ):
86
+ pass
87
+
88
+
89
+ class timeout (error ):
90
+ pass
91
+
92
+
93
+ class socket (object ):
94
+
95
+ def __init__ (self , family = AF_INET , type = SOCK_STREAM , proto = 0 , fd = None ):
96
+ if fd is None :
97
+ fd , err = _Socket (family , type , proto )
98
+ if err :
99
+ raise error (err .Error ())
100
+ self ._fd = fd
101
+ self .family = family
102
+ self .type = type
103
+ self .proto = proto
104
+
105
+ def accept (self ):
106
+ fd , sockaddr , err = _Accept (self ._fd )
107
+ if err :
108
+ raise error (err .Error ())
109
+ return (socket (self .family , self .type , self .proto , fd ),
110
+ self ._get_address (sockaddr ))
111
+
112
+ def bind (self , address ):
113
+ sockaddr = self ._parse_address (address )
114
+ err = _Bind (self ._fd , sockaddr )
115
+ if err :
116
+ raise error (err .Error ())
117
+
118
+ def close (self ):
119
+ _Close (self ._fd )
120
+
121
+ def connect (self , address ):
122
+ self .connect_ex (address )
123
+
124
+ def connect_ex (self , address ):
125
+ addr = self ._parse_address (address )
126
+ err = _Connect (self ._fd , addr )
127
+ if err :
128
+ raise error (err )
129
+
130
+ def fileno (self ):
131
+ return self ._fd
132
+
133
+ def listen (self , backlog ):
134
+ err = _Listen (self ._fd , backlog )
135
+ if err :
136
+ raise error (err .Error ())
137
+
138
+ def getpeername (self ):
139
+ sockaddr , err = _Getpeername (self ._fd )
140
+ if err :
141
+ raise error (err .Error ())
142
+ return self ._get_address (sockaddr )
143
+
144
+ def getsockname (self ):
145
+ sockaddr , err = _Getsockname (self ._fd )
146
+ if err :
147
+ raise error (err .Error ())
148
+ return self ._get_address (sockaddr )
149
+
150
+ def getsockopt (self , level , optname , buflen = None ):
151
+ val , err = _GetsockoptInt (self ._fd , level , optname )
152
+ if err :
153
+ raise error (err )
154
+ return val
155
+
156
+ def recv (self , bufsize , flags = 0 ):
157
+ data , _ = self .recvfrom (bufsize , flags )
158
+ return data
159
+
160
+ def recv_into (self , buffer , nbytes = 0 , flags = 0 ):
161
+ n , _ = self .recvfrom_into (buffer , nbytes , flags )
162
+ return n
163
+
164
+ def recvfrom (self , bufsize , flags = 0 ):
165
+ buffer = bytearray (bufsize )
166
+ n , addr = self .recvfrom_into (buffer , bufsize , flags )
167
+ return str (buffer [:n ]), addr
168
+
169
+ def recvfrom_into (self , buffer , nbytes = 0 , flags = 0 ):
170
+ n , _ , err = _Recvfrom (self ._fd , buffer , flags )
171
+ if err :
172
+ raise error (err .Error ())
173
+ return n , None
174
+
175
+ def setsockopt (self , level , optname , value ):
176
+ err = _SetsockoptInt (self ._fd , level , optname , value )
177
+ if err :
178
+ raise error (err .Error ())
179
+
180
+ def send (self , string , flags = 0 ):
181
+ sockaddr , err = _Getsockname (self ._fd )
182
+ if err :
183
+ raise error (err )
184
+ err = _Sendto (self ._fd , string , flags , sockaddr )
185
+ if err :
186
+ raise error (err )
187
+ return len (string )
188
+
189
+ def sendto (self , string , flags_or_address , address = None ):
190
+ raise NotImplementedError
191
+
192
+ def sendall (self , string , flags = 0 ):
193
+ return self .send (string , flags )
194
+
195
+ def setblocking (self , flag ):
196
+ err = _SetNonblock (fd , int (not flag ))
197
+ if err :
198
+ raise error (err .Error ())
199
+
200
+ def settimeout (self , value ):
201
+ if value is None :
202
+ timevalue = None
203
+ else :
204
+ timeval = _Timeval .new ()
205
+ frac , integer = math .modf (value )
206
+ timeval .Sec = int (integer )
207
+ timeval .Usec = int (frac * 1000000.0 )
208
+ err = _SetsockoptTimeval (self ._fd , level , SO_RCVTIMEO , timeval )
209
+ if err :
210
+ raise error (err )
211
+
212
+ def gettimeout (self ):
213
+ raise NotImplementedError
214
+
215
+ def shutdown (self , how ):
216
+ err = _Shutdown (self ._fd , how )
217
+ if err :
218
+ raise error (err )
219
+
220
+ def _parse_address (self , address ):
221
+ if self .family == AF_UNIX :
222
+ sockaddr = _SockaddrUnix .new ()
223
+ sockaddr .Name , = address
224
+ return sockaddr
225
+ host , port = address
226
+ if not host :
227
+ host = '127.0.0.1'
228
+ ip = _ParseIP (host )
229
+ if ip :
230
+ ips = [ip ]
231
+ else :
232
+ ips , err = _LookupIP (host )
233
+ if err :
234
+ raise error (err .Error ())
235
+ if self .family == AF_INET :
236
+ convert = _IP .To4
237
+ else :
238
+ convert = _IP .To6
239
+ for ip in ips :
240
+ ip = convert (ip )
241
+ if ip :
242
+ break
243
+ else :
244
+ raise error ('cannot resolve address' )
245
+ if self .family == AF_INET :
246
+ sockaddr = _SockaddrInet4 .new ()
247
+ else :
248
+ sockaddr = _SockaddrInet6 .new ()
249
+ sockaddr .Port = port
250
+ sockaddr .Addr [:] = ip
251
+ return sockaddr
252
+
253
+ def _get_address (self , sockaddr ):
254
+ if isinstance (sockaddr , type (_SockaddrUnix .new ())):
255
+ return (sockaddr .Name ,)
256
+ return _IPv4 (* sockaddr .Addr ).String (), sockaddr .Port
257
+
258
+
259
+ def fromfd (fd , family , type , proto = None ):
260
+ return socket (family , type , proto , fd )
261
+
262
+
263
+ def gethostbyname (hostname ):
264
+ raise NotImplementedError
265
+
266
+
267
+ def gethostbyaddr (ipaddr ):
268
+ names , err = _LookupAddr (ipaddr )
269
+ if err :
270
+ return error (err )
271
+ return names [0 ], [], [ipaddr ]
272
+
273
+
274
+ def gethostname ():
275
+ raise NotImplementedError
276
+
277
+
278
+ def getprotobyname (proto ):
279
+ raise NotImplementedError
280
+
281
+
282
+ # --> port number
283
+ def getservbyname (servicename , protocolname = None ):
284
+ raise NotImplementedError
285
+
286
+
287
+ def getservbyport (portnumber , protocolname = None ):
288
+ raise NotImplementedError
289
+
290
+
291
+ def socketpair (family = None , type = None , proto = None ):
292
+ raise NotImplementedError
293
+
294
+
295
+ def ntohs (n ):
296
+ raise NotImplementedError
297
+
298
+
299
+ def ntohl (n ):
300
+ raise NotImplementedError
301
+
302
+
303
+ def htons (n ):
304
+ raise NotImplementedError
305
+
306
+
307
+ def htonl (n ):
308
+ raise NotImplementedError
309
+
310
+
311
+ # --> List of (family, socktype, proto, canonname, sockaddr)
312
+ def getaddrinfo (host , port , family = None , socktype = None , proto = None , flags = None ):
313
+ raise NotImplementedError
314
+
315
+
316
+ # --> (host, port)
317
+ def getnameinfo (sockaddr , flags ):
318
+ raise NotImplementedError
319
+
320
+
321
+ # -> 32-bit packed IP representation
322
+ def inet_aton (ipaddr ):
323
+ return '' .join (chr (int (n )) for n in ipaddr .split ('.' ))
324
+
325
+
326
+ # -> IP address string
327
+ def inet_ntoa (ipaddr ):
328
+ return '' .join (ord (c ) for c in ipaddr )
329
+
330
+
331
+ # -> None | float
332
+ def getdefaulttimeout ():
333
+ raise NotImplementedError
334
+
335
+
336
+ def setdefaulttimeout (to ):
337
+ raise NotImplementedError
0 commit comments