12948Smckusic /* Copyright (c) 1979 Regents of the University of California */ 22948Smckusic 3*10567Smckusick static char sccsid[] = "@(#)pix.c 1.4 01/22/83"; 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" 13*10567Smckusick #include "config.h" 142839Swnj #define ERRS 1 152839Swnj 162839Swnj char *name; 172839Swnj 182839Swnj int onintr(); 192839Swnj 202839Swnj #define ETXTBSY 26 212839Swnj 222839Swnj main(argc, argv) 232839Swnj int argc; 242839Swnj char *argv[]; 252839Swnj { 262839Swnj register char **av; 272839Swnj register int ac; 282839Swnj int i, io, pid, status; 292839Swnj extern errno; 302839Swnj 312839Swnj do 322839Swnj io = open("/dev/null", 0); 332839Swnj while (io >= 0 && io < 3); 342839Swnj for (io = 3; io < 15; io++) 352839Swnj close(io); 362839Swnj if ((signal(2, 1) & 01) == 0) 372839Swnj signal(2, onintr); 382839Swnj for (ac = 1; ac < argc; ac++) 392839Swnj if (dotted(argv[ac], 'p')) { 402839Swnj ac++; 412839Swnj break; 422839Swnj } 432839Swnj name = "-o/tmp/pixaXXXXX" + 2; 442839Swnj mktemp(name); 452839Swnj for (;;) { 462839Swnj io = creat(name, 0400); 472839Swnj if (io > 0) 482839Swnj break; 492839Swnj if (name[8] == 'z') { 502839Swnj perror(name); 512839Swnj exit(1); 522839Swnj } 532839Swnj name[8]++; 542839Swnj } 552839Swnj pid = fork(); 562839Swnj if (pid == -1) { 572839Swnj write(2, "No more processes\n", 18); 582839Swnj onintr(); 592839Swnj } 602839Swnj if (pid == 0) { 612839Swnj if (io != 3) { 622839Swnj write(2, "Impossible error in pix\n", 24); 632839Swnj onintr(); 642839Swnj } 652839Swnj argv[ac] = 0; 662839Swnj argv[0] = name - 2; 672839Swnj do 68*10567Smckusick execv(pi_comp, argv); 692839Swnj while (errno == ETXTBSY); 702839Swnj write(2, "Can't find pi\n", 14); 712839Swnj onintr(); 722839Swnj } 732839Swnj close(io); 742839Swnj do 752839Swnj i = wait(&status); 762839Swnj while (i != pid && i != -1); 772839Swnj if (i == -1 || (status & 0377)) 782839Swnj onintr(); 792839Swnj if (status != 0) { 802839Swnj if ((status >> 8) == ERRS) 812839Swnj write(2, "Execution suppressed due to compilation errors\n", 47); 822839Swnj onintr(); 832839Swnj } 842839Swnj ac--; 855641Smckusic argv[ac] = name; 865641Smckusic ac--; 875641Smckusic argv[ac] = "pix"; 882839Swnj argv[argc] = 0; 892839Swnj do 90*10567Smckusick execv(px_debug, &argv[ac]); 912839Swnj while (errno == ETXTBSY); 922839Swnj write(2, "Can't find px\n", 14); 932839Swnj onintr(); 942839Swnj } 952839Swnj 962839Swnj dotted(cp, ch) 972839Swnj char *cp, ch; 982839Swnj { 992839Swnj register int i; 1002839Swnj 1012839Swnj i = strlen(cp); 1022839Swnj return (i > 1 && cp[i - 2] == '.' && cp[i - 1] == ch); 1032839Swnj } 1042839Swnj 1052839Swnj onintr() 1062839Swnj { 1072839Swnj 1082839Swnj signal(2, 1); 1092839Swnj unlink(name); 1102839Swnj exit(1); 1112839Swnj } 112