148106Sbostic /*- 2*62175Sbostic * Copyright (c) 1980, 1993 3*62175Sbostic * The Regents of the University of California. All rights reserved. 448106Sbostic * 548106Sbostic * %sccs.include.redist.c% 622262Sdist */ 72948Smckusic 822262Sdist #ifndef lint 9*62175Sbostic static char copyright[] = 10*62175Sbostic "@(#) Copyright (c) 1980, 1993\n\ 11*62175Sbostic The Regents of the University of California. All rights reserved.\n"; 1248106Sbostic #endif /* not lint */ 132948Smckusic 1422262Sdist #ifndef lint 15*62175Sbostic static char sccsid[] = "@(#)pix.c 8.1 (Berkeley) 06/06/93"; 1648106Sbostic #endif /* not lint */ 1722262Sdist 182839Swnj /* 192839Swnj * pix - pi then px 202839Swnj * 212839Swnj * Bill Joy UCB August 26, 1977 222839Swnj */ 232839Swnj 242948Smckusic #include "whoami.h" 252948Smckusic #include "objfmt.h" 2610567Smckusick #include "config.h" 272839Swnj #define ERRS 1 282839Swnj 292839Swnj char *name; 302839Swnj 312839Swnj int onintr(); 322839Swnj 332839Swnj #define ETXTBSY 26 342839Swnj 352839Swnj main(argc, argv) 362839Swnj int argc; 372839Swnj char *argv[]; 382839Swnj { 392839Swnj register char **av; 402839Swnj register int ac; 412839Swnj int i, io, pid, status; 422839Swnj extern errno; 432839Swnj 442839Swnj do 452839Swnj io = open("/dev/null", 0); 462839Swnj while (io >= 0 && io < 3); 472839Swnj for (io = 3; io < 15; io++) 482839Swnj close(io); 492839Swnj if ((signal(2, 1) & 01) == 0) 502839Swnj signal(2, onintr); 512839Swnj for (ac = 1; ac < argc; ac++) 522839Swnj if (dotted(argv[ac], 'p')) { 532839Swnj ac++; 542839Swnj break; 552839Swnj } 562839Swnj name = "-o/tmp/pixaXXXXX" + 2; 572839Swnj mktemp(name); 582839Swnj for (;;) { 592839Swnj io = creat(name, 0400); 602839Swnj if (io > 0) 612839Swnj break; 622839Swnj if (name[8] == 'z') { 632839Swnj perror(name); 642839Swnj exit(1); 652839Swnj } 662839Swnj name[8]++; 672839Swnj } 682839Swnj pid = fork(); 692839Swnj if (pid == -1) { 702839Swnj write(2, "No more processes\n", 18); 712839Swnj onintr(); 722839Swnj } 732839Swnj if (pid == 0) { 742839Swnj if (io != 3) { 752839Swnj write(2, "Impossible error in pix\n", 24); 762839Swnj onintr(); 772839Swnj } 782839Swnj argv[ac] = 0; 792839Swnj argv[0] = name - 2; 802839Swnj do 8110567Smckusick execv(pi_comp, argv); 822839Swnj while (errno == ETXTBSY); 832839Swnj write(2, "Can't find pi\n", 14); 842839Swnj onintr(); 852839Swnj } 862839Swnj close(io); 872839Swnj do 882839Swnj i = wait(&status); 892839Swnj while (i != pid && i != -1); 902839Swnj if (i == -1 || (status & 0377)) 912839Swnj onintr(); 922839Swnj if (status != 0) { 932839Swnj if ((status >> 8) == ERRS) 942839Swnj write(2, "Execution suppressed due to compilation errors\n", 47); 952839Swnj onintr(); 962839Swnj } 972839Swnj ac--; 985641Smckusic argv[ac] = name; 995641Smckusic ac--; 1005641Smckusic argv[ac] = "pix"; 1012839Swnj argv[argc] = 0; 1022839Swnj do 10310567Smckusick execv(px_debug, &argv[ac]); 1042839Swnj while (errno == ETXTBSY); 1052839Swnj write(2, "Can't find px\n", 14); 1062839Swnj onintr(); 1072839Swnj } 1082839Swnj 1092839Swnj dotted(cp, ch) 1102839Swnj char *cp, ch; 1112839Swnj { 1122839Swnj register int i; 1132839Swnj 1142839Swnj i = strlen(cp); 1152839Swnj return (i > 1 && cp[i - 2] == '.' && cp[i - 1] == ch); 1162839Swnj } 1172839Swnj 1182839Swnj onintr() 1192839Swnj { 1202839Swnj 1212839Swnj signal(2, 1); 1222839Swnj unlink(name); 1232839Swnj exit(1); 1242839Swnj } 125