10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * CDDL HEADER START
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The contents of this file are subject to the terms of the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Common Development and Distribution License (the "License").
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * You may not use this file except in compliance with the License.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * or http://www.opensolaris.org/os/licensing.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * See the License for the specific language governing permissions
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * and limitations under the License.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * When distributing Covered Code, include this CDDL HEADER in each
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If applicable, add the following below this CDDL HEADER, with the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * fields enclosed by brackets "[]" replaced with your own identifying
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * information: Portions Copyright [yyyy] [name of copyright owner]
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * CDDL HEADER END
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Use is subject to license terms.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * dosys.cc
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Execute one commandline
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Included files
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <fcntl.h> /* open() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mk/defs.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mksh/dosys.h> /* doshell(), doexec() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mksh/misc.h> /* getmem() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <sys/stat.h> /* open() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <unistd.h> /* getpid() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Defined macros
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * typedefs & structs
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic int filter_file;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic char *filter_file_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * File table of contents
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void redirect_stderr(void);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * dosys(command, ignore_error, call_make, silent_error, target)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Check if command string contains meta chars and dispatch to
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * the proper routine for executing one command line.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Indicates if the command execution failed
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * command The command to run
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * ignore_error Should make abort when an error is seen?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * call_make Did command reference $(MAKE) ?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * silent_error Should error messages be suppressed for pmake?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target Target we are building
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * do_not_exec_rule Is -n on?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * working_on_targets We started processing real targets
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard LoweDoname
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowedosys(register Name command, register Boolean ignore_error, register Boolean call_make, Boolean silent_error, Boolean always_exec, Name target)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe timestruc_t before;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register int length = command->hash.length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring wcb(command);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register wchar_t *p = wcb.get_string();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register wchar_t *q;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Doname result;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Strip spaces from head of command string */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (iswspace(*p)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p++, length--;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (*p == (int) nul_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return build_failed;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* If we are faking it we just return */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (do_not_exec_rule &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe working_on_targets &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe !call_make &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe !always_exec) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return build_ok;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* no_action_was_taken is used to print special message */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe no_action_was_taken = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Copy string to make it OK to write it. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe q = ALLOC_WC(length + 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) wcscpy(q, p);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Write the state file iff this command uses make. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (call_make && command_changed) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe write_state_file(0, false);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe make_state->stat.time = file_no_time;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)exists(make_state);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe before = make_state->stat.time;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Run command directly if it contains no shell meta chars,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * else run it using the shell.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (await(ignore_error,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe silent_error,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wcb.get_string(),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe command->meta ?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe doshell(q, ignore_error,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe stdout_file, stderr_file, 0) :
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe doexec(q, ignore_error,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe stdout_file, stderr_file,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_path, 0),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe NULL,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe -1
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe )) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result = build_ok;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result = build_failed;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(q);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((report_dependencies_level == 0) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe call_make) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe make_state->stat.time = file_no_time;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)exists(make_state);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (before == make_state->stat.time) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return result;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe makefile_type = reading_statefile;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (read_trace_level > 1) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe trace_reader = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe temp_file_number++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) read_simple_file(make_state,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe true);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe trace_reader = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return result;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}