/*- * Copyright (c) 1980, 1993 * The Regents of the University of California. All rights reserved. * * %sccs.include.redist.c% */ #ifndef lint static char copyright[] = "@(#) Copyright (c) 1980, 1993\n\ The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ #ifndef lint static char sccsid[] = "@(#)pix.c 8.2 (Berkeley) 05/27/94"; #endif /* not lint */ /* * pix - pi then px * * Bill Joy UCB August 26, 1977 */ #include "whoami.h" #include "objfmt.h" #include "config.h" #define ERRS 1 char argname[] = "-o/tmp/pixaXXXXX"; char *name = &argname[2]; int onintr(); #define ETXTBSY 26 main(argc, argv) int argc; char *argv[]; { register char **av; register int ac; int i, io, pid, status; extern errno; do io = open("/dev/null", 0); while (io >= 0 && io < 3); for (io = 3; io < 15; io++) close(io); if ((signal(2, 1) & 01) == 0) signal(2, onintr); for (ac = 1; ac < argc; ac++) if (dotted(argv[ac], 'p')) { ac++; break; } mktemp(name); for (;;) { io = creat(name, 0400); if (io > 0) break; if (name[8] == 'z') { perror(name); exit(1); } name[8]++; } pid = fork(); if (pid == -1) { write(2, "No more processes\n", 18); onintr(); } if (pid == 0) { if (io != 3) { write(2, "Impossible error in pix\n", 24); onintr(); } argv[ac] = 0; argv[0] = name - 2; do execv(pi_comp, argv); while (errno == ETXTBSY); write(2, "Can't find pi\n", 14); onintr(); } close(io); do i = wait(&status); while (i != pid && i != -1); if (i == -1 || (status & 0377)) onintr(); if (status != 0) { if ((status >> 8) == ERRS) write(2, "Execution suppressed due to compilation errors\n", 47); onintr(); } ac--; argv[ac] = name; ac--; argv[ac] = "pix"; argv[argc] = 0; do execv(px_debug, &argv[ac]); while (errno == ETXTBSY); write(2, "Can't find px\n", 14); onintr(); } dotted(cp, ch) char *cp, ch; { register int i; i = strlen(cp); return (i > 1 && cp[i - 2] == '.' && cp[i - 1] == ch); } onintr() { signal(2, 1); unlink(name); exit(1); }