From fa5f3e4096925e352e0191311c4d764e7b847276 Mon Sep 17 00:00:00 2001 From: Ken Thompson Date: Tue, 13 May 1975 19:49:32 -0500 Subject: [PATCH] Research V6 development Work on file usr/source/s1/lpr.c Work on file usr/source/s1/if.c Co-Authored-By: Dennis Ritchie Synthesized-from: v6 --- usr/source/s1/if.c | 146 ++++++++++++++++++++++++++ usr/source/s1/lpr.c | 244 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 390 insertions(+) create mode 100644 usr/source/s1/if.c create mode 100644 usr/source/s1/lpr.c diff --git a/usr/source/s1/if.c b/usr/source/s1/if.c new file mode 100644 index 0000000000..220dd97cb0 --- /dev/null +++ b/usr/source/s1/if.c @@ -0,0 +1,146 @@ +/* if command */ + +int ap; +int ac; +char **av; + +main(argc, argv) +char *argv[]; +{ + + argv[argc] = 0; + ac = argc; av = argv; ap = 1; + if (argc<2) return; + if (exp()) + if(doex(0)) { + write(1, "no command\n", 11); + seek(0, 0, 2); + } +} + +char *nxtarg() { + + if (ap>ac) return(0*ap++); + return(av[ap++]); +} + +exp(s) { + int p1; + + p1 = e1(); + if (eq(nxtarg(), "-o")) return(p1 | exp()); + ap--; + return(p1); +} + +e1() { + int p1; + + p1 = e2(); + if (eq(nxtarg(), "-a")) return (p1 & e1()); + ap--; + return(p1); +} + +e2() { + if (eq(nxtarg(), "!")) + return(!e3()); + ap--; + return(e3()); +} + +e3() { + int p1, ccode; + register char *a; + + ccode = 0; + if ((a=nxtarg())==0) goto err; + if(eq(a, "(")) { + p1 = exp(); + if(!eq(nxtarg(), ")")) goto err; + return(p1); + } + + if(eq(a, "-r")) + return(tio(nxtarg(), 0)); + + if(eq(a, "-w")) + return(tio(nxtarg(), 1)); + + if(eq(a, "-c")) + return(tcreat(nxtarg())); + + if(eq(a, "{")) { /* execute a command for exit code */ + if(fork()) /*parent*/ wait(&ccode); + else { /*child*/ + doex(1); + goto err; + } + while((a=nxtarg()) && (!eq(a,"}"))); + return(ccode? 0 : 1); + } + + p1 = nxtarg(); + if (p1==0) goto err; + if(eq(p1, "=")) + return(eq(a, nxtarg())); + + if(eq(p1, "!=")) + return(!eq(a, nxtarg())); +err: + write(1, "if error\n", 9); + exit(9); +} + +tio(a, f) { + + a = open(a, f); + if (a>=0) { + close(a); + return(1); + } + return(0); +} + +tcreat(a) { + return(1); +} + +eq(a, b) +char *a, *b; +{ + register int i; + + i = 0; +l: + if(a[i] != b[i]) + return(0); + if(a[i++] == '\0') + return(1); + goto l; +} + +doex(earg) { + + register int np, i, c; + char *nargv[50], *ncom, *na; + + np = 0; + while (na=nxtarg()) { + if(earg && eq(na,"}")) break; + nargv[np++] = na; + } + if(earg && (!eq(na, "}"))) return(9); + nargv[np] = 0; + if (np==0) return(earg); + execv(nargv[0], nargv, np); + i = 0; + ncom = "/usr/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; + while(c=nargv[0][i]) { + ncom[9+i++] = c; + } + ncom[9+i] = '\0'; + execv(ncom+4, nargv, np); + execv(ncom, nargv, np); + return(1); +} diff --git a/usr/source/s1/lpr.c b/usr/source/s1/lpr.c new file mode 100644 index 0000000000..61da897f81 --- /dev/null +++ b/usr/source/s1/lpr.c @@ -0,0 +1,244 @@ +/* + * dpr -- off line print via dataphone daemon to GCOS + * normally invoked through opr + */ + +char tfname[] "/usr/lpd/tfaXXXXX"; +char cfname[] "/usr/lpd/cfaXXXXX"; +char lfname[] "/usr/lpd/lfaXXXXX"; +char dfname[] "/usr/lpd/dfaXXXXX"; +int nact; +int tff; +int mailflg; +char person[10]; +int inchar; +int maxrec 1000; + +main(argc, argv) +int argc; +char *argv[]; +{ + register char *arg; + int c, f, flag; + int out(); + + pidfn(); + if((signal(1, 1) & 01) == 0) + signal(1, out); + if((signal(2, 1) & 01) == 0) + signal(2, out); + if((signal(3, 1) & 01) == 0) + signal(3, out); + flag = 0; + tff = nfile(tfname); + while (argc>1 && (arg = argv[1])[0]=='-') { + switch (arg[1]) { + + case 'c': + flag = '+'; + break; + + case 'r': + flag = '-'; + break; + + case 'm': + mailflg = 1; + break; + } + argc--; + argv++; + } + ident(); + + if(argc == 1) + copy(0); + while(--argc) { + arg = *++argv; + if(flag == '+') + goto cf; + if(*arg == '/' && flag != '-') { + card('F', arg); + nact++; + continue; + } + if(link(arg, lfname) < 0) + goto cf; + card('F', lfname); + card('U', lfname); + lfname[inchar]++; + nact++; + goto df; + + cf: + f = open(arg, 0); + if(f < 0) { + printf("Cannot open %s\n", arg); + continue; + } + copy(f); + close(f); + + df: + if(flag == '-') { + f = unlink(arg); + if(f < 0) + printf("Cannot remove %s\n", arg); + } + } + + if(nact) { + tfname[inchar]--; + f = link(tfname, dfname); + if(f < 0) { + printf("Cannot rename %s\n", dfname); + tfname[inchar]++; + out(); + } + unlink(tfname); + execl("/etc/lpd", "lpd", 0); + dfname[inchar]++; + } + out(); +} + +copy(f) +int f; +{ + int ff, i, nr, nc; + static int buf[256]; + + card('F', cfname); + card('U', cfname); + ff = nfile(cfname); + nc = 0; + nr = 0; + while((i = read(f, buf, 512)) > 0) { + write(ff, buf, i); + nc =+ i; + if(nc >= 512) { + nc =- 512; + nr++; + if(nr > maxrec) { + printf("Copy file is too large\n"); + break; + } + } + } + close(ff); + nact++; +} + +card(c, s) +int c; +char s[]; +{ + char *p1, *p2; + static char buf[512]; + int col; + + p1 = buf; + p2 = s; + col = 0; + *p1++ = c; + while((c = *p2++) != '\0') { + *p1++ = c; + col++; + } + *p1++ = '\n'; + write(tff, buf, col+2); +} + +ident() +{ + int c, n; + register char *b1p, *pp, *b2p; + static char b1[100], b2[100]; + + b1p = b1; + if(getpw(getuid(), b1p)) { + b1p = "pdp::::m0000,m000:"; + } + n = 0; + b2p = b2; + while(*b2p++ = "$ ident "[n++]); + b2p--; + n = 5; + while(--n) while(*b1p++ != ':'); + while((*b2p++ = *b1p++) != ':'); + b2p[-1] = ','; + b1p = b1; + pp = person; + while((c = *b1p++) != ':') { + *b2p++ = c; + *pp++ = c; + } + *b2p++ = 0; + *pp++ = 0; + card('L', b2); + if (mailflg) + card('M', person); +} + +pidfn() +{ + register i, j, c; + int p; + + p = getpid(); + i = 0; + while(tfname[i] != 'X') + i++; + i =+ 4; + for(j=0; j<5; j++) { + c = (p%10) + '0'; + p =/ 10; + tfname[i] = c; + cfname[i] = c; + lfname[i] = c; + dfname[i] = c; + i--; + } + inchar = i; +} + +nfile(name) +char *name; +{ + register f; + + f = creat(name, 0666); + if(f < 0) { + printf("Cannot create %s\n", name); + out(); + } + name[inchar]++; + return(f); +} + +out() +{ + register i; + + signal(1, 1); + signal(1, 2); + signal(1, 3); + i = inchar; + while(tfname[i] != 'a') { + tfname[i]--; + unlink(tfname); + } + while(cfname[i] != 'a') { + cfname[i]--; + unlink(cfname); + } + while(lfname[i] != 'a') { + lfname[i]--; + unlink(lfname); + } + while(dfname[i] != 'a') { + dfname[i]--; + unlink(dfname); + } + exit(); +} -- 2.20.1