Rev 2099 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2099 | Rev 2110 | ||
---|---|---|---|
Line 4... | Line 4... | ||
4 | #include "tp.h" |
4 | #include "tp.h" |
Line 5... | Line 5... | ||
5 | 5 | ||
6 | extern tp_obj tp_dict(TP); |
6 | extern tp_obj tp_dict(TP); |
7 | extern tp_obj tp_method(TP,tp_obj self,tp_obj v(TP)); |
7 | extern tp_obj tp_method(TP,tp_obj self,tp_obj v(TP)); |
- | 8 | extern tp_obj tp_fnc(TP,tp_obj v(TP)); |
|
- | 9 | extern tp_obj tp_get(TP,tp_obj self, tp_obj k); |
|
- | 10 | tp_obj tp_has(TP,tp_obj self, tp_obj k); |
|
- | 11 | #define _cdecl __attribute__((cdecl)) |
|
- | 12 | extern int (* _cdecl con_printf)(const char* format,...); |
|
- | 13 | ||
Line 8... | Line 14... | ||
8 | extern tp_obj tp_fnc(TP,tp_obj v(TP)); |
14 | #define PRECISION 0.000001 |
9 | 15 | ||
10 | #define GET_SOCKET_DESCRIPTOR(_obj, _sock) do{ \ |
16 | #define GET_SOCKET_DESCRIPTOR(_obj, _sock) do{ \ |
11 | if (!tp_has(tp, _obj, tp_string("socket"))) \ |
17 | if (fabs(tp_has(tp, _obj, tp_string("socket")).number.val) < PRECISION)\ |
12 | tp_raise(tp_None, "Socket not open", tp_None); \ |
18 | tp_raise(tp_None, "Socket not open", tp_None); \ |
Line 13... | Line 19... | ||
13 | _sock = (__u32)tp_get(tp, _obj, tp_string("socket")).number.val;\ |
19 | _sock = (__u32)(tp_get(tp, _obj, tp_string("socket")).number.val + PRECISION);\ |
14 | } while(0) |
20 | } while(0) |
15 | 21 | ||
16 | /* Socket close method. |
22 | /* Socket close method. |
17 | * |
23 | * |
18 | * Example: |
24 | * Example: |
19 | * s.close() # s must be a socket object created by socket. |
25 | * s.close() # s must be a socket object created by socket. |
20 | * |
26 | * |
21 | * Raises exception if socket was not opened. Otherwise returns True. |
27 | * Raises exception if socket was not opened. Otherwise returns True. |
22 | */ |
28 | */ |
23 | tp_obj kolibri_close_socket(TP) |
29 | static tp_obj kolibri_close_socket(TP) |
24 | { |
30 | { |
Line 25... | Line 31... | ||
25 | tp_obj self = TP_TYPE(TP_DICT); |
31 | tp_obj self = TP_TYPE(TP_DICT); |
Line 26... | Line -... | ||
26 | __u32 socktype; |
- | |
27 | __u32 s; |
32 | __u32 socktype; |
28 | - | ||
29 | GET_SOCKET_DESCRIPTOR(self, s); |
- | |
30 | - | ||
31 | con_printf("cp5\n"); |
- | |
32 | socktype = (__u32)tp_get(tp, self, tp_string("type")).number.val; |
- | |
33 | con_printf("cp6\n"); |
- | |
34 | if (!tp_has(tp, self, tp_string("socket"))) |
- | |
35 | { |
33 | __u32 s; |
36 | con_printf("cp7\n"); |
34 | |
37 | tp_raise(tp_None, "Socket not open", tp_None); |
- | |
38 | } |
- | |
39 | s = (__u32)tp_get(tp, self, tp_string("socket")).number.val; |
35 | GET_SOCKET_DESCRIPTOR(self, s); |
40 | con_printf("cp0, s=%d\n", s); |
- | |
41 | if (socktype == SOCK_STREAM) |
- | |
42 | { |
36 | |
43 | con_printf("cp1\n"); |
- | |
44 | __menuet__close_TCP_socket(s); |
37 | socktype = (__u32)tp_get(tp, self, tp_string("type")).number.val; |
45 | con_printf("cp2\n"); |
- | |
46 | } |
38 | GET_SOCKET_DESCRIPTOR(self, s); |
47 | else if (socktype == SOCK_DGRAM) |
39 | if (socktype == SOCK_STREAM) |
Line 48... | Line 40... | ||
48 | { |
40 | __menuet__close_TCP_socket(s); |
49 | __menuet__close_UDP_socket(s); |
41 | else if (socktype == SOCK_DGRAM) |
Line 57... | Line 49... | ||
57 | * data=" |
49 | * data=" |
58 | * s.send(data) |
50 | * s.send(data) |
59 | * or: |
51 | * or: |
60 | * s.send(data, 20) # Send just 20 bytes |
52 | * s.send(data, 20) # Send just 20 bytes |
61 | */ |
53 | */ |
62 | tp_obj kolibri_send(TP) |
54 | static tp_obj kolibri_send(TP) |
63 | { |
55 | { |
64 | tp_obj self = TP_TYPE(TP_DICT); |
56 | tp_obj self = TP_TYPE(TP_DICT); |
65 | tp_obj data_obj = TP_TYPE(TP_STRING); |
57 | tp_obj data_obj = TP_TYPE(TP_STRING); |
66 | __u32 datalen = TP_DEFAULT(tp_False).number.val; |
58 | __u32 datalen = TP_DEFAULT(tp_False).number.val; |
67 | __u32 socktype = (__u32)tp_get(tp, self, tp_string("type")).number.val; |
59 | __u32 socktype = (__u32)tp_get(tp, self, tp_string("type")).number.val; |
68 | __u32 s; |
60 | __u32 s; |
- | 61 | int result; |
|
Line 69... | Line 62... | ||
69 | 62 | ||
Line 70... | Line 63... | ||
70 | GET_SOCKET_DESCRIPTOR(self, s); |
63 | GET_SOCKET_DESCRIPTOR(self, s); |
71 | 64 | ||
72 | if (datalen < 0 || datalen > data_obj.string.len) |
65 | if (datalen < 0 || datalen > data_obj.string.len) |
73 | datalen = data_obj.string.len; |
66 | datalen = data_obj.string.len; |
74 | if (socktype == SOCK_STREAM) |
67 | if (socktype == SOCK_STREAM) |
75 | __menuet__write_TCP_socket(s, datalen, (void *)data_obj.string.val); |
68 | result = __menuet__write_TCP_socket(s, datalen, (void *)data_obj.string.val); |
76 | else if (socktype == SOCK_DGRAM) |
69 | else if (socktype == SOCK_DGRAM) |
77 | __menuet__write_UDP_socket(s, datalen, (void *)data_obj.string.val); |
70 | result = __menuet__write_UDP_socket(s, datalen, (void *)data_obj.string.val); |
Line 78... | Line 71... | ||
78 | return tp_None; |
71 | return tp_number(!(result != 0)); |
79 | } |
72 | } |
80 | 73 | ||
81 | /* Socket recv method. |
74 | /* Socket recv method. |
82 | * |
75 | * |
83 | * data=" |
76 | * data=" |
84 | * s.recv(data) |
77 | * s.recv(data) |
85 | * or: |
78 | * or: |
86 | * s.recv(data, 20) # Send just 20 bytes |
79 | * s.recv(data, 20) # Send just 20 bytes |
87 | */ |
80 | */ |
88 | tp_obj kolibri_recv(TP) |
- | |
89 | { |
81 | static tp_obj kolibri_recv(TP) |
90 | tp_obj self = TP_TYPE(TP_DICT); |
82 | { |
91 | tp_obj data_obj = TP_TYPE(TP_STRING); |
83 | tp_obj self = TP_TYPE(TP_DICT); |
92 | __u32 datalen = TP_DEFAULT(tp_False).number.val; |
84 | __u32 datalen = TP_DEFAULT(tp_False).number.val; |
93 | __u32 s; |
85 | __u32 s; |
Line 117... | Line 109... | ||
117 | } |
109 | } |
118 | } |
110 | } |
119 | return tp_string_n(buf, bytes_read); |
111 | return tp_string_n(buf, bytes_read); |
120 | } |
112 | } |
Line 121... | Line 113... | ||
121 | 113 | ||
122 | void inet_pton(TP, const char *buf, int len, __u32 *addr) |
114 | static void inet_pton(TP, const char *buf, int len, __u32 *addr) |
123 | { |
115 | { |
124 | char *p = (char *)buf; |
116 | char *p = (char *)buf; |
125 | int i = 0; |
117 | int i = 0; |
126 | __u32 val = 0; |
118 | __u32 val = 0; |
127 | *addr = 0; |
119 | *addr = 0; |
128 | while (*p && p < buf + len && i < 4) |
120 | while (*p && p < buf + len && i < 4) |
129 | { |
- | |
130 | con_printf("char %d", *p); |
121 | { |
131 | if (*p == '.') |
122 | if (*p == '.' || !*p) |
132 | { |
123 | { |
133 | if (val > 255) |
124 | if (val > 255) |
134 | tp_raise(, "ValueError: number > 255 in IP address", tp_None); |
125 | tp_raise(tp_None, "ValueError: number > 255 in IP address", tp_None); |
135 | *addr += (val << ((i++) << 3)); |
- | |
136 | con_printf("num %d\n", val); |
126 | *addr += (val << ((i++) << 3)); |
137 | val = 0; |
127 | val = 0; |
138 | } |
128 | } |
139 | else |
129 | else |
140 | { |
130 | { |
141 | if (*p < '0' || *p > '9') |
131 | if (*p < '0' || *p > '9') |
142 | tp_raise(, "ValueError: bad char in IP address, digit expected", tp_None); |
132 | tp_raise(tp_None, "ValueError: bad char in IP address, digit expected", tp_None); |
143 | val = val * 10 + *p - '0'; |
133 | val = val * 10 + *p - '0'; |
144 | } |
134 | } |
145 | p++; |
135 | p++; |
- | 136 | } |
|
- | 137 | if (!*p) |
|
- | 138 | { |
|
- | 139 | if (i == 3) |
|
- | 140 | *addr += (val << ((i++) << 3)); |
|
- | 141 | else |
|
- | 142 | tp_raise(tp_None, "ValueError: bad IP address", tp_None); |
|
- | 143 | } |
|
146 | } |
144 | |
Line 147... | Line 145... | ||
147 | } |
145 | } |
148 | 146 | ||
149 | /* Converter from string presentation to binary address. */ |
147 | /* Converter from string presentation to binary address. */ |
150 | tp_obj kolibri_inet_pton(TP) |
148 | static tp_obj kolibri_inet_pton(TP) |
151 | { |
149 | { |
152 | tp_obj obj; |
- | |
153 | __u32 addr; |
150 | tp_obj obj; |
154 | con_printf("A1\n"); |
- | |
155 | obj = TP_TYPE(TP_STRING); |
151 | __u32 addr; |
156 | con_printf("A2\n"); |
- | |
157 | inet_pton(tp, (char *)obj.string.val, (int)obj.string.len, &addr); |
152 | obj = TP_TYPE(TP_STRING); |
158 | con_printf("A3\n"); |
153 | inet_pton(tp, (char *)obj.string.val, (int)obj.string.len, &addr); |
Line 159... | Line 154... | ||
159 | return tp_number(addr); |
154 | return tp_number(addr); |
160 | } |
155 | } |
Line 262... | Line 257... | ||
262 | { |
257 | { |
263 | tp_obj s; |
258 | tp_obj s; |
264 | tp_obj sockfamily = TP_TYPE(TP_NUMBER); |
259 | tp_obj sockfamily = TP_TYPE(TP_NUMBER); |
265 | tp_obj socktype = TP_TYPE(TP_NUMBER); |
260 | tp_obj socktype = TP_TYPE(TP_NUMBER); |
Line 266... | Line 261... | ||
266 | 261 | ||
267 | if (abs(sockfamily.number.val - AF_INET) > 0.000001 || |
262 | if (fabs(sockfamily.number.val - AF_INET) > PRECISION || |
268 | (abs(socktype.number.val - SOCK_STREAM) > 0.000001 && |
263 | (fabs(socktype.number.val - SOCK_STREAM) > PRECISION && |
269 | abs(socktype.number.val - SOCK_DGRAM) > 0.000001)) |
264 | fabs(socktype.number.val - SOCK_DGRAM) > PRECISION)) |
270 | return tp_None; |
265 | return tp_None; |
271 | s = tp_dict(tp); |
266 | s = tp_dict(tp); |
272 | tp_set(tp, s, tp_string("family"), sockfamily); |
267 | tp_set(tp, s, tp_string("family"), sockfamily); |
273 | tp_set(tp, s, tp_string("type"), socktype); |
268 | tp_set(tp, s, tp_string("type"), socktype); |
274 | tp_set(tp, s, tp_string("bind"), tp_method(tp, s, kolibri_bind)); |
269 | tp_set(tp, s, tp_string("bind"), tp_method(tp, s, kolibri_bind)); |
275 | tp_set(tp, s, tp_string("connect"), tp_method(tp, s, kolibri_connect)); |
270 | tp_set(tp, s, tp_string("connect"), tp_method(tp, s, kolibri_connect)); |
276 | tp_set(tp, s, tp_string("send"), tp_method(tp, s, kolibri_send)); |
271 | tp_set(tp, s, tp_string("send"), tp_method(tp, s, kolibri_send)); |
277 | tp_set(tp, s, tp_string("recv"), tp_method(tp, s, kolibri_recv)); |
272 | tp_set(tp, s, tp_string("recv"), tp_method(tp, s, kolibri_recv)); |
278 | tp_set(tp, s, tp_string("close"), tp_method(tp, s, kolibri_close_socket)); |
273 | tp_set(tp, s, tp_string("close"), tp_method(tp, s, kolibri_close_socket)); |
279 | if (abs(socktype.number.val - SOCK_STREAM) < 0.000001) |
274 | if (fabs(socktype.number.val - SOCK_STREAM) < PRECISION) |
280 | tp_set(tp, s, tp_string("listen"), tp_method(tp, s, kolibri_listen)); |
275 | tp_set(tp, s, tp_string("listen"), tp_method(tp, s, kolibri_listen)); |
281 | return s; |
276 | return s; |
Line 282... | Line 277... | ||
282 | } |
277 | } |
Line 286... | Line 281... | ||
286 | tp_obj socket_mod = tp_dict(tp); |
281 | tp_obj socket_mod = tp_dict(tp); |
Line 287... | Line 282... | ||
287 | 282 | ||
288 | tp_set(tp, socket_mod, tp_string("AF_INET"), tp_number(AF_INET)); |
283 | tp_set(tp, socket_mod, tp_string("AF_INET"), tp_number(AF_INET)); |
289 | tp_set(tp, socket_mod, tp_string("SOCK_STREAM"), tp_number(SOCK_STREAM)); |
284 | tp_set(tp, socket_mod, tp_string("SOCK_STREAM"), tp_number(SOCK_STREAM)); |
290 | tp_set(tp, socket_mod, tp_string("SOCK_DGRAM"), tp_number(SOCK_DGRAM)); |
- | |
291 | tp_set(tp, socket_mod, tp_string("socket"), tp_fnc(tp, kolibri_socket)); |
285 | tp_set(tp, socket_mod, tp_string("SOCK_DGRAM"), tp_number(SOCK_DGRAM)); |
- | 286 | tp_set(tp, socket_mod, tp_string("inet_pton"), tp_fnc(tp, kolibri_inet_pton)); |
|
292 | tp_set(tp, socket_mod, tp_string("inet_pton"), tp_fnc(tp, kolibri_inet_pton)); |
287 | tp_set(tp, socket_mod, tp_string("socket"), tp_fnc(tp, kolibri_socket)); |
293 | return socket_mod; |
288 | return socket_mod; |