|
|
1.1 ! root 1: /* Copyright (c) 1979 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)pix.c 1.4 1/22/83"; ! 4: ! 5: /* ! 6: * pix - pi then px ! 7: * ! 8: * Bill Joy UCB August 26, 1977 ! 9: */ ! 10: ! 11: #include "whoami.h" ! 12: #include "objfmt.h" ! 13: #include "config.h" ! 14: #define ERRS 1 ! 15: ! 16: char *name; ! 17: ! 18: int onintr(); ! 19: ! 20: #define ETXTBSY 26 ! 21: ! 22: main(argc, argv) ! 23: int argc; ! 24: char *argv[]; ! 25: { ! 26: register char **av; ! 27: register int ac; ! 28: int i, io, pid, status; ! 29: extern errno; ! 30: ! 31: do ! 32: io = open("/dev/null", 0); ! 33: while (io >= 0 && io < 3); ! 34: for (io = 3; io < 15; io++) ! 35: close(io); ! 36: if ((signal(2, 1) & 01) == 0) ! 37: signal(2, onintr); ! 38: for (ac = 1; ac < argc; ac++) ! 39: if (dotted(argv[ac], 'p')) { ! 40: ac++; ! 41: break; ! 42: } ! 43: name = "-o/tmp/pixaXXXXX" + 2; ! 44: mktemp(name); ! 45: for (;;) { ! 46: io = creat(name, 0400); ! 47: if (io > 0) ! 48: break; ! 49: if (name[8] == 'z') { ! 50: perror(name); ! 51: exit(1); ! 52: } ! 53: name[8]++; ! 54: } ! 55: pid = fork(); ! 56: if (pid == -1) { ! 57: write(2, "No more processes\n", 18); ! 58: onintr(); ! 59: } ! 60: if (pid == 0) { ! 61: if (io != 3) { ! 62: write(2, "Impossible error in pix\n", 24); ! 63: onintr(); ! 64: } ! 65: argv[ac] = 0; ! 66: argv[0] = name - 2; ! 67: do ! 68: execv(pi_comp, argv); ! 69: while (errno == ETXTBSY); ! 70: write(2, "Can't find pi\n", 14); ! 71: onintr(); ! 72: } ! 73: close(io); ! 74: do ! 75: i = wait(&status); ! 76: while (i != pid && i != -1); ! 77: if (i == -1 || (status & 0377)) ! 78: onintr(); ! 79: if (status != 0) { ! 80: if ((status >> 8) == ERRS) ! 81: write(2, "Execution suppressed due to compilation errors\n", 47); ! 82: onintr(); ! 83: } ! 84: ac--; ! 85: argv[ac] = name; ! 86: ac--; ! 87: argv[ac] = "pix"; ! 88: argv[argc] = 0; ! 89: do ! 90: execv(px_debug, &argv[ac]); ! 91: while (errno == ETXTBSY); ! 92: write(2, "Can't find px\n", 14); ! 93: onintr(); ! 94: } ! 95: ! 96: dotted(cp, ch) ! 97: char *cp, ch; ! 98: { ! 99: register int i; ! 100: ! 101: i = strlen(cp); ! 102: return (i > 1 && cp[i - 2] == '.' && cp[i - 1] == ch); ! 103: } ! 104: ! 105: onintr() ! 106: { ! 107: ! 108: signal(2, 1); ! 109: unlink(name); ! 110: exit(1); ! 111: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.