home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
back2roots/padua
/
padua.7z
/
padua
/
shell
/
csh537src.lha
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-03-21
|
14KB
|
592 lines
/*
* MAIN.C
*
* Matthew Dillon, 24 Feb 1986
* (c)1986 Matthew Dillon 9 October 1986
*
* Version 2.07M by Steve Drew 10-Sep-87
* Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
* Version 5.00L by U. Dominik Mueller 17-Feb-91
* Version 5.20L by Andreas M. Kirchwitz (Fri, 13 Mar 1992)
*
*/
#include "shell.h"
#define CSH_VER "5"
#define CSH_REV "37"
static struct Window *getwindow(void);
static void exectimer(int stop);
char shellcompiled[]="Compiled: "__DATE__" "__TIME__" with "COMPILER"\n";
#if 1
char shellname[] ="Csh "CSH_VER"."CSH_REV" (public release)";
#else
char shellname[] ="Csh "CSH_VER"."CSH_REV" (BETA)";
#endif
char shellversion[] =CSH_VER""CSH_REV;
char shellvers[] =CSH_VER"."CSH_REV;
char shellv [] ="\0$VER: csh "CSH_VER"."CSH_REV" "__AMIGADATE__"";
char shellctr [] ="CshCounter";
char shellres [] ="CshResident";
char shellthere[] ="CshLoggedIn";
char *oldtitle = NULL;
char trueprompt[100];
char Inline[260];
extern struct ExecBase *SysBase; /* standard fare....*/
extern struct DosLibrary *DOSBase; /* more standard fare.... */
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct Library *GadToolsBase;
struct Library *AslBase; /* AMK: Asl-FileRequester replaces ARP */
struct Library *BattClockBase;
struct Window *old_WindowPtr = NULL;
int oldtaskpri=-999;
BPTR OldCin;
void *PatternBase;
BOOL nologout = FALSE;
BOOL nowintitle = FALSE;
#ifdef MULTIUSER_SUPPORT
struct muBase *muBase; /* LILJA: Added for multiuser-support */
#endif
static char *defset[]={
v_histnum, "0",
v_titlebar, shellname,
v_hist, "50",
v_lasterr, "0",
v_stat, "0",
v_path, "RAM:,RAM:c,df0:c,df1:c,sys:system,csh:,s:",
v_rxpath, "REXX:",
v_scroll, "2",
v_minrows, "34",
v_hilite, "c7",
v_lcd, "",
v_qcd, "csh:csh-qcd",
v_insert, "1",
v_abbrev, "5",
"_terminal","",
"_man", "csh:csh.doc",
"_version", shellversion,
/* v_nomatch, "1",*/
v_prghash, "csh:csh-prgs",
NULL, NULL
};
static char *defalias[]={
"cls", "echo -n ^l",
"dswap","cd $_lcd",
"exit", "endcli;quit",
"cdir", "%q cd $q; cls; dir",
"q", "quit",
"rx", "RX",
"manlist", "search -nl $_man \" \"",
NULL, NULL
};
struct MsgPort *Console=(struct MsgPort *)-1;
long ExecTimer, ExecRC;
#ifdef __SASC
long __stack = 17500L;
#endif
main(int argc, char *argv[])
{
static ROOT locals;
BPTR fh;
int i, login=0;
char buf[10];
BOOL nologin=FALSE,nocshrc=FALSE,noclrmenu=FALSE;
#ifdef AZTEC_C
extern int Enable_Abort;
Enable_Abort = 0;
#endif
MyMem=salloc(4);
if( argc==0 ) { /* Prevent starting from workbench */
Delay(60);
exit(0);
}
Myprocess = (struct Process *)FindTask(NULL);
OldCin = Myprocess->pr_CIS;
Mycli = Cli();
/* Mycli = (struct CommandLineInterface *)((long)Myprocess->pr_CLI << 2);*/
init_mbase();
push_locals( &locals );
initmap();
if (!SysBase || SysBase->LibNode.lib_Version<37) {
printf("Sorry, you'll need at least V37 to run CSH.\n");
exit(20);
}
if (!DOSBase) {
printf("No dos library\n");
exit(20);
}
/* we do not work without it ... */
DOSBase->dl_Root->rn_Flags |= RNF_WILDSTAR;
if (!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",37L))) {
printf("No graphics library\n");
exit(20);
}
if (!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",37L))) {
printf("No intuition library\n");
CloseLibrary((struct Library *)GfxBase);
exit(20);
}
if (!(AslBase=OpenLibrary("asl.library",37L))) {
printf("No asl library\n");
CloseLibrary((struct Library *)IntuitionBase);
CloseLibrary((struct Library *)GfxBase);
exit(20);
}
if (!(GadToolsBase=OpenLibrary("gadtools.library",37L))) {
printf("No gadtools library\n");
CloseLibrary((struct Library *)AslBase);
CloseLibrary((struct Library *)IntuitionBase);
CloseLibrary((struct Library *)GfxBase);
exit(20);
}
#ifdef MULTIUSER_SUPPORT
/* LILJA: Added for multiuser-support */
muBase = (struct muBase *) OpenLibrary("multiuser.library",39);
#endif
PatternBase = OpenLibrary("pattern.library",5L);
BattClockBase = OpenResource(BATTCLOCKNAME);
set_var(LEVEL_SET,"_kick2x",(SysBase->LibNode.lib_Version>=37)?"1":"0");
set_var(LEVEL_SET,"_kick3x",(SysBase->LibNode.lib_Version>=39)?"1":"0");
if( !IsInteractive(Input())) {
o_bground=1;
Mycli->cli_Background=DOSTRUE;
} else
Mycli->cli_Background=DOSFALSE;
set_var( LEVEL_SET, v_bground, (o_bground) ? "1" : "0" );
if( fh=Open( "CONSOLE:" , MODE_NEWFILE) ) {
Console= ((struct FileHandle *)(4*fh))->fh_Type;
Close(fh);
}
Forbid();
i=0;
/* AMK: OS20-GetVar replaces ARP-Getenv, SetVar replaces Setenv */
if ( GetVar(shellres ,buf,10,GVF_GLOBAL_ONLY|GVF_BINARY_VAR) >= 0L)
o_resident=1;
if ( GetVar(shellthere,buf,10,GVF_GLOBAL_ONLY|GVF_BINARY_VAR) < 0L)
login=TRUE, SetVar(shellthere,"1",-1L,GVF_GLOBAL_ONLY|GVF_BINARY_VAR);
if ( GetVar(shellctr ,buf,10,GVF_GLOBAL_ONLY|GVF_BINARY_VAR) >= 0L)
i=atoi(buf);
sprintf(buf, "%d", i+1);
/* AMK: OS20-SetVar replaces ARP-Setenv */
SetVar(shellctr, buf, -1L, GVF_GLOBAL_ONLY|GVF_BINARY_VAR);
Permit();
#ifdef AZTEC_C
stdin->_flags |= _IONBF; /* make sure we're set as an unbuffered tty */
stdout->_flags |= _IONBF; /* in case of redirection in .login */
Close( (BPTR)_devtab[2].fd);
_devtab[2].mode |= O_STDIO;
_devtab[2].fd = _devtab[1].fd; /* set stderr to Output() otherwise */
/* don't work with aux driver */
#else
/* if( setvbuf( stdout,NULL,_IOLBF,BUFSIZ )) exit(20); */
/* setnbf( stdout ); */
/* Close( _ufbs[2] );*/
/*_ufbs[2]=_ufbs[1]; */
/* setnbf( stderr ); */
#endif
sprintf(buf,"%ld",Myprocess->pr_TaskNum);
set_var(LEVEL_SET, "_clinumber", buf);
seterr(0);
if (Myprocess->pr_CurrentDir == NULL)
execute("cd :");
set_cwd();
o_nowindow= 1;
set_var(LEVEL_SET,v_prompt, (isconsole(Input())) ? "%c%p> ":"");
for( i=0; defset[i]; i+=2 )
set_var( LEVEL_SET, defset[i], defset[i+1] );
for( i=0; defalias[i]; i+=2 )
set_var( LEVEL_ALIAS, defalias[i], defalias[i+1] );
o_nowindow= 0;
for (i = 1; i < argc; ++i) {
if (*argv[i]=='-' && (index(argv[i],'a') || index(argv[i],'t')))
o_nowindow=1;
if (*argv[i]=='-' && index(argv[i],'n'))
nologin = TRUE;
if (*argv[i]=='-' && index(argv[i],'N'))
nocshrc = TRUE;
if (*argv[i]=='-' && index(argv[i],'L'))
nologout = TRUE;
if (*argv[i]=='-' && index(argv[i],'M'))
noclrmenu = TRUE;
if (*argv[i]=='-' && index(argv[i],'W'))
nowintitle = TRUE;
if (*argv[i]=='-' && index(argv[i],'R'))
o_noraw = 1;
}
if( !o_nowindow && (Mywindow=getwindow()) && isconsole(Input())) {
old_WindowPtr = Myprocess->pr_WindowPtr;
Myprocess->pr_WindowPtr = Mywindow;
newwidth();
oldtitle=(char *)(Mywindow->Title);
if (!noclrmenu) {
/* clear menus, even if we are not the owner */
set_menu();
}
}
if (login && !nologin) {
/*printf("we're the first csh today, mon ami!\n");*/
if( exists("S:.login"))
execute("source S:.login");
}
if (!nocshrc) {
if( exists("S:.cshrc"))
execute("source S:.cshrc");
}
{
char nam1[40],nam2[40],nam3[40];
BOOL e1,e2,e3;
strcpy(nam1,"ENVARC:"); strcat(nam1,shellctr); e1=exists(nam1);
strcpy(nam2,"ENVARC:"); strcat(nam2,shellres); e2=exists(nam2);
strcpy(nam3,"ENVARC:"); strcat(nam3,shellthere); e3=exists(nam3);
if (e1 || e2 || e3) {
printf("\nWARNING: please remove the following files from ENVARC:\n\n");
if (e1)
printf(" - %s\n",shellctr);
if (e2)
printf(" - %s\n",shellres);
if (e3)
printf(" - %s\n",shellthere);
printf("\n and reboot your system after removing the files.\n");
printf(" Never copy ENV: to ENVARC: !!\n\n");
Delay(150L);
}
}
for (i = 1; i < argc; ++i) {
if (*argv[i]=='-') {
char *str=argv[i]+1;
for( ; *str; str++ ) {
switch( *str) {
case 'c':
case 'C': execute( compile_av( argv, i+1, argc, ' ',*str=='C'));
main_exit(Lastresult); break;
case 'k': set_var(LEVEL_SET,v_nobreak,"1"); break;
case 'v': Verbose=1; set_var(LEVEL_SET,v_verbose,"hs"); break;
case 'b': oldtaskpri=Myprocess->pr_Task.tc_Node.ln_Pri;
SetTaskPri( &Myprocess->pr_Task, -1 ); break;
case 'f': oldtaskpri=Myprocess->pr_Task.tc_Node.ln_Pri;
SetTaskPri( &Myprocess->pr_Task, 1 ); break;
case 'a': o_nowindow= o_noraw= 1;
set_var( LEVEL_SET, v_hilite, "" ); break;
#if 0
case 'm': unset_var(LEVEL_SET,v_nomatch); break;
#endif
case 'm': set_var(LEVEL_SET,v_nomatch,"1"); break;
case 't': o_nowindow= o_vt100= o_nofastscr= 1;
set_var( LEVEL_SET, v_hilite, "r" );
set_var( LEVEL_SET, v_noreq, "1" );
set_var( LEVEL_SET, "_terminal", "1" );
set_var( LEVEL_ALIAS, "cls", "e -n ^[[0\\;0H^[[J" );
break;
case 's': DOSBase->dl_Root->rn_Flags |= RNF_WILDSTAR;
break;
}
}
} else {
sprintf (Inline, "source %s",argv[i]);
execute (Inline);
}
}
if( !isconsole(Input()))
main_exit( Lastresult );
for (;;) {
if (breakcheck())
while (WaitForChar(Input(), 100L) || CHARSWAIT( stdin ))
gets(Inline);
clearerr(stdin); /* prevent acidental quit */
/*
AMK: new position of breakreset() before exec_every(),
old position caused enforcer hits
(do 'set _every "set cols = $(wincols)"' and
then abort (^c) a command)
*/
breakreset();
exec_every();
{ /* AMK TEST BEGIN */
char *old;
char pwd[256];
/* no requesters when no disk is inserted */
Myprocess->pr_WindowPtr = (APTR)(-1);
#if 1
if (NameFromLock(Myprocess->pr_CurrentDir, pwd, 255L)) {
if( !(old=get_var(LEVEL_SET, v_cwd)) )
old="";
if (strcmp(pwd,old)) {
set_var(LEVEL_SET, v_lcd, old);
set_cwd();
}
}
#else
if (!NameFromLock(Myprocess->pr_CurrentDir, pwd, 255L)) {
fprintf(stderr,"csh.main: NameFromLock() failed\n");
strcpy(pwd,"<unknown>");
}
if( !(old=get_var(LEVEL_SET, v_cwd)) )
old="";
if (strcmp(pwd,old)) {
set_var(LEVEL_SET, v_lcd, old);
set_cwd();
}
#endif
/*update_sys_var(v_cwd);*/
Myprocess->pr_WindowPtr = o_noreq ? (APTR) -1L : Mywindow;
} /* AMK TEST BEGIN */
update_sys_var(v_titlebar);
update_sys_var(v_prompt);
/*
AMK: old position of breakreset(), causes enforcer hits
(do 'set _every "set cols = $(wincols)"' and
then abort (^c) a command)
*/
breakreset();
#if RAW_CONSOLE
if (Quit || !rawgets(Inline, disable ? "_ " : trueprompt)) main_exit(0);
#else
printf("%s", disable ? "_ " : trueprompt);
fflush(stdout);
if (Quit || !gets(Inline)) main_exit(0);
#endif
breakreset();
exectimer(0);
if (*Inline) ExecRC=exec_command(Inline);
exectimer(1);
}
}
void
main_exit(n)
{
int i;
char buf[10];
/* AMK: OS20-GetVar replaces ARP-Getenv */
GetVar(shellctr,buf,10L,GVF_GLOBAL_ONLY|GVF_BINARY_VAR);
i=atoi(buf);
sprintf(buf,"%d",i-1);
/* AMK: OS20-SetVar replaces ARP-Setenv */
SetVar(shellctr, buf, -1L, GVF_GLOBAL_ONLY|GVF_BINARY_VAR);
if( oldtitle )
SetWindowTitles(Mywindow,oldtitle,(char *)-1);
if( oldtaskpri != -999 )
SetTaskPri(&Myprocess->pr_Task,oldtaskpri);
if (Mywindow)
Myprocess->pr_WindowPtr = old_WindowPtr;
for (i=1; i<MAXMYFILES; i++) myclose(i);
/* no effect if AnzMenus==0 (no menus in use) */
remove_menu();
#ifdef MULTIUSER_SUPPORT
/* LILJA: Added for multiuser-support */
if (muBase) CloseLibrary((struct Library *)muBase);
#endif
if (PatternBase) CloseLibrary( PatternBase );
CloseLibrary((struct Library *)GadToolsBase);
CloseLibrary((struct Library *)AslBase);
CloseLibrary((struct Library *)IntuitionBase);
CloseLibrary((struct Library *)GfxBase);
exit(n);
}
static void
exectimer(int stop)
{
struct DateStamp dss;
static long lasttime;
long time;
DateStamp(&dss);
time=dss.ds_Minute*6000+2*dss.ds_Tick; /* 2 = 100/TickPerSec */
if( stop )
ExecTimer=time-lasttime;
else
lasttime=time;
}
/* print break message only once */
static BOOL dobreak_output = TRUE;
int
breakcheck()
{
return !o_nobreak && SetSignal(0L,0L) & SIGBREAKF_CTRL_C;
}
void
breakreset()
{
/* We reset CTRL_E here for GMD's foreach() hack ... */
/* Why not just reset CTRL_F also -- for completeness? :) */
SetSignal(0L, SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D|SIGBREAKF_CTRL_E);
dobreak_output = TRUE;
}
dobreak()
{
if (breakcheck()) {
if (dobreak_output) {
printf("^C\n");
dobreak_output = FALSE;
}
return(1);
}
return(0);
}
/* this routine causes manx to use this Chk_Abort() rather than it's own */
/* otherwise it resets our ^C when doing any I/O (even when Enable_Abort */
/* is zero). Since we want to check for our own ^C's */
long
Chk_Abort()
{
return(0);
}
void
_wb_parse()
{
}
do_howmany()
{
char buf[10];
/* AMK: OS20-GetVar replaces ARP-Getenv */
GetVar(shellctr, buf, 10L, GVF_GLOBAL_ONLY|GVF_BINARY_VAR);
printf("Shell(s) running: %s\n",buf);
return 0;
}
static struct Window *
getwindow(void)
{
struct Window *win = NULL;
if( o_nowindow )
return NULL;
if( isconsole(Output()))
Write(Output(),"",1); /* make window appear */
if( Myprocess->pr_ConsoleTask ) {
struct InfoData *infodata;
infodata=(void *)SAllocMem((long)sizeof(struct InfoData),MEMF_CLEAR|MEMF_PUBLIC);
if (DoPkt((void *)Myprocess->pr_ConsoleTask,ACTION_DISK_INFO,((LONG)infodata)>>2,NULL,NULL,NULL,NULL)) {
win=(struct Window *)infodata->id_VolumeNode;
}
FreeMem(infodata,sizeof(struct InfoData));
if( win==NULL )
o_nowindow=1;
}
newwidth();
return win;
}
#ifdef LATTICE
int
setenv( char *var, char *val )
{
char *buf=salloc(strlen(var)+strlen(val)+10);
sprintf(buf, "%s=%s", var, val );
Free(buf);
return putenv(buf);
}
__regargs int __chkabort(void) { return(0); }
#endif
#ifdef _DCC
void
swapmem(void *_s1, void *_s2, size_t _n)
{
char t, *s1=_s1, *s2=_s2;
int i;
for( i=0; i<_n; i++ )
t=*s1; *s1++=*s2; *s2++=t;
}
int
setenv( char *var, char *val )
{
BPTR fh;
char buf[40];
sprintf(buf,"ENV:%s",var );
if( fh=Open(buf,MODE_NEWFILE) ) {
Write(fh,val,strlen(val));
Close(fh);
}
}
int
rand()
{
return 0;
}
_waitwbmsg() {return 0;};
#endif