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

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

unix.superglobalmegacorp.com

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