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;
}
Example #2
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;
}
Example #3
0
/**
	 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;
}
Example #4
0
/**
	 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;
	}
}