Annotation of 41BSD/cmd/pascal/px_header.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.