mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-11-19 21:44:11 +01:00
121 lines
3.3 KiB
C
121 lines
3.3 KiB
C
/*
|
|
* main.c - the main() function
|
|
*
|
|
* This file is part of zsh, the Z shell.
|
|
*
|
|
* Copyright (c) 1992-1997 Paul Falstad
|
|
* All rights reserved.
|
|
*
|
|
* Permission is hereby granted, without written agreement and without
|
|
* license or royalty fees, to use, copy, modify, and distribute this
|
|
* software and to distribute modified versions of this software for any
|
|
* purpose, provided that the above copyright notice and the following
|
|
* two paragraphs appear in all copies of this software.
|
|
*
|
|
* In no event shall Paul Falstad or the Zsh Development Group be liable
|
|
* to any party for direct, indirect, special, incidental, or consequential
|
|
* damages arising out of the use of this software and its documentation,
|
|
* even if Paul Falstad and the Zsh Development Group have been advised of
|
|
* the possibility of such damage.
|
|
*
|
|
* Paul Falstad and the Zsh Development Group specifically disclaim any
|
|
* warranties, including, but not limited to, the implied warranties of
|
|
* merchantability and fitness for a particular purpose. The software
|
|
* provided hereunder is on an "as is" basis, and Paul Falstad and the
|
|
* Zsh Development Group have no obligation to provide maintenance,
|
|
* support, updates, enhancements, or modifications.
|
|
*
|
|
*/
|
|
|
|
#include "zsh.mdh"
|
|
#include "main.pro"
|
|
|
|
/**/
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
char **t;
|
|
int t0;
|
|
#ifdef USE_LOCALE
|
|
setlocale(LC_ALL, "");
|
|
#endif
|
|
|
|
init_hackzero(argv, environ);
|
|
|
|
/*
|
|
* Provisionally set up the type table to allow metafication.
|
|
* This will be done properly when we have decided if we are
|
|
* interactive
|
|
*/
|
|
typtab['\0'] |= IMETA;
|
|
typtab[STOUC(Meta) ] |= IMETA;
|
|
typtab[STOUC(Marker)] |= IMETA;
|
|
for (t0 = (int)STOUC(Pound); t0 <= (int)STOUC(Nularg); t0++)
|
|
typtab[t0] |= ITOK | IMETA;
|
|
|
|
for (t = argv; *t; *t = metafy(*t, -1, META_ALLOC), t++);
|
|
|
|
zsh_name = argv[0];
|
|
do {
|
|
char *arg0 = zsh_name;
|
|
if (!(zsh_name = strrchr(arg0, '/')))
|
|
zsh_name = arg0;
|
|
else
|
|
zsh_name++;
|
|
if (*zsh_name == '-')
|
|
zsh_name++;
|
|
if (strcmp(zsh_name, "su") == 0) {
|
|
char *sh = zgetenv("SHELL");
|
|
if (sh && *sh && arg0 != sh)
|
|
zsh_name = sh;
|
|
else
|
|
break;
|
|
} else
|
|
break;
|
|
} while (zsh_name);
|
|
|
|
fdtable_size = OPEN_MAX;
|
|
fdtable = zcalloc(fdtable_size);
|
|
|
|
createoptiontable();
|
|
emulate(zsh_name, 1); /* initialises most options */
|
|
opts[LOGINSHELL] = (**argv == '-');
|
|
opts[MONITOR] = 1; /* may be unset in init_io() */
|
|
opts[PRIVILEGED] = (getuid() != geteuid() || getgid() != getegid());
|
|
opts[USEZLE] = 1; /* may be unset in init_io() */
|
|
parseargs(argv); /* sets INTERACTIVE, SHINSTDIN and SINGLECOMMAND */
|
|
|
|
SHTTY = -1;
|
|
init_io();
|
|
setupvals();
|
|
init_signals();
|
|
init_bltinmods();
|
|
run_init_scripts();
|
|
init_misc();
|
|
|
|
for (;;) {
|
|
do
|
|
loop(1,0);
|
|
while (tok != ENDINPUT && (tok != LEXERR || isset(SHINSTDIN)));
|
|
if (tok == LEXERR) {
|
|
stopmsg = 1;
|
|
zexit(lastval, 0);
|
|
}
|
|
if (!(isset(IGNOREEOF) && interact)) {
|
|
#if 0
|
|
if (interact)
|
|
fputs(islogin ? "logout\n" : "exit\n", shout);
|
|
#endif
|
|
zexit(lastval, 0);
|
|
continue;
|
|
}
|
|
noexitct++;
|
|
if (noexitct >= 10) {
|
|
stopmsg = 1;
|
|
zexit(lastval, 0);
|
|
}
|
|
zerrnam("zsh", (!islogin) ? "use 'exit' to exit."
|
|
: "use 'logout' to logout.", NULL, 0);
|
|
}
|
|
}
|