evas@euraiv1.UUCP (Eelco van Asperen) (10/02/87)
Here is part 9 of 9: Eelco van Asperen. # This is a shar archive. Extract with sh, not csh. # This archive ends with exit, so do not worry about trailing junk. # --------------------------- cut here -------------------------- echo Extracting commands/rm.dif sed 's/^X//' > commands/rm.dif << '+ END-OF-FILE 'commands/rm.dif X107,109c107,109 X< stderr3 ("rm: remove ", name, " with mode "); X< octal(s.st_mode & 0777); X< std_err("? "); X--- X> stderr3 ("rm: remove ", name, " (mode = "); X> octal(s.st_mode & 0777); X> std_err(") ? "); X132,133c132,133 X< execl ("/bin/rmdir", "rmdir", name, 0); X< execl ("/usr/bin/rmdir", "rmdir", name, 0); X--- X> execl ("/bin/rmdir", "rmdir", name, (char*) 0); X> execl ("/usr/bin/rmdir", "rmdir", name, (char*) 0); + END-OF-FILE commands/rm.dif chmod u=rw,g=r,o=r commands/rm.dif set `sum commands/rm.dif` sum=$1 case $sum in 31036) :;; *) echo 'Bad sum in 'commands/rm.dif >&2 esac echo Extracting commands/rmdir.dif sed 's/^X//' > commands/rmdir.dif << '+ END-OF-FILE 'commands/rmdir.dif X1c1,3 X< /* rmdir - remove a directory Author: Adri Koppes */ X--- X> /* rmdir - remove a directory Author: Adri Koppes X> * (modified by Paul Polderman) X> */ X29a32,33 X> extern char *rindex(); X> X37a42 X> register char *p; X49,55c54,60 X< strcpy (dots, dirname); X< while (dirname[fd]) X< if (dirname[fd++] == '/') X< sl = fd; X< dots[sl] = '\0'; X< if (access (dots, 2)) { X< stderr2(dirname, " no permission\n"); X--- X> if (p = rindex(dirname, '/')) X> p++; X> else X> p = dirname; X> X> if (strcmp(p, ".") == 0 || strcmp(p, "..") == 0) { X> stderr2(dirname, " will not remove \".\" or \"..\"\n"); X59,61c64,71 X< stat ("", &cwd); X< if ((s.st_ino == cwd.st_ino) && (s.st_dev == cwd.st_dev)) { X< std_err ("rmdir: can't remove current directory\n"); X--- X> X> strcpy (dots, dirname); X> while (dirname[fd]) X> if (dirname[fd++] == '/') X> sl = fd; X> dots[sl] = '\0'; X> if (access (dots, 2)) { X> stderr2(dirname, " no permission\n"); X65,67c75,77 X< if ((fd = open (dirname, 0)) < 0) { X< stderr2("can't read ", dirname); X< std_err("\n"); X--- X> stat ("", &cwd); X> if ((s.st_ino == cwd.st_ino) && (s.st_dev == cwd.st_dev)) { X> std_err ("rmdir: can't remove current directory\n"); X70a81,86 X> if ((fd = open (dirname, 0)) < 0) { X> stderr2("can't read ", dirname); X> std_err("\n"); X> error++; X> return; X> } X81,86c97,106 X< strcat (dots, "/."); X< unlink (dots); X< strcat (dots, "."); X< unlink (dots); X< if (unlink (dirname)) { X< stderr2("can't remove ", dirname); X--- X> strcat (dots, "/.."); X> patch_path(dots); X> for (p = dots; *p; p++) /* find end of dots */ X> ; X> unlink(dots); /* dirname/.. */ X> *(p - 1) = '\0'; X> unlink(dots); /* dirname/. */ X> *(p - 3) = '\0'; X> if (unlink(dots)) { /* dirname */ X> stderr2("can't remove ", dots); X99a120,148 X> X> patch_path(dir) X> char *dir; /* pathname ending with "/.." */ X> { X> register char *p, *s; X> struct stat pst, st; X> X> if (stat(dir, &pst) < 0) X> return; X> p = dir; X> while (*p == '/') p++; X> while (1) { X> s = p; /* remember start of new pathname part */ X> while (*p && *p != '/') X> p++; /* find next slash */ X> if (*p == '\0') X> return; /* if end of pathname, return */ X> X> /* check if this part of pathname == the original pathname */ X> *p = '\0'; X> stat(dir, &st); X> if (st.st_ino == pst.st_ino && st.st_dev == pst.st_dev X> && strcmp(s, "..") == 0) X> return; X> /* if not, try next part */ X> *p++ = '/'; X> while (*p == '/') p++; X> } X> } + END-OF-FILE commands/rmdir.dif chmod u=rw,g=r,o=r commands/rmdir.dif set `sum commands/rmdir.dif` sum=$1 case $sum in 48972) :;; *) echo 'Bad sum in 'commands/rmdir.dif >&2 esac echo Extracting commands/roff.dif sed 's/^X//' > commands/roff.dif << '+ END-OF-FILE 'commands/roff.dif X1c1,16 X< /* roff - text justifier Author: George Sicherman */ X--- X> /* roff - text justifier Author: George L. Sicherman */ X> X> /* X> * roff - C version. X> * the Colonel. 19 May 1983. X> * X> * Copyright 1983 by G. L. Sicherman. X> * You may use and alter this software freely for noncommercial ends X> * so long as you leave this message alone. X> * X> * Fix by Tim Maroney, 31 Dec 1984. X> * .hc implemented, 8 Feb 1985. X> * Fix to hyphenating with underlining, 12 Feb 1985. X> * Fixes to long-line hang and .bp by Dave Tutelman, 30 Mar 1985. X> * Fix to centering valve with long input lines, 4 May 1987. X> */ X14,16c29,32 X< #define UNDERL 0200 X< X< char cumbuf[BUFSIZ]; X--- X> #define UNDERL '\200' X> X> char cumbuf[BUFSIZ]; X> X48d63 X< int center = 0; X67d81 X< X128,130c142,144 X< char *ttyname(); X< X< /* This routine is not needed -- X--- X> /* This routine is not needed. X> char *ttyname(); X> X138c152 X< */ X--- X> * ------- end of mesg */ X145,147c159,162 X< if (center || !o_fi) { X< if (assylen) writeline(0,1); X< else blankline(); X--- X> if (o_ce || !o_fi) { X> if (assylen) writeline(0,1); X> else blankline(); X> if (o_ce) o_ce--; X213,214d227 X< center=o_ce; X< if (o_ce) o_ce--; X227a241,244 X> * Tutelman's fix #1, modified by the Colonel. X> */ X> if (!o_fi || o_ce) goto giveup; X> /* X242c259 X< if (*hc!=o_hc) continue; X--- X> if ((*hc&~UNDERL)!=o_hc) continue; X293c310 X< for (t=s; *s; s++) if (*s != o_hc) *t++ = *s; X--- X> for (t=s; *s; s++) if ((*s&~UNDERL) != o_hc) *t++ = *s; X307c324 X< while (*s) n += (o_hc != *s++); X--- X> while (*s) n += (o_hc != (~UNDERL & *s++)); X372,373c389,393 X< if (s>0) o_bp=page_no-r; X< else if (s<0) o_bp=page_no+r; X--- X> /* X> * Tutelman's fix #2 - the signs were reversed! X> */ X> if (s>0) o_bp=page_no+r; X> else if (s<0) o_bp=page_no-r; X388,389c408,413 X< nread(&o_ce); X< writebreak(); X--- X> /* X> * Fix to centering. Set counter _after_ breaking! --G.L.S. X> */ X> nread(&r); X> writebreak(); X> o_ce = r; X735c759 X< if (c==EOF || c=='\n') break;; X--- X> if (c==EOF || c=='\n') break; X836c860 X< if (center) for (j=0; j<(o_ll-assylen+1)/2; j++) spit(' '); X--- X> if (o_ce) for (j=0; j<(o_ll-assylen+1)/2; j++) spit(' '); X1085c1109,1112 X< c = *t; X--- X> /* X> * fix - last char translates to space. X> */ X> c = *t? *t: ' '; X1123,1125c1150 X< * strhas - does string have character? X< * USG and BSD both have this in their libraries. Now, if X< * they could just agree on the name of the function ... X--- X> * strhas - does string have character? Allow UNDERL flag. X1132c1157 X< for (; *p; p++) if (*p==c) return p; X--- X> for (; *p; p++) if ((*p&~UNDERL)==c) return p; + END-OF-FILE commands/roff.dif chmod u=rw,g=r,o=r commands/roff.dif set `sum commands/roff.dif` sum=$1 case $sum in 57369) :;; *) echo 'Bad sum in 'commands/roff.dif >&2 esac if test -f commands/sh then echo Removing commands/sh rm commands/sh fi if test -d commands/sh then : else echo Creating commands/sh mkdir commands/sh fi echo Extracting commands/sh/sh-h.dif sed 's/^X//' > commands/sh/sh-h.dif << '+ END-OF-FILE 'commands/sh/sh-h.dif X88,98c88,98 X< char **dolv; X< int dolc; X< int exstat; X< char gflg; X< int talking; /* interactive (talking-type wireless) */ X< int execflg; X< int multiline; /* \n changed to ; */ X< struct op *outtree; /* result from parser */ X< X< xint *failpt; X< xint *errpt; X--- X> Extern char **dolv; X> Extern int dolc; X> Extern int exstat; X> Extern char gflg; X> Extern int talking; /* interactive (talking-type wireless) */ X> Extern int execflg; X> Extern int multiline; /* \n changed to ; */ X> Extern struct op *outtree; /* result from parser */ X> X> Extern xint *failpt; X> Extern xint *errpt; X103,104c103,105 X< } *brklist; X< int isbreak; X--- X> } ; X> Extern struct brkcon *brklist; X> Extern int isbreak; X127,128c128,129 X< struct wdblock *wdlist; X< struct wdblock *iolist; X--- X> Extern struct wdblock *wdlist; X> Extern struct wdblock *iolist; X152,166c153,167 X< char *flag; X< X< char *null; /* null value for variable */ X< int intr; /* interrupt pending */ X< X< char *trap[NSIG]; X< char ourtrap[NSIG]; X< int trapset; /* trap pending */ X< X< int inword; /* defer traps and interrupts */ X< X< int yynerrs; /* yacc */ X< X< char line[LINELIM]; X< char *elinep; X--- X> extern char *flag; X> X> extern char *null; /* null value for variable */ X> extern int intr; /* interrupt pending */ X> X> Extern char *trap[NSIG]; X> Extern char ourtrap[NSIG]; X> Extern int trapset; /* trap pending */ X> X> extern int inword; /* defer traps and interrupts */ X> X> Extern int yynerrs; /* yacc */ X> X> Extern char line[LINELIM]; X> extern char *elinep; X219,226c220,227 X< struct var *vlist; /* dictionary */ X< X< struct var *homedir; /* home directory */ X< struct var *prompt; /* main prompt */ X< struct var *cprompt; /* continuation prompt */ X< struct var *path; /* search path for commands */ X< struct var *shell; /* shell to interpret command files */ X< struct var *ifs; /* field separators */ X--- X> Extern struct var *vlist; /* dictionary */ X> X> Extern struct var *homedir; /* home directory */ X> Extern struct var *prompt; /* main prompt */ X> Extern struct var *cprompt; /* continuation prompt */ X> Extern struct var *path; /* search path for commands */ X> Extern struct var *shell; /* shell to interpret command files */ X> Extern struct var *ifs; /* field separators */ X256c257 X< struct io iostack[NPUSH]; X--- X> Extern struct io iostack[NPUSH]; X260,263c261,266 X< #define XIO 3 /* file IO */ X< X< /* in substitution */ X< #define INSUB() (e.iop->task == XGRAVE || e.iop->task == XDOLL) X--- X> #define XIO 4 /* file IO */ X> #define XHERE 0x80 /* Any of the above inside a here document */ X> #define XMASK 0x7f /* Get the actual task */ X> X> /* in substitution */ X> #define INSUB() ((e.iop->task&XMASK)==XGRAVE||(e.iop->task&XMASK)==XDOLL) X300c303 X< struct ioarg temparg; /* temporary for PUSHIO */ X--- X> Extern struct ioarg temparg; /* temporary for PUSHIO */ X330c333 X< int areanum; /* current allocation area */ X--- X> Extern int areanum; /* current allocation area */ + END-OF-FILE commands/sh/sh-h.dif chmod u=rw,g=r,o=r commands/sh/sh-h.dif set `sum commands/sh/sh-h.dif` sum=$1 case $sum in 37516) :;; *) echo 'Bad sum in 'commands/sh/sh-h.dif >&2 esac echo Extracting commands/sh/sh1.dif sed 's/^X//' > commands/sh/sh1.dif << '+ END-OF-FILE 'commands/sh/sh1.dif X0a1 X> #define Extern extern X21c22 X< char **environ; /* environment pointer */ X--- X> extern char **environ; /* environment pointer */ X40a42 X> initarea(); X163c165 X< setval(lookup("#"), putn(dolc)); X--- X> setval(lookup("#"), putn(dolc-1)); X205d206 X< register char *cp; X213,215c214 X< cp = getcell(258); X< garbage(); X< DELETE(cp); X--- X> garbage(); X522c521 X< if (vp == 0 || (vp->name = space(cp-n+2)) == 0) { X--- X> if (vp == 0 || (vp->name = space((int)(cp-n)+2)) == 0) { X669c668 X< write(out, vp->name, findeq(vp->name) - vp->name); X--- X> write(out, vp->name, (int)(findeq(vp->name) - vp->name)); X772,773c771,773 X< #define GROWBY 1024 X< #define SHRINKBY 256 X--- X> #define REGSIZE sizeof(struct region) X> #define GROWBY 256 X> #undef SHRINKBY 64 X786,792c786,793 X< /*initial empty arena*/ X< extern struct region area1; X< static struct region area2 = {&area1, BUSY}; X< static struct region area1 = {&area2, BUSY}; X< static struct region *areap = &area1; X< static struct region *areatop = &area1; X< static struct region *areabrk; X--- X> /* X> * All memory between (char *)areabot and (char *)(areatop+1) is X> * exclusively administered by the area management routines. X> * It is assumed that sbrk() and brk() manipulate the high end. X> */ X> static struct region *areabot; /* bottom of area */ X> static struct region *areatop; /* top of area */ X> static struct region *areanxt; /* starting point of scan */ X795a797,807 X> initarea() X> { X> while ((int)sbrk(0) & ALIGN) X> sbrk(1); X> areabot = (struct region *)sbrk(REGSIZE); X> areabot->next = areabot; X> areabot->area = BUSY; X> areatop = areabot; X> areanxt = areabot; X> } X> X800,836c812,868 X< register int rbytes; X< register struct region *p, *q; X< struct region *newbrk; X< X< if (areabrk == NULL) X< areabrk = (struct region *)(((int)sbrk(0)+ALIGN)&~ALIGN); X< X< rbytes = (nbytes+sizeof(struct region)-1)/sizeof(struct region) + 1; X< p=areap; X< for (;;) { X< do { X< if (p->area > areanum) { X< while ((q = p->next)->area > areanum) X< p->next = q->next; X< if (q >= p+rbytes) { X< areap = p+rbytes; X< if (q > areap) { X< areap->next = p->next; X< areap->area = FREE; X< } X< p->next = areap; X< p->area = areanum; X< return((char *)(p+1)); X< } X< } X< q = p; p = p->next; X< } while (q >= areap || p < areap); X< newbrk = (struct region *)sbrk(rbytes>=GROWBY? rbytes: GROWBY); X< if ((int)newbrk == -1) X< return(NULL); X< newbrk = (struct region *)sbrk(0); X< areatop->next = areabrk; X< areatop->area = ((q=areabrk)!=areatop+1)? BUSY: FREE; X< areatop = areabrk->next = newbrk-1; X< areabrk->area = FREE; areabrk = newbrk; X< areatop->next = &area2; areatop->area=BUSY; X< } X--- X> register int nregio; X> register struct region *p, *q; X> register i; X> X> if (nbytes == 0) X> abort(); /* silly and defeats the algorithm */ X> /* X> * round upwards and add administration area X> */ X> nregio = (nbytes+(REGSIZE-1))/REGSIZE + 1; X> for (p = areanxt;;) { X> if (p->area > areanum) { X> /* X> * merge free cells X> */ X> while ((q = p->next)->area > areanum) X> p->next = q->next; X> /* X> * exit loop if cell big enough X> */ X> if (q >= p + nregio) X> goto found; X> } X> p = p->next; X> if (p == areanxt) X> break; X> } X> i = nregio >= GROWBY ? nregio : GROWBY; X> p = (struct region *)sbrk(i * REGSIZE); X> if ((int)p == -1) X> return(NULL); X> p--; X> if (p != areatop) X> abort(); /* allocated areas are contiguous */ X> q = p + i; X> p->next = q; X> p->area = FREE; X> q->next = areabot; X> q->area = BUSY; X> areatop = q; X> found: X> /* X> * we found a FREE area big enough, pointed to by 'p', and up to 'q' X> */ X> areanxt = p + nregio; X> if (areanxt < q) { X> /* X> * split into requested area and rest X> */ X> if (areanxt+1 > q) X> abort(); /* insufficient space left for admin */ X> areanxt->next = q; X> areanxt->area = FREE; X> p->next = areanxt; X> } X> p->area = areanum; X> return((char *)(p+1)); X847,848c879,880 X< if (p < areap) X< areap = p; X--- X> if (p < areanxt) X> areanxt = p; X860,865c892,894 X< p = &area1; X< do { X< if (p->area >= a) X< p->area = FREE; X< p = p->next; X< } while (p != top); X--- X> for (p = areabot; p != top; p = p->next) X> if (p->area >= a) X> p->area = FREE; X883,907c912,929 X< register int nu; X< X< top = areatop; X< X< areap = p = &area1; X< do { X< if (p->area>areanum) { X< while ((q = p->next)->area > areanum) X< p->next = q->next; X< areap = p; X< } X< q = p; p = p->next; X< } while (p != top); X< #if STOPSHRINK == 0 X< nu = (SHRINKBY+sizeof(struct region)-1)/sizeof(struct region); X< if (areatop >= q+nu && X< q->area > areanum) { X< brk((char *)(areabrk -= nu)); X< q->next = areatop = areabrk-1; X< areatop->next = &area2; X< areatop->area = BUSY; X< } X< #endif X< } X< X--- X> X> top = areatop; X> for (p = areabot; p != top; p = p->next) { X> if (p->area > areanum) { X> while ((q = p->next)->area > areanum) X> p->next = q->next; X> areanxt = p; X> } X> } X> #ifdef SHRINKBY X> if (areatop >= q + SHRINKBY && q->area > areanum) { X> brk((char *)(q+1)); X> q->next = areabot; X> q->area = BUSY; X> areatop = q; X> } X> #endif X> } + END-OF-FILE commands/sh/sh1.dif chmod u=rw,g=r,o=r commands/sh/sh1.dif set `sum commands/sh/sh1.dif` sum=$1 case $sum in 49975) :;; *) echo 'Bad sum in 'commands/sh/sh1.dif >&2 esac echo Extracting commands/sh/sh2.dif sed 's/^X//' > commands/sh/sh2.dif << '+ END-OF-FILE 'commands/sh/sh2.dif X0a1 X> #define Extern extern + END-OF-FILE commands/sh/sh2.dif chmod u=rw,g=r,o=r commands/sh/sh2.dif set `sum commands/sh/sh2.dif` sum=$1 case $sum in 2318) :;; *) echo 'Bad sum in 'commands/sh/sh2.dif >&2 esac echo Extracting commands/sh/sh3.dif sed 's/^X//' > commands/sh/sh3.dif << '+ END-OF-FILE 'commands/sh/sh3.dif X0a1 X> #define Extern extern X529,530c530,531 X< *v = "/bin/sh"; X< execve(*v, v, envp); X--- X> *v = e.linep; X> execve("/bin/sh", v, envp); + END-OF-FILE commands/sh/sh3.dif chmod u=rw,g=r,o=r commands/sh/sh3.dif set `sum commands/sh/sh3.dif` sum=$1 case $sum in 9698) :;; *) echo 'Bad sum in 'commands/sh/sh3.dif >&2 esac echo Extracting commands/sh/sh4.dif sed 's/^X//' > commands/sh/sh4.dif << '+ END-OF-FILE 'commands/sh/sh4.dif X0a1 X> #define Extern extern X348a350,353 X> X> /* jrp debug */ X> scraphere(); X> X454c459 X< for (dp = cp = space(pp-np+3); np < pp;) X--- X> for (dp = cp = space((int)(pp-np)+3); np < pp;) X512c517 X< p = op = space(end1-start1+strlen(middle)+strlen(end)+2); X--- X> p = op = space((int)(end1-start1)+strlen(middle)+strlen(end)+2); X631c636 X< if ((n=lim-base) <= v2) X--- X> if ((n=(int)(lim-base)) <= v2) + END-OF-FILE commands/sh/sh4.dif chmod u=rw,g=r,o=r commands/sh/sh4.dif set `sum commands/sh/sh4.dif` sum=$1 case $sum in 28634) :;; *) echo 'Bad sum in 'commands/sh/sh4.dif >&2 esac echo Extracting commands/sh/sh5.dif sed 's/^X//' > commands/sh/sh5.dif << '+ END-OF-FILE 'commands/sh/sh5.dif X0a1 X> #define Extern extern X28c29 X< if (ec != '\'') { X--- X> if ((ec != '"') && (ec != '\'')) { X402d402 X< char *memcpy(); X416,419c416,419 X< char *b_start; X< char *b_next; X< char *b_line; X< int b_size; X--- X> char *b_linebuf; X> char *b_next; X> char b_tmpfile[50]; X> int b_fd; X424c424 X< #define NCPB 100 /* here text block allocation unit */ X--- X> #define NCPB 2048 /* here text block allocation unit */ X438a439 X> h->h_iop->io_un.io_here = NULL; X461,462c462,466 X< for (h = herelist; h != NULL; h = h->h_next) X< h->h_iop->io_un.io_here = readhere(h->h_tag, h->h_dosub? 0: '\''); X--- X> for (h = herelist; h != NULL; h = h->h_next) { X> h->h_iop->io_un.io_here = X> readhere(h->h_tag, h->h_dosub? 0: '\'', X> h->h_iop->io_flag & IOXHERE); X> } X467c471 X< readhere(s, ec) X--- X> readhere(s, ec, nolit) X476a481,485 X> bp->b_linebuf = (char *)space(NCPB); X> if (bp->b_linebuf == 0) { X> /* jrp - should release bp here... */ X> return(0); X> } X482,485c491,496 X< bp->b_size = 0; X< bp->b_line = 0; X< bp->b_next = 0; X< bp->b_start = 0; X--- X> X> /* jrp changes */ X> bp->b_linebuf[0] = 0; X> bp->b_next = bp->b_linebuf; X> bp->b_tmpfile[0] = 0; X> bp->b_fd = -1; X490c501 X< if (savec(c, bp) == 0) { X--- X> if (savec(c, bp, nolit) == 0) { X495,501c506,511 X< savec(0, bp); X< if (strcmp(s, bp->b_line) == 0 || c == 0) X< break; X< bp->b_next[-1] = '\n'; X< bp->b_line = bp->b_next; X< } X< *bp->b_line = 0; X--- X> savec(0, bp, nolit); X> if (strcmp(s, bp->b_linebuf) == 0 || c == 0) X> break; X> savec('\n', bp, nolit); X> } X> *bp->b_linebuf = 0; X511,586c521,681 X< savec(c, bp) X< register struct block *bp; X< { X< register char *np; X< X< if (bp->b_start == NULL || bp->b_next+1 >= bp->b_start+bp->b_size) { X< np = space(bp->b_size + NCPB); X< if (np == 0) X< return(0); X< memcpy(np, bp->b_start, bp->b_size); X< bp->b_size += NCPB; X< bp->b_line = np + (bp->b_line-bp->b_start); X< bp->b_next = np + (bp->b_next-bp->b_start); X< xfree(bp->b_start); X< bp->b_start = np; X< } X< *bp->b_next++ = c; X< return(1); X< } X< X< herein(bp, xdoll) X< struct block *bp; X< { X< register tf; X< char tname[50]; X< static int inc; X< register char *cp, *lp; X< X< if (bp == 0) X< return(-1); X< for (cp = tname, lp = "/tmp/shtm"; (*cp = *lp++) != '\0'; cp++) X< ; X< lp = putn(getpid()*100 + inc++); X< for (; (*cp = *lp++) != '\0'; cp++) X< ; X< if ((tf = creat(tname, 0666)) >= 0) { X< if (xdoll) { X< char c; X< jmp_buf ev; X< X< if (newenv(setjmp(errpt = ev)) == 0) { X< PUSHIO(aword, bp->b_start, strchar); X< setbase(e.iop); X< while ((c = subgetc(0, 0)) != 0) { X< c &= ~ QUOTE; X< write(tf, &c, sizeof c); X< } X< quitenv(); X< } else X< unlink(tname); X< } else X< write(tf, bp->b_start, bp->b_line-bp->b_start); X< close(tf); X< tf = open(tname, 0); X< unlink(tname); X< } X< return(tf); X< } X< X< scraphere() X< { X< herelist = NULL; X< } X< X< char * X< memcpy(ato, from, nb) X< register char *ato, *from; X< register int nb; X< { X< register char *to; X< X< to = ato; X< while (--nb >= 0) X< *to++ = *from++; X< return(ato); X< } X--- X> savec(c, bp, nolit) X> register struct block *bp; X> { X> /* jrp - gutted routine completely, modified to use temp file. */ X> X> /* If the file is not open, see if a filename needs to be X> * created. If so, create one. Then create the file. X> */ X> char * lp; X> char * cp; X> static int inc; X> int len; X> X> if(bp->b_fd < 0) { X> if(bp->b_tmpfile[0] == 0) { X> /* Key this by the PID plus a tag... */ X> for (cp = bp->b_tmpfile, lp = "/tmp/shtm"; X> (*cp = *lp++) != '\0'; cp++) X> ; X> X> inc = (inc + 1) % 100; X> lp = putn(getpid()*100 + inc); X> for (; (*cp = *lp++) != '\0'; cp++) X> ; X> } X> X> /* Create the file, then open it for X> * read/write access. After opening the X> * file, unlink it to it'll go away when X> * we're through using it. X> */ X> bp->b_fd = creat(bp->b_tmpfile, 0600); X> close(bp->b_fd); X> bp->b_fd = open(bp->b_tmpfile, 2); X> unlink(bp->b_tmpfile); X> if(bp->b_fd < 0) { X> return(0); X> } X> } X> X> /* Stuff the character into the line buffer. If it's a X> * newline, then insert it before the trailing null, write X> * out the line, and reset the line buffer. X> */ X> if(c == '\n') { X> bp->b_next[-1] = '\n'; X> bp->b_next[0] = '\0'; X> len = strlen(bp->b_linebuf); X> X> /* Write this out, unless the line ended X> * with a backslash... X> */ X> if((len > 1) && (bp->b_next[-2] != '\\')) { X> write_linebuf(bp, nolit); X> } X> X> return(1); X> } X> else { X> if(bp->b_next == &(bp->b_linebuf[NCPB - 1])) { X> prs("here: line buffer full\n"); X> return(0); X> } X> *(bp->b_next++) = c; X> return(1); X> } X> } X> X> write_linebuf(bp, nolit) X> struct block * bp; X> { X> X> char c; X> jmp_buf ev; X> X> if(nolit) { X> if (newenv(setjmp(errpt = ev)) == 0) { X> PUSHIO(aword, bp->b_linebuf, strchar); X> setbase(e.iop); X> e.iop->task |= XHERE; X> while ((c = subgetc(0, 0)) != 0) { X> c &= ~ QUOTE; X> write(bp->b_fd, &c, sizeof c); X> } X> quitenv(); X> X> } X> } X> else { X> write(bp->b_fd, bp->b_linebuf, strlen(bp->b_linebuf)); X> } X> X> /* Zap the line buffer for next time... */ X> bp->b_next = bp->b_linebuf; X> bp->b_linebuf[0] = 0; X> } X> X> herein(bp, xdoll) X> struct block *bp; X> { X> int ret_fd; X> X> if (bp == 0) X> return(-1); X> X> /* If we have a temp file, then rewind it to the beginning */ X> if(bp->b_fd < 0) { X> return(-1); X> } X> X> lseek(bp->b_fd, 0L, 0); X> X> /* Free up this block pointer, as we're X> * not going to need it anymore. X> */ X> xfree(bp->b_linebuf); X> xfree(bp); X> X> return(bp->b_fd); X> } X> X> scraphere() X> { X> struct here * h; X> struct here * nexth; X> struct block * bp; X> X> X> /* Close and unlink any files associated with X> * heres in progress, and free up all the X> * associated structures. X> */ X> h = herelist; X> while(h != NULL) { X> nexth = h->h_next; X> bp = (struct block *)h->h_iop->io_un.io_here; X> if(bp != NULL) { X> if(bp->b_fd >= 0) { close(bp->b_fd); } X> if(*bp->b_tmpfile) { unlink(bp->b_tmpfile); } X> xfree(bp->b_linebuf); X> xfree(bp); X> } X> xfree(h); X> h = nexth; X> } X> X> herelist = NULL; X> } X> X> char * X> memcpy(ato, from, nb) X> register char *ato, *from; X> register int nb; X> { X> register char *to; X> X> to = ato; X> while (--nb >= 0) X> *to++ = *from++; X> return(ato); X> } + END-OF-FILE commands/sh/sh5.dif chmod u=rw,g=r,o=r commands/sh/sh5.dif set `sum commands/sh/sh5.dif` sum=$1 case $sum in 1505) :;; *) echo 'Bad sum in 'commands/sh/sh5.dif >&2 esac echo Extracting commands/sh/sh6.c sed 's/^X//' > commands/sh/sh6.c << '+ END-OF-FILE 'commands/sh/sh6.c X#define Extern X X#include <signal.h> X#include <errno.h> X#include <setjmp.h> X#include "sh.h" X + END-OF-FILE commands/sh/sh6.c chmod u=rw,g=r,o=r commands/sh/sh6.c set `sum commands/sh/sh6.c` sum=$1 case $sum in 7714) :;; *) echo 'Bad sum in 'commands/sh/sh6.c >&2 esac echo Extracting commands/split.dif sed 's/^X//' > commands/split.dif << '+ END-OF-FILE 'commands/split.dif X66c66 X< if (write(fd, base, index-base) != index-base) X--- X> if (write(fd,base,(int)(index-base)) != (int)(index-base)) X73c73 X< if (write(fd, base, index - base) != index - base) quit(); X--- X> if (write(fd, base, (int) (index-base)) != (int) (index-base)) quit(); + END-OF-FILE commands/split.dif chmod u=rw,g=r,o=r commands/split.dif set `sum commands/split.dif` sum=$1 case $sum in 20492) :;; *) echo 'Bad sum in 'commands/split.dif >&2 esac echo Extracting commands/tar.dif sed 's/^X//' > commands/tar.dif << '+ END-OF-FILE 'commands/tar.dif X60a61,62 X> char path[NAME_SIZE]; X> char pathname[NAME_SIZE]; X111,112c113,116 X< for (i = 3; i < argc; i++) X< add_file(argv[i]); X--- X> for (i = 3; i < argc; i++) { X> add_file(argv[i]); X> path[0] = '\0'; X> } X158,163c162,167 X< string_print(NIL_PTR, "linked to %s", X< header.member.m_link); X< else X< string_print(NIL_PTR, "%d tape blocks", block_size()); X< print("\n"); X< skip_entry(); X--- X> string_print(NIL_PTR, "linked to %s\n", X> header.member.m_link); X> else { X> string_print(NIL_PTR, "%d tape blocks\n", block_size()); X> skip_entry(); X> } X248c252 X< execl(MKDIR, "mkdir", dir_name, 0); X--- X> execl(MKDIR, "mkdir", dir_name, (char *) 0); X281,283c285 X< char path[NAME_SIZE]; X< X< char pathname[NAME_SIZE]; X--- X> + END-OF-FILE commands/tar.dif chmod u=rw,g=r,o=r commands/tar.dif set `sum commands/tar.dif` sum=$1 case $sum in 54112) :;; *) echo 'Bad sum in 'commands/tar.dif >&2 esac echo Extracting commands/test.c sed 's/^X//' > commands/test.c << '+ END-OF-FILE 'commands/test.c X/* test(1); version 7-like -- author Erik Baalbergen */ X#include <stat.h> X#include <sgtty.h> X X/* test(1) accepts the following grammar: X expr ::= bexpr | bexpr "-o" expr ; X bexpr ::= primary | primary "-a" bexpr ; X primary ::= unary-operator operand X | operand binary-operator operand X | operand X | "(" expr ")" X | "!" expr X ; X unary-operator ::= "-r"|"-w"|"-f"|"-d"|"-s"|"-t"|"-z"|"-n"; X binary-operator ::= "="|"!="|"-eq"|"-ne"|"-ge"|"-gt"|"-le"|"-lt"; X operand ::= <any legal UNIX file name> X*/ X X#define EOI 0 X#define FILRD 1 X#define FILWR 2 X#define FILND 3 X#define FILID 4 X#define FILGZ 5 X#define FILTT 6 X#define STZER 7 X#define STNZE 8 X#define STEQL 9 X#define STNEQ 10 X#define INTEQ 11 X#define INTNE 12 X#define INTGE 13 X#define INTGT 14 X#define INTLE 15 X#define INTLT 16 X#define UNEGN 17 X#define BAND 18 X#define BOR 19 X#define LPAREN 20 X#define RPAREN 21 X#define OPERAND 22 X X#define UNOP 1 X#define BINOP 2 X#define BUNOP 3 X#define BBINOP 4 X#define PAREN 5 X Xstruct op { X char *op_text; X short op_num, op_type; X} ops[] = { X {"-r", FILRD, UNOP}, X {"-w", FILWR, UNOP}, X {"-f", FILND, UNOP}, X {"-d", FILID, UNOP}, X {"-s", FILGZ, UNOP}, X {"-t", FILTT, UNOP}, X {"-z", STZER, UNOP}, X {"-n", STNZE, UNOP}, X {"=", STEQL, BINOP}, X {"!=", STNEQ, BINOP}, X {"-eq", INTEQ, BINOP}, X {"-ne", INTNE, BINOP}, X {"-ge", INTGE, BINOP}, X {"-gt", INTGT, BINOP}, X {"-le", INTLE, BINOP}, X {"-lt", INTLT, BINOP}, X {"!", UNEGN, BUNOP}, X {"-a", BAND, BBINOP}, X {"-o", BOR, BBINOP}, X {"(", LPAREN, PAREN}, X {")", RPAREN, PAREN}, X {0, 0, 0} X}; X Xlong num(); Xchar **ip; Xchar *prog; Xstruct op *ip_op; X Xmain(argc, argv) X char *argv[]; X{ X prog = argv[0]; X ip = &argv[1]; X exit(!(expr(lex(*ip)) && *++ip == 0)); X} X Xexpr(n) X{ X int res; X X if (n == EOI) X syntax(); X res = bexpr(n); X if (lex(*++ip) == BOR) X return expr(lex(*++ip)) || res; X ip--; X return res; X} X Xbexpr(n) X{ X int res; X X if (n == EOI) X syntax(); X res = primary(n); X if (lex(*++ip) == BAND) X return bexpr(lex(*++ip)) && res; X ip--; X return res; X} X Xprimary(n) X{ X register char *opnd1, *opnd2; X int res; X X if (n == EOI) X syntax(); X if (n == UNEGN) X return !expr(lex(*++ip)); X if (n == LPAREN) { X res = expr(lex(*++ip)); X if (lex(*++ip) != RPAREN) X syntax(); X return res; X } X if (n == OPERAND) { X opnd1 = *ip; X (void) lex(*++ip); X if (ip_op && ip_op->op_type == BINOP) { X struct op *op = ip_op; X X if ((opnd2 = *++ip) == (char *)0) X syntax(); X X switch (op->op_num) { X case STEQL: X return strcmp(opnd1, opnd2) == 0; X case STNEQ: X return strcmp(opnd1, opnd2) != 0; X case INTEQ: X return num(opnd1) == num(opnd2); X case INTNE: X return num(opnd1) != num(opnd2); X case INTGE: X return num(opnd1) >= num(opnd2); X case INTGT: X return num(opnd1) > num(opnd2); X case INTLE: X return num(opnd1) <= num(opnd2); X case INTLT: X return num(opnd1) < num(opnd2); X } X } X ip--; X return strlen(opnd1) > 0; X } X /* unary expression */ X if (ip_op->op_type != UNOP || *++ip == 0) X syntax(); X if (n == STZER) X return strlen(*ip) == 0; X if (n == STNZE) X return strlen(*ip) != 0; X return filstat(*ip, n); X} X Xfilstat(nm, mode) X char *nm; X{ X struct stat s; X struct sgttyb t; X X switch (mode) { X case FILRD: X return access(nm, 4) == 0; X case FILWR: X return access(nm, 2) == 0; X case FILND: X return stat(nm, &s) == 0 && ((s.st_mode & S_IFMT) != S_IFDIR); X case FILID: X return stat(nm, &s) == 0 && ((s.st_mode & S_IFMT) == S_IFDIR); X case FILGZ: X return stat(nm, &s) == 0 && (s.st_size > 0L); X case FILTT: X return ioctl((int)num(nm), TIOCGETP, &t) == 0; X } X} X Xint Xlex(s) X register char *s; X{ X register struct op *op = ops; X X if (s == 0) X return EOI; X while (op->op_text) { X if (strcmp(s, op->op_text) == 0) { X ip_op = op; X return op->op_num; X } X op++; X } X ip_op = (struct op *)0; X return OPERAND; X} X Xlong Xnum(s) X register char *s; X{ X long l = 0; X long sign = 1; X X if (*s == '\0') X syntax(); X if (*s == '-') { X sign = -1; X s++; X } X while (*s >= '0' && *s <= '9') X l = l * 10 + *s++ - '0'; X if (*s != '\0') X syntax(); X return sign * l; X} X Xsyntax() X{ X write(2, prog, strlen(prog)); X write(2, ": syntax error\n", 15); X exit(1); X} + END-OF-FILE commands/test.c chmod u=rw,g=r,o=r commands/test.c set `sum commands/test.c` sum=$1 case $sum in 29713) :;; *) echo 'Bad sum in 'commands/test.c >&2 esac echo Extracting commands/uudecode.c sed 's/^X//' > commands/uudecode.c << '+ END-OF-FILE 'commands/uudecode.c X/* uudecode - decode a uuencoded file */ X X/* call: uudecode [input_file] */ X X#include "stdio.h" X#include "pwd.h" X#include "stat.h" X Xextern FILE *fopen(); Xchar *fgets(); X#define NULLF (FILE *) 0 X#define NULLP (char *) 0 X X/* single character decode */ X#define DEC(c) (((c) - ' ') & 077) X Xmain(argc, argv) Xchar **argv; X{ X FILE *in, *out; X struct stat sbuf; X int mode; X char dest[128]; X char buf[80]; X X /* optional input arg */ X if (argc > 1) { X if ((in = fopen(argv[1], "r")) == NULLF) { X perror(argv[1]); X exit(1); X } X argv++; argc--; X } else X in = stdin; X X if (argc != 1) { X printf("Usage: uudecode [infile]\n"); X exit(2); X } X X /* search for header line */ X for (;;) { X if (fgets(buf, sizeof buf, in) == NULLP) { X fprintf(stderr, "No begin line\n"); X exit(3); X } X if (strncmp(buf, "begin ", 6) == 0) X break; X } X sscanf(buf, "begin %o %s", &mode, dest); X X /* handle ~user/file format */ X if (dest[0] == '~') { X char *sl; X struct passwd *getpwnam(); X char *index(); X struct passwd *user; X char dnbuf[100]; X X sl = index(dest, '/'); X if (sl == NULLP) { X fprintf(stderr, "Illegal ~user\n"); X exit(3); X } X *sl++ = 0; X user = getpwnam(dest+1); X if (user == NULL) { X fprintf(stderr, "No such user as %s\n", dest); X exit(4); X } X strcpy(dnbuf, user->pw_dir); X strcat(dnbuf, "/"); X strcat(dnbuf, sl); X strcpy(dest, dnbuf); X } X X /* create output file */ X out = fopen(dest, "w"); X if (out == NULLF) { X perror(dest); X exit(4); X } X chmod(dest, mode); X X decode(in, out); X X if (fgets(buf, sizeof buf, in) == NULLP || strcmp(buf, "end\n")) { X fprintf(stderr, "No end line\n"); X exit(5); X } X exit(0); X} X X/* X * copy from in to out, decoding as you go along. X */ Xdecode(in, out) XFILE *in; XFILE *out; X{ X char buf[80]; X char *bp; X int n; X X for (;;) { X /* for each input line */ X if (fgets(buf, sizeof buf, in) == NULLP) { X printf("Short file\n"); X exit(10); X } X n = DEC(buf[0]); X if (n <= 0) X break; X X bp = &buf[1]; X while (n > 0) { X outdec(bp, out, n); X bp += 4; X n -= 3; X } X } X} X X/* X * output a group of 3 bytes (4 input characters). X * the input chars are pointed to by p, they are to X * be output to file f. n is used to tell us not to X * output all of them at the end of the file. X */ Xoutdec(p, f, n) Xchar *p; XFILE *f; X{ X int c1, c2, c3; X X c1 = DEC(*p) << 2 | DEC(p[1]) >> 4; X c2 = DEC(p[1]) << 4 | DEC(p[2]) >> 2; X c3 = DEC(p[2]) << 6 | DEC(p[3]); X if (n >= 1) X putc(c1, f); X if (n >= 2) X putc(c2, f); X if (n >= 3) X putc(c3, f); X} X X X/* fr: like read but stdio */ Xint Xfr(fd, buf, cnt) XFILE *fd; Xchar *buf; Xint cnt; X{ X int c, i; X X for (i=0; i<cnt; i++) { X c = getc(fd); X if (c == EOF) X return(i); X buf[i] = c; X } X return (cnt); X} X X/* X * Return the ptr in sp at which the character c appears; X * NULL if not found X */ X X Xchar * Xindex(sp, c) Xregister char *sp, c; X{ X do { X if (*sp == c) X return(sp); X } while (*sp++); X return(NULL); X} + END-OF-FILE commands/uudecode.c chmod u=rw,g=r,o=r commands/uudecode.c set `sum commands/uudecode.c` sum=$1 case $sum in 12023) :;; *) echo 'Bad sum in 'commands/uudecode.c >&2 esac echo Extracting commands/uuencode.c sed 's/^X//' > commands/uuencode.c << '+ END-OF-FILE 'commands/uuencode.c X/* uuencode - encode a file for mailing to a remote system */ X X/* Call: uuencode [input] output X * encodes a file to pure ASCII, with 3 bytes in the original file becoming X * 4 bytes in the encoded file. Uudecode decodes encoded files. X */ X X#include "stdio.h" X#include "stat.h" X Xextern FILE *fopen(); X X/* ENC is the basic 1 character encoding function to make a char printing */ X#define ENC(c) (((c) & 077) + ' ') X Xmain(argc, argv) Xchar **argv; X{ X FILE *in; X struct stat sbuf; X int mode; X X /* optional 1st argument */ X if (argc > 2) { X if ((in = fopen(argv[1], "r")) == (FILE *) NULL) { X perror(argv[1]); X exit(1); X } X argv++; argc--; X } else X in = stdin; X X if (argc != 2) { X printf("Usage: uuencode [infile] remotefile\n"); X exit(2); X } X X /* figure out the input file mode */ X fstat(fileno(in), &sbuf); X mode = sbuf.st_mode & 0777; X printf("begin %o %s\n", mode, argv[1]); X X encode(in, stdout); X X printf("end\n"); X exit(0); X} X X/* X * copy from in to out, encoding as you go along. X */ Xencode(in, out) XFILE *in; XFILE *out; X{ X char buf[80]; X int i, n; X X for (;;) { X /* 1 (up to) 45 character line */ X n = fr(in, buf, 45); X putc(ENC(n), out); X X for (i=0; i<n; i += 3) X outdec(&buf[i], out); X X putc('\n', out); X if (n <= 0) X break; X } X} X X/* X * output one group of 3 bytes, pointed at by p, on file f. X */ Xoutdec(p, f) Xchar *p; XFILE *f; X{ X int c1, c2, c3, c4; X X c1 = *p >> 2; X c2 = (*p << 4) & 060 | (p[1] >> 4) & 017; X c3 = (p[1] << 2) & 074 | (p[2] >> 6) & 03; X c4 = p[2] & 077; X putc(ENC(c1), f); X putc(ENC(c2), f); X putc(ENC(c3), f); X putc(ENC(c4), f); X} X X/* fr: like read but stdio */ Xint Xfr(fd, buf, cnt) XFILE *fd; Xchar *buf; Xint cnt; X{ X int c, i; X X for (i=0; i<cnt; i++) { X c = getc(fd); X if (c == EOF) X return(i); X buf[i] = c; X } X return (cnt); X} + END-OF-FILE commands/uuencode.c chmod u=rw,g=r,o=r commands/uuencode.c set `sum commands/uuencode.c` sum=$1 case $sum in 63186) :;; *) echo 'Bad sum in 'commands/uuencode.c >&2 esac echo Extracting commands/wc.dif sed 's/^X//' > commands/wc.dif << '+ END-OF-FILE 'commands/wc.dif X4c4 X< #define isdigit(c) (c >= '0' && c <= '9) X--- X> #define isdigit(c) (c >= '0' && c <= '9') X55c55 X< if (*cp++ == '-') { X--- X> if (argc >1 && *cp++ == '-') { + END-OF-FILE commands/wc.dif chmod u=rw,g=r,o=r commands/wc.dif set `sum commands/wc.dif` sum=$1 case $sum in 9665) :;; *) echo 'Bad sum in 'commands/wc.dif >&2 esac exit 0 echo byebyebyebyebyebyebyebyebyebyebyebyebyebyebyebyebyebyebyebyebyebey