summaryrefslogtreecommitdiff
path: root/usr/src/make_src/Make/lib/mksh/src/mksh.cc
diff options
context:
space:
mode:
authorIgor Pashev <igor.pashev@nexenta.com>2012-06-29 14:36:07 +0400
committerIgor Pashev <igor.pashev@nexenta.com>2012-06-29 14:36:07 +0400
commite0463df9c3d2ee6155221cc443c571d5da47098a (patch)
tree5c6b99e64c1b65d986e2722728c74f202a578be6 /usr/src/make_src/Make/lib/mksh/src/mksh.cc
downloadsunmake-orig.tar.gz
Initial import of DevPro make sourcesorig
Downloaded from http://dlc.sun.com/osol/devpro/downloads/current/ Licensed under CDDL http://www.opensource.org/licenses/CDDL-1.0
Diffstat (limited to 'usr/src/make_src/Make/lib/mksh/src/mksh.cc')
-rw-r--r--usr/src/make_src/Make/lib/mksh/src/mksh.cc286
1 files changed, 286 insertions, 0 deletions
diff --git a/usr/src/make_src/Make/lib/mksh/src/mksh.cc b/usr/src/make_src/Make/lib/mksh/src/mksh.cc
new file mode 100644
index 0000000..98c9601
--- /dev/null
+++ b/usr/src/make_src/Make/lib/mksh/src/mksh.cc
@@ -0,0 +1,286 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * @(#)mksh.cc 1.22 06/12/12
+ */
+
+#pragma ident "@(#)mksh.cc 1.22 06/12/12"
+
+/*
+ * mksh.cc
+ *
+ * Execute the command(s) of one Make or DMake rule
+ */
+
+/*
+ * Included files
+ */
+#if defined(TEAMWARE_MAKE_CMN) || defined(MAKETOOL) /* tolik */
+# include <avo/util.h>
+#endif
+
+#include <mksh/dosys.h> /* redirect_io() */
+#include <mksh/misc.h> /* retmem() */
+#include <mksh/mksh.h>
+#include <mksdmsi18n/mksdmsi18n.h>
+#include <errno.h>
+#include <signal.h>
+
+#ifdef HP_UX
+ extern void (*sigset(int, void (*)(__harg)))(__harg);
+#endif
+
+/*
+ * Workaround for NFS bug. Sometimes, when running 'chdir' on a remote
+ * dmake server, it fails with "Stale NFS file handle" error.
+ * The second attempt seems to work.
+ */
+int
+my_chdir(char * dir) {
+ int res = chdir(dir);
+ if (res != 0 && (errno == ESTALE || errno == EAGAIN)) {
+ /* Stale NFS file handle. Try again */
+ res = chdir(dir);
+ }
+ return res;
+}
+
+
+/*
+ * File table of contents
+ */
+static void change_sunpro_dependencies_value(char *oldpath, char *newpath);
+static void init_mksh_globals(char *shell);
+static void set_env_vars(char *env_list[]);
+
+#if defined(DISTRIBUTED) || defined(MAKETOOL) /* tolik */
+/*
+ * Execute the command(s) of one Make or DMake rule
+ */
+int
+do_job(Avo_DmakeCommand *cmd_list[], char *env_list[], char *stdout_file, char *stderr_file, char *cwd, char *cnwd, int ignore, int silent, pathpt vroot_path, char *shell, int nice_prio)
+{
+ Boolean always_exec_flag;
+ char *cmd;
+ Avo_DmakeCommand **cmd_list_p;
+ Name command;
+ Boolean do_not_exec_flag;
+ Boolean ignore_flag;
+ int length;
+ Boolean make_refd_flag;
+ Boolean meta_flag;
+ char pathname[MAXPATHLEN];
+ Doname result;
+ Boolean silent_flag;
+ wchar_t *tmp_wcs_buffer;
+
+ if ((childPid = fork()) < 0) { /* error */
+ ;
+ } else if (childPid > 0) { /* parent */
+ ;
+ } else { /* child, mksh */
+ (void) sigset(SIGCHLD, SIG_DFL);
+ enable_interrupt(handle_interrupt_mksh);
+ /* set environment variables */
+ set_env_vars(env_list);
+ /* redirect stdout and stderr to temp files */
+ dup2(1, 2); // Because fatal_mksh() prints error messages into
+ // stderr but dmake uses stderr for XDR communications
+ // and stdout for errors messages.
+ redirect_io(stdout_file, stderr_file);
+ /* try cd'ing to cwd */
+ if (my_chdir(cwd) != 0) {
+ /* try the netpath machine:pathname */
+ if (!avo_netpath_to_path(cnwd, pathname)) {
+ fatal_mksh(catgets(libmksdmsi18n_catd, 1, 137, "`cd %s' failed, and conversion of %s to automounter pathname also failed: %s"), cwd, cnwd, strerror(errno));
+ } else if (my_chdir(pathname) != 0) {
+ fatal_mksh(catgets(libmksdmsi18n_catd, 1, 138, "`cd %s' and `cd %s' both failed: %s"), cwd, pathname, strerror(errno));
+ }
+ /*
+ * change the value of SUNPRO_DEPENDENCIES
+ * to the new path.
+ */
+ change_sunpro_dependencies_value(cwd, pathname);
+ }
+ init_mksh_globals(shell);
+ for (cmd_list_p = cmd_list;
+ *cmd_list_p != (Avo_DmakeCommand *) NULL;
+ cmd_list_p++) {
+ if ((*cmd_list_p)->ignore()) {
+ ignore_flag = true;
+ } else {
+ ignore_flag = false;
+ }
+ if ((*cmd_list_p)->silent()) {
+ silent_flag = true;
+ } else {
+ silent_flag = false;
+ }
+/*
+ if ((*cmd_list_p)->always_exec()) {
+ always_exec_flag = true;
+ } else {
+ always_exec_flag = false;
+ }
+ */
+ always_exec_flag = false;
+ if ((*cmd_list_p)->meta()) {
+ meta_flag = true;
+ } else {
+ meta_flag = false;
+ }
+ if ((*cmd_list_p)->make_refd()) {
+ make_refd_flag = true;
+ } else {
+ make_refd_flag = false;
+ }
+ if ((*cmd_list_p)->do_not_exec()) {
+ do_not_exec_flag = true;
+ } else {
+ do_not_exec_flag = false;
+ }
+ do_not_exec_rule = do_not_exec_flag;
+ cmd = (*cmd_list_p)->getCmd();
+ if ((length = strlen(cmd)) >= MAXPATHLEN) {
+ tmp_wcs_buffer = ALLOC_WC(length + 1);
+ (void) mbstowcs(tmp_wcs_buffer, cmd, length + 1);
+ command = GETNAME(tmp_wcs_buffer, FIND_LENGTH);
+ retmem(tmp_wcs_buffer);
+ } else {
+ MBSTOWCS(wcs_buffer, cmd);
+ command = GETNAME(wcs_buffer, FIND_LENGTH);
+ }
+ if ((command->hash.length > 0) &&
+ (!silent_flag || do_not_exec_flag)) {
+ (void) printf("%s\n", command->string_mb);
+ }
+ result = dosys_mksh(command,
+ ignore_flag,
+ make_refd_flag,
+ false, /* bugs #4085164 & #4990057 */
+ /* BOOLEAN(silent_flag && ignore_flag), */
+ always_exec_flag,
+ (Name) NULL,
+ false,
+ NULL,
+ NULL,
+ vroot_path,
+ nice_prio);
+ if (result == build_failed) {
+
+#ifdef PRINT_EXIT_STATUS
+ warning_mksh(NOCATGETS("I'm in do_job(), and dosys_mksh() returned result of build_failed."));
+#endif
+
+ if (silent_flag) {
+ (void) printf(catgets(libmksdmsi18n_catd, 1, 139, "The following command caused the error:\n%s\n"),
+ command->string_mb);
+ }
+ if (!ignore_flag && !ignore) {
+
+#ifdef PRINT_EXIT_STATUS
+ warning_mksh(NOCATGETS("I'm in do_job(), and dosys_mksh() returned result of build_failed, exiting 1."));
+#endif
+
+ exit(1);
+ }
+ }
+ }
+
+#ifdef PRINT_EXIT_STATUS
+ warning_mksh(NOCATGETS("I'm in do_job(), exiting 0."));
+#endif
+
+ exit(0);
+ }
+ return childPid;
+}
+#endif /* TEAMWARE_MAKE_CMN */
+
+static void
+set_env_vars(char *env_list[])
+{
+ char **env_list_p;
+
+ for (env_list_p = env_list;
+ *env_list_p != (char *) NULL;
+ env_list_p++) {
+ putenv(*env_list_p);
+ }
+}
+
+static void
+init_mksh_globals(char *shell)
+{
+/*
+ MBSTOWCS(wcs_buffer, NOCATGETS("SHELL"));
+ shell_name = GETNAME(wcs_buffer, FIND_LENGTH);
+ MBSTOWCS(wcs_buffer, shell);
+ (void) SETVAR(shell_name, GETNAME(wcs_buffer, FIND_LENGTH), false);
+ */
+ char * dmake_shell;
+ if ((dmake_shell = getenv(NOCATGETS("DMAKE_SHELL"))) == NULL) {
+ dmake_shell = shell;
+ }
+ MBSTOWCS(wcs_buffer, dmake_shell);
+ shell_name = GETNAME(wcs_buffer, FIND_LENGTH);
+}
+
+/*
+ * Change the pathname in the value of the SUNPRO_DEPENDENCIES env variable
+ * from oldpath to newpath.
+ */
+static void
+change_sunpro_dependencies_value(char *oldpath, char *newpath)
+{
+ char buf[MAXPATHLEN];
+ static char *env;
+ int length;
+ int oldpathlen;
+ char *sp_dep_value;
+
+ /* check if SUNPRO_DEPENDENCIES is set in the environment */
+ if ((sp_dep_value = getenv(NOCATGETS("SUNPRO_DEPENDENCIES"))) != NULL) {
+ oldpathlen = strlen(oldpath);
+ /* check if oldpath is indeed in the value of SUNPRO_DEPENDENCIES */
+ if (strncmp(oldpath, sp_dep_value, oldpathlen) == 0) {
+ (void) sprintf(buf,
+ "%s%s",
+ newpath,
+ sp_dep_value + oldpathlen);
+ length = 2 +
+ strlen(NOCATGETS("SUNPRO_DEPENDENCIES")) +
+ strlen(buf);
+ env = getmem(length);
+ (void) sprintf(env,
+ "%s=%s",
+ NOCATGETS("SUNPRO_DEPENDENCIES"),
+ buf);
+ (void) putenv(env);
+ }
+ }
+}
+
+