/* Xfer.h */
#ifndef _xfer_h_
#define _xfer_h_ 1
#ifndef _ftp_h_
#include "FTP.h"
#endif
#ifndef _rcmd_h_
#include "RCmd.h"
#endif
/* This is for block transfer mode. See RFC 959. */
typedef struct FTPBlockHeader {
unsigned char desc;
unsigned char byteCount[2];
} FTPBlockHeader;
/* See RFC 959. */
#define kRegularBlock 0
#define kLastBlock 64
#define kXferBufSize 32768 /* Must be 2^16 to support block mode. */
/* These coincide with the definitions of kAcceptForWriting, etc., in FTP.h. */
#define kNetWriting kAcceptForWriting
#define kNetReading kAcceptForReading
#define NETREADING(xp) ((xp)->netMode == kNetReading)
#define NETWRITING(xp) ((xp)->netMode == kNetWriting)
/* More stuff for XferSpec setup.
* Typically, all of these are used at once when
* you don't want progress reports.
*/
#define kNoReports 0
#define kFileSizeDontCare 0L
#define kLocalFileIsStdout "-"
/* Some BlockProcs will timeout after the defined interval, and they
* return this instead of just -1 for a regular error.
*/
#define kTimeoutErr (-2)
/* typedef struct XferSpec *XferSpecPtr; done in RCmd.h. */
#define kNoTransfer ((XferSpecPtr) 0)
typedef int (*XferProc) (XferSpecPtr);
/* Each progress meter function follows this calling format. */
typedef int (*ProgressMeterProc) (XferSpecPtr, int);
typedef struct XferSpec {
/* These must be filled in by you. */
int netMode; /* Reading or writing Net I/O? */
XferProc xProc;
int inStream;
int outStream;
/* You can use this to point to another structure if you like. */
void *miscPtr;
/* Filled in by you if you want progress reports. */
int doReports;
char *localFileName;
char *remoteFileName;
long expectedSize;
long startPoint;
/* These are filled in by RDataCmd. */
ResponsePtr cmdResp;
ResponsePtr xferResp;
/* These are filled in by Progress routines. */
int progMeterInUse;
ProgressMeterProc prProc;
long bytesTransferred;
long bytesLeft;
double frac;
double bytesPerSec;
double secsElap;
struct timeval startTime;
struct timeval endTime;
long timeOfNextUpdate;
/* Needed to guarantee that the file times get set. */
int doUTime;
time_t remoteModTime;
int aborted;
int outIsTTY;
int inIsTTY;
Sig_t origPipe;
Sig_t origIntr;
int atEof; /* Block mode needs this. */
} XferSpec;
#define CLEARXFERSPEC(R) PTRZERO(R, sizeof(XferSpec))
typedef int (*NetReadProc) (XferSpecPtr xp);
typedef int (*NetWriteProc) (XferSpecPtr xp, char *, int);
/* Xfer.c */
void InitXferBuffer(void);
int BufferGets(char *, size_t, XferSpecPtr);
void XferSigHandler(int);
XferSpecPtr InitXferSpec(void);
void DoneWithXferSpec(XferSpecPtr);
void AbortDataTransfer(XferSpecPtr);
void EndTransfer(XferSpecPtr);
void StartTransfer(XferSpecPtr);
int StdAsciiFileReceive(XferSpecPtr);
int StdAsciiFileSend(XferSpecPtr);
int StdFileReceive(XferSpecPtr);
int StdFileSend(XferSpecPtr);
int StreamModeRead(XferSpecPtr);
int StreamModeWrite(XferSpecPtr, char *, int);
int BlockModeRead(XferSpecPtr);
int BlockModeWrite(XferSpecPtr, char *, int);
#endif /* _xfer_h_ */
syntax highlighted by Code2HTML, v. 0.9.1