148106Sbostic /*-
262175Sbostic * Copyright (c) 1980, 1993
362175Sbostic * The Regents of the University of California. All rights reserved.
448106Sbostic *
548106Sbostic * %sccs.include.redist.c%
622262Sdist */
72948Smckusic
822262Sdist #ifndef lint
962175Sbostic static char copyright[] =
1062175Sbostic "@(#) Copyright (c) 1980, 1993\n\
1162175Sbostic The Regents of the University of California. All rights reserved.\n";
1248106Sbostic #endif /* not lint */
132948Smckusic
1422262Sdist #ifndef lint
15*67250Smckusick static char sccsid[] = "@(#)pix.c 8.2 (Berkeley) 05/27/94";
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
29*67250Smckusick char argname[] = "-o/tmp/pixaXXXXX";
30*67250Smckusick char *name = &argname[2];
312839Swnj
322839Swnj int onintr();
332839Swnj
342839Swnj #define ETXTBSY 26
352839Swnj
main(argc,argv)362839Swnj main(argc, argv)
372839Swnj int argc;
382839Swnj char *argv[];
392839Swnj {
402839Swnj register char **av;
412839Swnj register int ac;
422839Swnj int i, io, pid, status;
432839Swnj extern errno;
442839Swnj
452839Swnj do
462839Swnj io = open("/dev/null", 0);
472839Swnj while (io >= 0 && io < 3);
482839Swnj for (io = 3; io < 15; io++)
492839Swnj close(io);
502839Swnj if ((signal(2, 1) & 01) == 0)
512839Swnj signal(2, onintr);
522839Swnj for (ac = 1; ac < argc; ac++)
532839Swnj if (dotted(argv[ac], 'p')) {
542839Swnj ac++;
552839Swnj break;
562839Swnj }
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
dotted(cp,ch)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
onintr()1182839Swnj onintr()
1192839Swnj {
1202839Swnj
1212839Swnj signal(2, 1);
1222839Swnj unlink(name);
1232839Swnj exit(1);
1242839Swnj }
125