nabaztag_hack_kit 0.1.0.beta3 → 0.1.0.beta8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +7 -2
- data/.gitmodules +3 -0
- data/.travis.yml +2 -2
- data/CHANGELOG.md +17 -2
- data/LICENSE +21 -0
- data/README.md +115 -44
- data/Rakefile +2 -6
- data/bytecode/{Commands.md → _docs/commands.md} +0 -0
- data/bytecode/{Docs.md → _docs/grammar.md} +0 -0
- data/bytecode/_docs/grammar.pdf +0 -0
- data/bytecode/{src → _original}/README.md +0 -0
- data/bytecode/{src → _original}/lib/arp.mtl +0 -0
- data/bytecode/{src → _original}/lib/cfg.mtl +0 -0
- data/bytecode/{src → _original}/lib/choreos.mtl +0 -0
- data/bytecode/{src → _original}/lib/dhcp.mtl +0 -0
- data/bytecode/{src → _original}/lib/dns.mtl +0 -0
- data/bytecode/{src → _original}/lib/http.mtl +0 -0
- data/bytecode/{src → _original}/lib/tcp.mtl +0 -0
- data/bytecode/{src → _original}/lib/udp.mtl +0 -0
- data/bytecode/{src → _original}/lib/util.mtl +0 -0
- data/bytecode/{src → _original}/lib/var.mtl +0 -0
- data/bytecode/{src → _original}/lib/wav.mtl +0 -0
- data/bytecode/{src → _original}/lib/wifi.mtl +0 -0
- data/bytecode/{src → _original}/nominal-ping.mtl +0 -0
- data/bytecode/main.mtl +11 -11
- data/bytecode/test/test.mtl +8 -8
- data/examples/basic/Gemfile +1 -3
- data/examples/basic/config.ru +14 -4
- data/examples/record/Gemfile +0 -5
- data/examples/record/{config.ru.example → config.ru} +2 -2
- data/examples/record/server.rb +0 -2
- data/ext/Makefile +10 -0
- data/ext/bin/mtl_comp +29 -0
- data/{bytecode → ext}/bin/mtl_merge +0 -0
- data/ext/bin/mtl_simu +29 -0
- data/{bytecode/src/mtl → ext}/extconf.rb +0 -0
- data/ext/mtl_linux/.gitignore +7 -0
- data/ext/mtl_linux/LICENSE +21 -0
- data/ext/mtl_linux/Makefile +116 -0
- data/ext/mtl_linux/MetalC.project +196 -0
- data/ext/mtl_linux/conf.bin +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux}/conf.bin.sans_password +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux}/config.txt +0 -0
- data/ext/mtl_linux/inc/log.h +21 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/properties.h +0 -0
- data/{bytecode/src/mtl/linux_simuaudio.h → ext/mtl_linux/inc/simu/linux/simuaudio.h} +0 -0
- data/{bytecode/src/mtl/linux_simunet.h → ext/mtl_linux/inc/simu/linux/simunet.h} +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc/simu/win}/simuaudio.h +18 -18
- data/{bytecode/src/mtl → ext/mtl_linux/inc/simu/win}/simunet.h +0 -0
- data/ext/mtl_linux/inc/vcomp/compiler.h +200 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/file.h +11 -11
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/filesystem.h +0 -0
- data/ext/mtl_linux/inc/vcomp/interpreter.h +121 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/memory.h +120 -92
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/param.h +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/parser.h +27 -27
- data/ext/mtl_linux/inc/vcomp/prodbuffer.h +42 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/resource.h +1 -1
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/terminal.h +8 -8
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/util.h +7 -7
- data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vaudio.h +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vbc.h +1 -1
- data/ext/mtl_linux/inc/vm/vbc_str.h +167 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vinterp.h +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vloader.h +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vlog.h +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vmem.h +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vnet.h +0 -0
- data/ext/mtl_linux/nominal.mtl +3959 -0
- data/ext/mtl_linux/src/comp/main.cpp +123 -0
- data/ext/mtl_linux/src/simu/dumpbc.c +2566 -0
- data/ext/mtl_linux/src/simu/linux/main.cpp +288 -0
- data/ext/mtl_linux/src/simu/linux/simu.c +309 -0
- data/ext/mtl_linux/src/simu/linux/simuaudio.c +44 -0
- data/ext/mtl_linux/src/simu/linux/simunet.c +707 -0
- data/ext/mtl_linux/src/simu/log.c +340 -0
- data/ext/mtl_linux/src/simu/properties.c +368 -0
- data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/GTKANAL.H +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/LAYER3.C +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/TABINIT.C +0 -0
- data/ext/mtl_linux/src/simu/win/mp3/common.c +302 -0
- data/ext/mtl_linux/src/simu/win/mp3/dct64_i386.c +316 -0
- data/ext/mtl_linux/src/simu/win/mp3/decode_i386.c +160 -0
- data/ext/mtl_linux/src/simu/win/mp3/huffman.h +332 -0
- data/ext/mtl_linux/src/simu/win/mp3/interface.c +276 -0
- data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/mpg123.h +34 -30
- data/ext/mtl_linux/src/simu/win/mp3/mpglib.h +47 -0
- data/ext/mtl_linux/src/simu/win/simu.c +819 -0
- data/ext/mtl_linux/src/simu/win/simuaudio.c +787 -0
- data/ext/mtl_linux/src/simu/win/simunet.c +489 -0
- data/ext/mtl_linux/src/vcomp/bootstrap.cpp +95 -0
- data/ext/mtl_linux/src/vcomp/compiler.cpp +587 -0
- data/ext/mtl_linux/src/vcomp/compiler_file.cpp +1253 -0
- data/ext/mtl_linux/src/vcomp/compiler_prog.cpp +437 -0
- data/ext/mtl_linux/src/vcomp/compiler_term.cpp +1500 -0
- data/ext/mtl_linux/src/vcomp/compiler_type.cpp +1238 -0
- data/ext/mtl_linux/src/vcomp/compiler_var.cpp +502 -0
- data/ext/mtl_linux/src/vcomp/file.cpp +100 -0
- data/ext/mtl_linux/src/vcomp/interpreter.cpp +93 -0
- data/ext/mtl_linux/src/vcomp/memory.cpp +313 -0
- data/ext/mtl_linux/src/vcomp/parser.cpp +584 -0
- data/ext/mtl_linux/src/vcomp/parser_xml.cpp +137 -0
- data/{bytecode/src/mtl → ext/mtl_linux/src}/vcomp/prodbuffer.cpp +57 -36
- data/ext/mtl_linux/src/vcomp/stdlib_core.cpp +130 -0
- data/ext/mtl_linux/src/vcomp/terminal.cpp +80 -0
- data/{bytecode/src/mtl → ext/mtl_linux/src}/vcomp/util.cpp +18 -11
- data/ext/mtl_linux/src/vm/vaudio.c +830 -0
- data/ext/mtl_linux/src/vm/vinterp.c +1780 -0
- data/ext/mtl_linux/src/vm/vloader.c +139 -0
- data/ext/mtl_linux/src/vm/vlog.c +782 -0
- data/ext/mtl_linux/src/vm/vmem.c +461 -0
- data/ext/mtl_linux/src/vm/vnet.c +298 -0
- data/{bytecode/src/mtl → ext/mtl_linux}/utils/correct_const.sh +0 -0
- data/lib/nabaztag_hack_kit/server.rb +4 -7
- data/lib/nabaztag_hack_kit/version.rb +1 -1
- data/lib/nabaztag_hack_kit.rb +2 -2
- data/nabaztag_hack_kit.gemspec +10 -11
- data/spec/integration/server_spec.rb +3 -3
- data/spec/spec_helper.rb +2 -0
- data/spec/unit/message_spec.rb +12 -18
- data/spec/unit/server_spec.rb +13 -10
- metadata +145 -137
- data/bytecode/bin/mtl_comp +0 -50
- data/bytecode/bin/mtl_simu +0 -49
- data/bytecode/src/mtl/Makefile +0 -42
- data/bytecode/src/mtl/README.md +0 -13
- data/bytecode/src/mtl/bc.cpp +0 -1891
- data/bytecode/src/mtl/dumpbc.c +0 -2566
- data/bytecode/src/mtl/linux_simu.c +0 -271
- data/bytecode/src/mtl/linux_simuaudio.c +0 -16
- data/bytecode/src/mtl/linux_simunet.c +0 -620
- data/bytecode/src/mtl/log.c +0 -297
- data/bytecode/src/mtl/log.h +0 -20
- data/bytecode/src/mtl/main_compiler.cpp +0 -104
- data/bytecode/src/mtl/main_simu.cpp +0 -221
- data/bytecode/src/mtl/mp3/common.c +0 -265
- data/bytecode/src/mtl/mp3/dct64_i386.c +0 -316
- data/bytecode/src/mtl/mp3/decode_i386.c +0 -155
- data/bytecode/src/mtl/mp3/huffman.h +0 -332
- data/bytecode/src/mtl/mp3/interface.c +0 -258
- data/bytecode/src/mtl/mp3/mpglib.h +0 -44
- data/bytecode/src/mtl/properties.c +0 -293
- data/bytecode/src/mtl/simu.c +0 -750
- data/bytecode/src/mtl/simuaudio.c +0 -662
- data/bytecode/src/mtl/simunet.c +0 -400
- data/bytecode/src/mtl/vaudio.c +0 -677
- data/bytecode/src/mtl/vbc_str.h +0 -166
- data/bytecode/src/mtl/vcomp/Makefile +0 -29
- data/bytecode/src/mtl/vcomp/bootstrap.cpp +0 -89
- data/bytecode/src/mtl/vcomp/compiler.cpp +0 -470
- data/bytecode/src/mtl/vcomp/compiler.h +0 -200
- data/bytecode/src/mtl/vcomp/compiler_file.cpp +0 -929
- data/bytecode/src/mtl/vcomp/compiler_prog.cpp +0 -250
- data/bytecode/src/mtl/vcomp/compiler_term.cpp +0 -1053
- data/bytecode/src/mtl/vcomp/compiler_type.cpp +0 -872
- data/bytecode/src/mtl/vcomp/compiler_var.cpp +0 -289
- data/bytecode/src/mtl/vcomp/file.cpp +0 -79
- data/bytecode/src/mtl/vcomp/interpreter.cpp +0 -85
- data/bytecode/src/mtl/vcomp/interpreter.h +0 -121
- data/bytecode/src/mtl/vcomp/memory.cpp +0 -241
- data/bytecode/src/mtl/vcomp/parser.cpp +0 -427
- data/bytecode/src/mtl/vcomp/parser_xml.cpp +0 -124
- data/bytecode/src/mtl/vcomp/prodbuffer.h +0 -42
- data/bytecode/src/mtl/vcomp/stdlib_core.cpp +0 -122
- data/bytecode/src/mtl/vcomp/terminal.cpp +0 -73
- data/bytecode/src/mtl/vinterp.c +0 -1349
- data/bytecode/src/mtl/vloader.c +0 -127
- data/bytecode/src/mtl/vlog.c +0 -589
- data/bytecode/src/mtl/vmem.c +0 -424
- data/bytecode/src/mtl/vnet.c +0 -255
- data/examples/basic/Procfile +0 -2
- data/examples/basic/server.rb +0 -14
@@ -1,620 +0,0 @@
|
|
1
|
-
#include <string.h>
|
2
|
-
#include <stdio.h>
|
3
|
-
|
4
|
-
#include <resolv.h>
|
5
|
-
#include <arpa/inet.h>
|
6
|
-
#include <sys/types.h>
|
7
|
-
#include <sys/socket.h>
|
8
|
-
#include <sys/select.h>
|
9
|
-
#include <netinet/in.h>
|
10
|
-
#include <unistd.h>
|
11
|
-
#include <fcntl.h>
|
12
|
-
|
13
|
-
#include <errno.h>
|
14
|
-
|
15
|
-
#include "vmem.h"
|
16
|
-
#include "vloader.h"
|
17
|
-
#include "vinterp.h"
|
18
|
-
|
19
|
-
#include "log.h"
|
20
|
-
|
21
|
-
#define TCPMAX 128 // nombre max de sockets tcp pouvant être ouvertes en même temps
|
22
|
-
#define UDPMAX 128 // nombre max de sockets udp pouvant être ouvertes en même temps
|
23
|
-
|
24
|
-
int tcp_sock[TCPMAX]; // =-1 -> disponible
|
25
|
-
int tcp_enable[TCPMAX];
|
26
|
-
int tcp_listen[TCPMAX]; // si 1, la socket est en listen (et donc une action sur la socket est une connection)
|
27
|
-
int tcp_writeEventToNotify[TCPMAX]; // si 1, on a envoyé un write event qui n'a pas encore été suivi d'un read ou write
|
28
|
-
|
29
|
-
int udp_sock[UDPMAX];
|
30
|
-
int udp_port[UDPMAX]; // port=0 -> disponible
|
31
|
-
|
32
|
-
|
33
|
-
// déclarations
|
34
|
-
int inet_addr_bin(char *ip);
|
35
|
-
int simunetinit(void);
|
36
|
-
int checkNetworkEvents(void);
|
37
|
-
int checkTcpEvents(void);
|
38
|
-
int tcpEventRead(int fd);
|
39
|
-
int tcpEventWrite(int fd);
|
40
|
-
int tcpbysock(int s);
|
41
|
-
int tcpgetfree(void);
|
42
|
-
int tcpopen(char* dstip,int dstport);
|
43
|
-
int tcpclose(int i);
|
44
|
-
void tcpenable(int i,int enable);
|
45
|
-
int tcpsend(int i,char* msg, int len);
|
46
|
-
int tcpservercreate(int port);
|
47
|
-
int udpbyport(int p);
|
48
|
-
int udpgetfree(void);
|
49
|
-
int udpbysock(int s);
|
50
|
-
int udpcreate(int port);
|
51
|
-
int udpclose(int port);
|
52
|
-
int udpsend(int localport,char* dstip,int dstport,char* msg, int len);
|
53
|
-
int checkUdpEvents();
|
54
|
-
int udpEventRead(int fd);
|
55
|
-
|
56
|
-
|
57
|
-
void helper_write_buffer(char *buf, int res)
|
58
|
-
{
|
59
|
-
if (res <= 0)
|
60
|
-
{ my_printf(LOG_SIMUNET, "BUF empty\n"); return ; }
|
61
|
-
|
62
|
-
my_printf(LOG_SIMUNET, "buffer content (len: %d) >>>>>>>>\n", res);
|
63
|
-
|
64
|
-
// rendre la chaine imprimable
|
65
|
-
char printable[2048];
|
66
|
-
if (res>2048)
|
67
|
-
res = 2048;
|
68
|
-
memcpy(printable, buf, 2048);
|
69
|
-
int i;
|
70
|
-
for (i=0; i<res; ++i)
|
71
|
-
if (!isprint(printable[i]) && ('\n' != printable[i]))
|
72
|
-
printable[i]='.';
|
73
|
-
|
74
|
-
my_printf(LOG_SIMUNET, "%.2048s\n", printable);
|
75
|
-
my_printf(LOG_SIMUNET, "<<<<<<< end of buffer content\n");
|
76
|
-
}
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
/**
|
81
|
-
Cast parce qu'on nous donne les ip dans un format bizarre
|
82
|
-
*/
|
83
|
-
int inet_addr_bin(char *ip)
|
84
|
-
{
|
85
|
-
return *(int*)ip;
|
86
|
-
}
|
87
|
-
|
88
|
-
|
89
|
-
/**
|
90
|
-
Initialiise les structures qui serviront à gérer les fonctions réseau
|
91
|
-
*/
|
92
|
-
int simunetinit(void)
|
93
|
-
{
|
94
|
-
;
|
95
|
-
memset(&tcp_sock, -1, sizeof(tcp_sock));
|
96
|
-
memset(&tcp_enable, 0, sizeof(tcp_enable));
|
97
|
-
memset(&tcp_listen, 0, sizeof(tcp_listen));
|
98
|
-
memset(&tcp_writeEventToNotify, 0, sizeof(tcp_writeEventToNotify));
|
99
|
-
memset(&udp_sock, 0, sizeof(udp_sock));
|
100
|
-
memset(&udp_port, 0, sizeof(udp_port));
|
101
|
-
|
102
|
-
return 0;
|
103
|
-
}
|
104
|
-
|
105
|
-
int checkTcpEvents(void);
|
106
|
-
|
107
|
-
/**
|
108
|
-
Vérifie les évènements qui se sont produits sur les socket ouvertes et
|
109
|
-
fait les actions appropriées.
|
110
|
-
|
111
|
-
TODO peut être possible de retravailler les autres fonctions pour
|
112
|
-
avoir les tableaux et valeurs prêtes sans avoir à passer par les
|
113
|
-
boucles ?
|
114
|
-
*/
|
115
|
-
int checkNetworkEvents(void)
|
116
|
-
{
|
117
|
-
checkTcpEvents();
|
118
|
-
checkUdpEvents();
|
119
|
-
return 0;
|
120
|
-
}
|
121
|
-
|
122
|
-
/////////////// TCP /////////////////
|
123
|
-
|
124
|
-
int tcpEventRead(int fd);
|
125
|
-
int tcpEventWrite(int fd);
|
126
|
-
int tcpbysock(int s);
|
127
|
-
|
128
|
-
int checkTcpEvents(void)
|
129
|
-
{
|
130
|
-
fd_set fdset_r, fdset_w, fdset_err;
|
131
|
-
int nfds = 0;
|
132
|
-
int maxval = 0; // doit pouvoir être dispo directement
|
133
|
-
struct timeval timeout = {0, 0} ;
|
134
|
-
int i;
|
135
|
-
|
136
|
-
FD_ZERO(&fdset_r);
|
137
|
-
FD_ZERO(&fdset_w);
|
138
|
-
FD_ZERO(&fdset_err);
|
139
|
-
|
140
|
-
for (i=0; i<TCPMAX; ++i)
|
141
|
-
{
|
142
|
-
if (tcp_sock[i] != -1)
|
143
|
-
{
|
144
|
-
FD_SET(tcp_sock[i], &fdset_r);
|
145
|
-
FD_SET(tcp_sock[i], &fdset_w);
|
146
|
-
FD_SET(tcp_sock[i], &fdset_err);
|
147
|
-
if (tcp_sock[i] > maxval)
|
148
|
-
maxval = tcp_sock[i];
|
149
|
-
}
|
150
|
-
}
|
151
|
-
|
152
|
-
int nbevts = select(maxval+1, &fdset_r, NULL /* &fdset_w */, &fdset_err, &timeout);
|
153
|
-
if (nbevts < 0)
|
154
|
-
{
|
155
|
-
my_printf(LOG_SIMUNET, "Sockets : Tcp select failed (%s)\n", strerror(errno));
|
156
|
-
return -1;
|
157
|
-
}
|
158
|
-
|
159
|
-
/*** write events ***/
|
160
|
-
for (i=0; i<TCPMAX; ++i)
|
161
|
-
if (tcp_writeEventToNotify[i])
|
162
|
-
tcpEventWrite(tcp_sock[i]);
|
163
|
-
|
164
|
-
/*** read events ***/
|
165
|
-
if (nbevts > 0)
|
166
|
-
{
|
167
|
-
for (i=0; i<=maxval; ++i)
|
168
|
-
{
|
169
|
-
if (FD_ISSET(i, &fdset_w))
|
170
|
-
{
|
171
|
-
tcpEventWrite(i);
|
172
|
-
}
|
173
|
-
if (FD_ISSET(i, &fdset_r))
|
174
|
-
{
|
175
|
-
tcpEventRead(i);
|
176
|
-
}
|
177
|
-
if (FD_ISSET(i, &fdset_err))
|
178
|
-
{
|
179
|
-
// TODO
|
180
|
-
}
|
181
|
-
}
|
182
|
-
}
|
183
|
-
|
184
|
-
return 0;
|
185
|
-
}
|
186
|
-
|
187
|
-
/**
|
188
|
-
Gère un evt read sur une socket
|
189
|
-
*/
|
190
|
-
int tcpEventRead(int fd)
|
191
|
-
{
|
192
|
-
/* soit une donnée à lire, soit un accept, soit un close */
|
193
|
-
/* accept si on l'attend, close si on lit 0 data, read sinon */
|
194
|
-
int idx = tcpbysock(fd);
|
195
|
-
|
196
|
-
if (idx < 0)
|
197
|
-
{
|
198
|
-
// TODO gérer l'erreur
|
199
|
-
return 0;
|
200
|
-
}
|
201
|
-
|
202
|
-
if (tcp_listen[idx])
|
203
|
-
{
|
204
|
-
// accept
|
205
|
-
struct sockaddr_in cor;
|
206
|
-
int ns;
|
207
|
-
int sizecor;
|
208
|
-
int ni,ip,port;
|
209
|
-
char buf[16];
|
210
|
-
|
211
|
-
tcp_listen[idx] = 0;
|
212
|
-
|
213
|
-
sizecor=sizeof(cor);
|
214
|
-
ns=accept(fd,(struct sockaddr*)&cor,&sizecor);
|
215
|
-
if (ns==-1) return 1;
|
216
|
-
|
217
|
-
ni=tcpgetfree();
|
218
|
-
if (ni<0)
|
219
|
-
{
|
220
|
-
close(ns);
|
221
|
-
return 1;
|
222
|
-
}
|
223
|
-
|
224
|
-
ip=cor.sin_addr.s_addr;
|
225
|
-
port=ntohs(cor.sin_port);
|
226
|
-
|
227
|
-
tcp_sock[ni]=ns;
|
228
|
-
|
229
|
-
my_printf(LOG_SIMUNET, "Sockets : accept Tcp from %x:%d (socket=%d)\n",ip,port,ns);
|
230
|
-
VPUSH(INTTOVAL(ni));
|
231
|
-
VPUSH(INTTOVAL(2));
|
232
|
-
sprintf(buf,"%d",idx);
|
233
|
-
VPUSH(PNTTOVAL(VMALLOCSTR(buf,strlen(buf))));
|
234
|
-
VPUSH(VCALLSTACKGET(sys_start,SYS_CBTCP));
|
235
|
-
if (VSTACKGET(0)!=NIL) interpGo();
|
236
|
-
else { VPULL();VPULL();VPULL();}
|
237
|
-
VPULL();
|
238
|
-
return 1;
|
239
|
-
}
|
240
|
-
// donnée ou close
|
241
|
-
else
|
242
|
-
{
|
243
|
-
char buf[2048];
|
244
|
-
int res;
|
245
|
-
if (!tcp_enable[idx])
|
246
|
-
{
|
247
|
-
// Sleep(10);
|
248
|
-
// recv(sock,buf,0,0);
|
249
|
-
// printf("disabled\n");
|
250
|
-
return 1;
|
251
|
-
}
|
252
|
-
|
253
|
-
my_printf(LOG_SIMUNET, "Sockets : Read event on %d\n",fd);
|
254
|
-
res=recv(fd,buf,2048,0);
|
255
|
-
|
256
|
-
helper_write_buffer(buf, res);
|
257
|
-
|
258
|
-
VPUSH(INTTOVAL(idx));
|
259
|
-
if (res>0)
|
260
|
-
{
|
261
|
-
VPUSH(INTTOVAL(1));
|
262
|
-
VPUSH(PNTTOVAL(VMALLOCSTR(buf,res)));
|
263
|
-
}
|
264
|
-
else
|
265
|
-
{
|
266
|
-
VPUSH(INTTOVAL(-1));
|
267
|
-
VPUSH(NIL);
|
268
|
-
}
|
269
|
-
|
270
|
-
VPUSH(VCALLSTACKGET(sys_start,SYS_CBTCP));
|
271
|
-
if (VSTACKGET(0)!=NIL) interpGo();
|
272
|
-
else { VPULL();VPULL();VPULL();}
|
273
|
-
VPULL();
|
274
|
-
return 1;
|
275
|
-
}
|
276
|
-
}
|
277
|
-
|
278
|
-
/**
|
279
|
-
Gère un evt write sur une socket
|
280
|
-
*/
|
281
|
-
int tcpEventWrite(int fd)
|
282
|
-
{
|
283
|
-
int idx = tcpbysock(fd);
|
284
|
-
if (idx<0) {
|
285
|
-
my_printf(LOG_SIMUNET, "Sockets : idx < 0\n");
|
286
|
-
return 0;
|
287
|
-
}
|
288
|
-
|
289
|
-
tcp_writeEventToNotify[idx] = 0;
|
290
|
-
|
291
|
-
my_printf(LOG_SIMUNET, "Sockets : Write event on %d\n",idx);
|
292
|
-
VPUSH(INTTOVAL(idx));
|
293
|
-
VPUSH(INTTOVAL(0));
|
294
|
-
VPUSH(NIL);
|
295
|
-
VPUSH(VCALLSTACKGET(sys_start,SYS_CBTCP));
|
296
|
-
if (VSTACKGET(0)!=NIL) interpGo();
|
297
|
-
else { VPULL();VPULL();VPULL();}
|
298
|
-
VPULL();
|
299
|
-
return 1;
|
300
|
-
}
|
301
|
-
|
302
|
-
/**
|
303
|
-
Retrouve l'indice d'une socket dans le tableau tcp_sock
|
304
|
-
*/
|
305
|
-
int tcpbysock(int s)
|
306
|
-
{
|
307
|
-
int i;
|
308
|
-
for(i=0;i<TCPMAX;i++) if (tcp_sock[i]==s) return i;
|
309
|
-
return -1;
|
310
|
-
}
|
311
|
-
|
312
|
-
/**
|
313
|
-
Renvoie l'indice du premier emplacement libre (socket pas en cours
|
314
|
-
d'utilisation) du tableau tcp_sock
|
315
|
-
*/
|
316
|
-
int tcpgetfree(void)
|
317
|
-
{
|
318
|
-
int i;
|
319
|
-
for(i=0;i<TCPMAX;i++) if (tcp_sock[i]==-1)
|
320
|
-
{
|
321
|
-
tcp_enable[i]=1;
|
322
|
-
tcp_listen[i]=0;
|
323
|
-
return i;
|
324
|
-
}
|
325
|
-
return -1;
|
326
|
-
}
|
327
|
-
|
328
|
-
/**
|
329
|
-
Ouvre une connection tcp
|
330
|
-
|
331
|
-
dstip:
|
332
|
-
*/
|
333
|
-
int tcpopen(char* dstip,int dstport)
|
334
|
-
{
|
335
|
-
int socktcp;
|
336
|
-
struct sockaddr_in ina;
|
337
|
-
int opt=1;
|
338
|
-
|
339
|
-
int i=tcpgetfree();
|
340
|
-
if (i<0) return i;
|
341
|
-
|
342
|
-
socktcp=socket(AF_INET,SOCK_STREAM,0);
|
343
|
-
if (socktcp==-1) return -1;
|
344
|
-
|
345
|
-
ina.sin_family = AF_INET;
|
346
|
-
ina.sin_port = htons((unsigned short)dstport);
|
347
|
-
ina.sin_addr.s_addr = inet_addr_bin(dstip);
|
348
|
-
|
349
|
-
fcntl(socktcp, F_SETFD, O_NONBLOCK);
|
350
|
-
|
351
|
-
if (connect(socktcp,(struct sockaddr *)&ina,sizeof(ina))!=0)
|
352
|
-
// ici dans le code windows il y a une condition si SOCKETWOULDBLOCK
|
353
|
-
{
|
354
|
-
my_printf(LOG_SIMUNET, "Sockets : Tcp connect failed (%s)\n", strerror(errno));
|
355
|
-
close(socktcp);
|
356
|
-
return -1;
|
357
|
-
}
|
358
|
-
my_printf(LOG_SIMUNET, "Sockets : create Tcp %s:%d (socket=%d)\n",inet_ntoa(ina.sin_addr),dstport,socktcp);
|
359
|
-
|
360
|
-
tcp_sock[i]=socktcp;
|
361
|
-
tcp_writeEventToNotify[i] = 1;
|
362
|
-
|
363
|
-
return i;
|
364
|
-
}
|
365
|
-
|
366
|
-
/**
|
367
|
-
Ferme une connection tcp
|
368
|
-
*/
|
369
|
-
int tcpclose(int i)
|
370
|
-
{
|
371
|
-
if ((i>=0)&&(i<TCPMAX)&&(tcp_sock[i]!=-1))
|
372
|
-
{
|
373
|
-
my_printf(LOG_SIMUNET, "Sockets : Tcp close %d\n",tcp_sock[i]);
|
374
|
-
close(tcp_sock[i]);
|
375
|
-
tcp_sock[i]=-1;
|
376
|
-
}
|
377
|
-
return i;
|
378
|
-
}
|
379
|
-
|
380
|
-
/**
|
381
|
-
?
|
382
|
-
*/
|
383
|
-
void tcpenable(int i,int enable)
|
384
|
-
{
|
385
|
-
if ((i>=0)&&(i<TCPMAX)&&(tcp_sock[i]!=-1))
|
386
|
-
{
|
387
|
-
char buf[16];
|
388
|
-
if (enable!=tcp_enable[i])
|
389
|
-
{
|
390
|
-
tcp_enable[i]=enable;
|
391
|
-
if (enable) recv(tcp_sock[i],buf,0,0);
|
392
|
-
}
|
393
|
-
}
|
394
|
-
}
|
395
|
-
|
396
|
-
|
397
|
-
/**
|
398
|
-
Envoie des données sur une connection tcp déjà ouverte
|
399
|
-
*/
|
400
|
-
int tcpsend(int i,char* msg, int len)
|
401
|
-
{
|
402
|
-
if ((i>=0)&&(i<TCPMAX)&&(tcp_sock[i]!=-1))
|
403
|
-
{
|
404
|
-
int res=send(tcp_sock[i],msg,len,0);
|
405
|
-
helper_write_buffer(msg, len);
|
406
|
-
if (res<0)
|
407
|
-
{
|
408
|
-
my_printf(LOG_SIMUNET, "Sockets: Tcp could not send data (%s)\n", strerror(errno));
|
409
|
-
// ici dans le code windows il y a une condition si SOCKETWOULDBLOCK
|
410
|
-
res=-1;
|
411
|
-
}
|
412
|
-
return res;
|
413
|
-
}
|
414
|
-
return -1;
|
415
|
-
}
|
416
|
-
|
417
|
-
/**
|
418
|
-
Ouvre le port spécifié et attend des connections dessus
|
419
|
-
*/
|
420
|
-
int tcpservercreate(int port)
|
421
|
-
{
|
422
|
-
int opt=1;
|
423
|
-
struct sockaddr_in ina;
|
424
|
-
int socksrv;
|
425
|
-
int i=tcpgetfree();
|
426
|
-
if (i<0) return i;
|
427
|
-
|
428
|
-
socksrv=socket(AF_INET,SOCK_STREAM,0);
|
429
|
-
if (socksrv==-1)
|
430
|
-
{
|
431
|
-
return -1;
|
432
|
-
}
|
433
|
-
setsockopt (socksrv, SOL_SOCKET, SO_REUSEADDR,(char*) &opt, sizeof (opt));
|
434
|
-
ina.sin_family = AF_INET;
|
435
|
-
ina.sin_port = htons((unsigned short)port);
|
436
|
-
ina.sin_addr.s_addr = INADDR_ANY;
|
437
|
-
|
438
|
-
if (bind(socksrv,(struct sockaddr*)&ina,sizeof(ina))!=0)
|
439
|
-
{
|
440
|
-
my_printf(LOG_SIMUNET, "Sockets : Tcp port %d busy (%s)\n",port, strerror(errno));
|
441
|
-
close(socksrv);
|
442
|
-
return -1;
|
443
|
-
}
|
444
|
-
if (listen(socksrv,3)!=0)
|
445
|
-
{
|
446
|
-
my_printf(LOG_SIMUNET, "Sockets : Tcp port %d listen error (%s)\n",port, strerror(errno));
|
447
|
-
close(socksrv);
|
448
|
-
return -1;
|
449
|
-
}
|
450
|
-
my_printf(LOG_SIMUNET, "Sockets : create Tcp server :%d (socket=%d) (%s)\n",port,socksrv, strerror(errno));
|
451
|
-
tcp_sock[i]=socksrv;
|
452
|
-
tcp_listen[i]=1;
|
453
|
-
|
454
|
-
return 0;
|
455
|
-
}
|
456
|
-
|
457
|
-
|
458
|
-
/////////////// UDP /////////////////
|
459
|
-
|
460
|
-
int udpbyport(int p)
|
461
|
-
{
|
462
|
-
int i;
|
463
|
-
for(i=0;i<UDPMAX;i++) if (udp_port[i]==p) return i;
|
464
|
-
return -1;
|
465
|
-
}
|
466
|
-
|
467
|
-
int udpgetfree(void)
|
468
|
-
{
|
469
|
-
return udpbyport(0);
|
470
|
-
}
|
471
|
-
|
472
|
-
int udpbysock(int s)
|
473
|
-
{
|
474
|
-
int i;
|
475
|
-
for(i=0;i<UDPMAX;i++) if ((udp_port[i])&&(udp_sock[i]==s)) return i;
|
476
|
-
return -1;
|
477
|
-
}
|
478
|
-
|
479
|
-
int udpcreate(int port)
|
480
|
-
{
|
481
|
-
int sockudp;
|
482
|
-
struct sockaddr_in ina;
|
483
|
-
int opt=1;
|
484
|
-
int i;
|
485
|
-
|
486
|
-
udpclose(port);
|
487
|
-
|
488
|
-
i=udpgetfree();
|
489
|
-
if (i<0) return i;
|
490
|
-
|
491
|
-
sockudp=socket(AF_INET,SOCK_DGRAM,0);
|
492
|
-
if (sockudp==-1) return -1;
|
493
|
-
|
494
|
-
ina.sin_family = AF_INET;
|
495
|
-
ina.sin_port = htons((unsigned short)port);
|
496
|
-
ina.sin_addr.s_addr = INADDR_ANY;
|
497
|
-
if (bind(sockudp,(struct sockaddr*)&ina,sizeof(ina))!=0)
|
498
|
-
{
|
499
|
-
my_printf(LOG_SIMUNET, "Sockets : Udp port %d busy\n",port);
|
500
|
-
close(sockudp);
|
501
|
-
return -1;
|
502
|
-
}
|
503
|
-
setsockopt(sockudp, SOL_SOCKET, SO_REUSEADDR, (char*)&opt, sizeof (opt));
|
504
|
-
setsockopt(sockudp, SOL_SOCKET, SO_BROADCAST, (char*)&opt, sizeof (opt));
|
505
|
-
my_printf(LOG_SIMUNET, "Sockets : create Udp :%d (socket=%d)\n",port,sockudp);
|
506
|
-
|
507
|
-
udp_port[i]=port;
|
508
|
-
udp_sock[i]=sockudp;
|
509
|
-
return i;
|
510
|
-
}
|
511
|
-
|
512
|
-
int udpclose(int port)
|
513
|
-
{
|
514
|
-
int i=udpbyport(port);
|
515
|
-
if (i>=0)
|
516
|
-
{
|
517
|
-
close(udp_sock[i]);
|
518
|
-
udp_port[i]=0;
|
519
|
-
}
|
520
|
-
return i;
|
521
|
-
}
|
522
|
-
|
523
|
-
int udpsend(int localport,char* dstip,int dstport,char* msg, int len)
|
524
|
-
{
|
525
|
-
struct sockaddr_in ina;
|
526
|
-
int i;
|
527
|
-
|
528
|
-
i=udpbyport(localport);
|
529
|
-
if (i<0) i=udpcreate(localport);
|
530
|
-
if (i>=0)
|
531
|
-
{
|
532
|
-
ina.sin_family = AF_INET;
|
533
|
-
ina.sin_port = htons((unsigned short)dstport);
|
534
|
-
ina.sin_addr.s_addr = inet_addr_bin(dstip);
|
535
|
-
|
536
|
-
// hack pour dns. dans le bytecode de simu, on considère que
|
537
|
-
// 192.168.1.1 est le dns. Si on essaie d'envoyer un paquet à
|
538
|
-
// cette adresse, il faut translater vers le "vrai" dns.
|
539
|
-
in_addr_t ip_192_168_1_1 = inet_addr("192.168.1.1");
|
540
|
-
if (!memcmp(&(ina.sin_addr),&ip_192_168_1_1, sizeof(ip_192_168_1_1))) {
|
541
|
-
my_printf(LOG_SIMUNET, "Sockets : (hack) converting 192.168.1.1 to real dns ip\n");
|
542
|
-
res_init();
|
543
|
-
if (_res.nscount <= 0) { my_printf(LOG_SIMUNET, "Fatal error: no DNS available. Should abort\n"); return 0; };
|
544
|
-
ina.sin_addr = _res.nsaddr_list[0].sin_addr;
|
545
|
-
}
|
546
|
-
|
547
|
-
my_printf(LOG_SIMUNET, "Sockets : send %d bytes on chn %d\n",len,i);
|
548
|
-
sendto(udp_sock[i],msg,len,0,(struct sockaddr *)&ina,sizeof(ina));
|
549
|
-
return 0;
|
550
|
-
}
|
551
|
-
return -1;
|
552
|
-
}
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
int checkUdpEvents(void)
|
557
|
-
{
|
558
|
-
fd_set fdset_r, fdset_w, fdset_err;
|
559
|
-
int nfds = 0;
|
560
|
-
int maxval = 0; // doit pouvoir être dispo directement
|
561
|
-
struct timeval timeout = {0, 0} ;
|
562
|
-
int i;
|
563
|
-
|
564
|
-
FD_ZERO(&fdset_r);
|
565
|
-
FD_ZERO(&fdset_w);
|
566
|
-
FD_ZERO(&fdset_err);
|
567
|
-
|
568
|
-
for (i=0; i<UDPMAX; ++i)
|
569
|
-
{
|
570
|
-
if (udp_sock[i] != -1)
|
571
|
-
{
|
572
|
-
FD_SET(udp_sock[i], &fdset_r);
|
573
|
-
/* FD_SET(udp_sock[i], &fdset_w); */
|
574
|
-
/* FD_SET(udp_sock[i], &fdset_err); */
|
575
|
-
if (udp_sock[i] > maxval)
|
576
|
-
maxval = udp_sock[i];
|
577
|
-
}
|
578
|
-
}
|
579
|
-
|
580
|
-
int nbevts = select(maxval+1, &fdset_r, &fdset_w, &fdset_err, &timeout);
|
581
|
-
|
582
|
-
if (nbevts < 0)
|
583
|
-
{
|
584
|
-
my_printf(LOG_SIMUNET, "Sockets : Udp select failed (%s)\n", strerror(errno));
|
585
|
-
return -1;
|
586
|
-
}
|
587
|
-
|
588
|
-
if (nbevts > 0)
|
589
|
-
{
|
590
|
-
for (i=0; i<=maxval; ++i)
|
591
|
-
{
|
592
|
-
if (FD_ISSET(i, &fdset_r))
|
593
|
-
{
|
594
|
-
udpEventRead(i);
|
595
|
-
}
|
596
|
-
}
|
597
|
-
}
|
598
|
-
|
599
|
-
return 0;
|
600
|
-
}
|
601
|
-
|
602
|
-
int udpEventRead(int fd)
|
603
|
-
{
|
604
|
-
char buf[4096];
|
605
|
-
struct sockaddr_in add;
|
606
|
-
int i=udpbysock(fd);
|
607
|
-
int l=sizeof(add);
|
608
|
-
int res=recvfrom(fd,buf,4096,0,(struct sockaddr *)&add,&l);
|
609
|
-
if (res<0) return 1;
|
610
|
-
|
611
|
-
my_printf(LOG_SIMUNET, "Sockets : UDP Read %d bytes on :%d from %s:%d\n",res,udp_port[i],inet_ntoa(add.sin_addr),ntohs(add.sin_port));
|
612
|
-
VPUSH(INTTOVAL(i));
|
613
|
-
VPUSH(PNTTOVAL(VMALLOCSTR(buf,res)));
|
614
|
-
VPUSH(PNTTOVAL(VMALLOCSTR((char*)&add.sin_addr.s_addr,4)));
|
615
|
-
VPUSH(VCALLSTACKGET(sys_start,SYS_CBUDP));
|
616
|
-
if (VSTACKGET(0)!=NIL) interpGo();
|
617
|
-
else { VPULL();VPULL();VPULL();}
|
618
|
-
VPULL();
|
619
|
-
return 1;
|
620
|
-
}
|