summaryrefslogtreecommitdiffstats
path: root/usr.bin/make/job.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/make/job.c')
-rw-r--r--usr.bin/make/job.c57
1 files changed, 36 insertions, 21 deletions
diff --git a/usr.bin/make/job.c b/usr.bin/make/job.c
index 50571e4..8dfda98 100644
--- a/usr.bin/make/job.c
+++ b/usr.bin/make/job.c
@@ -166,11 +166,10 @@ static int numCommands; /* The number of commands actually printed
*/
static char tfile[sizeof(TMPPAT)];
-
/*
* Descriptions for various shells.
*/
-static Shell shells[] = {
+static const DEF_SHELL_STRUCT(CShell, const) shells[] = {
/*
* CSH description. The csh can do echo control by playing
* with the setting of the 'echo' shell variable. Sadly,
@@ -296,7 +295,7 @@ static void JobRestart(Job *);
static int JobStart(GNode *, int, Job *);
static char *JobOutput(Job *, char *, char *, int);
static void JobDoOutput(Job *, Boolean);
-static Shell *JobMatchShell(char *);
+static Shell *JobMatchShell(const char *);
static void JobInterrupt(int, int);
static void JobRestartJobs(void);
@@ -2150,7 +2149,7 @@ Shell_Init(void)
{
if (commandShell == NULL)
- commandShell = JobCopyShell(&shells[DEFSHELL]);
+ commandShell = JobMatchShell(shells[DEFSHELL].name);
if (shellPath == NULL) {
/*
@@ -2253,12 +2252,6 @@ Job_Init(int maxproc)
}
Shell_Init();
- if (commandShell->exit == NULL) {
- commandShell->exit = "";
- }
- if (commandShell->echo == NULL) {
- commandShell->echo = "";
- }
/*
* Catch the four signals that POSIX specifies if they aren't ignored.
@@ -2394,7 +2387,9 @@ Job_Empty(void)
* Find a matching shell in 'shells' given its final component.
*
* Results:
- * A pointer to the Shell structure.
+ * A pointer to a freshly allocated Shell structure with is a copy
+ * of the static structure or NULL if no shell with the given name
+ * is found.
*
* Side Effects:
* None.
@@ -2402,13 +2397,14 @@ Job_Empty(void)
*-----------------------------------------------------------------------
*/
static Shell *
-JobMatchShell(char *name)
+JobMatchShell(const char *name)
{
- Shell *sh; /* Pointer into shells table */
- Shell *match; /* Longest-matching shell */
- char *cp1,
- *cp2;
- char *eoname;
+ const struct CShell *sh; /* Pointer into shells table */
+ const struct CShell *match; /* Longest-matching shell */
+ struct Shell *nsh;
+ const char *cp1;
+ const char *cp2;
+ const char *eoname;
eoname = name + strlen(name);
@@ -2426,7 +2422,25 @@ JobMatchShell(char *name)
match = sh;
}
}
- return(match);
+ if (match == NULL)
+ return (NULL);
+
+ /* make a copy */
+ nsh = emalloc(sizeof(*nsh));
+
+ nsh->name = estrdup(match->name);
+ nsh->echoOff = estrdup(match->echoOff);
+ nsh->echoOn = estrdup(match->echoOn);
+ nsh->hasEchoCtl = match->hasEchoCtl;
+ nsh->noPrint = estrdup(match->noPrint);
+ nsh->noPLen = match->noPLen;
+ nsh->hasErrCtl = match->hasErrCtl;
+ nsh->errCheck = estrdup(match->errCheck);
+ nsh->ignErr = estrdup(match->ignErr);
+ nsh->echo = estrdup(match->echo);
+ nsh->exit = estrdup(match->exit);
+
+ return (nsh);
}
/*-
@@ -2480,7 +2494,8 @@ Job_ParseShell(char *line)
char **argv;
int argc;
char *path;
- Shell newShell, *sh;
+ Shell newShell;
+ Shell *sh;
Boolean fullSpec = FALSE;
while (isspace((unsigned char) *line)) {
@@ -2585,13 +2600,13 @@ Job_ParseShell(char *line)
return (FAILURE);
}
} else {
- sh = &newShell;
+ sh = JobCopyShell(&newShell);
}
}
/* set the new shell */
JobFreeShell(commandShell);
- commandShell = JobCopyShell(sh);
+ commandShell = sh;
shellName = commandShell->name;
OpenPOWER on IntegriCloud