Subversion Repositories Kolibri OS

Rev

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="Preved!!!Example."
49
 * data="Preved!!!Example."
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="Preved!!!Example."
76
 * data="Preved!!!Example."
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;