diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2012-05-09 20:31:35 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2012-05-09 20:31:35 +0300 |
commit | a59319732d89feda419acab674ea580c95db7d4a (patch) | |
tree | 3d30595e8f50cb1b486c9f61f93a498834c22842 /extension/fork.c | |
parent | 8ff0b4eaa7592280b5a55087c0326c6ef1f88db5 (diff) | |
parent | c41908d0b02f7746a67ab7aa2e54058e5b66439a (diff) | |
download | egawk-a59319732d89feda419acab674ea580c95db7d4a.tar.gz egawk-a59319732d89feda419acab674ea580c95db7d4a.tar.bz2 egawk-a59319732d89feda419acab674ea580c95db7d4a.zip |
Merge branch 'xgawk'
Diffstat (limited to 'extension/fork.c')
-rw-r--r-- | extension/fork.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/extension/fork.c b/extension/fork.c index 88353879..5a6e96d5 100644 --- a/extension/fork.c +++ b/extension/fork.c @@ -44,16 +44,18 @@ do_fork(int nargs) ret = fork(); if (ret < 0) - update_ERRNO(); - else if (ret == 0) { + update_ERRNO_int(errno); + else if (ret == 0 && PROCINFO_node != NULL) { /* update PROCINFO in the child */ aptr = assoc_lookup(PROCINFO_node, tmp = make_string("pid", 3)); - (*aptr)->numbr = (AWKNUM) getpid(); + unref(*aptr); + *aptr = make_number((AWKNUM) getpid()); unref(tmp); aptr = assoc_lookup(PROCINFO_node, tmp = make_string("ppid", 4)); - (*aptr)->numbr = (AWKNUM) getppid(); + unref(*aptr); + *aptr = make_number((AWKNUM) getppid()); unref(tmp); } @@ -83,7 +85,7 @@ do_waitpid(int nargs) options = WNOHANG|WUNTRACED; ret = waitpid(pid, NULL, options); if (ret < 0) - update_ERRNO(); + update_ERRNO_int(errno); } else if (do_lint) lintwarn("wait: called with no arguments"); @@ -91,6 +93,25 @@ do_waitpid(int nargs) return make_number((AWKNUM) ret); } + +/* do_wait --- provide dynamically loaded wait() builtin for gawk */ + +static NODE * +do_wait(int nargs) +{ + int ret; + + if (do_lint && nargs > 0) + lintwarn("wait: called with too many arguments"); + + ret = wait(NULL); + if (ret < 0) + update_ERRNO_int(errno); + + /* Set the return value */ + return make_number((AWKNUM) ret); +} + /* dlload --- load new builtins in this library */ NODE * @@ -100,5 +121,6 @@ void *dl; { make_builtin("fork", do_fork, 0); make_builtin("waitpid", do_waitpid, 1); + make_builtin("wait", do_wait, 0); return make_number((AWKNUM) 0); } |