|
|
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));
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.