🚀 add module/libsock.nas, preparing to add socket lib into this language.

This commit is contained in:
ValKmjolnir 2022-06-06 16:34:21 +08:00
parent a2e2d5d8f6
commit 53b85cd459
4 changed files with 90 additions and 6 deletions

View File

@ -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;

37
module/libsock.nas Normal file
View File

@ -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);
}
};
}();

View File

@ -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

43
module/nasocket.cpp Normal file
View File

@ -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
}