"Fossies" - the Fresh Open Source Software Archive

Member "schily-2021-09-18/sunpro/Make/bin/make/common/dosys.cc" (15 Aug 2021, 4629 Bytes) of package /linux/privat/schily-2021-09-18.tar.bz2:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 /*
    2  * CDDL HEADER START
    3  *
    4  * This file and its contents are supplied under the terms of the
    5  * Common Development and Distribution License ("CDDL"), version 1.0.
    6  * You may use this file only in accordance with the terms of version
    7  * 1.0 of the CDDL.
    8  *
    9  * A full copy of the text of the CDDL should have accompanied this
   10  * source.  A copy of the CDDL is also available via the Internet at
   11  * http://www.opensource.org/licenses/cddl1.txt
   12  * See the License for the specific language governing permissions
   13  * and limitations under the License.
   14  *
   15  * When distributing Covered Code, include this CDDL HEADER in each
   16  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
   17  * If applicable, add the following below this CDDL HEADER, with the
   18  * fields enclosed by brackets "[]" replaced with your own identifying
   19  * information: Portions Copyright [yyyy] [name of copyright owner]
   20  *
   21  * CDDL HEADER END
   22  */
   23 /*
   24  * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
   25  * Use is subject to license terms.
   26  */
   27 /*
   28  * @(#)dosys.cc 1.45 06/12/12
   29  */
   30 
   31 #pragma ident   "@(#)dosys.cc   1.45    06/12/12"
   32 
   33 /*
   34  * Copyright 2017-2018 J. Schilling
   35  *
   36  * @(#)dosys.cc 1.5 21/08/15 2017-2018 J. Schilling
   37  */
   38 #include <schily/mconfig.h>
   39 #ifndef lint
   40 static  UConst char sccsid[] =
   41     "@(#)dosys.cc   1.5 21/08/15 2017-2018 J. Schilling";
   42 #endif
   43 
   44 /*
   45  *  dosys.cc
   46  *
   47  *  Execute one commandline
   48  */
   49 
   50 /*
   51  * Included files
   52  */
   53 #include <mk/defs.h>
   54 #include <mksh/dosys.h>     /* doshell(), doexec() */
   55 #include <mksh/misc.h>      /* getmem() */
   56 
   57 /*
   58  * Defined macros
   59  */
   60 
   61 /*
   62  * typedefs & structs
   63  */
   64 
   65 /*
   66  * Static variables
   67  */
   68 static  int     filter_file;
   69 static  char        *filter_file_name;
   70 
   71 /*
   72  * File table of contents
   73  */
   74 static  void        redirect_stderr(void);
   75 
   76 /*
   77  *  dosys(command, ignore_error, call_make, silent_error, target)
   78  *
   79  *  Check if command string contains meta chars and dispatch to
   80  *  the proper routine for executing one command line.
   81  *
   82  *  Return value:
   83  *              Indicates if the command execution failed
   84  *
   85  *  Parameters:
   86  *      command     The command to run
   87  *      ignore_error    Should make abort when an error is seen?
   88  *      call_make   Did command reference $(MAKE) ?
   89  *      silent_error    Should error messages be suppressed for pmake?
   90  *      target      Target we are building
   91  *
   92  *  Global variables used:
   93  *      do_not_exec_rule Is -n on?
   94  *      working_on_targets We started processing real targets
   95  */
   96 Doname
   97 dosys(register Name command, register Boolean ignore_error, register Boolean call_make, Boolean silent_error, Boolean always_exec, Name target, Boolean redirect_out_err)
   98 {
   99     timestruc_t     before;
  100     register int        length = command->hash.length;
  101     Wstring         wcb(command);
  102     register wchar_t    *p = wcb.get_string();
  103     register wchar_t    *q;
  104     Doname          result;
  105 
  106     /* Strip spaces from head of command string */
  107     while (iswspace(*p)) {
  108         p++, length--;
  109     }
  110     if (*p == (int) nul_char) {
  111         return build_failed;
  112     }
  113     /* If we are faking it we just return */
  114     if (do_not_exec_rule &&
  115         working_on_targets &&
  116         !call_make &&
  117         !always_exec) {
  118         return build_ok;
  119     }
  120     /* no_action_was_taken is used to print special message */
  121     no_action_was_taken = false;
  122 
  123     /* Copy string to make it OK to write it. */
  124     q = ALLOC_WC(length + 1);
  125     (void) wcscpy(q, p);
  126     /* Write the state file iff this command uses make. */
  127     if (call_make && command_changed) {
  128         write_state_file(0, false);
  129     }
  130     make_state->stat.time = file_no_time;
  131     (void)exists(make_state);
  132     before = make_state->stat.time;
  133     /*
  134      * Run command directly if it contains no shell meta chars,
  135      * else run it using the shell.
  136      */
  137     if (await(ignore_error,
  138           silent_error,
  139           target,
  140           wcb.get_string(),
  141                   command->meta ?
  142                 doshell(q, ignore_error, redirect_out_err,
  143                 stdout_file, stderr_file, 0) :
  144                 doexec(q, ignore_error, redirect_out_err,
  145                stdout_file, stderr_file,
  146                        vroot_path, 0),
  147               send_mtool_msgs,
  148 #if defined(DISTRIBUTED) || defined(MAKETOOL) /* tolik */
  149                   get_xdrs_ptr(),
  150                   get_job_msg_id()
  151 #else
  152                   NULL,
  153                   -1
  154 #endif
  155               )) {
  156         result = build_ok;
  157     } else {
  158         result = build_failed;
  159     }
  160     retmem(q);
  161 
  162     if ((report_dependencies_level == 0) &&
  163         call_make) {
  164         make_state->stat.time = file_no_time;
  165         (void)exists(make_state);
  166         if (before == make_state->stat.time) {
  167             return result;
  168         }
  169         makefile_type = reading_statefile;
  170         if (read_trace_level > 1) {
  171             trace_reader = true;
  172         }
  173         temp_file_number++;
  174         (void) read_simple_file(make_state,
  175                     false,
  176                     false,
  177                     false,
  178                     false,
  179                     false,
  180                     true);
  181         trace_reader = false;
  182     }
  183     return result;
  184 }