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 / px_header.c < prev    next >
C/C++ Source or Header  |  1980-02-17  |  1KB  |  87 lines

  1. /*
  2.  * pxheader - program to sit in front of interpreter code to make shell mods
  3.  *          unnecessary to make Pascal obj's look like real programs.
  4.  *
  5.  * This program lives in /usr/lib/px_header
  6.  * Bill Joy UCB February 6, 1978
  7.  */
  8.  
  9. struct {
  10.     int pint;
  11. };
  12. char    BINPX[]        "/usr/ucb/px";        /* A little strange ... */
  13. char    USRBINPX[]    "/usr/bin/px";
  14.  
  15. extern    errno;
  16.  
  17. #define    ETXTBSY    26
  18.  
  19. main(argc, argv)
  20.     register int argc;
  21.     register char *argv[];
  22. {
  23.     register int i, j, *ip;
  24.     int largv[512], pv[2];
  25.  
  26.     if (argc > 510) {
  27.         error("Too many arguments.\n");
  28.         exit(1);
  29.     }
  30.     largv[0] = argv[0];
  31.     largv[1] = "-";
  32.     for (i = 1; i < argc; i++)
  33.         largv[i + 1] = argv[i];
  34.     largv[argc + 1] = 0;
  35.     pipe(pv);
  36.     i = fork();
  37.     if (i == -1)
  38.         error("Try again.\n");
  39.     if (i == 0) {
  40.         close(pv[0]);
  41.         write(pv[1], 1006, 2);
  42.         ip = 1006;
  43.         i = ip->pint;
  44.         ip++;
  45.         while (i != 0) {
  46.             j = (i > 0 && i < 512) ? i : 512;
  47.             write(pv[1], ip, j);
  48.             ip =+ 512 / sizeof (int);
  49.             i =- j;
  50.         }
  51.         exit(1);
  52.     }
  53.     close(pv[1]);
  54.     if (pv[0] != 3) {
  55.         close(3);
  56.         dup(pv[0]);
  57.         close(pv[0]);
  58.     }
  59.     for (;;) {
  60.         execv(BINPX, largv);
  61.         if (errno != ETXTBSY)
  62.             break;
  63.         sleep(2);
  64.     }
  65.     for (;;) {
  66.         execv(USRBINPX, largv);
  67.         if (errno != ETXTBSY)
  68.             break;
  69.         sleep(2);
  70.     }
  71.     error("Px not found.\n");
  72. }
  73.  
  74. error(cp)
  75.     register char *cp;
  76. {
  77.     register int i;
  78.     register char *dp;
  79.  
  80.     dp = cp;
  81.     i = 0;
  82.     while (*dp++)
  83.         i++;
  84.     write(2, cp, i);
  85.     exit (1);
  86. }
  87.