Logo Search packages:      
Sourcecode: ncftp2 version File versions  Download package


/* Xfer.h */

#ifndef _xfer_h_
#define _xfer_h_  1

#ifndef _ftp_h_
#include "FTP.h"

#ifndef _rcmd_h_
#include "RCmd.h"

/* 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_ */

Generated by  Doxygen 1.6.0   Back to index