# 2.11BSD#431 - /usr/ingres/source/equel/runtime/IIwrpipe.c

##### Functions

    IIwrpipe          X

       1: # include   "../../ingres.h"
       2: # include   "../../symbol.h"
       3: # include   "../../pipes.h"
       4: # include   "IIglobals.h"
       5:
       6: /*
       7: **  Buffered Write on Pipe
       8: **
       9: **	The message `msg' of length `n' is buffered and written onto
      10: **	the pipe with UNIX file descriptor `des'.  `Buf' is the addr
      11: **	of the buffer in which buffering is to take place.  If `n' is
      12: **	zero, `msg' is taken to be a null-terminated string of char-
      13: **	acters.  `Mode' gives the operations mode of wrpipe().
      14: **
      15: **	Buffers written with wrpipe() should be read with rdpipe().
      16: **
      17: **	Modes:
      18: **
      19: **	P_PRIME -- Prime the pipe for writing.  This involves clearing
      20: **		out the error field, setting normal status, etc.  In
      21: **		general, it should always be done when you want to
      22: **		start writing.  It need not be done after writing an
      23: **		end-of-pipe (EOP), as this operation automatically
      24: **		resets the pipe.  The "exec_id" field (read by
      25: **		rdpipe(P_EXECID)) is set to `des', and the "func_id"
      26: **		field is set to `n'.
      27: **
      28: **	P_NORM -- Normal mode.  `Msg' is buffered into `buf' and
      29: **		physically written into the pipe as necessary.
      30: **
      31: **	P_END -- Writes an EOP.  Only the first three parameters need
      32: **		be specified.
      33: **
      34: **	P_FLUSH -- Flushes the buffer into the pipe, but does not write
      35: **		an EOP.  In fact, a non-EOP is guaranteed to be
      36: **		written.
      37: **
      38: **	P_WRITE -- Same as P_FLUSH, but the mode is unchanged.  This
      39: **		mode is pretty obscure, and you probably need not use
      40: **		it.
      41: **
      42: **	P_INT -- Writes an interrupt synchronization block into the
      43: **		pipe.  This mode need only be called by resyncpipes()
      44: **		and need not normally concern the user.  It is critical
      45: **		that this mode be called by all processes so that dead-
      46: **		lock or syserrs do not occur.
      47: */
      48:
      49: IIwrpipe(mode, buf1, des, msg, n)
      50: int     mode;
      51: struct pipfrmt  *buf1;
      52: int     des;
      53: char        *msg;
      54: int     n;
      55: {
      56:     register int        nn;
      57:     register int        msgl;
      58:     register struct pipfrmt *buf;
      59:     int         flushflg;
      60:     int         i;
      61:     char            *proc_name;
      62:
      63: #	ifdef xATR1
      64:     proc_name = IIproc_name ? IIproc_name : "";
      65: #	endif
      66:
      67:     buf = buf1;
      68: #	ifdef xATR1
      69:     if (IIdebug > 1)
      70:         printf("\n%s wrpipe md %d buf %u des %d msg %l n %d\n",
      71:             proc_name, mode, buf, des, msg, n);
      72: #	endif
      73:     nn = msgl = 0;
      74:     flushflg = 0;
      75:     switch (mode)
      76:     {
      77:       case P_PRIME:
      78:         buf->buf_len = buf->pbuf_pt = buf->err_id = 0;
      79:         buf->hdrstat = NORM_STAT;
      80:         buf->exec_id = des;
      81:         buf->func_id = n;
      82:         return(0);
      83:
      84:       case P_NORM:
      85:         msgl = nn = (n == 0) ? IIlength(msg) + 1 : n;
      86:         break;
      87:
      88:       case P_END:
      89:         buf->hdrstat = LAST_STAT;
      90:         flushflg++;
      91:         break;
      92:
      93:       case P_FLUSH:
      94:         buf->hdrstat = NORM_STAT;
      95:
      96:       case P_WRITE:
      97:         flushflg++;
      98:         break;
      99:
     100:       case P_INT:
     101:         buf->hdrstat = SYNC_STAT;
     102:         flushflg++;
     103:         break;
     104:
     105:       default:
     106:         IIsyserr("wrpipe: bad mode %d", mode);
     107:     }
     108:
     109:     while (nn > 0 || flushflg)
     110:     {
     111:         /* BUFFER OUT DATA */
     112:         while (nn > 0 && buf->pbuf_pt < PBUFSIZ)
     113:             buf->pbuf[buf->pbuf_pt++] = msg[msgl - (nn--)];
     114:         /* WRITE PIPE ? */
     115:         if (buf->pbuf_pt >= PBUFSIZ || flushflg)
     116:         {
     117:             buf->buf_len = buf->pbuf_pt;
     118: #			ifdef xATR2
     119:             if (IIdebug > 1)
     120:                 IIprpipe(buf);
     121: #			endif
     122:             if ((i = write(des, buf, HDRSIZ+PBUFSIZ)) < HDRSIZ+PBUFSIZ)
     123:                 IIsyserr("wrpipe: wr err %d %d", i, des);
     124:             buf->pbuf_pt = 0;
     125:             buf->err_id = 0;
     126:             flushflg = 0;
     127:         }
     128:     }
     129: #	ifdef xATR3
     130:     if (IIdebug > 1)
     131:     {
     132:         printf("%s wrpipe ret %d\n", proc_name, msgl);
     133:     }
     134: #	endif
     135:     return (msgl);
     136: }

#### Defined functions

IIwrpipe defined in line 49; used 8 times

- in /usr/ingres/source/equel/runtime/IIcvar.c line 60-63(2)
- in /usr/ingres/source/equel/runtime/IIingres.c line 57
- in /usr/ingres/source/equel/runtime/IIresync.c line 28-30(2)
- in /usr/ingres/source/equel/runtime/IIsync.c line 29-30(2)
- in /usr/ingres/source/equel/runtime/IIwrite.c line 28

Last modified: 1980-12-17 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 601 |