Annotation of coherent/g/usr/lib/uucp/tay104/trans.h, revision 1.1.1.1

1.1       root        1: /* trans.h
                      2:    Header file for file and command transfer routines.
                      3: 
                      4:    Copyright (C) 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: /* The maximum possible number of channels.  */
                     27: #define IMAX_CHAN (16)
                     28: 
                     29: /* The ifeatures field of the sdaemon structure is an or of the
                     30:    following values.  These values are sent during the uucico
                     31:    handshake, and MUST NOT CHANGE.  */
                     32: 
                     33: /* File size negotiation.  */
                     34: #define FEATURE_SIZES (01)
                     35: 
                     36: /* File transfer restart.  */
                     37: #define FEATURE_RESTART (02)
                     38: 
                     39: /* The E (execute) command.  */
                     40: #define FEATURE_EXEC (04)
                     41: 
                     42: /* Version 1.03: requires decimal size in S and R command.  Needless
                     43:    to say, this should not be used by any new programs.  */
                     44: #define FEATURE_V103 (010)
                     45: 
                     46: /* SVR4 UUCP: expects dummy string between notify field and size field
                     47:    in send command.  There is probably some meaning to this string,
                     48:    but I don't know what it is.  If I ever find out, this flag will
                     49:    still be used to indicate it.  */
                     50: #define FEATURE_SVR4 (020)
                     51: 
                     52: /* This structure is used to hold information concerning the
                     53:    communication link established with the remote system.  */
                     54: 
                     55: struct sdaemon
                     56: {
                     57:   /* Global uuconf pointer.  */
                     58:   pointer puuconf;
                     59:   /* Remote system information.  */
                     60:   const struct uuconf_system *qsys;
                     61:   /* Local name being used.  */
                     62:   const char *zlocalname;
                     63:   /* Connection structure.  */
                     64:   struct sconnection *qconn;
                     65:   /* Protocol being used.  */
                     66:   const struct sprotocol *qproto;
                     67:   /* The largest file size permitted for a local request.  */
                     68:   long clocal_size;
                     69:   /* The largest file size permitted for a remote request.  */
                     70:   long cremote_size;
                     71:   /* The largest file size that may ever be transferred.  */
                     72:   long cmax_ever;
                     73:   /* The remote system ulimit.  */
                     74:   long cmax_receive;
                     75:   /* Features supported by the remote side.  */
                     76:   int ifeatures;
                     77:   /* TRUE if we should request the remote side to hang up.  */
                     78:   boolean frequest_hangup;
                     79:   /* TRUE if the remote side requested a hangup.  */
                     80:   boolean fhangup_requested;
                     81:   /* TRUE if we are hanging up.  */
                     82:   boolean fhangup;
                     83:   /* TRUE if the local system is currently the master.  */
                     84:   boolean fmaster;
                     85:   /* TRUE if the local system placed the call.  */
                     86:   boolean fcaller;
                     87:   /* UUCONF_RELIABLE_* flags for the connection.  */
                     88:   int ireliable;
                     89:   /* If fcaller is FALSE, the lowest grade which may be transferred
                     90:      during this call.  */
                     91:   char bgrade;
                     92: };
                     93: 
                     94: /* This structure is used to hold a file or command transfer which is
                     95:    in progress.  */
                     96: 
                     97: struct stransfer
                     98: {
                     99:   /* Next file transfer in queue.  */
                    100:   struct stransfer *qnext;
                    101:   /* Previous file transfer in queue.  */
                    102:   struct stransfer *qprev;
                    103:   /* Points to the queue this structure is on.  */
                    104:   struct stransfer **pqqueue;
                    105:   /* The function to call to send some data.  */
                    106:   boolean (*psendfn) P((struct stransfer *qtrans, struct sdaemon *qdaemon));
                    107:   /* The function to call when data is received.  */
                    108:   boolean (*precfn) P((struct stransfer *qtrans, struct sdaemon *qdaemon,
                    109:                       const char *zdata, size_t cdata));
                    110:   /* Type specific information.   */
                    111:   pointer pinfo;
                    112:   /* TRUE if we are sending the file e (this is used to avoid a call
                    113:      to psendfn).  */
                    114:   boolean fsendfile;
                    115:   /* TRUE if we are receiving the file e (this is used to avoid a call
                    116:      to precfn).  */
                    117:   boolean frecfile;
                    118:   /* The file to read or write.  */
                    119:   openfile_t e;
                    120:   /* The position we are at in the file.  */
                    121:   long ipos;
                    122:   /* TRUE if we are waiting for a command string.  */
                    123:   boolean fcmd;
                    124:   /* The command string we have so far.  */
                    125:   char *zcmd;
                    126:   /* The length of the command string we have so far.  */
                    127:   size_t ccmd;
                    128:   /* Local destination number.  */
                    129:   int ilocal;
                    130:   /* Remote destination number.  */
                    131:   int iremote;
                    132:   /* The command.  */
                    133:   struct scmd s;
                    134:   /* A message to log when work starts.  */
                    135:   char *zlog;
                    136:   /* The process time; imicros can be negative.  */
                    137:   long isecs;
                    138:   long imicros;
                    139:   /* Number of bytes sent or received.  */
                    140:   long cbytes;
                    141: };
                    142: 
                    143: /* Reasons that a file transfer might fail.  */
                    144: 
                    145: enum tfailure
                    146: {
                    147:   /* No failure.  */
                    148:   FAILURE_NONE,
                    149:   /* No permission for operation.  */
                    150:   FAILURE_PERM,
                    151:   /* Can't open necessary file.  */
                    152:   FAILURE_OPEN,
                    153:   /* Not enough space to receive file.  */
                    154:   FAILURE_SIZE,
                    155:   /* File was received in a previous conversation.  */
                    156:   FAILURE_RECEIVED
                    157: };
                    158: 
                    159: /* The main loop which talks to the remote system, passing transfer
                    160:    requests and file back and forth.  */
                    161: extern boolean floop P((struct sdaemon *qdaemon));
                    162: 
                    163: /* Allocate a new transfer structure.  */
                    164: extern struct stransfer *qtransalc P((struct scmd *qcmd));
                    165: 
                    166: /* Free a transfer structure.  */
                    167: extern void utransfree P((struct stransfer *qtrans));
                    168: 
                    169: /* Queue up local requests.  If pfany is not NULL, this sets *pfany to
                    170:    TRUE if there are, in fact, any local requests which can be done at
                    171:    this point.  */
                    172: extern boolean fqueue P((struct sdaemon *qdaemon, boolean *pfany));
                    173: 
                    174: /* Clear away any queued requests.  This may be called more than once
                    175:    at the end of a call.  */
                    176: extern void uclear_queue P((struct sdaemon *qdaemon));
                    177: 
                    178: /* Queue a new transfer request made by the local system.  */
                    179: extern boolean fqueue_local P((struct sdaemon *qdaemon,
                    180:                               struct stransfer *qtrans));
                    181: 
                    182: /* Queue a new transfer request made by the remote system.  */
                    183: extern boolean fqueue_remote P((struct sdaemon *qdaemon,
                    184:                                struct stransfer *qtrans));
                    185: 
                    186: /* Queue a transfer request which wants to send something.  */
                    187: extern boolean fqueue_send P((struct sdaemon *qdaemon,
                    188:                              struct stransfer *qtrans));
                    189: 
                    190: /* Queue a transfer request which wants to receiving something.  */
                    191: extern boolean fqueue_receive P((struct sdaemon *qdaemon,
                    192:                                 struct stransfer *qtrans));
                    193: 
                    194: /* Prepare to send a file by local or remote request.  */
                    195: extern boolean flocal_send_file_init P((struct sdaemon *qdaemon,
                    196:                                        struct scmd *qcmd));
                    197: extern boolean fremote_send_file_init P((struct sdaemon *qdaemon,
                    198:                                         struct scmd *qcmd,
                    199:                                         int iremote));
                    200: 
                    201: /* Prepare to receive a file by local or remote request.  */
                    202: extern boolean flocal_rec_file_init P((struct sdaemon *qdaemon,
                    203:                                       struct scmd *qcmd));
                    204: extern boolean fremote_rec_file_init P((struct sdaemon *qdaemon,
                    205:                                        struct scmd *qcmd,
                    206:                                        int iremote));
                    207: 
                    208: /* Prepare to request work by local or remote request.  */
                    209: extern boolean flocal_xcmd_init P((struct sdaemon *qdaemon,
                    210:                                   struct scmd *qcmd));
                    211: extern boolean fremote_xcmd_init P((struct sdaemon *qdaemon,
                    212:                                    struct scmd *qcmd,
                    213:                                    int iremote));
                    214: 
                    215: /* We have lost the connection; record any in progress file transfers
                    216:    in the statistics file and discard any temporary files.  */
                    217: extern void ufailed P((struct sdaemon *qdaemon));
                    218: 
                    219: /* Check that there is enough disk space for a file receive.  Return
                    220:    FALSE if there is not.  */
                    221: extern boolean frec_check_free P((struct stransfer *qtrans,
                    222:                                  long cfree_space));
                    223: 
                    224: /* Discard the temporary file being used to receive a file, if
                    225:    appropriate.  */
                    226: extern boolean frec_discard_temp P((struct sdaemon *qdaemon,
                    227:                                    struct stransfer *qtrans));
                    228: 
                    229: /* Handle data received by a protocol.  This is called by the protocol
                    230:    specific routines as data comes in.  The data is passed as two
                    231:    buffers because that is convenient for packet based protocols, but
                    232:    normally csecond will be 0.  The ilocal argument is the local
                    233:    channel number, and the iremote argument is the remote channel
                    234:    number.  Either may be -1, if the protocol does not have channels.
                    235:    The ipos argument is the position in the file, if the protocol
                    236:    knows it; for most protocols, this will be -1.  The fallacked
                    237:    argument should be set to TRUE if the remote has acknowledged all
                    238:    outstanding data; see uwindow_acked, below, for details. This will
                    239:    set *pfexit to TRUE if there is something for the main loop to do.
                    240:    A file is complete is when a zero length buffer is passed (cfirst
                    241:    == 0).  A command is complete when data containing a null byte is
                    242:    passed.  This will return FALSE on error.  If the protocol pfwait
                    243:    entry point should exit and let the top level loop continue,
                    244:    *pfexit will be set to TRUE (if pfexit is not NULL).  This will not
                    245:    set *pfexit to FALSE, so the caller must do that.  */
                    246: extern boolean fgot_data P((struct sdaemon *qdaemon,
                    247:                            const char *zfirst, size_t cfirst,
                    248:                            const char *zsecond, size_t csecond,
                    249:                            int ilocal, int iremote,
                    250:                            long ipos, boolean fallacked,
                    251:                            boolean *pfexit));
                    252: 
                    253: /* This routine is called when an ack is sent for a file receive.  */
                    254: extern void usent_receive_ack P((struct sdaemon *qdaemon,
                    255:                                 struct stransfer *qtrans));
                    256: 
                    257: /* A protocol may call this routine to indicate the packets have been
                    258:    acknowledged by the remote system.  If the fallacked argument is
                    259:    TRUE, then all outstanding packets have been acknowledged; for
                    260:    convenience, this may also be indicated by passing fallacked as
                    261:    TRUE to fgot_data, above.  Otherwise this routine should be called
                    262:    each time a complete window is acked by the remote system.  The
                    263:    transfer code uses this information to keep track of when an
                    264:    acknowledgement of a file receive has been seen by the other side,
                    265:    so that file receives may be handled cleanly if the connection is
                    266:    lost.  */
                    267: extern void uwindow_acked P((struct sdaemon *qdaemon,
                    268:                             boolean fallacked));

unix.superglobalmegacorp.com

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