xec.c revision 1
1N/A/*********************************************************************** 1N/A* This software is part of the ast package * 1N/A* Copyright (c) 1982-2011 AT&T Intellectual Property * 1N/A* and is licensed under the * 1N/A* Common Public License, Version 1.0 * 1N/A* by AT&T Intellectual Property * 1N/A* A copy of the License is available at * 1N/A* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 1N/A* Information and Software Systems Research * 1N/A* David Korn <dgk@research.att.com> * 1N/A***********************************************************************/ 1N/A * UNIX shell parse tree executer 1N/A * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. 1N/A#
endif /* _lib_nice */ 1N/A#
endif /* !_lib_spawnveg */ 1N/A#
endif /* SHOPT_SPAWN */ 1N/A/* ======== command execution ========*/ 1N/A * The following two functions allow command substituion for non-builtins 1N/A * to use a pipe and to wait for the pipe to close before restoring to a 1N/A * print time <t> in h:m:s format with precision <p> 1N/A if(c>=
'0' && c <=
'9')
1N/A p = (c>
'3')?
3:(c-
'0');
1N/A d =
100.*(((
double)(
tm[
1]+
tm[
2]))/d);
1N/A * clear argument pointers that point into the stack 1N/A /* call builtin to cleanup state */ 1N/A#
endif /* SHOPT_OPTIMIZE */ 1N/A case '<':
case '>':
case ';':
1N/A case '$':
case '`':
case '\t':
1N/A * this is for a debugger but it hasn't been tested yet 1N/A * if a debug script sets .sh.level it should set up the scope 1N/A * as if you were executing in that level 1N/A /* perhaps this should be an error */ 1N/A * write the current command on the stack and make it available as .sh.command 1N/A /* now setup .sh.level variable */ 1N/A * Given stream <iop> compile and execute 1N/A * returns 1 when option -<c> is specified 1N/A * set ${.sh.name} and ${.sh.subscript} 1N/A * set _ to reference for ${.sh.name}[$.sh.subscript] 1N/A#
endif /* SHOPT_NAMESPACE */ 1N/A#
endif /* SHOPT_NAMESPACE */ 1N/A * print out function definition 1N/A sh_trap(
"typeset -p\nprint cd \"$PWD\"\nprint .sh.dollar=$$\nprint umask $(umask)",0);
1N/A#
endif /*SHOPT_COSHELL*/ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A#
endif /* SHOPT_NAMESPACE */ 1N/A#
endif /* SHOPT_PFSH */ 1N/A#
endif /* SHOPT_NAMESPACE */ 1N/A#
endif /* SHOPT_TYPEDEF */ 1N/A /* fake 'true' built-in */ 1N/A /* set +x doesn't echo */ 1N/A#
endif /* SHOPT_NAMESPACE */ 1N/A /* check for builtins */ 1N/A * disable editors for built-in 1N/A * versions of commands on PATH 1N/A /* do close-on-exec */ 1N/A /* failure on special built-ins fatal */ 1N/A /* restore directory changed */ 1N/A /* don't restore for subshell exec */ 1N/A /* check for functions */ 1N/A#
endif /* SHOPT_NAMESPACE */ 1N/A /* increase refcnt for unset */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A /* disable foreground job monitor */ 1N/A#
endif /* SHOPT_DEVFD */ 1N/A#
endif /* SHOPT_BGX */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A#
endif /* _lib_fork */ 1N/A#
endif /* SHOPT_SPAWN */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A /* This is the parent branch of fork 1N/A * It may or may not wait for the child 1N/A /* print job number */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A * this is the FORKED branch (child) of execute 1N/A /* default std input for & */ 1N/A /* pipe in or out */ 1N/A#
endif /* _lib_nice */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A /* don't clear job table for out 1N/A pipes so that jobs comand can 1N/A be used in a pipeline 1N/A * don't create a new process, just 1N/A * save and restore io-streams 1N/A#
endif /*SHOPT_COSHELL */ 1N/A * if read end of pipe is a simple command 1N/A * treat as non-sharable to improve performance 1N/A /* wait for remainder of pipline */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A * This code sets up a pipe. 1N/A * All elements of the pipe are started by the parent. 1N/A * The last element executes in current environment 1N/A int pvo[
3];
/* old pipe for multi-stage */ 1N/A int pvn[
3];
/* current set up pipe */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A /* create the pipe */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A /* execute out part of pipe no wait */ 1N/A /* close out-part of pipe */ 1N/A /* save the pipe stream-ids */ 1N/A /* pipeline all in one process group */ 1N/A /* repeat until end of pipeline */ 1N/A * execute last element of pipeline 1N/A * in the current process 1N/A /* execution failure, close pipe */ 1N/A /* a list of commands are executed here */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A#
endif /* SHOPT_OPTIMIZE */ 1N/A /* reuse register */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A#
endif /*SHOPT_OPTIMIZE */ 1N/A case TWH:
/* while and until */ 1N/A#
endif /*SHOPT_FILESCAN*/ 1N/A#
endif /* SHOPT_OPTIMIZE */ 1N/A#
endif /* SHOPT_FILESCAN */ 1N/A#
endif /*SHOPT_COSHELL */ 1N/A#
endif /* SHOPT_OPTIMIZE */ 1N/A#
endif /*SHOPT_FILESCAN */ 1N/A#
endif /*SHOPT_FILESCAN */ 1N/A /* This is for the arithmetic for */ 1N/A#
endif /*SHOPT_FILESCAN */ 1N/A#
endif /*SHOPT_OPTIMIZE */ 1N/A#
endif /*SHOPT_FILESCAN */ 1N/A#
endif /*SHOPT_COSHELL */ 1N/A#
endif /*SHOPT_COSHELL */ 1N/A while(*s==
'\\' && s[
1]==0)
1N/A /* time the command */ 1N/A#
endif /* timeofday */ 1N/A#
endif /*SHOPT_COSHELL */ 1N/A#
endif /* timeofday */ 1N/A#
endif /* timeofday */ 1N/A#
endif /* timeofday */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A#
endif /* SHOPT_NAMESPACE */ 1N/A /* look for discipline functions */ 1N/A /* Function names cannot be special builtin */ 1N/A#
endif /* SHOPT_NAMESPACE */ 1N/A /* new test compound command */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A /* store last argument here if it fits */ 1N/A#
endif /* SHOPT_COSHELL */ 1N/A * test for equality with second argument trimmed 1N/A * returns 1 if r == trim(s) otherwise 0 1N/Astatic int trim_eq(
register const char *r,
register const char *s)
1N/A * print out the command line if set -x is on 1N/A /* make this trace atomic */ 1N/A /* don't quote [ and [[ */ 1N/A * This routine creates a subshell by calling fork() or vfork() 1N/A * If ((flags&COMASK)==TCOM), then vfork() is permitted 1N/A * If fork fails, the shell sleeps for exponentially longer periods 1N/A * and tries again until a limit is reached. 1N/A * SH_FORKLIM is the max period between forks - power of 2 usually. 1N/A * Currently shell tries after 2,4,8,16, and 32 seconds and then quits 1N/A * Failures cause the routine to error exit. 1N/A * Parent links to here-documents are removed by the child 1N/A * Traps are reset by the child 1N/A * The process-id of the child is returned to the parent, 0 to the child. 1N/A * called by parent and child after fork by sh_fork() 1N/A /* first process defines process group */ 1N/A * errno==EPERM means that an earlier processes 1N/A * completed. Make parent the job group id. 1N/A#
endif /* SHOPT_BGX */ 1N/A /* This is the child process */ 1N/A#
endif /* SIGTSTP */ 1N/A#
endif /* SIGTSTP */ 1N/A#
endif /* SHOPT_ACCT */ 1N/A /* Reset remaining signals to parent */ 1N/A /* except for those `lost' by trap */ 1N/A * add exports from previous scope to the new scope 1N/A * This routine executes .sh.math functions from within ((...))) 1N/A * This routine is used to execute the given function <fun> in a new scope 1N/A * If <fun> is NULL, then arg points to a structure containing a pointer 1N/A * to a function that will be executed in the current environment. 1N/A#
endif /* SHOPT_NAMESPACE */ 1N/A#
endif /* SHOPT_NAMESPACE */ 1N/A /* eliminate parent scope */ 1N/A /* save trap table */ 1N/A * external interface to execute a function without arguments 1N/A * <np> is the function node 1N/A * If <nq> is not-null, then sh.name and sh.subscript will be set 1N/A * This dummy routine is called by built-ins that do recursion 1N/A * on the file system (chmod, chgrp, chown). It causes 1N/A * the shell to invoke the non-builtin version in this case 1N/A * set up pipe for cooperating process 1N/A /* first co-process */ 1N/A * create a shell script consisting of t->fork.forktre and execute it 1N/A static const char prolog[] =
"(print $(typeset +A);set; typeset -p; print .sh.dollar=$$;set +o)";
1N/A /* pass the positional parameters */ 1N/A for(i=
3; i <
10; i++)
1N/A for(i=
3; i <
10; i++)
1N/A#
endif /* !_lib_fork */ 1N/A * A combined fork/exec for systems with slow or non-existent fork() 1N/A#
endif /* SHOPT_COSHELL */ 1N/A#
endif /* !_lib_fork */ 1N/A /* find first path that has a library component */ 1N/A#
endif /* SIGTSTP */ 1N/A#
endif /* _lib_fork */ 1N/A#
endif /* SHOPT_SPAWN */