diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2010-07-16 13:09:56 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2010-07-16 13:09:56 +0300 |
commit | bc70de7b3302d5a81515b901cae376b8b51d2004 (patch) | |
tree | d36d6743e65697f6923b79d0ea8f9f9bf4ef7398 /extension/fork.c | |
parent | b9e4a1fd4c8c8753ab8a9887bab55f03efe1e3e2 (diff) | |
download | egawk-bc70de7b3302d5a81515b901cae376b8b51d2004.tar.gz egawk-bc70de7b3302d5a81515b901cae376b8b51d2004.tar.bz2 egawk-bc70de7b3302d5a81515b901cae376b8b51d2004.zip |
Move to gawk-3.1.0.
Diffstat (limited to 'extension/fork.c')
-rw-r--r-- | extension/fork.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/extension/fork.c b/extension/fork.c new file mode 100644 index 00000000..038a1689 --- /dev/null +++ b/extension/fork.c @@ -0,0 +1,106 @@ +/* + * fork.c - Provide fork and waitpid functions for gawk. + */ + +/* + * Copyright (C) 2001 the Free Software Foundation, Inc. + * + * This file is part of GAWK, the GNU implementation of the + * AWK Programming Language. + * + * GAWK is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * GAWK is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "awk.h" +#include <sys/wait.h> + +/* do_fork --- provide dynamically loaded fork() builtin for gawk */ + +static NODE * +do_fork(tree) +NODE *tree; +{ + int ret = -1; + NODE **aptr; + + if (do_lint && tree->param_cnt > 0) + lintwarn("fork: called with too many arguments"); + + ret = fork(); + + if (ret < 0) + update_ERRNO(); + else if (ret == 0) { + /* update PROCINFO in the child */ + + aptr = assoc_lookup(PROCINFO_node, tmp_string("pid", 3), FALSE); + (*aptr)->numbr = (AWKNUM) getpid(); + + aptr = assoc_lookup(PROCINFO_node, tmp_string("ppid", 4), FALSE); + (*aptr)->numbr = (AWKNUM) getppid(); + } + + /* Set the return value */ + set_value(tmp_number((AWKNUM) ret)); + + /* Just to make the interpreter happy */ + return tmp_number((AWKNUM) 0); +} + + +/* do_waitpid --- provide dynamically loaded waitpid() builtin for gawk */ + +static NODE * +do_waitpid(tree) +NODE *tree; +{ + NODE *pidnode; + int ret = -1; + double pidval; + pid_t pid; + int options = 0; + + if (do_lint && tree->param_cnt > 1) + lintwarn("waitpid: called with too many arguments"); + + pidnode = get_argument(tree, 0); + if (pidnode != NULL) { + pidval = force_number(pidnode); + pid = (int) pidval; + options = WNOHANG|WUNTRACED; + ret = waitpid(pid, NULL, options); + if (ret < 0) + update_ERRNO(); + } else if (do_lint) + lintwarn("wait: called with no arguments"); + + /* Set the return value */ + set_value(tmp_number((AWKNUM) ret)); + + /* Just to make the interpreter happy */ + return tmp_number((AWKNUM) 0); +} + +/* dlload --- load new builtins in this library */ + +NODE * +dlload(tree, dl) +NODE *tree; +void *dl; +{ + make_builtin("fork", do_fork, 0); + make_builtin("waitpid", do_waitpid, 1); + return tmp_number((AWKNUM) 0); +} |