aboutsummaryrefslogtreecommitdiffstats
path: root/extension/fork.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2012-05-09 20:31:35 +0300
committerArnold D. Robbins <arnold@skeeve.com>2012-05-09 20:31:35 +0300
commita59319732d89feda419acab674ea580c95db7d4a (patch)
tree3d30595e8f50cb1b486c9f61f93a498834c22842 /extension/fork.c
parent8ff0b4eaa7592280b5a55087c0326c6ef1f88db5 (diff)
parentc41908d0b02f7746a67ab7aa2e54058e5b66439a (diff)
downloadegawk-a59319732d89feda419acab674ea580c95db7d4a.tar.gz
egawk-a59319732d89feda419acab674ea580c95db7d4a.tar.bz2
egawk-a59319732d89feda419acab674ea580c95db7d4a.zip
Merge branch 'xgawk'
Diffstat (limited to 'extension/fork.c')
-rw-r--r--extension/fork.c32
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);
}