add unix.waitpid
This commit is contained in:
parent
c4d52a88cd
commit
e6457651d3
2
lib.nas
2
lib.nas
|
@ -277,7 +277,7 @@ var unix=
|
||||||
fork: func(){return __builtin_fork;},
|
fork: func(){return __builtin_fork;},
|
||||||
dup2: func(fd0,fd1){die("not supported yet");},
|
dup2: func(fd0,fd1){die("not supported yet");},
|
||||||
exec: func(filename,argv,envp){die("not supported yet");},
|
exec: func(filename,argv,envp){die("not supported yet");},
|
||||||
waitpid: func(pid,nohang=0){die("not supported yet");},
|
waitpid: func(pid,nohang=0){return __builtin_waitpid;},
|
||||||
isdir: func(path){return bits.bitand(io.stat(path)[2],0x4000);}, # S_IFDIR 0x4000
|
isdir: func(path){return bits.bitand(io.stat(path)[2],0x4000);}, # S_IFDIR 0x4000
|
||||||
isfile: func(path){return bits.bitand(io.stat(path)[2],0x8000);}, # S_IFREG 0x8000
|
isfile: func(path){return bits.bitand(io.stat(path)[2],0x8000);}, # S_IFREG 0x8000
|
||||||
opendir: func(path){return __builtin_opendir;},
|
opendir: func(path){return __builtin_opendir;},
|
||||||
|
|
1
nasal.h
1
nasal.h
|
@ -27,6 +27,7 @@
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#else
|
#else
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
inline double hex_to_double(const char* str)
|
inline double hex_to_double(const char* str)
|
||||||
|
|
|
@ -67,6 +67,7 @@ nas_native(builtin_buf);
|
||||||
nas_native(builtin_sleep);
|
nas_native(builtin_sleep);
|
||||||
nas_native(builtin_pipe);
|
nas_native(builtin_pipe);
|
||||||
nas_native(builtin_fork);
|
nas_native(builtin_fork);
|
||||||
|
nas_native(builtin_waitpid);
|
||||||
nas_native(builtin_opendir);
|
nas_native(builtin_opendir);
|
||||||
nas_native(builtin_readdir);
|
nas_native(builtin_readdir);
|
||||||
nas_native(builtin_closedir);
|
nas_native(builtin_closedir);
|
||||||
|
@ -153,6 +154,7 @@ struct
|
||||||
{"__builtin_sleep", builtin_sleep },
|
{"__builtin_sleep", builtin_sleep },
|
||||||
{"__builtin_pipe", builtin_pipe },
|
{"__builtin_pipe", builtin_pipe },
|
||||||
{"__builtin_fork", builtin_fork },
|
{"__builtin_fork", builtin_fork },
|
||||||
|
{"__builtin_waitpid", builtin_waitpid },
|
||||||
{"__builtin_opendir", builtin_opendir },
|
{"__builtin_opendir", builtin_opendir },
|
||||||
{"__builtin_readdir", builtin_readdir },
|
{"__builtin_readdir", builtin_readdir },
|
||||||
{"__builtin_closedir",builtin_closedir},
|
{"__builtin_closedir",builtin_closedir},
|
||||||
|
@ -963,14 +965,34 @@ nasal_ref builtin_pipe(nasal_ref* local,nasal_gc& gc)
|
||||||
res.vec().elems.push_back({vm_num,(double)fd[1]});
|
res.vec().elems.push_back({vm_num,(double)fd[1]});
|
||||||
return res;
|
return res;
|
||||||
#endif
|
#endif
|
||||||
return builtin_err("pipe","not supported yet");
|
return builtin_err("pipe","not supported for windows platform");
|
||||||
}
|
}
|
||||||
nasal_ref builtin_fork(nasal_ref* local,nasal_gc& gc)
|
nasal_ref builtin_fork(nasal_ref* local,nasal_gc& gc)
|
||||||
{
|
{
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
return {vm_num,(double)fork()};
|
double res=fork();
|
||||||
|
if(res<0)
|
||||||
|
return builtin_err("fork","failed to fork a process");
|
||||||
|
return {vm_num,(double)res};
|
||||||
#endif
|
#endif
|
||||||
return builtin_err("fork","not supported yet");
|
return builtin_err("fork","not supported for windows platform");
|
||||||
|
}
|
||||||
|
nasal_ref builtin_waitpid(nasal_ref* local,nasal_gc& gc)
|
||||||
|
{
|
||||||
|
nasal_ref pid=local[1];
|
||||||
|
nasal_ref nohang=local[2];
|
||||||
|
if(pid.type!=vm_num || nohang.type!=vm_num)
|
||||||
|
return builtin_err("waitpid","pid and nohang must be number");
|
||||||
|
#ifndef _WIN32
|
||||||
|
int ret_pid;
|
||||||
|
int status;
|
||||||
|
ret_pid=waitpid(pid.num(),&status,nohang.num()==0?0:WNOHANG);
|
||||||
|
nasal_ref vec=gc.alloc(vm_vec);
|
||||||
|
vec.vec().elems.push_back({vm_num,(double)ret_pid});
|
||||||
|
vec.vec().elems.push_back({vm_num,(double)status});
|
||||||
|
return vec;
|
||||||
|
#endif
|
||||||
|
return builtin_err("waitpid","not supported for windows platform");
|
||||||
}
|
}
|
||||||
void obj_dir_destructor(void* ptr)
|
void obj_dir_destructor(void* ptr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -277,7 +277,7 @@ var unix=
|
||||||
fork: func(){return __builtin_fork;},
|
fork: func(){return __builtin_fork;},
|
||||||
dup2: func(fd0,fd1){die("not supported yet");},
|
dup2: func(fd0,fd1){die("not supported yet");},
|
||||||
exec: func(filename,argv,envp){die("not supported yet");},
|
exec: func(filename,argv,envp){die("not supported yet");},
|
||||||
waitpid: func(pid,nohang=0){die("not supported yet");},
|
waitpid: func(pid,nohang=0){return __builtin_waitpid;},
|
||||||
isdir: func(path){return bits.bitand(io.stat(path)[2],0x4000);}, # S_IFDIR 0x4000
|
isdir: func(path){return bits.bitand(io.stat(path)[2],0x4000);}, # S_IFDIR 0x4000
|
||||||
isfile: func(path){return bits.bitand(io.stat(path)[2],0x8000);}, # S_IFREG 0x8000
|
isfile: func(path){return bits.bitand(io.stat(path)[2],0x8000);}, # S_IFREG 0x8000
|
||||||
opendir: func(path){return __builtin_opendir;},
|
opendir: func(path){return __builtin_opendir;},
|
||||||
|
|
|
@ -23,9 +23,7 @@ var extern={
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var module={
|
var module={
|
||||||
name:nil,
|
|
||||||
new: func(name){
|
new: func(name){
|
||||||
me.name=name;
|
|
||||||
var lib=dylib.dlopen(name);
|
var lib=dylib.dlopen(name);
|
||||||
var f={};
|
var f={};
|
||||||
return {
|
return {
|
||||||
|
|
Loading…
Reference in New Issue