diff options
Diffstat (limited to 'dmake/qssl/runargv.c')
-rw-r--r-- | dmake/qssl/runargv.c | 298 |
1 files changed, 0 insertions, 298 deletions
diff --git a/dmake/qssl/runargv.c b/dmake/qssl/runargv.c deleted file mode 100644 index c0e602ac9f3f..000000000000 --- a/dmake/qssl/runargv.c +++ /dev/null @@ -1,298 +0,0 @@ -/* RCS $Id: runargv.c,v 1.3 2007-10-15 15:46:20 ihi Exp $ --- --- SYNOPSIS --- Invoke a sub process. --- --- DESCRIPTION --- Use the standard methods of executing a sub process. --- --- AUTHOR --- Dennis Vadura, dvadura@dmake.wticorp.com --- --- WWW --- http://dmake.wticorp.com/ --- --- COPYRIGHT --- Copyright (c) 1996,1997 by WTI Corp. All rights reserved. --- --- This program is NOT free software; you can redistribute it and/or --- modify it under the terms of the Software License Agreement Provided --- in the file <distribution-root>/readme/license.txt. --- --- LOG --- Use cvs log to obtain detailed change logs. -*/ - -#include <signal.h> -#include "extern.h" -#include "sysintf.h" - -typedef struct prp { - char *prp_cmd; - int prp_group; - int prp_ignore; - int prp_last; - int prp_shell; - struct prp *prp_next; -} RCP, *RCPPTR; - -typedef struct pr { - int pr_valid; - int pr_pid; - CELLPTR pr_target; - int pr_ignore; - int pr_last; - RCPPTR pr_recipe; - RCPPTR pr_recipe_end; - char *pr_dir; -} PR; - -static PR *_procs = NIL(PR); -static int _proc_cnt = 0; -static int _abort_flg= FALSE; -static int _use_i = -1; -static int _do_upd = 0; - -static void _add_child ANSI((int, CELLPTR, int, int)); -static void _attach_cmd ANSI((char *, int, int, CELLPTR, int, int)); -static void _finished_child ANSI((int, int)); -static int _running ANSI((CELLPTR)); - -/* iz71422 changed the parameters for runargv but it (and the rest of - * qssl) got *NOT* fixed. */ -iz81252 changed the parameters for Pack_argv() and runargv() but this file -did not get fixed! -PUBLIC int -runargv(target, ignore, group, last, shell, cmd) -CELLPTR target; -int ignore; -int group; -int last; -int shell; -char *cmd; -{ - extern int errno; - int pid; - char **argv; - - if( _running(target) /*&& Max_proc != 1*/ ) { - /* The command will be executed when the previous recipe - * line completes. */ - _attach_cmd( cmd, group, ignore, target, last, shell ); - return(1); - } - - while( _proc_cnt == Max_proc ) - if( Wait_for_child(FALSE, -1) == -1 ) Fatal( "Lost a child %d", errno ); - - argv = Pack_argv( group, shell, cmd ); - - switch( pid=fork() ){ - int wid; - int status; - - case -1: /* fork failed */ - Error("%s: %s", argv[0], strerror(errno)); - Handle_result(-1, ignore, _abort_flg, target); - return(-1); - - case 0: /* child */ - execvp(argv[0], argv); - Continue = TRUE; /* survive error message */ - Error("%s: %s", argv[0], strerror(errno)); - kill(getpid(), SIGTERM); - /*NOTREACHED*/ - - default: /* parent */ - _add_child(pid, target, ignore, last); - } - - return(1); -} - - -PUBLIC int -Wait_for_child( abort_flg, pid ) -int abort_flg; -int pid; -{ - int wid; - int status; - int waitchild; - - waitchild = (pid == -1)? FALSE : Wait_for_completion; - - do { - if( (wid = wait(&status)) == -1 ) return(-1); - - _abort_flg = abort_flg; - _finished_child(wid, status); - _abort_flg = FALSE; - } - while( waitchild && pid != wid ); - - return(0); -} - - -PUBLIC void -Clean_up_processes() -{ - register int i; - - if( _procs != NIL(PR) ) { - for( i=0; i<Max_proc; i++ ) - if( _procs[i].pr_valid ) - kill(_procs[i].pr_pid, SIGTERM); - - while( Wait_for_child(TRUE, -1) != -1 ); - } -} - - -static void -_add_child( pid, target, ignore, last ) -int pid; -CELLPTR target; -int ignore; -int last; -{ - register int i; - register PR *pp; - - if( _procs == NIL(PR) ) { - TALLOC( _procs, Max_proc, PR ); - } - - if( (i = _use_i) == -1 ) - for( i=0; i<Max_proc; i++ ) - if( !_procs[i].pr_valid ) - break; - - pp = _procs+i; - - pp->pr_valid = 1; - pp->pr_pid = pid; - pp->pr_target = target; - pp->pr_ignore = ignore; - pp->pr_last = last; - pp->pr_dir = DmStrDup(Get_current_dir()); - - Current_target = NIL(CELL); - - _proc_cnt++; - - if( Wait_for_completion ) Wait_for_child( FALSE, pid ); -} - - -static void -_finished_child(pid, status) -int pid; -int status; -{ - register int i; - register PR *pp; - char *dir; - - for( i=0; i<Max_proc; i++ ) - if( _procs[i].pr_valid && _procs[i].pr_pid == pid ) - break; - - /* Some children we didn't make esp true if using /bin/sh to execute a - * a pipe and feed the output as a makefile into dmake. */ - if( i == Max_proc ) return; - _procs[i].pr_valid = 0; - _proc_cnt--; - dir = DmStrDup(Get_current_dir()); - Set_dir( _procs[i].pr_dir ); - - if( _procs[i].pr_recipe != NIL(RCP) && !_abort_flg ) { - RCPPTR rp = _procs[i].pr_recipe; - - - Current_target = _procs[i].pr_target; - Handle_result( status, _procs[i].pr_ignore, FALSE, _procs[i].pr_target ); - Current_target = NIL(CELL); - - if ( _procs[i].pr_target->ce_attr & A_ERROR ) { - _procs[i].pr_last = TRUE; - goto ABORT_REMAINDER_OF_RECIPE; - } - - _procs[i].pr_recipe = rp->prp_next; - - _use_i = i; - runargv( _procs[i].pr_target, rp->prp_ignore, rp->prp_group, - rp->prp_last, rp->prp_shell, rp->prp_cmd ); - _use_i = -1; - - FREE( rp->prp_cmd ); - FREE( rp ); - - if( _proc_cnt == Max_proc ) Wait_for_child( FALSE, -1 ); - } - else { - Handle_result(status,_procs[i].pr_ignore,_abort_flg,_procs[i].pr_target); - - ABORT_REMAINDER_OF_RECIPE: - if( _procs[i].pr_last ) { - FREE(_procs[i].pr_dir ); - - if( !Doing_bang ) Update_time_stamp( _procs[i].pr_target ); - } - } - - Set_dir(dir); - FREE(dir); -} - - -static int -_running( cp ) -CELLPTR cp; -{ - register int i; - - if( !_procs ) return(FALSE); - - for( i=0; i<Max_proc; i++ ) - if( _procs[i].pr_valid && - _procs[i].pr_target == cp ) - break; - - return( i != Max_proc ); -} - - -static void -_attach_cmd( cmd, group, ignore, cp, last, shell ) -char *cmd; -int group; -int ignore; -CELLPTR cp; -int last; -int shell; -{ - register int i; - RCPPTR rp; - - for( i=0; i<Max_proc; i++ ) - if( _procs[i].pr_valid && - _procs[i].pr_target == cp ) - break; - - TALLOC( rp, 1, RCP ); - rp->prp_cmd = DmStrDup(cmd); - rp->prp_group = group; - rp->prp_ignore= ignore; - rp->prp_last = last; - rp->prp_shell = shell; - - if( _procs[i].pr_recipe == NIL(RCP) ) - _procs[i].pr_recipe = _procs[i].pr_recipe_end = rp; - else { - _procs[i].pr_recipe_end->prp_next = rp; - _procs[i].pr_recipe_end = rp; - } -} |