Skip to content

Commit ba19ee6

Browse files
committed
raw socket support
1 parent d540e38 commit ba19ee6

File tree

2 files changed

+918
-0
lines changed

2 files changed

+918
-0
lines changed

grumpy-runtime-src/lib/_socket.py

+337
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,337 @@
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

Comments
 (0)