summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorharti <harti@FreeBSD.org>2004-11-30 15:35:51 +0000
committerharti <harti@FreeBSD.org>2004-11-30 15:35:51 +0000
commit6a1de54fc3ff3e21e3c3b49aa1d59060f5ce2361 (patch)
tree59ddd1be197eb63917845c0e26ea757eb90892cc /usr.bin
parentc87a620e46b80034db4eb7d25d17ecdf0da14893 (diff)
downloadFreeBSD-src-6a1de54fc3ff3e21e3c3b49aa1d59060f5ce2361.zip
FreeBSD-src-6a1de54fc3ff3e21e3c3b49aa1d59060f5ce2361.tar.gz
Constify the array of predefined shells. It turns out that we need two
versions of the structure definition for this: one with const char pointers, because otherwise gcc won't let us initialize the fields with constant strings, and one without the const, because we need to work with the structure.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/make/job.c57
-rw-r--r--usr.bin/make/job.h51
2 files changed, 63 insertions, 45 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;
diff --git a/usr.bin/make/job.h b/usr.bin/make/job.h
index 25aa511..fbcd56e 100644
--- a/usr.bin/make/job.h
+++ b/usr.bin/make/job.h
@@ -175,30 +175,33 @@ typedef struct Job {
* strings is empty when hasErrCtl is FALSE, the command will be executed
* anyway as is and if it causes an error, so be it.
*/
-typedef struct Shell {
- char *name; /* the name of the shell. For Bourne and C
- * shells, this is used only to find the
- * shell description when used as the single
- * source of a .SHELL target. For user-defined
- * shells, this is the full path of the shell.
- */
- Boolean hasEchoCtl; /* True if both echoOff and echoOn defined */
- char *echoOff; /* command to turn off echo */
- char *echoOn; /* command to turn it back on again */
- char *noPrint; /* command to skip when printing output from
- * shell. This is usually the command which
- * was executed to turn off echoing */
- int noPLen; /* length of noPrint command */
- Boolean hasErrCtl; /* set if can control error checking for
- * individual commands */
- char *errCheck; /* string to turn error checking on */
- char *ignErr; /* string to turn off error checking */
- /*
- * command-line flags
- */
- char *echo; /* echo commands */
- char *exit; /* exit on error */
-} Shell;
+#define DEF_SHELL_STRUCT(TAG, CONST) \
+struct TAG { \
+ CONST char *name; /* the name of the shell. For Bourne and C \
+ * shells, this is used only to find the \
+ * shell description when used as the single \
+ * source of a .SHELL target. For user-defined \
+ * shells, this is the full path of the shell. \
+ */ \
+ Boolean hasEchoCtl; /* True if both echoOff and echoOn defined */ \
+ CONST char *echoOff; /* command to turn off echo */ \
+ CONST char *echoOn; /* command to turn it back on again */ \
+ CONST char *noPrint; /* command to skip when printing output from \
+ * shell. This is usually the command which \
+ * was executed to turn off echoing */ \
+ int noPLen; /* length of noPrint command */ \
+ Boolean hasErrCtl; /* set if can control error checking for \
+ * individual commands */ \
+ CONST char *errCheck; /* string to turn error checking on */ \
+ CONST char *ignErr; /* string to turn off error checking */ \
+ /* \
+ * command-line flags \
+ */ \
+ CONST char *echo; /* echo commands */ \
+ CONST char *exit; /* exit on error */ \
+}
+
+typedef DEF_SHELL_STRUCT(Shell,) Shell;
extern char *shellPath;
extern char *shellName;
OpenPOWER on IntegriCloud