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