1*2839Swnj # 2*2839Swnj /* 3*2839Swnj * pix - pi then px 4*2839Swnj * 5*2839Swnj * Bill Joy UCB August 26, 1977 6*2839Swnj */ 7*2839Swnj static char *sccsid = "@(#)pix.c 1.1 (Berkeley) 03/02/81"; 8*2839Swnj 9*2839Swnj #define ERRS 1 10*2839Swnj 11*2839Swnj char *name; 12*2839Swnj 13*2839Swnj int onintr(); 14*2839Swnj 15*2839Swnj #define ETXTBSY 26 16*2839Swnj 17*2839Swnj main(argc, argv) 18*2839Swnj int argc; 19*2839Swnj char *argv[]; 20*2839Swnj { 21*2839Swnj register char **av; 22*2839Swnj register int ac; 23*2839Swnj int i, io, pid, status; 24*2839Swnj extern errno; 25*2839Swnj 26*2839Swnj do 27*2839Swnj io = open("/dev/null", 0); 28*2839Swnj while (io >= 0 && io < 3); 29*2839Swnj for (io = 3; io < 15; io++) 30*2839Swnj close(io); 31*2839Swnj if ((signal(2, 1) & 01) == 0) 32*2839Swnj signal(2, onintr); 33*2839Swnj for (ac = 1; ac < argc; ac++) 34*2839Swnj if (dotted(argv[ac], 'p')) { 35*2839Swnj ac++; 36*2839Swnj break; 37*2839Swnj } 38*2839Swnj name = "-o/tmp/pixaXXXXX" + 2; 39*2839Swnj mktemp(name); 40*2839Swnj for (;;) { 41*2839Swnj io = creat(name, 0400); 42*2839Swnj if (io > 0) 43*2839Swnj break; 44*2839Swnj if (name[8] == 'z') { 45*2839Swnj perror(name); 46*2839Swnj exit(1); 47*2839Swnj } 48*2839Swnj name[8]++; 49*2839Swnj } 50*2839Swnj pid = fork(); 51*2839Swnj if (pid == -1) { 52*2839Swnj write(2, "No more processes\n", 18); 53*2839Swnj onintr(); 54*2839Swnj } 55*2839Swnj if (pid == 0) { 56*2839Swnj if (io != 3) { 57*2839Swnj write(2, "Impossible error in pix\n", 24); 58*2839Swnj onintr(); 59*2839Swnj } 60*2839Swnj argv[ac] = 0; 61*2839Swnj argv[0] = name - 2; 62*2839Swnj #ifdef CORY 63*2839Swnj /* Temporary to allow accounting to distinguish pix's and pi's */ 64*2839Swnj do 65*2839Swnj execv("/usr/bin/pix-pi", argv); 66*2839Swnj while (errno == ETXTBSY); 67*2839Swnj #endif 68*2839Swnj do 69*2839Swnj execv("/usr/ucb/pi", argv); 70*2839Swnj while (errno == ETXTBSY); 71*2839Swnj do 72*2839Swnj execv("/usr/bin/pi", argv); 73*2839Swnj while (errno == ETXTBSY); 74*2839Swnj write(2, "Can't find pi\n", 14); 75*2839Swnj onintr(); 76*2839Swnj } 77*2839Swnj close(io); 78*2839Swnj do 79*2839Swnj i = wait(&status); 80*2839Swnj while (i != pid && i != -1); 81*2839Swnj if (i == -1 || (status & 0377)) 82*2839Swnj onintr(); 83*2839Swnj if (status != 0) { 84*2839Swnj if ((status >> 8) == ERRS) 85*2839Swnj write(2, "Execution suppressed due to compilation errors\n", 47); 86*2839Swnj onintr(); 87*2839Swnj } 88*2839Swnj ac--; 89*2839Swnj argv[ac] = name - 2; 90*2839Swnj argv[argc] = 0; 91*2839Swnj #ifdef CORY 92*2839Swnj /* Temporary to allow accounting to distinguish pix's and px's */ 93*2839Swnj do 94*2839Swnj execv("/usr/bin/pix-px", &argv[ac]); 95*2839Swnj while (errno == ETXTBSY); 96*2839Swnj #endif 97*2839Swnj do 98*2839Swnj execv("/usr/ucb/px", &argv[ac]); 99*2839Swnj while (errno == ETXTBSY); 100*2839Swnj do 101*2839Swnj execv("/usr/bin/px", &argv[ac]); 102*2839Swnj while (errno == ETXTBSY); 103*2839Swnj write(2, "Can't find px\n", 14); 104*2839Swnj onintr(); 105*2839Swnj } 106*2839Swnj 107*2839Swnj dotted(cp, ch) 108*2839Swnj char *cp, ch; 109*2839Swnj { 110*2839Swnj register int i; 111*2839Swnj 112*2839Swnj i = strlen(cp); 113*2839Swnj return (i > 1 && cp[i - 2] == '.' && cp[i - 1] == ch); 114*2839Swnj } 115*2839Swnj 116*2839Swnj onintr() 117*2839Swnj { 118*2839Swnj 119*2839Swnj signal(2, 1); 120*2839Swnj unlink(name); 121*2839Swnj exit(1); 122*2839Swnj } 123