home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Distributions / ucb / spencer_2bsd.tar.gz / 2bsd.tar / src / pascal / pix.c < prev    next >
C/C++ Source or Header  |  1980-02-17  |  2KB  |  120 lines

  1. #
  2. /*
  3.  * pix - pi then px
  4.  *
  5.  * Bill Joy UCB August 26, 1977
  6.  */
  7.  
  8. #define    ERRS    1
  9.  
  10. char    *name;
  11.  
  12. int    onintr();
  13.  
  14. #define    ETXTBSY    26
  15.  
  16. main(argc, argv)
  17.     int argc;
  18.     char *argv[];
  19. {
  20.     register char **av;
  21.     register int ac;
  22.     int i, io, pid, status;
  23.     extern errno;
  24.  
  25.     do
  26.         io = open("/dev/null", 0);
  27.     while (io >= 0 && io < 3);
  28.     for (io = 3; io < 15; io++)
  29.         close(io);
  30.     if ((signal(2, 1) & 01) == 0)
  31.         signal(2, onintr);
  32.     for (ac = 1; ac < argc; ac++)
  33.         if (dotted(argv[ac], 'p')) {
  34.             ac++;
  35.             break;
  36.         }
  37.     name = "-o/tmp/pixaXXXXX" + 2;
  38.     mktemp(name);
  39.     for (;;) {
  40.         io = creat(name, 0400);
  41.         if (io > 0)
  42.             break;
  43.         if (name[8] == 'z') {
  44.             perror(name);
  45.             exit(1);
  46.         }
  47.         name[8]++;
  48.     }
  49.     pid = fork();
  50.     if (pid == -1) {
  51.         write(2, "No more processes\n", 18);
  52.         onintr();
  53.     }
  54.     if (pid == 0) {
  55.         if (io != 3) {
  56.             write(2, "Impossible error in pix\n", 24);
  57.             onintr();
  58.         }
  59.         argv[ac] = 0;
  60.         argv[0] = name - 2;
  61. #ifdef CORY
  62.         /* Temporary to allow accounting to distinguish pix's and pi's */
  63.         do
  64.             execv("/usr/bin/pix-pi", argv);
  65.         while (errno == ETXTBSY);
  66. #endif
  67.         do
  68.             execv("/usr/ucb/pi", argv);
  69.         while (errno == ETXTBSY);
  70.         do
  71.             execv("/usr/bin/pi", argv);
  72.         while (errno == ETXTBSY);
  73.         write(2, "Can't find pi\n", 14);
  74.         onintr();
  75.     }
  76.     close(io);
  77.     do
  78.         i = wait(&status);
  79.     while (i != pid && i != -1);
  80.     if (i == -1 || (status & 0377))
  81.         onintr();
  82.     if (status != 0) {
  83.         if ((status >> 8) == ERRS)
  84.             write(2, "Execution suppressed due to compilation errors\n", 47);
  85.         onintr();
  86.     }
  87.     ac--;
  88.     argv[ac] = name - 2;
  89.     argv[argc] = 0;
  90.     /* Temporary to allow accounting to distinguish pix's and px's */
  91.     do
  92.         execv("/usr/bin/pix-px", &argv[ac]);
  93.     while (errno == ETXTBSY);
  94.     do
  95.         execv("/usr/ucb/px", &argv[ac]);
  96.     while (errno == ETXTBSY);
  97.     do
  98.         execv("/usr/bin/px", &argv[ac]);
  99.     while (errno == ETXTBSY);
  100.     write(2, "Can't find px\n", 14);
  101.     onintr();
  102. }
  103.  
  104. dotted(cp, ch)
  105.     char *cp, ch;
  106. {
  107.     register int i;
  108.  
  109.     i = strlen(cp);
  110.     return (i > 1 && cp[i - 2] == '.' && cp[i - 1] == ch);
  111. }
  112.  
  113. onintr()
  114. {
  115.  
  116.     signal(2, 1);
  117.     unlink(name);
  118.     exit(1);
  119. }
  120.