|
|
1.1 root 1: /* prot.h
2: Protocol header file.
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: /* We need the definition of uuconf_cmdtab to declare the protocol
27: parameter arrays. */
28: #ifndef UUCONF_H
29: #include "uuconf.h"
30: #endif
31:
32: #if ANSI_C
33: /* These structures are used in prototypes but are not defined in this
34: header file. */
35: struct sdaemon;
36: struct sconnection;
37: struct stransfer;
38: #endif
39:
40: /* The sprotocol structure holds information and functions for a specific
41: protocol (e.g. the 'g' protocol). */
42:
43: struct sprotocol
44: {
45: /* The name of the protocol (e.g. 'g'). */
46: char bname;
47: /* Reliability requirements, an or of UUCONF_RELIABLE_xxx defines
48: from uuconf.h. */
49: int ireliable;
50: /* The maximum number of channels this protocol can support. */
51: int cchans;
52: /* Protocol parameter commands. */
53: struct uuconf_cmdtab *qcmds;
54: /* A routine to start the protocol. If *pzlog is set to be
55: non-NULL, it is an informative message to be logged; it should
56: then be passed to ubuffree. */
57: boolean (*pfstart) P((struct sdaemon *qdaemon, char **pzlog));
58: /* Shutdown the protocol. */
59: boolean (*pfshutdown) P((struct sdaemon *qdaemon));
60: /* Send a command to the other side. */
61: boolean (*pfsendcmd) P((struct sdaemon *qdaemon, const char *z,
62: int ilocal, int iremote));
63: /* Get buffer to space to fill with data. This should set *pcdata
64: to the amount of data desired. */
65: char *(*pzgetspace) P((struct sdaemon *qdaemon, size_t *pcdata));
66: /* Send data to the other side. The argument z must be a return
67: value of pzgetspace. The ipos argument is the file position, and
68: is ignored by most protocols. */
69: boolean (*pfsenddata) P((struct sdaemon *qdaemon, char *z, size_t c,
70: int ilocal, int iremote, long ipos));
71: /* Wait for data to come in and call fgot_data with it until
72: fgot_data sets *pfexit. */
73: boolean (*pfwait) P((struct sdaemon *qdaemon));
74: /* Handle any file level actions that need to be taken. If a file
75: transfer is starting rather than ending, fstart is TRUE. If the
76: file is being sent rather than received, fsend is TRUE. If
77: fstart and fsend are both TRUE, cbytes holds the size of the
78: file. If *pfhandled is set to TRUE, then the protocol routine
79: has taken care of queueing up qtrans for the next action. */
80: boolean (*pffile) P((struct sdaemon *qdaemon, struct stransfer *qtrans,
81: boolean fstart, boolean fsend, long cbytes,
82: boolean *pfhandled));
83: };
84:
85: /* Send data to the other system. If the fread argument is TRUE, this
86: will also receive data into the receive buffer abPrecbuf; fread is
87: passed as TRUE if the protocol expects data to be coming back, to
88: make sure the input buffer does not fill up. Returns FALSE on
89: error. */
90: extern boolean fsend_data P((struct sconnection *qconn,
91: const char *zsend, size_t csend,
92: boolean fdoread));
93:
94: /* Receive data from the other system when there is no data to send.
95: The cneed argument is the amount of data desired and the ctimeout
96: argument is the timeout in seconds. This will set *pcrec to the
97: amount of data received. It will return FALSE on error. If a
98: timeout occurs, it will return TRUE with *pcrec set to zero. */
99: extern boolean freceive_data P((struct sconnection *qconn, size_t cneed,
100: size_t *pcrec, int ctimeout,
101: boolean freport));
102:
103: /* Get one character from the remote system, going through the
104: procotol buffering. The ctimeout argument is the timeout in
105: seconds, and the freport argument is TRUE if errors should be
106: reported (when closing a connection it is pointless to report
107: errors). This returns a character or -1 on a timeout or -2 on an
108: error. */
109: extern int breceive_char P((struct sconnection *qconn,
110: int ctimeout, boolean freport));
111:
112: /* Compute a 32 bit CRC of a data buffer, given an initial CRC. */
113: extern unsigned long icrc P((const char *z, size_t c, unsigned long ick));
114:
115: /* The initial CRC value to use for a new buffer. */
116: #if ANSI_C
117: #define ICRCINIT (0xffffffffUL)
118: #else
119: #define ICRCINIT ((unsigned long) 0xffffffffL)
120: #endif
121:
122: /* The size of the receive buffer. */
123: #define CRECBUFLEN (16384)
124:
125: /* Buffer to hold received data. */
126: extern char abPrecbuf[CRECBUFLEN];
127:
128: /* Index of start of data in abPrecbuf. */
129: extern int iPrecstart;
130:
131: /* Index of end of data (first byte not included in data) in abPrecbuf. */
132: extern int iPrecend;
133:
134: /* There are a couple of variables and functions that are shared by
135: the 'i' and 'j' protocols (the 'j' protocol is just a wrapper
136: around the 'i' protocol). These belong in a separate header file,
137: protij.h, but I don't want to create one for just a couple of
138: things. */
139:
140: /* An escape sequence of characters for the 'j' protocol to avoid
141: (protocol parameter ``avoid''). */
142: extern const char *zJavoid_parameter;
143:
144: /* Timeout to use when sending the 'i' protocol SYNC packet (protocol
145: parameter ``sync-timeout''). */
146: extern int cIsync_timeout;
147:
148: /* Shared startup routine for the 'i' and 'j' protocols. */
149: extern boolean fijstart P((struct sdaemon *qdaemon, char **pzlog,
150: int imaxpacksize,
151: boolean (*pfsend) P((struct sconnection *qconn,
152: const char *zsend,
153: size_t csend,
154: boolean fdoread)),
155: boolean (*pfreceive) P((struct sconnection *qconn,
156: size_t cneed,
157: size_t *pcrec,
158: int ctimeout,
159: boolean freport))));
160:
161: /* Prototypes for 'g' protocol functions. */
162:
163: extern struct uuconf_cmdtab asGproto_params[];
164: extern boolean fgstart P((struct sdaemon *qdaemon, char **pzlog));
165: extern boolean fbiggstart P((struct sdaemon *qdaemon, char **pzlog));
166: extern boolean fgshutdown P((struct sdaemon *qdaemon));
167: extern boolean fgsendcmd P((struct sdaemon *qdaemon, const char *z,
168: int ilocal, int iremote));
169: extern char *zggetspace P((struct sdaemon *qdaemon, size_t *pcdata));
170: extern boolean fgsenddata P((struct sdaemon *qdaemon, char *z, size_t c,
171: int ilocal, int iremote, long ipos));
172: extern boolean fgwait P((struct sdaemon *qdaemon));
173:
174: /* Prototypes for 'f' protocol functions. */
175:
176: extern struct uuconf_cmdtab asFproto_params[];
177: extern boolean ffstart P((struct sdaemon *qdaemon, char **pzlog));
178: extern boolean ffshutdown P((struct sdaemon *qdaemon));
179: extern boolean ffsendcmd P((struct sdaemon *qdaemon, const char *z,
180: int ilocal, int iremote));
181: extern char *zfgetspace P((struct sdaemon *qdaemon, size_t *pcdata));
182: extern boolean ffsenddata P((struct sdaemon *qdaemon, char *z, size_t c,
183: int ilocal, int iremote, long ipos));
184: extern boolean ffwait P((struct sdaemon *qdaemon));
185: extern boolean fffile P((struct sdaemon *qdaemon, struct stransfer *qtrans,
186: boolean fstart, boolean fsend, long cbytes,
187: boolean *pfhandled));
188:
189: /* Prototypes for 't' protocol functions. */
190:
191: extern struct uuconf_cmdtab asTproto_params[];
192: extern boolean ftstart P((struct sdaemon *qdaemon, char **pzlog));
193: extern boolean ftshutdown P((struct sdaemon *qdaemon));
194: extern boolean ftsendcmd P((struct sdaemon *qdaemon, const char *z,
195: int ilocal, int iremote));
196: extern char *ztgetspace P((struct sdaemon *qdaemon, size_t *pcdata));
197: extern boolean ftsenddata P((struct sdaemon *qdaemon, char *z, size_t c,
198: int ilocal, int iremote, long ipos));
199: extern boolean ftwait P((struct sdaemon *qdaemon));
200: extern boolean ftfile P((struct sdaemon *qdaemon, struct stransfer *qtrans,
201: boolean fstart, boolean fsend, long cbytes,
202: boolean *pfhandled));
203:
204: /* Prototypes for 'e' protocol functions. */
205:
206: extern struct uuconf_cmdtab asEproto_params[];
207: extern boolean festart P((struct sdaemon *qdaemon, char **pzlog));
208: extern boolean feshutdown P((struct sdaemon *qdaemon));
209: extern boolean fesendcmd P((struct sdaemon *qdaemon, const char *z,
210: int ilocal, int iremote));
211: extern char *zegetspace P((struct sdaemon *qdaemon, size_t *pcdata));
212: extern boolean fesenddata P((struct sdaemon *qdaemon, char *z, size_t c,
213: int ilocal, int iremote, long ipos));
214: extern boolean fewait P((struct sdaemon *qdaemon));
215: extern boolean fefile P((struct sdaemon *qdaemon, struct stransfer *qtrans,
216: boolean fstart, boolean fsend, long cbytes,
217: boolean *pfhandled));
218:
219: /* Prototypes for 'i' protocol functions. */
220:
221: extern struct uuconf_cmdtab asIproto_params[];
222: extern boolean fistart P((struct sdaemon *qdaemon, char **pzlog));
223: extern boolean fishutdown P((struct sdaemon *qdaemon));
224: extern boolean fisendcmd P((struct sdaemon *qdaemon, const char *z,
225: int ilocal, int iremote));
226: extern char *zigetspace P((struct sdaemon *qdaemon, size_t *pcdata));
227: extern boolean fisenddata P((struct sdaemon *qdaemon, char *z, size_t c,
228: int ilocal, int iremote, long ipos));
229: extern boolean fiwait P((struct sdaemon *qdaemon));
230:
231: /* Prototypes for 'j' protocol functions. The 'j' protocol mostly
232: uses the 'i' protocol functions, but it has a couple of functions
233: of its own. */
234: extern boolean fjstart P((struct sdaemon *qdaemon, char **pzlog));
235: extern boolean fjshutdown P((struct sdaemon *qdaemon));
236:
237: /* Prototypes for 'a' protocol functions (these use 'z' as the second
238: character because 'a' is a modified Zmodem protocol). */
239: extern struct uuconf_cmdtab asZproto_params[];
240: extern boolean fzstart P((struct sdaemon *qdaemon, char **pzlog));
241: extern boolean fzshutdown P((struct sdaemon *qdaemon));
242: extern boolean fzsendcmd P((struct sdaemon *qdaemon, const char *z,
243: int ilocal, int iremote));
244: extern char *zzgetspace P((struct sdaemon *qdaemon, size_t *pcdata));
245: extern boolean fzsenddata P((struct sdaemon *qdaemon, char *z, size_t c,
246: int ilocal, int iremote, long ipos));
247: extern boolean fzwait P((struct sdaemon *qdaemon));
248: extern boolean fzfile P((struct sdaemon *qdaemon, struct stransfer *qtrans,
249: boolean fstart, boolean fsend, long cbytes,
250: boolean *pfhandled));
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.