summaryrefslogtreecommitdiffstats
path: root/bin/sh/main.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1996-09-01 10:22:36 +0000
committerpeter <peter@FreeBSD.org>1996-09-01 10:22:36 +0000
commit5195be912eb257c05a0c97e561e72f01af2583ff (patch)
treee47ab3981b495c675a987dd1e943d1f4c823f314 /bin/sh/main.c
parent2fc7d7d1fa299368ccdddede67b31695266698bd (diff)
downloadFreeBSD-src-5195be912eb257c05a0c97e561e72f01af2583ff.zip
FreeBSD-src-5195be912eb257c05a0c97e561e72f01af2583ff.tar.gz
Merge of 4.4-Lite2 sh source, plus some gcc -Wall cleaning. This is a
merge of parallel duplicate work by Steve Price and myself. :-] There are some changes to the build that are my fault... mkinit.c was trying (poorly) to duplicate some of the work that make(1) is designed to do. The Makefile hackery is my fault too, the depend list was incomplete because of some explicit OBJS+= entries, so mkdep wasn't picking up their source file #includes. This closes a pile of /bin/sh PR's, but not all of them.. Submitted by: Steve Price <steve@bonsai.hiwaay.net>, peter
Diffstat (limited to 'bin/sh/main.c')
-rw-r--r--bin/sh/main.c98
1 files changed, 75 insertions, 23 deletions
diff --git a/bin/sh/main.c b/bin/sh/main.c
index 34a0abb..edebcd7 100644
--- a/bin/sh/main.c
+++ b/bin/sh/main.c
@@ -33,7 +33,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: main.c,v 1.3 1995/05/30 00:07:18 rgrimes Exp $
+ * $Id: main.c,v 1.4 1996/08/11 22:50:58 ache Exp $
*/
#ifndef lint
@@ -43,13 +43,17 @@ static char copyright[] =
#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 5/31/93";
+static char sccsid[] = "@(#)main.c 8.6 (Berkeley) 5/28/95";
#endif /* not lint */
+#include <stdio.h>
#include <signal.h>
+#include <sys/stat.h>
+#include <unistd.h>
#include <fcntl.h>
#include <locale.h>
+
#include "shell.h"
#include "main.h"
#include "mail.h"
@@ -57,15 +61,18 @@ static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 5/31/93";
#include "output.h"
#include "parser.h"
#include "nodes.h"
+#include "expand.h"
#include "eval.h"
#include "jobs.h"
#include "input.h"
#include "trap.h"
#include "var.h"
+#include "show.h"
#include "memalloc.h"
#include "error.h"
#include "init.h"
#include "mystring.h"
+#include "exec.h"
#define PROFILE 0
@@ -79,14 +86,8 @@ short profile_buf[16384];
extern int etext();
#endif
-#ifdef __STDC__
-STATIC void read_profile(char *);
-char *getenv(char *);
-#else
-STATIC void read_profile();
-char *getenv();
-#endif
-
+STATIC void read_profile __P((char *));
+STATIC char *find_dot_file __P((char *));
/*
* Main routine. We initialize things, parse the arguments, execute
@@ -96,7 +97,11 @@ char *getenv();
* is used to figure out how far we had gotten.
*/
-main(argc, argv) char **argv; {
+int
+main(argc, argv)
+ int argc;
+ char **argv;
+{
struct jmploc jmploc;
struct stackmark smark;
volatile int state;
@@ -113,6 +118,8 @@ main(argc, argv) char **argv; {
* exception EXSHELLPROC to clean up before executing
* the shell procedure.
*/
+ if (exception == EXERROR)
+ exitstatus = 2;
if (exception == EXSHELLPROC) {
rootpid = getpid();
rootshell = 1;
@@ -159,10 +166,11 @@ state1:
}
state2:
state = 3;
- if ((shinit = lookupvar("ENV")) != NULL &&
- *shinit != '\0') {
- state = 3;
- read_profile(shinit);
+ if (getuid() == geteuid() && getgid() == getegid()) {
+ if ((shinit = lookupvar("ENV")) != NULL && *shinit != '\0') {
+ state = 3;
+ read_profile(shinit);
+ }
}
state3:
state = 4;
@@ -177,6 +185,8 @@ state4: /* XXX ??? - why isn't this before the "if" statement */
monitor(0);
#endif
exitshell(exitstatus);
+ /*NOTREACHED*/
+ return 0;
}
@@ -186,7 +196,9 @@ state4: /* XXX ??? - why isn't this before the "if" statement */
*/
void
-cmdloop(top) {
+cmdloop(top)
+ int top;
+{
union node *n;
struct stackmark smark;
int inter;
@@ -256,7 +268,7 @@ read_profile(name)
void
readcmdfile(name)
char *name;
- {
+{
int fd;
INTOFF;
@@ -273,14 +285,48 @@ readcmdfile(name)
/*
* Take commands from a file. To be compatable we should do a path
- * search for the file, but a path search doesn't make any sense.
+ * search for the file, which is necessary to find sub-commands.
*/
-dotcmd(argc, argv) char **argv; {
+
+STATIC char *
+find_dot_file(basename)
+ char *basename;
+{
+ static char localname[FILENAME_MAX+1];
+ char *fullname;
+ char *path = pathval();
+ struct stat statb;
+
+ /* don't try this for absolute or relative paths */
+ if( strchr(basename, '/'))
+ return basename;
+
+ while ((fullname = padvance(&path, basename)) != NULL) {
+ strcpy(localname, fullname);
+ stunalloc(fullname);
+ if ((stat(fullname, &statb) == 0) && S_ISREG(statb.st_mode))
+ return localname;
+ }
+ return basename;
+}
+
+int
+dotcmd(argc, argv)
+ int argc;
+ char **argv;
+{
+ struct strlist *sp;
exitstatus = 0;
+
+ for (sp = cmdenviron; sp ; sp = sp->next)
+ setvareq(savestr(sp->text), VSTRFIXED|VTEXTFIXED);
+
if (argc >= 2) { /* That's what SVR2 does */
- setinputfile(argv[1], 1);
- commandname = argv[1];
+ char *fullname = find_dot_file(argv[1]);
+
+ setinputfile(fullname, 1);
+ commandname = fullname;
cmdloop(0);
popfile();
}
@@ -288,12 +334,18 @@ dotcmd(argc, argv) char **argv; {
}
-exitcmd(argc, argv) char **argv; {
+int
+exitcmd(argc, argv)
+ int argc;
+ char **argv;
+{
if (stoppedjobs())
- return;
+ return 0;
if (argc > 1)
exitstatus = number(argv[1]);
exitshell(exitstatus);
+ /*NOTREACHED*/
+ return 0;
}
OpenPOWER on IntegriCloud