/* * MAIN.C * * Matthew Dillon, 24 Feb 1986 * (c)1986 Matthew Dillon 9 October 1986 * * Version 2.07M by Steve Drew 10-Sep-87 * * Version 3.02A by Carlo Borreo & Cesare Dieni 20-Dec-88 * */ char *shellctr="CshCounter"; extern char *v_titlebar, *v_prompt, *v_hist, *v_lasterr, *v_path; int aux; /* for use with aux: driver */ char *oldtitle; char trueprompt[100]; char Inline[260]; struct IntuitionBase *IntuitionBase; struct Window *w; struct ArpBase *ArpBase; main(argc, argv) register char *argv[]; { #if RAW_CONSOLE char *rawgets(); #endif register unsigned int i; extern int Enable_Abort; char buf[10]; ArpBase=(struct ArpBase *)OpenLibrary("arp.library",34L); if (ArpBase==NULL) { printf("No arp library\n"); exit(0); } Forbid(); i=Errno=0; if (Getenv(shellctr,buf,10L)) { i=(int)(long)Atol(buf); if (Errno) i=0; } sprintf(buf,"%d",i+1); Setenv(shellctr,buf); Permit(); IntuitionBase=(struct IntuitionBase *)ArpBase->IntuiBase; init(); sprintf(buf,"%ld",Myprocess->pr_TaskNum); set_var(LEVEL_SET, "_clinumber", buf); oldtitle=(char *)(w->Title); set_var(LEVEL_SET, v_titlebar, "CShell V3.02A"); set_var(LEVEL_SET, v_prompt, (IsInteractive(Input())) ? "\23337m%p> \2330m" : ""); set_var(LEVEL_SET, v_hist, "20"); set_var(LEVEL_SET, v_lasterr, "0"); set_var(LEVEL_SET, v_path, "RAM:,RAM:c/,df0:c/,df1:c/,sys:system/"); set_var(LEVEL_SET, "_insert", "1"); set_var(LEVEL_SET, "f1", "cdir df0:\15"); set_var(LEVEL_SET, "F1", "cdir df1:\15"); set_var(LEVEL_SET, "f3", "cdir RAM:\15"); set_var(LEVEL_SET, "F3", "cdir vd0:\15"); set_var(LEVEL_SET, "f4", "cd df0:\15"); set_var(LEVEL_SET, "F4", "cd df1:\15"); set_var(LEVEL_SET, "f5", "cls; ls\15"); set_var(LEVEL_SET, "F5", "cdir "); set_var(LEVEL_SET, "f6", "lc\15"); set_var(LEVEL_SET, "f7", "info\15"); set_var(LEVEL_SET, "F7", "assign \15"); set_var(LEVEL_SET, "f8", "window -lf\15"); set_var(LEVEL_SET, "F8", "window -sb\15"); set_var(LEVEL_SET, "f10", "cls\15"); set_var(LEVEL_SET, "F10", "exit\15"); set_var(LEVEL_ALIAS, "cls", "echo -n ^l"); set_var(LEVEL_ALIAS, "lc", "ls -s"); set_var(LEVEL_ALIAS, "kr", "rm -r RAM:* >NIL:"); set_var(LEVEL_ALIAS, "cdir", "%q cd $q; cls; dir"); set_var(LEVEL_ALIAS, "exit", "endcli;quit"); set_var(LEVEL_ALIAS, "lp", "cat >PRT:"); seterr(); do_pwd(NULL); /* set $_cwd */ Enable_Abort = 0; for (i = 1; i < argc; ++i) { if (!strcmp(argv[i],"-c")) { Inline[0] = ' '; Inline[1] = '\0'; while (++i < argc) { strcat(Inline,argv[i]); strcat(Inline," "); } exec_command(Inline); main_exit(Lastresult); } if (!strcmp(argv[i],"-a")) { aux = 1; continue; } sprintf (Inline, "source %s",argv[i]); av[1] = argv[i]; do_source (Inline); } for (;;) { if (breakcheck()) while (WaitForChar(Input(), 100L) || stdin->_bp < stdin->_bend) gets(Inline); clearerr(stdin); /* prevent acidental quit */ #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(); if (*Inline) exec_command(Inline); } } main_exit(n) { register unsigned short i; char buf[10]; Getenv(shellctr,buf,10L); i=(int)Atol(buf); sprintf(buf,"%d",i-1); Setenv(shellctr,buf); SetWindowTitles(w,oldtitle,-1L); for (i=1; i_flags |= 0x80; /* make sure we're set as a tty */ stdout->_flags |= 0x80; /* in case of redirection in .login */ Close(_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 */ Myprocess = (struct Process *)FindTask(0L); Mycli=(struct CommandLineInterface *)((long)Myprocess->pr_CLI << 2); w=getwindow(); Pipe1 = pipe1; Pipe2 = pipe2; sprintf(pipe1, "ram:pipe1_%ld", Myprocess); sprintf(pipe2, "ram:pipe2_%ld", Myprocess); } breakcheck() { return (int)(SetSignal(0L,0L) & SIGBREAKF_CTRL_C); } breakreset() { SetSignal(0L, SIGBREAKF_CTRL_C); } dobreak() { if (breakcheck()) { printf("^C\n"); 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 */ Chk_Abort() { return(0); } _wb_parse() { } do_howmany() { char buf[10]; Getenv(shellctr, buf, 10L); printf("Shell(s) running: %s\n",buf); } struct Window *getwindow() { struct InfoData *infodata; struct Window *win; long args[8]; infodata=AllocMem((long)sizeof(struct InfoData),MEMF_CLEAR | MEMF_PUBLIC); args[0]=(long)infodata >> 2; SendPacket(ACTION_DISK_INFO,args,Myprocess->pr_ConsoleTask); win=(struct Window *)infodata->id_VolumeNode; FreeMem(infodata,(long)sizeof(struct InfoData)); return win; }