12948Smckusic /* Copyright (c) 1979 Regents of the University of California */ 22948Smckusic 3*5641Smckusic static char sccsid[] = "@(#)pix.c 1.3 02/01/82"; 42948Smckusic 52839Swnj /* 62839Swnj * pix - pi then px 72839Swnj * 82839Swnj * Bill Joy UCB August 26, 1977 92839Swnj */ 102839Swnj 112948Smckusic #include "whoami.h" 122948Smckusic #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 672948Smckusic 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--; 84*5641Smckusic argv[ac] = name; 85*5641Smckusic ac--; 86*5641Smckusic argv[ac] = "pix"; 872839Swnj argv[argc] = 0; 882839Swnj do 89*5641Smckusic execv(PX_DEBUG, &argv[ac]); 902839Swnj while (errno == ETXTBSY); 912839Swnj write(2, "Can't find px\n", 14); 922839Swnj onintr(); 932839Swnj } 942839Swnj 952839Swnj dotted(cp, ch) 962839Swnj char *cp, ch; 972839Swnj { 982839Swnj register int i; 992839Swnj 1002839Swnj i = strlen(cp); 1012839Swnj return (i > 1 && cp[i - 2] == '.' && cp[i - 1] == ch); 1022839Swnj } 1032839Swnj 1042839Swnj onintr() 1052839Swnj { 1062839Swnj 1072839Swnj signal(2, 1); 1082839Swnj unlink(name); 1092839Swnj exit(1); 1102839Swnj } 111