int main(int argc,char **argv) { PropLoad("config.txt"); if (!handle_options(argc, argv)) { return -1; } PropDump(); if (!vcompDoit(PropGet("SOURCE"))) { loadbytecode("foo.bin"); vmemInit(0); if (!strcmp(PropGet("BOOT"),"firmware")) { loaderInit((char*)dumpbc); } else { loaderInit(srcbytecode); } vmemDumpShort(); getchar(); simuInit(); VPUSH(INTTOVAL(0)); interpGo(); VPULL(); while(1) { simuDoLoop(); VPUSH(VCALLSTACKGET(sys_start,SYS_CBLOOP)); if (VSTACKGET(0)!=NIL) { interpGo(); } VPULL(); usleep(50 * 1000); } getchar(); } return 0; }
int netCb(char* src,int lensrc,char* macsrc) { VPUSH(PNTTOVAL(VMALLOCSTR(src,lensrc))); VPUSH(PNTTOVAL(VMALLOCSTR(macsrc,6))); VPUSH(VCALLSTACKGET(sys_start,SYS_CBTCP)); if (VSTACKGET(0)!=NIL) interpGo(); else { VPULL();VPULL();} VPULL(); return 0; }
/** UDPEventRead */ int udpEventRead(int fd) { char buf[4096]; struct sockaddr_in add; int i=udpbysock(fd); int l=sizeof(add); int res=recvfrom(fd,buf,4096,0,(struct sockaddr *)&add,&l); if (res<0) return 1; 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)); VPUSH(INTTOVAL(i)); VPUSH(PNTTOVAL(VMALLOCSTR(buf,res))); VPUSH(PNTTOVAL(VMALLOCSTR((char*)&add.sin_addr.s_addr,4))); VPUSH(VCALLSTACKGET(sys_start,SYS_CBUDP)); if (VSTACKGET(0)!=NIL) interpGo(); else { VPULL();VPULL();VPULL();} VPULL(); return 1; }
/** Gère un evt write sur une socket */ int tcpEventWrite(int fd) { int idx = tcpbysock(fd); if (idx<0) { my_printf(LOG_SIMUNET, "Sockets : idx < 0\n"); return 0; } tcp_writeEventToNotify[idx] = 0; my_printf(LOG_SIMUNET, "Sockets : Write event on %d\n",idx); VPUSH(INTTOVAL(idx)); VPUSH(INTTOVAL(0)); VPUSH(NIL); VPUSH(VCALLSTACKGET(sys_start,SYS_CBTCP)); if (VSTACKGET(0)!=NIL) interpGo(); else { VPULL();VPULL();VPULL();} VPULL(); return 1; }
/** Gère un evt read sur une socket */ int tcpEventRead(int fd) { /* soit une donnée à lire, soit un accept, soit un close */ /* accept si on l'attend, close si on lit 0 data, read sinon */ int idx = tcpbysock(fd); if (idx < 0) { // TODO gérer l'erreur return 0; } if (tcp_listen[idx]) { // accept struct sockaddr_in cor; int ns; int sizecor; int ni,ip,port; char buf[16]; tcp_listen[idx] = 0; sizecor=sizeof(cor); ns=accept(fd,(struct sockaddr*)&cor,&sizecor); if (ns==-1) return 1; ni=tcpgetfree(); if (ni<0) { close(ns); return 1; } ip=cor.sin_addr.s_addr; port=ntohs(cor.sin_port); tcp_sock[ni]=ns; my_printf(LOG_SIMUNET, "Sockets : accept Tcp from %x:%d (socket=%d)\n",ip,port,ns); VPUSH(INTTOVAL(ni)); VPUSH(INTTOVAL(2)); sprintf(buf,"%d",idx); VPUSH(PNTTOVAL(VMALLOCSTR(buf,strlen(buf)))); VPUSH(VCALLSTACKGET(sys_start,SYS_CBTCP)); if (VSTACKGET(0)!=NIL) interpGo(); else { VPULL();VPULL();VPULL();} VPULL(); return 1; } // donnée ou close else { char buf[2048]; int res; if (!tcp_enable[idx]) { // Sleep(10); // recv(sock,buf,0,0); // printf("disabled\n"); return 1; } my_printf(LOG_SIMUNET, "Sockets : Read event on %d\n",fd); res=recv(fd,buf,2048,0); helper_write_buffer(buf, res); VPUSH(INTTOVAL(idx)); if (res>0) { VPUSH(INTTOVAL(1)); VPUSH(PNTTOVAL(VMALLOCSTR(buf,res))); } else { VPUSH(INTTOVAL(-1)); VPUSH(NIL); } VPUSH(VCALLSTACKGET(sys_start,SYS_CBTCP)); if (VSTACKGET(0)!=NIL) interpGo(); else { VPULL();VPULL();VPULL();} VPULL(); return 1; } }