# 2.11BSD#431 - /usr/src/new/jove/portsrv.c

##### Functions

    error             X
    main              X
    p_inform          X
    proc_write        X
    read_pipe         X

##### Variables

    InputFD           X
    JovesInput        X
    header            X
    ppid              X

##### Macros

    HEADSIZE          X

##### struct's

    header            X

       1: /***************************************************************************
       2:  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
       3:  * is provided to you without charge, and with no warranty.  You may give  *
       4:  * away copies of JOVE, including sources, provided that this notice is    *
       5:  * included in all the files.                                              *
       6:  ***************************************************************************/
       7:
       8: /* This is a server for jove sub processes.  It runs the command and
       9:    signals jove when there is some output ready to send to jove. By the
      10:    time we get here, out standard output goes to jove's process input. */
      11:
      12: #include "tune.h"
      13:
      14: #ifdef PIPEPROCS    /* the whole file! */
      15:
      16: #include "jove.h"
      17:
      18: #include <signal.h>
      19: #include <sys/ioctl.h>
      20: #ifdef BSD4_2
      21: #   include <sys/wait.h>
      22: #else
      23: #   include <wait.h>
      24: #endif
      25:
      26: struct header {
      27:     int pid;
      28:     int nbytes;
      29:     char    buf[512];
      30: } header;
      31:
      32: #define HEADSIZE    ((sizeof header.pid) + sizeof (header.nbytes))
      33:
      34: error(str)
      35: char    *str;
      36: {
      37:     header.pid = getpid();
      38:     header.nbytes = strlen(str);
      39:     strcpy(header.buf, str);
      40:     proc_write(&header, header.nbytes + HEADSIZE);
      41:     exit(-2);
      42: }
      43:
      44: int ppid,
      45:     InputFD,
      46:     JovesInput;
      47:
      48: p_inform()
      49: {
      50:     long    nbytes;
      51:
      52:     ioctl(JovesInput, FIONREAD, (char *) &nbytes);
      53:     if (nbytes > 0)
      54:         kill(ppid, INPUT_SIG);
      55: }
      56:
      57: proc_write(ptr, n)
      58: char    *ptr;
      59: {
      60:     long    nbytes;
      61:
      62:     ioctl(1, FIONREAD, (char *) &nbytes);
      63:
      64:     if (nbytes == 0)
      65:         kill(ppid, INPUT_SIG);
      66:
      67:     (void) write(1, ptr, n);
      68:     alarm(1);
      69: }
      70:
      71: read_pipe()
      72: {
      73:     register int    n;
      74:
      75:     (void) signal(SIGALRM, p_inform);
      76:
      77:     while ((header.nbytes = read(InputFD, header.buf, sizeof header.buf)) > 0) {
      78:         n = HEADSIZE + header.nbytes;
      79:         proc_write(&header, n);
      80:     }
      81: }
      82:
      83: /* ARGSUSED */
      84: main(argc, argv)
      85: char    *argv[];
      86: {
      87:     int p[2];
      88:     int pid;
      89:     int tty_fd,
      90:         i;
      91:
      92: /*	tty_fd = open("/dev/tty", 1); */
      93:
      94:     if (pipe(p) == -1)
      95:         error("Cannot pipe jove portsrv.\n");
      96:
      97: /*	for (i = 0; i < argc; i++) {
      98: 		write(tty_fd, "*argv++ = ", 10);
      99: 		write(tty_fd, argv[i], strlen(argv[i]));
     100: 		write(tty_fd, "\n", 1);
     101: 	} */
     102:
     103:     ppid = getppid();
     104:     switch (pid = fork()) {
     105:     case -1:
     106:         error("portsrv: cannot fork.\n");
     107:
     108:     case 0:
     109:         /* We'll intercept childs output in p[0] */
     110:         (void) dup2(p[1], 1);
     111:         (void) dup2(p[1], 2);
     112:         (void) close(p[0]);
     113:         (void) close(p[1]);
     114:
     115:         (void) setpgrp(getpid(), getpid());
     116:         execv(argv[2], &argv[3]);
     117:         _exit(-4);
     118:
     119:     default:
     120:         (void) close(0);
     121:
     122:          /* don't want this guy to read anything jove sends to
     123: 		    our soon to be created child */
     124:
     125:         JovesInput = atoi(argv[1]);
     126:         (void) signal(SIGINT, SIG_IGN);
     127:         (void) signal(SIGQUIT, SIG_IGN);
     128:         (void) close(p[1]);
     129:
     130:         /* tell jove the pid of the real child as opposed to us */
     131:         header.pid = getpid();
     132:         header.nbytes = sizeof (int);
     133:         *(int *) header.buf = pid;
     134:         (void) write(1, (char *) &header, sizeof pid + HEADSIZE);
     135:         p_inform(); /* Inform jove */
     136:
     137:         /* read proc's output and send it to jove */
     138:         InputFD = p[0];
     139:         read_pipe();
     140:         (void) close(p[0]);
     141:         header.pid = getpid();
     142:         header.nbytes = EOF;    /* tell jove we are finished */
     143:         (void) write(1, (char *) &header, HEADSIZE);
     144:         p_inform();
     145:         /* try to exit like our child did ... */
     146:         {
     147:             union wait  w;
     148:
     149: #ifndef BSD4_2
     150:             while (wait2(&w.w_status, 0) != pid)
     151: #else
     152:             while (wait3(&w.w_status, 0, 0) != pid)
     153: #endif
     154:                 ;
     155:             if (WIFEXITED(w))
     156:                 exit(w.w_retcode);
     157:             else if (WIFSIGNALED(w))
     158:                 kill(getpid(), w.w_termsig);
     159:         }
     160:     }
     161: }
     162:
     163: #else /* PIPEPROCS */
     164: main()
     165: {
     166: }
     167: #endif

#### Defined functions

error defined in line 34; used 9 times

- in line 95, 106
- in /usr/src/new/jove/externs.h line 449, 1057
- in /usr/src/new/jove/fp.c line 239
- in /usr/src/new/jove/io.c line 1154, 1290
- in /usr/src/new/jove/util.c line 565, 657

main defined in line 164; never used
p_inform defined in line 48; used 3 times

- in line 75, 135, 144

proc_write defined in line 57; used 2 times

- in line 40, 79

read_pipe defined in line 71; used 1 times

- in line 139

#### Defined variables

InputFD defined in line 45; used 2 times

- in line 77, 138

JovesInput defined in line 46; used 2 times

- in line 52, 125

header defined in line 30; used 19 times

- in line 32-40(7), 77-79(5), 131-134(4), 141-143(3)

ppid defined in line 44; used 3 times

- in line 54, 65, 103

#### Defined struct's

header defined in line 26; never used

#### Defined macros

HEADSIZE defined in line 32; used 4 times

- in line 40, 78, 134, 143

Last modified: 1988-03-15 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 970 |