🚀 add module/libsock.nas, preparing to add socket lib into this language.
This commit is contained in:
parent
a2e2d5d8f6
commit
53b85cd459
8
main.cpp
8
main.cpp
|
@ -151,22 +151,18 @@ int main(int argc,const char* argv[])
|
|||
{"--debug",VM_DEBUG},{"-dbg",VM_DEBUG}
|
||||
};
|
||||
uint32_t cmd=0;
|
||||
bool recog_file=false;
|
||||
std::string filename;
|
||||
std::vector<std::string> vm_argv;
|
||||
for(int i=1;i<argc;++i)
|
||||
{
|
||||
if(cmdlst.count(argv[i]))
|
||||
cmd|=cmdlst[argv[i]];
|
||||
else if(!recog_file)
|
||||
{
|
||||
else if(!filename.length())
|
||||
filename=argv[i];
|
||||
recog_file=true;
|
||||
}
|
||||
else
|
||||
vm_argv.push_back(argv[i]);
|
||||
}
|
||||
if(!recog_file)
|
||||
if(!filename.length())
|
||||
err();
|
||||
if(!cmd)
|
||||
cmd|=VM_EXEC;
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
var socket=func(){
|
||||
var lib=dylib.dlopen("./module/libnasock"~(os.platform()=="windows"?".dll":".so"));
|
||||
var sock=dylib.dlsym(lib,"nas_socket");
|
||||
var closesocket=dylib.dlsym(lib,"nas_closesocket");
|
||||
var call=dylib.dlcall;
|
||||
return {
|
||||
AF_UNSPEC:0,AF_UNIX:1,AF_INET:2,AF_IMPLINK:3,
|
||||
AF_PUP:4,AF_CHAOS:5,AF_IPX:6,AF_NS:6,
|
||||
AF_ISO:7,AF_OSI:7,AF_ECMA:8,AF_DATAKIT:9,
|
||||
AF_CCITT:10,AF_SNA:11,AF_DECnet:12,AF_DLI:13,
|
||||
AF_LAT:14,AF_HYLINK:15,AF_APPLETALK:16,AF_NETBIOS:17,
|
||||
AF_VOICEVIEW:18,AF_FIREFOX:19,AF_UNKNOWN1:20,AF_BAN:21,
|
||||
AF_MAX:22,
|
||||
|
||||
SOCK_STREAM:1,SOCK_DGRAM:2,SOCK_RAW:3,SOCK_RDM:4,
|
||||
SOCK_SEQPACKET:5,
|
||||
|
||||
IPPROTO_IP:0,IPPROTO_ICMP:1,IPPROTO_IGMP:2,IPPROTO_GGP:3,
|
||||
IPPROTO_TCP:6,IPPROTO_PUP:12,IPPROTO_UDP:17,IPPROTO_IDP:22,
|
||||
IPPROTO_ND:77,IPPROTO_RAW:255,IPPROTO_MAX:256,
|
||||
|
||||
IPPORT_ECHO:7,IPPORT_DISCARD:9,IPPORT_SYSTAT:11,IPPORT_DAYTIME:13,
|
||||
IPPORT_NETSTAT:15,IPPORT_FTP:21,IPPORT_TELNET:23,IPPORT_SMTP:25,
|
||||
IPPORT_TIMESERVER:37,IPPORT_NAMESERVER:42,IPPORT_WHOIS:43,IPPORT_MTP:57,
|
||||
IPPORT_TFTP:69,IPPORT_RJE:77,IPPORT_FINGER:79,IPPORT_TTYLINK:87,
|
||||
IPPORT_SUPDUP:95,IPPORT_EXECSERVER:512,IPPORT_LOGINSERVER:513,IPPORT_CMDSERVER:514,
|
||||
IPPORT_EFSSERVER:520,IPPORT_BIFFUDP:512,IPPORT_WHOSERVER:513,IPPORT_ROUTESERVER:520,
|
||||
IPPORT_RESERVED:1024,
|
||||
|
||||
socket:func(af,type,proto){
|
||||
return call(sock,af,type,proto);
|
||||
},
|
||||
closesocket:func(sd){
|
||||
return call(closesocket,sd);
|
||||
}
|
||||
};
|
||||
}();
|
|
@ -15,6 +15,14 @@ libkey.dll: keyboard.cpp
|
|||
g++ -c -O3 keyboard.cpp -fPIC -o keyboard.o -static
|
||||
g++ -shared -o libkey.dll keyboard.o -static
|
||||
|
||||
libnasock.so: nasocket.cpp
|
||||
clang++ -c -O3 nasocket.cpp -fPIC -o nasocket.o
|
||||
clang++ -shared -o libnasock.so nasocket.o
|
||||
rm nasocket.o
|
||||
libnasock.dll: nasocket.cpp
|
||||
g++ -c -O3 nasocket.cpp -fPIC -o nasocket.o -lwsock32 -static
|
||||
g++ -shared -o libnasock.dll nasocket.o -lwsock32 -static
|
||||
|
||||
clean:
|
||||
rm *.o *.so *.dll *.dylib
|
||||
all: libfib.so libkey.so
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
#include "../nasal.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <winsock.h>
|
||||
#pragma comment(lib,"ws2_32")
|
||||
|
||||
class WSAmanager{
|
||||
private:
|
||||
WSAData data;
|
||||
public:
|
||||
WSAmanager(){
|
||||
WSAStartup(0x1010,&data);
|
||||
}
|
||||
~WSAmanager(){
|
||||
WSACleanup();
|
||||
}
|
||||
};
|
||||
|
||||
static WSAmanager win;
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
extern "C" nasal_ref nas_socket(std::vector<nasal_ref>& args,nasal_gc& gc){
|
||||
if(args.size()!=3)
|
||||
return builtin_err("socket","invalid arguments");
|
||||
if(args[0].type!=vm_num || args[1].type!=vm_num || args[2].type!=vm_num)
|
||||
return builtin_err("socket","\"af\", \"type\", \"protocol\" should be number");
|
||||
int sd=socket(args[0].num(),args[1].num(),args[2].num());
|
||||
return {vm_num,(double)sd};
|
||||
}
|
||||
|
||||
extern "C" nasal_ref nas_closesocket(std::vector<nasal_ref>& args,nasal_gc& gc){
|
||||
if(args.size()!=1)
|
||||
return builtin_err("closesocket","invalid arguments");
|
||||
if(args[0].type!=vm_num)
|
||||
return builtin_err("closesocket","\"\" should be number");
|
||||
#ifdef _WIN32
|
||||
return {vm_num,(double)closesocket(args[0].num())};
|
||||
#else
|
||||
return {vm_num,(double)close(args[0].num())};
|
||||
#endif
|
||||
}
|
Loading…
Reference in New Issue