Annotation of coherent/g/usr/lib/uucp/tay104/prot.c, revision 1.1.1.1

1.1       root        1: /* prot.c
                      2:    Protocol support routines to move commands and data around.
                      3: 
                      4:    Copyright (C) 1991, 1992 Ian Lance Taylor
                      5: 
                      6:    This file is part of the Taylor UUCP package.
                      7: 
                      8:    This program is free software; you can redistribute it and/or
                      9:    modify it under the terms of the GNU General Public License as
                     10:    published by the Free Software Foundation; either version 2 of the
                     11:    License, or (at your option) any later version.
                     12: 
                     13:    This program is distributed in the hope that it will be useful, but
                     14:    WITHOUT ANY WARRANTY; without even the implied warranty of
                     15:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     16:    General Public License for more details.
                     17: 
                     18:    You should have received a copy of the GNU General Public License
                     19:    along with this program; if not, write to the Free Software
                     20:    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     21: 
                     22:    The author of the program may be contacted at [email protected] or
                     23:    c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
                     24:    */
                     25: 
                     26: #include "uucp.h"
                     27: 
                     28: #if USE_RCS_ID
                     29: const char prot_rcsid[] = "$Id: prot.c,v 1.1 93/07/30 07:53:15 bin Exp Locker: bin $";
                     30: #endif
                     31: 
                     32: #include <errno.h>
                     33: 
                     34: #include "uudefs.h"
                     35: #include "system.h"
                     36: #include "conn.h"
                     37: #include "prot.h"
                     38: 
                     39: /* Variables visible to the protocol-specific routines.  */
                     40: 
                     41: /* Buffer to hold received data.  */
                     42: char abPrecbuf[CRECBUFLEN];
                     43: 
                     44: /* Index of start of data in abPrecbuf.  */
                     45: int iPrecstart;
                     46: 
                     47: /* Index of end of data (first byte not included in data) in abPrecbuf.  */
                     48: int iPrecend;
                     49: 
                     50: /* We want to output and input at the same time, if supported on this
                     51:    machine.  If we have something to send, we send it all while
                     52:    accepting a large amount of data.  Once we have sent everything we
                     53:    look at whatever we have received.  If data comes in faster than we
                     54:    can send it, we may run out of buffer space.  */
                     55: 
                     56: boolean
                     57: fsend_data (qconn, zsend, csend, fdoread)
                     58:      struct sconnection *qconn;
                     59:      const char *zsend;
                     60:      size_t csend;
                     61:      boolean fdoread;
                     62: {
                     63:   if (! fdoread)
                     64:     return fconn_write (qconn, zsend, csend);
                     65: 
                     66:   while (csend > 0)
                     67:     {
                     68:       size_t crec, csent;
                     69: 
                     70:       if (iPrecend < iPrecstart)
                     71:        crec = iPrecstart - iPrecend - 1;
                     72:       else
                     73:        {
                     74:          crec = CRECBUFLEN - iPrecend;
                     75:          if (iPrecstart == 0)
                     76:            --crec;
                     77:        }
                     78: 
                     79:       csent = csend;
                     80: 
                     81:       if (! fconn_io (qconn, zsend, &csent, abPrecbuf + iPrecend, &crec))
                     82:        return FALSE;
                     83: 
                     84:       csend -= csent;
                     85:       zsend += csent;
                     86: 
                     87:       iPrecend = (iPrecend + crec) % CRECBUFLEN;
                     88:     }
                     89: 
                     90:   return TRUE;
                     91: }
                     92: 
                     93: /* Read data from the other system when we have nothing to send.  The
                     94:    argument cneed is the amount of data the caller wants, and ctimeout
                     95:    is the timeout in seconds.  The function sets *pcrec to the amount
                     96:    of data which was actually received, which may be less than cneed
                     97:    if there isn't enough room in the receive buffer.  If no data is
                     98:    received before the timeout expires, *pcrec will be returned as 0.
                     99:    If an error occurs, the function returns FALSE.  If the freport
                    100:    argument is FALSE, no error should be reported.  */
                    101: 
                    102: boolean
                    103: freceive_data (qconn, cneed, pcrec, ctimeout, freport)
                    104:      struct sconnection *qconn;
                    105:      size_t cneed;
                    106:      size_t *pcrec;
                    107:      int ctimeout;
                    108:      boolean freport;
                    109: {
                    110:   /* Set *pcrec to the maximum amount of data we can read.  fconn_read
                    111:      expects *pcrec to be the buffer size, and sets it to the amount
                    112:      actually received.  */
                    113:   if (iPrecend < iPrecstart)
                    114:     *pcrec = iPrecstart - iPrecend - 1;
                    115:   else
                    116:     {
                    117:       *pcrec = CRECBUFLEN - iPrecend;
                    118:       if (iPrecstart == 0)
                    119:        --(*pcrec);
                    120:     }
                    121: 
                    122: #if DEBUG > 0
                    123:   /* If we have no room in the buffer, we're in trouble.  The
                    124:      protocols must be written to ensure that this can't happen.  */
                    125:   if (*pcrec == 0)
                    126:     ulog (LOG_FATAL, "freceive_data: No room in buffer");
                    127: #endif
                    128: 
                    129:   /* If we don't have room for all the data the caller wants, we
                    130:      simply have to expect less.  We'll get the rest later.  */
                    131:   if (*pcrec < cneed)
                    132:     cneed = *pcrec;
                    133: 
                    134:   if (! fconn_read (qconn, abPrecbuf + iPrecend, pcrec, cneed, ctimeout,
                    135:                    freport))
                    136:     return FALSE;
                    137: 
                    138:   iPrecend = (iPrecend + *pcrec) % CRECBUFLEN;
                    139: 
                    140:   return TRUE;
                    141: }
                    142: 
                    143: /* Read a single character.  Get it out of the receive buffer if it's
                    144:    there, otherwise ask freceive_data for at least one character.
                    145:    This is used because as a protocol is shutting down freceive_data
                    146:    may read ahead and eat characters that should be read outside the
                    147:    protocol routines.  We call freceive_data rather than fconn_read
                    148:    with an argument of 1 so that we can get all the available data in
                    149:    a single system call.  The ctimeout argument is the timeout in
                    150:    seconds; the freport argument is FALSE if no error should be
                    151:    reported.  This returns a character, or -1 on timeout or -2 on
                    152:    error.  */
                    153: 
                    154: int
                    155: breceive_char (qconn, ctimeout, freport)
                    156:      struct sconnection *qconn;
                    157:      int ctimeout;
                    158:      boolean freport;
                    159: {
                    160:   char b;
                    161: 
                    162:   if (iPrecstart == iPrecend)
                    163:     {
                    164:       size_t crec;
                    165: 
                    166:       if (! freceive_data (qconn, sizeof (char), &crec, ctimeout, freport))
                    167:        return -2;
                    168:       if (crec == 0)
                    169:        return -1;
                    170:     }
                    171: 
                    172:   b = abPrecbuf[iPrecstart];
                    173:   iPrecstart = (iPrecstart + 1) % CRECBUFLEN;
                    174:   return BUCHAR (b);
                    175: }
                    176: 
                    177: /* Send mail about a file transfer.  We send to the given mailing
                    178:    address if there is one, otherwise to the user.  */
                    179: 
                    180: boolean
                    181: fmail_transfer (fsuccess, zuser, zmail, zwhy, zfromfile, zfromsys,
                    182:                ztofile, ztosys, zsaved)
                    183:      boolean fsuccess;
                    184:      const char *zuser;
                    185:      const char *zmail;
                    186:      const char *zwhy;
                    187:      const char *zfromfile;
                    188:      const char *zfromsys;
                    189:      const char *ztofile;
                    190:      const char *ztosys;
                    191:      const char *zsaved;
                    192: {
                    193:   const char *zsendto;
                    194:   const char *az[20];
                    195:   int i;
                    196: 
                    197:   if (zmail != NULL && *zmail != '\0')
                    198:     zsendto = zmail;
                    199:   else
                    200:     zsendto = zuser;
                    201: 
                    202:   i = 0;
                    203:   az[i++] = "The file\n\t";
                    204:   if (zfromsys != NULL)
                    205:     {
                    206:       az[i++] = zfromsys;
                    207:       az[i++] = "!";
                    208:     }
                    209:   az[i++] = zfromfile;
                    210:   if (fsuccess)
                    211:     az[i++] = "\nwas successfully transferred to\n\t";
                    212:   else
                    213:     az[i++] = "\ncould not be transferred to\n\t";
                    214:   if (ztosys != NULL)
                    215:     {
                    216:       az[i++] = ztosys;
                    217:       az[i++] = "!";
                    218:     }
                    219:   az[i++] = ztofile;
                    220:   az[i++] = "\nas requested by\n\t";
                    221:   az[i++] = zuser;
                    222:   if (! fsuccess)
                    223:     {
                    224:       az[i++] = "\nfor the following reason:\n\t";
                    225:       az[i++] = zwhy;
                    226:       az[i++] = "\n";
                    227:     }
                    228:   if (zsaved != NULL)
                    229:     {
                    230:       az[i++] = zsaved;
                    231:       az[i++] = "\n";
                    232:     }
                    233: 
                    234:   return fsysdep_mail (zsendto,
                    235:                       fsuccess ? "UUCP succeeded" : "UUCP failed",
                    236:                       i, az);
                    237: }

unix.superglobalmegacorp.com

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