* Copyright (c) 1991 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
"@(#) Copyright (c) 1991 The Regents of the University of California.\n\
/*static char sccsid[] = "from: @(#)main.c 5.2 (Berkeley) 3/13/91";*/
static char rcsid
[] = "main.c,v 1.4 1993/08/01 18:58:12 mycroft Exp";
STATIC
union node
*curcmd
;
STATIC
union node
*prevcmd
;
short profile_buf
[16384];
STATIC
void read_profile(char *);
STATIC
void read_profile();
* Main routine. We initialize things, parse the arguments, execute
* profiles if we're a login shell, and then call cmdloop to execute
* commands. The setjmp call sets up the location to jump to when an
* exception occurs. When an exception occurs the variable "state"
* is used to figure out how far we had gotten.
main(argc
, argv
) char **argv
; {
monitor(4, etext
, profile_buf
, sizeof profile_buf
, 50);
if (setjmp(jmploc
.loc
)) {
* When a shell procedure is executed, we raise the
* exception EXSHELLPROC to clean up before executing
if (exception
== EXSHELLPROC
) {
} else if (state
== 0 || iflag
== 0 || ! rootshell
)
&& (! attyset() || equal(termval(), "emacs"))) {
if (exception
== EXINT
) {
FORCEINTON
; /* enable interrupts */
trputs("Shell args: "); trargs(argv
);
if (argv
[0] && argv
[0][0] == '-') {
read_profile("/etc/profile");
read_profile(".profile");
} else if ((sflag
|| minusc
) && (shinit
= getenv("SHINIT")) != NULL
) {
if (sflag
|| minusc
== NULL
) {
* Read and execute commands. "Top" is nonzero for the top level command
* loop; it turns on prompting if the shell is interactive.
TRACE(("cmdloop(%d) called\n", top
));
if (Iflag
== 0 || numeof
>= 50)
out2str("\nUse \"exit\" to leave shell.\n");
} else if (n
!= NULL
&& nflag
== 0) {
if (exitstatus
) /*DEBUG*/
outfmt(&errout
, "Exit status 0x%X\n", exitstatus
);
popstackmark(&smark
); /* unnecessary */
* Read /etc/profile or .profile. Return on error.
if ((fd
= open(name
, O_RDONLY
)) >= 0)
* Read a file containing shell functions.
if ((fd
= open(name
, O_RDONLY
)) >= 0)
error("Can't open %s", 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.
dotcmd(argc
, argv
) char **argv
; {
if (argc
>= 2) { /* That's what SVR2 does */
setinputfile(argv
[1], 1);
exitcmd(argc
, argv
) char **argv
; {
exitstatus
= number(argv
[1]);
lccmd(argc
, argv
) char **argv
; {
* Should never be called.