1*2948Smckusic /* Copyright (c) 1979 Regents of the University of California */ 2*2948Smckusic 3*2948Smckusic static char sccsid[] = "@(#)pix.c 1.2 03/06/81"; 4*2948Smckusic 52839Swnj /* 62839Swnj * pix - pi then px 72839Swnj * 82839Swnj * Bill Joy UCB August 26, 1977 92839Swnj */ 102839Swnj 11*2948Smckusic #include "whoami.h" 12*2948Smckusic #include "objfmt.h" 132839Swnj #define ERRS 1 142839Swnj 152839Swnj char *name; 162839Swnj 172839Swnj int onintr(); 182839Swnj 192839Swnj #define ETXTBSY 26 202839Swnj 212839Swnj main(argc, argv) 222839Swnj int argc; 232839Swnj char *argv[]; 242839Swnj { 252839Swnj register char **av; 262839Swnj register int ac; 272839Swnj int i, io, pid, status; 282839Swnj extern errno; 292839Swnj 302839Swnj do 312839Swnj io = open("/dev/null", 0); 322839Swnj while (io >= 0 && io < 3); 332839Swnj for (io = 3; io < 15; io++) 342839Swnj close(io); 352839Swnj if ((signal(2, 1) & 01) == 0) 362839Swnj signal(2, onintr); 372839Swnj for (ac = 1; ac < argc; ac++) 382839Swnj if (dotted(argv[ac], 'p')) { 392839Swnj ac++; 402839Swnj break; 412839Swnj } 422839Swnj name = "-o/tmp/pixaXXXXX" + 2; 432839Swnj mktemp(name); 442839Swnj for (;;) { 452839Swnj io = creat(name, 0400); 462839Swnj if (io > 0) 472839Swnj break; 482839Swnj if (name[8] == 'z') { 492839Swnj perror(name); 502839Swnj exit(1); 512839Swnj } 522839Swnj name[8]++; 532839Swnj } 542839Swnj pid = fork(); 552839Swnj if (pid == -1) { 562839Swnj write(2, "No more processes\n", 18); 572839Swnj onintr(); 582839Swnj } 592839Swnj if (pid == 0) { 602839Swnj if (io != 3) { 612839Swnj write(2, "Impossible error in pix\n", 24); 622839Swnj onintr(); 632839Swnj } 642839Swnj argv[ac] = 0; 652839Swnj argv[0] = name - 2; 662839Swnj do 67*2948Smckusic execv(PI_COMP, argv); 682839Swnj while (errno == ETXTBSY); 692839Swnj write(2, "Can't find pi\n", 14); 702839Swnj onintr(); 712839Swnj } 722839Swnj close(io); 732839Swnj do 742839Swnj i = wait(&status); 752839Swnj while (i != pid && i != -1); 762839Swnj if (i == -1 || (status & 0377)) 772839Swnj onintr(); 782839Swnj if (status != 0) { 792839Swnj if ((status >> 8) == ERRS) 802839Swnj write(2, "Execution suppressed due to compilation errors\n", 47); 812839Swnj onintr(); 822839Swnj } 832839Swnj ac--; 842839Swnj argv[ac] = name - 2; 852839Swnj argv[argc] = 0; 862839Swnj do 87*2948Smckusic execv(PX_INTRP, &argv[ac]); 882839Swnj while (errno == ETXTBSY); 892839Swnj write(2, "Can't find px\n", 14); 902839Swnj onintr(); 912839Swnj } 922839Swnj 932839Swnj dotted(cp, ch) 942839Swnj char *cp, ch; 952839Swnj { 962839Swnj register int i; 972839Swnj 982839Swnj i = strlen(cp); 992839Swnj return (i > 1 && cp[i - 2] == '.' && cp[i - 1] == ch); 1002839Swnj } 1012839Swnj 1022839Swnj onintr() 1032839Swnj { 1042839Swnj 1052839Swnj signal(2, 1); 1062839Swnj unlink(name); 1072839Swnj exit(1); 1082839Swnj } 109