wtoomey@gara.une.oz (Warren Toomey) (09/13/89)
# This is a shell archive. Remove anything before this line, then # unpack it by saving it in a file and typing "sh file". (Files # unpacked will be owned by you and have default permissions.) # # This archive contains: # exec.cdif file.cdif global.cdif hash.cdif header.h echo x - exec.cdif cat > "exec.cdif" << '//E*O*F exec.cdif//' *** ../Clam/exec.c Tue Sep 12 21:42:33 1989 --- exec.c Wed Sep 13 12:21:30 1989 *************** *** 170,176 **** SYM_T act; struct adefn *ptr; struct tchars setsigc; ! char line[MAXLL],pipeline[MAXLL],**oldargstemp,*oldcurraltemp; int i,pos,ppos,pid=0,oldnumargtemp,retval; bool skip_to_semi; --- 170,176 ---- SYM_T act; struct adefn *ptr; struct tchars setsigc; ! char line[MAXLL],pipeline[MAXLL],**oldargstemp; int i,pos,ppos,pid=0,oldnumargtemp,retval; bool skip_to_semi; *************** *** 356,362 **** return(FOUND); } strcpy(fullpathname,name); ! if (executable(fullpathname,"",1)==FALSE) return(NOTEXEC); return(FOUND); } --- 356,362 ---- return(FOUND); } strcpy(fullpathname,name); ! if (executable(fullpathname,NULL,1)==FALSE) return(NOTEXEC); return(FOUND); } *************** *** 433,439 **** #ifdef DEBUG fprintf(stderr,"doing executable with %s<\n",fullpathname); #endif ! if (executable(fullpathname,"",1)==FALSE) { #ifdef DEBUG fprintf(stderr,"executable failed\n"); --- 433,439 ---- #ifdef DEBUG fprintf(stderr,"doing executable with %s<\n",fullpathname); #endif ! if (executable(fullpathname,NULL,1)==FALSE) { #ifdef DEBUG fprintf(stderr,"executable failed\n"); *************** *** 679,685 **** mode=0777; if (open(efil,flags,mode)==-1) { ! write(2,"Can't open "); write(2,efil,strlen(efil)); exit(0); } --- 679,685 ---- mode=0777; if (open(efil,flags,mode)==-1) { ! write(2,"Can't open ",11); write(2,efil,strlen(efil)); exit(0); } *************** *** 693,705 **** #ifdef __STDC__ int execute(int argc, char **argv, int infd, int outfd, int errfd, char *ifil, char *ofil, char *efil, bool appnd, ! bool bckgnd, bool piped, int fromfile) #else ! int execute(argc,argv,infd,outfd,errfd,ifil,ofil,efil,appnd,bckgnd,piped,fromfile) int argc,infd,outfd,errfd; char *argv[],*ifil,*ofil,*efil; bool appnd,bckgnd,piped; ! int fromfile; #endif { extern void makenv(); --- 693,705 ---- #ifdef __STDC__ int execute(int argc, char **argv, int infd, int outfd, int errfd, char *ifil, char *ofil, char *efil, bool appnd, ! bool bckgnd, bool piped, int frmfile) #else ! int execute(argc,argv,infd,outfd,errfd,ifil,ofil,efil,appnd,bckgnd,piped,frmfile) int argc,infd,outfd,errfd; char *argv[],*ifil,*ofil,*efil; bool appnd,bckgnd,piped; ! int frmfile; #endif { extern void makenv(); *************** *** 760,766 **** fprintf(stderr,"maybe setexec from execute\n"); #endif /*if (bckgnd==TRUE) setbgexec(); ! else*/ if (!NoIoctl && piped==FALSE && !fromfile) setexec(pid=getpid()); redirect(infd,outfd,errfd,ifil,ofil,efil,appnd,bckgnd); if (alias_defn!=0) { --- 760,766 ---- fprintf(stderr,"maybe setexec from execute\n"); #endif /*if (bckgnd==TRUE) setbgexec(); ! else*/ if (!NoIoctl && piped==FALSE && !frmfile) setexec(pid=getpid()); redirect(infd,outfd,errfd,ifil,ofil,efil,appnd,bckgnd); if (alias_defn!=0) { *************** *** 821,827 **** } else { ! if (fromfile) { write(2,invokename,strlen(invokename)); write(2,": ",2); --- 821,827 ---- } else { ! if (frmfile) { write(2,invokename,strlen(invokename)); write(2,": ",2); //E*O*F exec.cdif// echo x - file.cdif cat > "file.cdif" << '//E*O*F file.cdif//' *** ../Clam/file.c Tue Sep 12 21:41:37 1989 --- file.c Wed Sep 13 12:21:30 1989 *************** *** 47,53 **** else return(FALSE); } ! void file(finp,nosave) FILE *finp; int nosave; { --- 47,53 ---- else return(FALSE); } ! void File(finp,nosave) FILE *finp; int nosave; { *************** *** 60,66 **** bool skip_to_semi; #ifdef DEBUG ! fprintf(stderr,"Starting file()\n"); #endif while (!ffinish(finp)) { --- 60,66 ---- bool skip_to_semi; #ifdef DEBUG ! fprintf(stderr,"Starting File()\n"); #endif while (!ffinish(finp)) { //E*O*F file.cdif// echo x - global.cdif cat > "global.cdif" << '//E*O*F global.cdif//' *** ../Clam/global.c Tue Sep 12 21:41:40 1989 --- global.c Wed Sep 13 12:21:31 1989 *************** *** 17,23 **** #ifndef lint static char copyright[]="Clam shell, (c)1988 by Callum Gibson"; ! static char version[]="Version 1.3 890817"; #endif char termcapbuf[1024],bs[10],nd[10],cl[10],cd[10],up[10],so[10],se[10],beep[20], --- 17,23 ---- #ifndef lint static char copyright[]="Clam shell, (c)1988 by Callum Gibson"; ! static char version[]="Version 1.3.2 890912"; #endif char termcapbuf[1024],bs[10],nd[10],cl[10],cd[10],up[10],so[10],se[10],beep[20], *************** *** 32,39 **** void (*charfn)(),(*ptif)(); /* char inserting function pointer */ /* Clam terminal driver characteristics which must always be set for Clam. */ struct sgttyb clam_sgttyb; struct tchars clam_tchars; ! #ifndef MINIX struct ltchars clam_ltchars; #endif --- 32,43 ---- void (*charfn)(),(*ptif)(); /* char inserting function pointer */ /* Clam terminal driver characteristics which must always be set for Clam. */ + #ifdef ATT + struct termio clam_termio; + #else struct sgttyb clam_sgttyb; struct tchars clam_tchars; ! # ifdef UCB struct ltchars clam_ltchars; + # endif #endif //E*O*F global.cdif// echo x - hash.cdif cat > "hash.cdif" << '//E*O*F hash.cdif//' *** ../Clam/hash.c Tue Sep 12 21:42:34 1989 --- hash.c Wed Sep 13 12:21:31 1989 *************** *** 190,196 **** } ! /* Minix doesn't have hashing */ void hashpath() { extern void vdel(); --- 190,207 ---- } ! void inihash() ! { ! int i; ! ! for (i=0;i<HSHSIZ;i++) ! { ! hasharray[i].name=NULL; ! hasharray[i].flag=0; ! } ! } ! ! void hashpath() { extern void vdel(); *************** *** 229,236 **** /* free up previous hash table */ for (times=0;times<HSHSIZ;times++) { ! free(hasharray[times].name); ! hasharray[times].name=NULL; if (!(hasharray[times].flag&EXTYPE)) /* it's a string */ free(hasharray[times].exec_ptr.dir); hasharray[times].exec_ptr.dir=NULL; /* nullify pointer */ --- 240,250 ---- /* free up previous hash table */ for (times=0;times<HSHSIZ;times++) { ! if (hasharray[times].name!=NULL) ! { ! free(hasharray[times].name); ! hasharray[times].name=NULL; ! } if (!(hasharray[times].flag&EXTYPE)) /* it's a string */ free(hasharray[times].exec_ptr.dir); hasharray[times].exec_ptr.dir=NULL; /* nullify pointer */ //E*O*F hash.cdif// echo x - header.h cat > "header.h" << '//E*O*F header.h//' /***************************************************************************** ** ** ** The Clam Shell is Copyright (C) 1988 by Callum Gibson. ** ** This file is part of Clam Shell. You may freely use, copy and ** ** distribute it, but if you alter any source code do not distribute ** ** the altered copy. i.e. you may alter this file for your own use only. ** ** ** *****************************************************************************/ /* You may need to change the location of some of the .h files. I can't account for everyone... */ #include <stdio.h> #include <ctype.h> #include <signal.h> #include <sys/types.h> #include <errno.h> #include <pwd.h> #ifdef ATT # include <dirent.h> # include <termio.h> # include <sys/file.h> # include <sys/time.h> #endif #ifdef MINIX # include <sgtty.h> # include <dirent.h> # include <fcntl.h> # ifndef ATARI_ST # include <sys/dir.h> # include <sys/time.h> # else # include <time.h> # endif #endif #ifdef UCB # include <sgtty.h> # include <sys/dir.h> # include <sys/time.h> # include <sys/file.h> # include <sys/resource.h> # ifdef SUN # include <sys/wait.h> # else # include <wait.h> # endif #endif /* Here is the Minix section i.e all the things that had to be set up to get Minix to go */ #ifdef MINIX # define TIOCSETN TIOCSETP # define lstat stat # define O_echoexpbefore O_ebefore # define builtin_name b_name # define builtin_func b_func # define current_alias c_alias # define getline getlin # define alias_depth als_dpt #endif /* for some reason the read set the error flag before the eof flag so I wrote my own ffinish macro which does both feof and ferror simultaneously */ #ifdef MINIX # define ffinish(p) (((p)->_flags&(_EOF|_ERR))!=0) #else # define ffinish(p) (((p)->_flag&(_IOEOF|_IOERR))!=0) #endif /*************************************************************************** Anything that needs to be changed is under this line. ***************************************************************************/ /* name of file with user passwords and directory entries e.g. /etc/passwd */ #define PASSWD "/etc/passwd" /* name of help program (full path, please) */ #define HELP "/usr/local/utilities/man" /* name of default interpreter shell. Normally it will be Bourne Shell */ #define DFLTSH "/bin/sh" /* name of default editor to use for alias creation. */ #define DFLTED "/usr/ucb/vi" /* Clam needs to know where it is for customised popen */ #define CLAMSH "/ccen/callum/bin/clam" /* Sizes of some data structures */ #ifdef MINIX # define MAXARG 512 /* no. of arguments */ # define MAXWL 512 /* word length */ # define MAXFNL 128 /* file name length */ # define MAXLL 1024 /* line length */ # define MAXPL 128 /* path length */ # define MAXCAN 1000 /* maximum number of candidates */ # define VARNL 32 /* variable name length */ # define VARVL 256 /* variable value length */ # define USERNL 32 /* max length of user names */ # define MAXAL 16 /* max depth of aliases */ #else # define MAXARG 512 /* no. of arguments */ # define MAXWL 1024 /* word length */ # define MAXFNL 256 /* file name length */ # define MAXLL 2048 /* line length */ # define MAXPL 2048 /* path length */ # define HSHSIZ 1021 /* size of hash array */ # define MAXCAN 2500 /* maximum number of candidates */ # define VARNL 256 /* variable name length */ # define VARVL 1024 /* variable value length */ # define USERNL 32 /* max length of user names */ # define MAXAL 32 /* max depth of aliases */ #endif /* number of signals. For ucb usually 27, for att 19. */ #ifdef ATT # define NUMSIG 19 #endif #ifdef MINIX # ifdef ATARI_ST # define NUMSIG NSIG /* defined in <signal.h> */ # else # define NUMSIG 19 # endif #endif #ifdef UCB # define NUMSIG 27 #endif /**************************************************************************** Don't change anything past this line unless you're hacking. ****************************************************************************/ /* Some general defines */ #define EOS '\0' #define UNDEF -1 #define NFILES 20 #define ALIASEX 01 /* executable is alias */ #define BUILTEX 02 /* executable is builtin */ #define EXTYPE 03 /* mask for the type of executable */ #define BEFOREDOT 0 /* priority flag bit if before . on path */ #define AFTERDOT 04 /* priority flag bit if after . on path */ #define PRIORITY 04 /* mask for priority of executable (as above) */ /* Identification for error codes for metacharacter expansion function */ #ifdef OK /* defined somewhere on minixST */ #undef OK #endif #define OK 0 #define SH_ERR -1 #define ST_ERR -2 #define BR_ERR -3 #define BQ_ERR -4 #define QM_ERR -5 #define TL_ERR -6 #define CY_ERR -7 #define CT_ERR -8 #define NX_ERR -9 #define DL_ERR -10 typedef enum TS {RDRIN,RDROUT,RDRERR,APPND,PIPE,WORD,ENDLN,SEMI,EQ,ADD,BCKGND,DBLPIPE,DBLAMP,ERRER} SYM_T; /* some brain damaged people put these in stdio */ #ifdef FALSE #undef FALSE #endif #ifdef TRUE #undef TRUE #endif typedef enum bb {FALSE,TRUE} bool; /* These structures are used to store the alias definitions. */ struct adefn { char *a_line; struct adefn *nextln; }; struct alias { char *a_name; struct adefn *defin; struct alias *next; }; /* ex_ptr is the hasharray structure's union which points to an executable's whereabouts */ union ex_ptr { char *dir; void (*builtin_fn)(); struct adefn *alias_defn; }; /* har is the hasharray structure */ struct har { char *name; char flag; union ex_ptr exec_ptr; }; struct job { int jobnumber; int pid; char *name; bool rdrout; char *dir; #ifdef ATT int status; #endif #ifdef MINIX int status; #endif #ifdef UCB union wait status; #endif long lastmod; struct job *next; }; #ifdef __STDC__ #ifndef __NO_PROTO__ /* alias.c */ struct adefn *checkalias (char *aname); void aliaslist (char *aname); void savealias (char *aname, FILE *fp); void addalias (char *aname, struct adefn *stdefn); void makelinealias (char *aname, char *aline); void makealias (char *aname, FILE *fp); void delalias (char *aname); /* builtin1.c */ void alias (int argc, char **argv, int infd, int outfd, int errfd, char *ifil, char *ofil, char *efil, bool appnd, bool bckgnd); void logout (int argc, char **argv, int infd, int outfd, int errfd, char *ifil, char *ofil, char *efil, bool appnd, bool bckgnd); void Kill (int argc, char *argv[], int infd, int outfd, int errfd, char *ifil, char *ofil, char *efil, bool appnd, bool bckgnd, bool piped); void limit (int argc, char *argv[], int infd, int outfd, int errfd, char *ifil, char *ofil, char *efil, bool appnd, bool bckgnd, bool piped); void unlimit (int argc, char *argv[], int infd, int outfd, int errfd, char *ifil, char *ofil, char *efil, bool appnd, bool bckgnd, bool piped); void (*checkbuiltins())(char *); /* builtin2.c */ void printlimit (char *limname); void setlimit (char *limname, char *limval); int getnextword (char *line, int *pos, char *word); int convert (char *string); void editalias (char *aname); /* clex.c */ bool firstword (char *line, int pos); void complete (char *line, int *pos, int curs[]); void nameopt (char *line, int pos, int curs[]); /* comlined.c */ void mputc (int c, FILE *f, int curs[]); int oputc (int c); void go (int curs[], int hor, int vert); void backward (int curs[]); void forward (int curs[]); void clrscrn (void); void insert (char *line, int pos, int letter, int curs[]); void overwr (char *line, int pos, int letter, int curs[]); void show (char *line, int curs[], bool clearing); void goend (char *line, int *pos, int curs[]); void copyback (char *line, int pos, int curs[], int count); void delnextword (char *line, int pos, int curs[]); void delprevword (char *line, int *pos, int curs[]); void backword (char *line, int *pos, int curs[]); void forword (char *line, int *pos, int curs[]); void yanknext (char *line, int pos, char *yankbuf); void yankprev (char *line, int pos, char *yankbuf); void clrline (char *line, int pos, int curs[]); void transpose (char *line, int pos, int curs[]); int strip (char *line); void tardis (char *line, int *pos, int curs[]); bool getline (char *line, int *nosave, int feature_off); /* cx.c */ bool expand_tilde (char *user_path, int *builtin); void help (char *line, int pos, int curs[]); /* exec.c */ void setbgexec (void); void resetsigdefaults (void); bool findslash (char *string); void runalias (struct adefn *start, int argc, char *argv[], int infd, int outfd, int errfd, char *ifil, char *ofil, char *efil, bool appnd, bool bckgnd, bool piped); int getpath (char *fullpathname, char *name, int flag); void panic (char *mess); int atoo (char *str); void setmask (char *str); void redirect (int infd, int outfd, int errfd, char *ifil, char *ofil, char *efil, bool appnd, bool bckgnd); int execute (int argc, char *argv[], int infd, int outfd, int errfd, char *ifil, char *ofil, char *efil, bool appnd, bool bckgnd, bool piped, int fromfile); /* file.c */ bool getfileline (char *line, FILE *fp, int nostrip); void File (FILE *finp, int nosave); /* hash.c */ bool executable (char *dir, char *entname, int nojoin); #ifdef HASH int hash (char *name); int hashaliases (void); int hashbuiltins (void); int tildehashisin (char *path); void inihash (void); void hashpath (void); #endif /* hist.c */ int savehist (char *line, int histnum, int max); void loadhist (char *line, int *pos, int histnum, int curs[]); void mprint (char *line, int nocr); void history (char *argv[]); bool gethist (char *event); char *getnumhist (int histnum); int matchhist (int histnum); int matchhline (char *line, int startnum); /* job.c */ #ifdef JOB void joblist (void); bool stoppedjobs (void); struct job *findjob (int pid); int pidfromjob (int jobno); void addreport (struct job *newone); int addjob (int pid, char *name, int outfd, bool bckgnd); void newcurr (void); void rmjob (int pid); int update (int pid, union wait status); void checkjobs (void); int waitfor (int pid); void reportjobs (void); #endif /* main.c */ int lengthint (int num); void printime (void); void prprompt (int prtype); bool tflagexist (char *id, char *tc); void printctrl (char *name, char *str); void terminal (void); void graceful (int sig); void setup (void); void resetsh (void); void setdown (void); void leave_shell (void); int process (int argc, char *argv[], char *comfile); void shinit (void); void interact (void); void execstring (int argc, char *argv[], int argp); int main (int argc, char *argv[], char *envp[]); /* meta.c */ void getdir (FILE *fp, char *line); int isanum (char *string); int meta_1 (char *line, int nosave); int meta_2 (char *line); /* parse.c */ bool getword (char *line, int *pos, char *word, bool allow_slash_or_bracket); SYM_T retsym (char *line, char *word, int *pos, bool allow_colon); bool getpipeline (char *line, int *pos, char *pipeline, bool sts); SYM_T intercom (char *line, int *pos, int *wpid, int *outpfd, bool pipedin, int fromfile); /* var.c */ char *vget (char *vname); char *vwget (char *vname, int wnum); bool export (char *vname, char *opt); void makenvpath (void); void makenventry (char *vname); void makenv (void); void vset (char *vname, char *vval); void vadd (char *vname, char *vval); void vdel (char *vname); void venvdel (char *vname); void vprint (void); void venvprint (void); void copyenv (char *newenv[], char *envp[]); void loadenv (void); #endif /* __NO_PROTO__ */ #endif /* __STDC__ */ //E*O*F header.h// exit 0