# 2.11BSD#431 - /usr/src/ucb/PORT/pascal/utilities/px_header.c

##### Functions

    error             X
    exit              X
    main              X
    run               X
    writeobj          X

##### Variables

    copyright         X

##### Macros

    ADDR_LC           X
    ETXTBSY           X
    MAXARGS           X

       1: /*
       2:  * Copyright (c) 1980 Regents of the University of California.
       3:  * All rights reserved.  The Berkeley software License Agreement
       4:  * specifies the terms and conditions for redistribution.
       5:  */
       6:
       7: #ifndef lint
       8: char copyright[] =
       9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
      10:  All rights reserved.\n";
      11: #endif not lint
      12:
      13: #ifndef lint
      14: static char sccsid[] = "@(#)px_header.c	5.2 (Berkeley) 6/21/85";
      15: #endif not lint
      16:
      17: /*
      18:  * pxheader - program to sit in front of interpreter code to make shell mods
      19:  *	      unnecessary to make Pascal obj's look like real programs.
      20:  *
      21:  * This program lives in /usr/lib/px_header
      22:  * Bill Joy UCB February 6, 1978
      23:  */
      24:
      25: #include <stdio.h>
      26: #include <sys/types.h>
      27: #include <a.out.h>
      28: #include "config.h"
      29: #include "whoami.h"
      30: #include "objfmt.h"
      31:
      32: #define ETXTBSY 26
      33: #define ADDR_LC \
      34:     (START + HEADER_BYTES - sizeof (struct exec) - sizeof (struct pxhdr))
      35: #define MAXARGS 512
      36:
      37: extern  errno;
      38:
      39: main(argc, argv)
      40:     register int argc;
      41:     register char *argv[];
      42: {
      43:     register int i;
      44:     int codesiz, symtabsiz;
      45:     register char *cp;
      46:     char *largv[MAXARGS];
      47:     int fd, pv[2], pid;
      48:
      49:     cp = (char *)(ADDR_LC);
      50:     codesiz = ((struct pxhdr *)(cp))->objsize + sizeof(struct pxhdr);
      51:     symtabsiz = ((struct pxhdr *)(cp))->symtabsize;
      52:     if (argc > MAXARGS - 3)
      53:         error(2, "Too many arguments.\n");
      54:     if (symtabsiz != 0) {
      55:         largv[0] = "pxhdr";
      56:         largv[1] = "/tmp/px00000";
      57:         cp = &largv[1][11];
      58:         for (i = getpid(); i > 0; i /= 10)
      59:             *cp-- = '0' + i % 10;
      60:         fd = creat(largv[1], 0444);
      61:         if (fd < 0)
      62:             error(3, "Cannot create /tmp file\n");
      63:         for (i = 0; i < argc; i++)
      64:             largv[i + 2] = argv[i];
      65:         largv[argc + 2] = 0;
      66:         writeobj(fd, codesiz, symtabsiz);
      67:         run(px_debug, largv);
      68:         /* no return */
      69:     }
      70:     largv[0] = "pipe";
      71:     for (i = 0; i < argc; i++)
      72:         largv[i + 1] = argv[i];
      73:     largv[argc + 1] = 0;
      74:     pipe(pv);
      75:     pid = fork();
      76:     if (pid != 0) {
      77:         if (pv[0] != 3) {
      78:             close(3);
      79:             dup(pv[0]);
      80:             close(pv[0]);
      81:         }
      82:         close(pv[1]);
      83:         run(px_intrp, largv);
      84:         /* no return */
      85:     }
      86:     writeobj(pv[1], codesiz, symtabsiz);
      87:     exit(0);
      88: }
      89:
      90: writeobj(fd, codesiz, symtabsiz)
      91:     int fd;
      92:     int codesiz, symtabsiz;
      93: {
      94:     int i;
      95:     register char *cp;
      96:
      97:     cp = (char *)(ADDR_LC);
      98:     while (codesiz != 0) {
      99:         i = (codesiz < BUFSIZ) ? codesiz : BUFSIZ;
     100:         write(fd, cp, i);
     101:         cp += i;
     102:         codesiz -= i;
     103:     }
     104:     while (symtabsiz != 0) {
     105:         i = (symtabsiz < BUFSIZ) ? symtabsiz : BUFSIZ;
     106:         write(fd, cp, i);
     107:         cp += i;
     108:         symtabsiz -= i;
     109:     }
     110:     close(fd);
     111: }
     112:
     113: run(prog, args)
     114:     char *prog;
     115:     char **args;
     116: {
     117:     for (;;) {
     118:         execv(prog, args);
     119:         if (errno != ETXTBSY)
     120:             break;
     121:         sleep(2);
     122:     }
     123:     error(0, prog);
     124:     error(1, " not found.\n");
     125: }
     126:
     127: error(errcode, cp)
     128:     int errcode;
     129:     register char *cp;
     130: {
     131:     register int i;
     132:     register char *dp;
     133:
     134:     dp = cp;
     135:     i = 0;
     136:     while (*dp++)
     137:         i++;
     138:     write(2, cp, i);
     139:     if (errcode)
     140:         exit(errcode);
     141: }
     142:
     143: exit(i)
     144: {
     145:     _exit(i);
     146: }

#### Defined functions

error defined in line 127; used 4 times

- in line 53, 62, 123-124(2)

exit defined in line 143; used 20 times

- in line 87, 140
- in /usr/src/ucb/PORT/pascal/utilities/pc.c line 125, 150, 157, 163, 170-179(3), 493, 501, 507, 533, 597
- in /usr/src/ucb/PORT/pascal/utilities/pc3.c line 119, 822
- in /usr/src/ucb/PORT/pascal/utilities/pix.c line 63, 122
- in /usr/src/ucb/PORT/pascal/utilities/pmerge.c line 111, 419

main defined in line 39; never used
run defined in line 113; used 2 times

- in line 67, 83

writeobj defined in line 90; used 2 times

- in line 66, 86

#### Defined variables

copyright defined in line 8; never used
sccsid defined in line 14; never used

#### Defined macros

ADDR_LC defined in line 33; used 2 times

- in line 49, 97

ETXTBSY defined in line 32; used 1 times

- in line 119

MAXARGS defined in line 35; used 2 times

- in line 46, 52

Last modified: 1985-06-22 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1519 |