3 * Copyright (c) 1996-2001 Mike Gleason, NCEMRSoft.
11 #define kLibraryVersion "@(#) LibNcFTP 3.0.6 (April 14, 2001)"
13 #if defined(WIN32) || defined(_WINDOWS)
14 # define longest_int LONGLONG
15 # define longest_uint ULONGLONG
16 # ifndef HAVE_LONG_LONG
17 # define HAVE_LONG_LONG 1
19 # ifndef SCANF_LONG_LONG
20 # define SCANF_LONG_LONG "%I64d"
22 # ifndef PRINTF_LONG_LONG
23 # define PRINTF_LONG_LONG "%I64d"
25 # ifndef PRINTF_LONG_LONG_I64D
26 # define PRINTF_LONG_LONG_I64D 1
28 # ifndef SCANF_LONG_LONG_I64D
29 # define SCANF_LONG_LONG_I64D 1
39 # include <sys/time.h>
40 # if !defined(__ultrix) || !defined(XTI)
41 # include <sys/socket.h>
43 # include <netinet/in.h>
44 # if 1 /* %config1% -- set by configure script -- do not modify */
55 /* #undef NO_SIGNALS */
59 #include "ncftp_errno.h"
61 /* This is used to verify validty of the data passed in.
62 * It also specifies the minimum version that is binary-compatibile with
63 * this version. (So this may not necessarily be kLibraryVersion.)
65 #define kLibraryMagic "LibNcFTP 3.0.6"
68 #define longest_int long long
69 #define longest_uint unsigned long long
73 # define forever for ( ; ; )
76 typedef void (*FTPSigProc
)(int);
78 typedef struct Line
*LinePtr
;
84 typedef struct LineList
{
87 } LineList
, *LineListPtr
;
89 typedef struct Response
{
96 } Response
, *ResponsePtr
;
98 #if USE_SIO && !defined(_SReadlineInfo_)
99 #define _SReadlineInfo_ 1
100 typedef struct SReadlineInfo
{
101 char *buf
; /* Pointer to beginning of buffer. */
102 char *bufPtr
; /* Pointer to current position in buffer. */
103 char *bufLim
; /* Pointer to end of buffer. */
104 size_t bufSize
; /* Current size of buffer block. */
105 size_t bufSizeMax
; /* Maximum size available for buffer. */
106 int malloc
; /* If non-zero, malloc() was used for buf. */
107 int fd
; /* File descriptor to use for I/O. */
108 int timeoutLen
; /* Timeout to use, in seconds. */
109 int requireEOLN
; /* When buffer is full, continue reading and discarding until \n? */
113 typedef struct FTPLibraryInfo
{
114 char magic
[16]; /* Don't modify this field. */
115 int init
; /* Don't modify this field. */
116 int socksInit
; /* Don't modify this field. */
117 unsigned int defaultPort
; /* Don't modify this field. */
118 char ourHostName
[64]; /* Don't modify this field. */
119 int hresult
; /* Don't modify this field. */
120 int htried
; /* Don't modify this field. */
121 char defaultAnonPassword
[80]; /* You may set this after init. */
122 } FTPLibraryInfo
, *FTPLIPtr
;
124 typedef struct FTPConnectionInfo
*FTPCIPtr
;
125 typedef void (*FTPProgressMeterProc
)(const FTPCIPtr
, int);
126 typedef void (*FTPLogProc
)(const FTPCIPtr
, char *);
127 typedef void (*FTPConnectMessageProc
)(const FTPCIPtr
, ResponsePtr
);
128 typedef void (*FTPLoginMessageProc
)(const FTPCIPtr
, ResponsePtr
);
129 typedef void (*FTPRedialStatusProc
)(const FTPCIPtr
, int, int);
130 typedef void (*FTPPrintResponseProc
)(const FTPCIPtr
, ResponsePtr
);
131 typedef int (*FTPFtwProc
)(const FTPCIPtr cip
, const char *fn
, int flag
);
132 typedef void (*FTPGetPassphraseProc
)(const FTPCIPtr
, LineListPtr pwPrompt
, char *pass
, size_t dsize
);
134 typedef struct FTPConnectionInfo
{
135 char magic
[16]; /* Don't modify this field. */
136 char host
[64]; /* REQUIRED input parameter. */
137 char user
[64]; /* OPTIONAL input parameter. */
138 char pass
[64]; /* OPTIONAL input parameter. */
139 char acct
[64]; /* OPTIONAL input parameter. */
140 unsigned int port
; /* OPTIONAL input parameter. */
141 unsigned int xferTimeout
; /* OPTIONAL input parameter. */
142 unsigned int connTimeout
; /* OPTIONAL input parameter. */
143 unsigned int ctrlTimeout
; /* OPTIONAL input parameter. */
144 unsigned int abortTimeout
; /* OPTIONAL input parameter. */
145 FILE *debugLog
; /* OPTIONAL input parameter. */
146 FILE *errLog
; /* OPTIONAL input parameter. */
147 FTPLogProc debugLogProc
; /* OPTIONAL input parameter. */
148 FTPLogProc errLogProc
; /* OPTIONAL input parameter. */
149 FTPLIPtr lip
; /* Do not modify this field. */
150 int maxDials
; /* OPTIONAL input parameter. */
151 int redialDelay
; /* OPTIONAL input parameter. */
152 int dataPortMode
; /* OPTIONAL input parameter. */
153 char actualHost
[64]; /* Do not modify this field. */
154 char ip
[32]; /* Do not modify this field. */
155 int connected
; /* Do not modify this field. */
156 int loggedIn
; /* Do not modify this field. */
157 int curTransferType
; /* Do not modify this field. */
158 char *startingWorkingDirectory
; /* Use, but do not modify. */
159 longest_int startPoint
; /* Do not modify this field. */
160 int hasPASV
; /* Do not modify this field. */
161 int hasSIZE
; /* Do not modify this field. */
162 int hasMDTM
; /* Do not modify this field. */
163 int hasREST
; /* Do not modify this field. */
164 int hasNLST_d
; /* Do not modify this field. */
165 int hasUTIME
; /* Do not modify this field. */
166 int hasFEAT
; /* Do not modify this field. */
167 int hasMLSD
; /* Do not modify this field. */
168 int hasMLST
; /* Do not modify this field. */
169 int usedMLS
; /* Do not modify this field. */
170 int hasCLNT
; /* Do not modify this field. */
171 int hasRETRBUFSIZE
; /* Do not modify this field. */
172 int hasRBUFSIZ
; /* Do not modify this field. */
173 int hasRBUFSZ
; /* Do not modify this field. */
174 int hasSTORBUFSIZE
; /* Do not modify this field. */
175 int hasSBUFSIZ
; /* Do not modify this field. */
176 int hasSBUFSZ
; /* Do not modify this field. */
177 int hasBUFSIZE
; /* Do not modify this field. */
178 int mlsFeatures
; /* Do not modify this field. */
179 int STATfileParamWorks
; /* Do not modify this field. */
180 int NLSTfileParamWorks
; /* Do not modify this field. */
181 struct sockaddr_in servCtlAddr
; /* Do not modify this field. */
182 struct sockaddr_in servDataAddr
; /* Do not modify this field. */
183 struct sockaddr_in ourCtlAddr
; /* Do not modify this field. */
184 struct sockaddr_in ourDataAddr
; /* Do not modify this field. */
185 int netMode
; /* Do not use or modify. */
186 char *buf
; /* Do not modify this field. */
187 size_t bufSize
; /* Do not modify this field. */
188 FILE *cin
; /* Do not use or modify. */
189 FILE *cout
; /* Do not use or modify. */
190 int ctrlSocketR
; /* You may use but not modify/close. */
191 int ctrlSocketW
; /* You may use but not modify/close. */
192 int dataSocket
; /* You may use but not modify/close. */
193 int errNo
; /* You may modify this if you want. */
194 unsigned short ephemLo
; /* You may modify this if you want. */
195 unsigned short ephemHi
; /* You may modify this if you want. */
196 int cancelXfer
; /* You may modify this. */
197 longest_int bytesTransferred
; /* Do not modify this field. */
198 FTPProgressMeterProc progress
; /* You may modify this if you want. */
199 int useProgressMeter
; /* Used internally. */
200 int leavePass
; /* You may modify this. */
201 double sec
; /* Do not modify this field. */
202 double secLeft
; /* Do not modify this field. */
203 double kBytesPerSec
; /* Do not modify this field. */
204 double percentCompleted
; /* Do not modify this field. */
205 longest_int expectedSize
; /* Do not modify this field. */
206 time_t mdtm
; /* Do not modify this field. */
207 time_t nextProgressUpdate
; /* Do not modify this field. */
208 const char *rname
; /* Do not modify this field. */
209 const char *lname
; /* Do not modify this field. */
210 struct timeval t0
; /* Do not modify this field. */
211 int stalled
; /* Do not modify this field. */
212 int dataTimedOut
; /* Do not modify this field. */
213 int eofOkay
; /* Do not use or modify. */
214 char lastFTPCmdResultStr
[128]; /* You may modify this if you want. */
215 LineList lastFTPCmdResultLL
; /* Use, but do not modify. */
216 int lastFTPCmdResultNum
; /* You may modify this if you want. */
217 char firewallHost
[64]; /* You may modify this. */
218 char firewallUser
[64]; /* You may modify this. */
219 char firewallPass
[64]; /* You may modify this. */
220 unsigned int firewallPort
; /* You may modify this. */
221 int firewallType
; /* You may modify this. */
222 int require20
; /* You may modify this. */
223 int usingTAR
; /* Use, but do not modify. */
224 FTPConnectMessageProc onConnectMsgProc
; /* You may modify this. */
225 FTPRedialStatusProc redialStatusProc
; /* You may modify this. */
226 FTPPrintResponseProc printResponseProc
; /* You may modify this. */
227 FTPLoginMessageProc onLoginMsgProc
; /* You may modify this. */
228 size_t ctrlSocketRBufSize
; /* You may modify this. */
229 size_t ctrlSocketSBufSize
; /* You may modify this. */
230 size_t dataSocketRBufSize
; /* You may modify this. */
231 size_t dataSocketSBufSize
; /* You may modify this. */
232 int serverType
; /* Do not use or modify. */
233 int ietfCompatLevel
; /* Do not use or modify. */
234 int numDownloads
; /* Do not use or modify. */
235 int numUploads
; /* Do not use or modify. */
236 int numListings
; /* Do not use or modify. */
237 int doNotGetStartingWorkingDirectory
; /* You may modify this. */
240 SReadlineInfo ctrlSrl
; /* Do not use or modify. */
242 FTPGetPassphraseProc passphraseProc
; /* You may modify this. */
243 int iUser
; /* Scratch integer field you can use. */
244 void *pUser
; /* Scratch pointer field you can use. */
245 longest_int llUser
; /* Scratch long long field you can use. */
246 const char *asciiFilenameExtensions
; /* You may assign this. */
247 int reserved
[32]; /* Do not use or modify. */
250 typedef struct FileInfo
*FileInfoPtr
, **FileInfoVec
;
251 typedef struct FileInfo
{
252 FileInfoPtr prev
, next
;
257 char *plug
; /* permissions, links, user, group */
264 typedef struct FileInfoList
{
265 FileInfoPtr first
, last
;
272 } FileInfoList
, *FileInfoListPtr
;
274 /* Used with UnMlsT() */
275 typedef struct MLstItem
{
281 int mode
; /* "UNIX.mode" fact */
282 int uid
; /* "UNIX.uid" fact */
283 int gid
; /* "UNIX.gid" fact */
284 char perm
[16]; /* "perm" fact */
285 char owner
[16]; /* "UNIX.owner" fact */
286 char group
[16]; /* "UNIX.group" fact */
287 } MLstItem
, *MLstItemPtr
;
289 /* Messages we pass to the current progress meter function. */
291 #define kPrUpdateMsg 2
294 /* Parameter for OpenDataConnection() */
295 #define kSendPortMode 0
296 #define kPassiveMode 1
297 #define kFallBackToSendPortMode 2
299 /* Parameter for AcceptDataConnection() */
300 #define kAcceptForWriting 00100
301 #define kAcceptForReading 00101
302 #define kNetWriting kAcceptForWriting
303 #define kNetReading kAcceptForReading
305 /* Value for printMode field of Response structure.
306 * Generally, don't worry about this.
308 #define kResponseNoPrint 00001
309 #define kResponseNoSave 00002
310 #define kResponseNoProc 00002
312 #define kDefaultFTPPort 21
314 #define kDefaultFTPBufSize 32768
317 /* This version of the library can handle timeouts without
318 * a user-installed signal handler.
320 #define kDefaultXferTimeout 600
321 #define kDefaultConnTimeout 30
322 #define kDefaultCtrlTimeout 135
323 #define kDefaultAbortTimeout 10
325 /* The library doesn't use timeouts by default because it would
326 * break apps that don't have a SIGALRM handler.
328 #define kDefaultXferTimeout (0) /* No timeout. */
329 #define kDefaultConnTimeout (0) /* No timeout. */
330 #define kDefaultCtrlTimeout (0) /* No timeout. */
331 #define kDefaultAbortTimeout 10
335 /* Suggested timeout values, in seconds, if you use timeouts. */
336 #define kSuggestedDefaultXferTimeout (0) /* No timeout on data blocks. */
337 #define kSuggestedDefaultConnTimeout 30
338 #define kSuggestedDefaultCtrlTimeout 135 /* 2*MSL, + slop */
339 #define kSuggestedAbortTimeout 10
341 #define kDefaultMaxDials 3
342 #define kDefaultRedialDelay 20 /* seconds */
344 #define kDefaultDataPortMode kSendPortMode
346 #define kRedialStatusDialing 0
347 #define kRedialStatusSleeping 1
350 # define INADDR_NONE (0xffffffff) /* <netinet/in.h> should have it. */
353 #define kTypeAscii 'A'
354 #define kTypeBinary 'I'
355 #define kTypeEbcdic 'E'
357 #define kGlobChars "[*?"
358 #define GLOBCHARSINSTR(a) (strpbrk(a, kGlobChars) != NULL)
362 #define kRecursiveYes 1
363 #define kRecursiveNo 0
373 #define UNIMPLEMENTED_CMD(a) ((a == 500) || (a == 502) || (a == 504))
375 /* Possible values returned by GetDateAndTime. */
376 #define kSizeUnknown ((longest_int) (-1))
377 #define kModTimeUnknown ((time_t) (-1))
379 #define kCommandAvailabilityUnknown (-1)
380 #define kCommandAvailable 1
381 #define kCommandNotAvailable 0
383 /* Values returned by FTPDecodeURL. */
385 #define kMalformedURL (-2)
387 /* Values for the firewall/proxy open. */
388 #define kFirewallNotInUse 0
389 #define kFirewallUserAtSite 1
390 #define kFirewallLoginThenUserAtSite 2
391 #define kFirewallSiteSite 3
392 #define kFirewallOpenSite 4
393 #define kFirewallUserAtUserPassAtPass 5
394 #define kFirewallFwuAtSiteFwpUserPass 6
395 #define kFirewallUserAtSiteFwuPassFwp 7
396 #define kFirewallLastType kFirewallUserAtSiteFwuPassFwp
398 /* For MLSD, MLST, and STAT. */
399 #define kPreferredMlsOpts (kMlsOptType | kMlsOptSize | kMlsOptModify | kMlsOptUNIXmode | kMlsOptUNIXowner | kMlsOptUNIXgroup | kMlsOptUNIXuid | kMlsOptUNIXgid | kMlsOptPerm)
401 #define kMlsOptType 00001
402 #define kMlsOptSize 00002
403 #define kMlsOptModify 00004
404 #define kMlsOptUNIXmode 00010
405 #define kMlsOptUNIXowner 00020
406 #define kMlsOptUNIXgroup 00040
407 #define kMlsOptPerm 00100
408 #define kMlsOptUNIXuid 00200
409 #define kMlsOptUNIXgid 00400
410 #define kMlsOptUnique 01000
416 /* For FTPChdir3(). */
417 #define kChdirOnly 00000
418 #define kChdirAndMkdir 00001
419 #define kChdirAndGetCWD 00002
420 #define kChdirOneSubdirAtATime 00004
422 /* Return codes for custom ConfirmResumeDownloadProcs. */
423 #define kConfirmResumeProcNotUsed 0
424 #define kConfirmResumeProcSaidSkip 1
425 #define kConfirmResumeProcSaidResume 2
426 #define kConfirmResumeProcSaidOverwrite 3
427 #define kConfirmResumeProcSaidAppend 4
428 #define kConfirmResumeProcSaidBestGuess 5
429 #define kConfirmResumeProcSaidCancel 6
431 typedef int (*ConfirmResumeDownloadProc
)(
432 const char *volatile *localpath
,
433 volatile longest_int localsize
,
434 volatile time_t localmtime
,
435 const char *volatile remotepath
,
436 volatile longest_int remotesize
,
437 volatile time_t remotetime
,
438 volatile longest_int
*volatile startPoint
441 typedef int (*ConfirmResumeUploadProc
)(
442 const char *volatile localpath
,
443 volatile longest_int localsize
,
444 volatile time_t localmtime
,
445 const char *volatile *remotepath
,
446 volatile longest_int remotesize
,
447 volatile time_t remotetime
,
448 volatile longest_int
*volatile startPoint
451 #define NoConfirmResumeDownloadProc ((ConfirmResumeDownloadProc) 0)
452 #define NoConfirmResumeUploadProc ((ConfirmResumeUploadProc) 0)
453 #define NoGetPassphraseProc ((FTPGetPassphraseProc) 0)
455 /* Types of FTP server software.
457 * We try to recognize a few of these, for information
458 * only, and occasional uses to determine some additional
459 * or broken functionality.
461 #define kServerTypeUnknown 0
462 #define kServerTypeWuFTPd 1
463 #define kServerTypeNcFTPd 2
464 #define kServerTypeProFTPD 3
465 #define kServerTypeMicrosoftFTP 4
466 #define kServerTypeWarFTPd 5
467 #define kServerTypeServ_U 6
468 #define kServerTypeWFTPD 7
469 #define kServerTypeVFTPD 8
470 #define kServerTypeFTP_Max 9
471 #define kServerTypeRoxen 10
472 #define kServerTypeNetWareFTP 11
473 #define kServerTypeWS_FTP 12
476 #if !defined(WIN32) && !defined(_WINDOWS) && !defined(closesocket)
477 # define closesocket close
480 #if !defined(WIN32) && !defined(_WINDOWS) && !defined(ioctlsocket)
481 # define ioctlsocket ioctl
484 #if defined(WIN32) || defined(_WINDOWS)
485 # define LOCAL_PATH_DELIM '\\'
486 # define LOCAL_PATH_DELIM_STR "\\"
487 # define LOCAL_PATH_ALTDELIM '/'
488 # define IsLocalPathDelim(c) ((c == LOCAL_PATH_DELIM) || (c == LOCAL_PATH_ALTDELIM))
489 # define UNC_PATH_PREFIX "\\\\"
490 # define IsUNCPrefixed(s) (IsLocalPathDelim(s[0]) && IsLocalPathDelim(s[1]))
492 # define LOCAL_PATH_DELIM '/'
493 # define LOCAL_PATH_DELIM_STR "/"
494 # define StrFindLocalPathDelim(a) strchr(a, LOCAL_PATH_DELIM)
495 # define StrRFindLocalPathDelim(a) strrchr(a, LOCAL_PATH_DELIM)
496 # define StrRemoveTrailingLocalPathDelim StrRemoveTrailingSlashes
497 # define IsLocalPathDelim(c) (c == LOCAL_PATH_DELIM)
498 # define TVFSPathToLocalPath(s)
499 # define LocalPathToTVFSPath(s)
505 #endif /* __cplusplus */
507 #ifndef _libncftp_ftp_c_
508 extern char gLibNcFTPVersion
[64];
511 #ifndef _libncftp_errno_c_
512 extern int gLibNcFTP_Uses_Me_To_Quiet_Variable_Unused_Warnings
;
515 #if (defined(__GNUC__)) && (__GNUC__ >= 2)
517 # define UNUSED(a) a __attribute__ ((unused))
519 # define LIBNCFTP_USE_VAR(a)
521 # define LIBNCFTP_USE_VAR(a) gLibNcFTP_Uses_Me_To_Quiet_Variable_Unused_Warnings = (a == 0)
527 /* Public routines */
528 void FTPAbortDataTransfer(const FTPCIPtr cip
);
529 int FTPChdir(const FTPCIPtr cip
, const char *const cdCwd
);
530 int FTPChdirAndGetCWD(const FTPCIPtr cip
, const char *const cdCwd
, char *const newCwd
, const size_t newCwdSize
);
531 int FTPChdir3(FTPCIPtr cip
, const char *const cdCwd
, char *const newCwd
, const size_t newCwdSize
, int flags
);
532 int FTPChmod(const FTPCIPtr cip
, const char *const pattern
, const char *const mode
, const int doGlob
);
533 int FTPCloseHost(const FTPCIPtr cip
);
534 int FTPCmd(const FTPCIPtr cip
, const char *const cmdspec
, ...)
535 #if (defined(__GNUC__)) && (__GNUC__ >= 2)
536 __attribute__ ((format (printf
, 2, 3)))
539 int FTPDecodeURL(const FTPCIPtr cip
, char *const url
, LineListPtr cdlist
, char *const fn
, const size_t fnsize
, int *const xtype
, int *const wantnlst
);
540 int FTPDelete(const FTPCIPtr cip
, const char *const pattern
, const int recurse
, const int doGlob
);
541 int FTPFileExists(const FTPCIPtr cip
, const char *const file
);
542 int FTPFileModificationTime(const FTPCIPtr cip
, const char *const file
, time_t *const mdtm
);
543 int FTPFileSize(const FTPCIPtr cip
, const char *const file
, longest_int
*const size
, const int type
);
544 int FTPFileSizeAndModificationTime(const FTPCIPtr cip
, const char *const file
, longest_int
*const size
, const int type
, time_t *const mdtm
);
545 int FTPFileType(const FTPCIPtr cip
, const char *const file
, int *const ftype
);
546 int FTPGetCWD(const FTPCIPtr cip
, char *const newCwd
, const size_t newCwdSize
);
547 int FTPGetFiles3(const FTPCIPtr cip
, const char *pattern
, const char *const dstdir
, const int recurse
, int doGlob
, const int xtype
, const int resumeflag
, int appendflag
, const int deleteflag
, const int tarflag
, const ConfirmResumeDownloadProc resumeProc
, int reserved
);
548 int FTPGetOneFile3(const FTPCIPtr cip
, const char *const file
, const char *const dstfile
, const int xtype
, const int fdtouse
, const int resumeflag
, const int appendflag
, const int deleteflag
, const ConfirmResumeDownloadProc resumeProc
, int reserved
);
549 int FTPInitConnectionInfo(const FTPLIPtr lip
, const FTPCIPtr cip
, size_t bufsize
);
550 int FTPInitLibrary(const FTPLIPtr lip
);
551 int FTPIsDir(const FTPCIPtr cip
, const char *const dir
);
552 int FTPIsRegularFile(const FTPCIPtr cip
, const char *const file
);
553 int FTPList(const FTPCIPtr cip
, const int outfd
, const int longMode
, const char *const lsflag
);
554 int FTPListToMemory(const FTPCIPtr cip
, const char *const pattern
, const LineListPtr llines
, const char *const lsflags
);
555 int FTPLocalGlob(FTPCIPtr cip
, LineListPtr fileList
, const char *pattern
, int doGlob
);
556 int FTPLoginHost(const FTPCIPtr cip
);
557 int FTPMkdir(const FTPCIPtr cip
, const char *const newDir
, const int recurse
);
558 int FTPMkdir2(const FTPCIPtr cip
, const char *const newDir
, const int recurse
, const char *const curDir
);
559 int FTPOpenHost(const FTPCIPtr cip
);
560 int FTPOpenHostNoLogin(const FTPCIPtr cip
);
561 void FTPPerror(const FTPCIPtr cip
, const int err
, const int eerr
, const char *const s1
, const char *const s2
);
562 int FTPPutOneFile3(const FTPCIPtr cip
, const char *const file
, const char *const dstfile
, const int xtype
, const int fdtouse
, const int appendflag
, const char *const tmppfx
, const char *const tmpsfx
, const int resumeflag
, const int deleteflag
, const ConfirmResumeUploadProc resumeProc
, int reserved
);
563 int FTPPutFiles3(const FTPCIPtr cip
, const char *const pattern
, const char *const dstdir
, const int recurse
, const int doGlob
, const int xtype
, int appendflag
, const char *const tmppfx
, const char *const tmpsfx
, const int resumeflag
, const int deleteflag
, const ConfirmResumeUploadProc resumeProc
, int reserved
);
564 int FTPRemoteGlob(FTPCIPtr cip
, LineListPtr fileList
, const char *pattern
, int doGlob
);
565 int FTPRename(const FTPCIPtr cip
, const char *const oldname
, const char *const newname
);
566 int FTPRmdir(const FTPCIPtr cip
, const char *const pattern
, const int recurse
, const int doGlob
);
567 void FTPShutdownHost(const FTPCIPtr cip
);
568 const char *FTPStrError(int e
);
569 int FTPSymlink(const FTPCIPtr cip
, const char *const lfrom
, const char *const lto
);
570 int FTPUmask(const FTPCIPtr cip
, const char *const umsk
);
571 int FTPUtime(const FTPCIPtr cip
, const char *const file
, time_t actime
, time_t modtime
, time_t crtime
);
573 /* LineList routines */
574 int CopyLineList(LineListPtr
, LineListPtr
);
575 void DisposeLineListContents(LineListPtr
);
576 void InitLineList(LineListPtr
);
577 LinePtr
RemoveLine(LineListPtr
, LinePtr
);
578 LinePtr
AddLine(LineListPtr
, const char *);
580 /* Other routines that might be useful. */
581 char *StrDup(const char *);
582 char *FGets(char *, size_t, FILE *);
583 void GetHomeDir(char *, size_t);
584 void GetUsrName(char *, size_t);
585 void Scramble(unsigned char *dst
, size_t dsize
, unsigned char *src
, char *key
);
586 time_t UnMDTMDate(char *);
587 int MkDirs(const char *const, int mode1
);
588 char *GetPass(const char *const prompt
);
589 int FilenameExtensionIndicatesASCII(const char *const pathName
, const char *const extnList
);
590 void StrRemoveTrailingSlashes(char *dst
);
591 #if defined(WIN32) || defined(_WINDOWS)
592 char *StrFindLocalPathDelim(const char *src
);
593 char *StrRFindLocalPathDelim(const char *src
);
594 void StrRemoveTrailingLocalPathDelim(char *dst
);
595 void TVFSPathToLocalPath(char *dst
);
596 void LocalPathToTVFSPath(char *dst
);
597 int gettimeofday(struct timeval
*const tp
, void *junk
);
598 void WinSleep(unsigned int seconds
);
601 #ifdef HAVE_SIGACTION
602 void (*NcSignal(int signum
, void (*handler
)(int)))(int);
603 #elif !defined(NcSignal)
604 # define NcSignal signal
607 /* Obselete routines. */
608 int FTPGetOneFile(const FTPCIPtr cip
, const char *const file
, const char *const dstfile
);
609 int FTPGetOneFile2(const FTPCIPtr cip
, const char *const file
, const char *const dstfile
, const int xtype
, const int fdtouse
, const int resumeflag
, const int appendflag
);
610 int FTPGetFiles(const FTPCIPtr cip
, const char *const pattern
, const char *const dstdir
, const int recurse
, const int doGlob
);
611 int FTPGetFiles2(const FTPCIPtr cip
, const char *const pattern
, const char *const dstdir
, const int recurse
, const int doGlob
, const int xtype
, const int resumeflag
, const int appendflag
);
612 int FTPGetOneFileAscii(const FTPCIPtr cip
, const char *const file
, const char *const dstfile
);
613 int FTPGetFilesAscii(const FTPCIPtr cip
, const char *const pattern
, const char *const dstdir
, const int recurse
, const int doGlob
);
614 int FTPPutOneFile(const FTPCIPtr cip
, const char *const file
, const char *const dstfile
);
615 int FTPPutOneFile2(const FTPCIPtr cip
, const char *const file
, const char *const dstfile
, const int xtype
, const int fdtouse
, const int appendflag
, const char *const tmppfx
, const char *const tmpsfx
);
616 int FTPPutFiles(const FTPCIPtr cip
, const char *const pattern
, const char *const dstdir
, const int recurse
, const int doGlob
);
617 int FTPPutFiles2(const FTPCIPtr cip
, const char *const pattern
, const char *const dstdir
, const int recurse
, const int doGlob
, const int xtype
, const int appendflag
, const char *const tmppfx
, const char *const tmpsfx
);
618 int FTPPutOneFileAscii(const FTPCIPtr cip
, const char *const file
, const char *const dstfile
);
619 int FTPPutFilesAscii(const FTPCIPtr cip
, const char *const pattern
, const char *const dstdir
, const int recurse
, const int doGlob
);
621 /* Private routines, or stuff for testing */
622 char *FTPGetLocalCWD(char *buf
, size_t size
);
623 int FTPQueryFeatures(const FTPCIPtr
);
624 int FTPMListOneFile(const FTPCIPtr cip
, const char *const file
, const MLstItemPtr mlip
);
625 void FTPInitializeOurHostName(const FTPLIPtr
);
626 void FTPInitializeAnonPassword(const FTPLIPtr
);
627 int FTPListToMemory2(const FTPCIPtr cip
, const char *const pattern
, const LineListPtr llines
, const char *const lsflags
, const int blanklines
, int *const tryMLSD
);
628 void FTPInitIOTimer(const FTPCIPtr
);
629 int FTPStartDataCmd(const FTPCIPtr
, int, int, longest_int
, const char *,...)
630 #if (defined(__GNUC__)) && (__GNUC__ >= 2)
631 __attribute__ ((format (printf
, 5, 6)))
634 void FTPStartIOTimer(const FTPCIPtr
);
635 void FTPStopIOTimer(const FTPCIPtr
);
636 void FTPUpdateIOTimer(const FTPCIPtr
);
637 int FTPSetTransferType(const FTPCIPtr
, int);
638 int FTPEndDataCmd(const FTPCIPtr
, int);
639 int FTPRemoteHelp(const FTPCIPtr
, const char *const, const LineListPtr
);
640 int FTPCmdNoResponse(const FTPCIPtr
, const char *const cmdspec
,...)
641 #if (defined(__GNUC__)) && (__GNUC__ >= 2)
642 __attribute__ ((format (printf
, 2, 3)))
645 int WaitResponse(const FTPCIPtr
, unsigned int);
646 int FTPLocalRecursiveFileList(FTPCIPtr
, LineListPtr
, FileInfoListPtr
);
647 int FTPLocalRecursiveFileList2(FTPCIPtr cip
, LineListPtr fileList
, FileInfoListPtr files
, int erelative
);
648 int FTPRemoteRecursiveFileList(FTPCIPtr
, LineListPtr
, FileInfoListPtr
);
649 int FTPRemoteRecursiveFileList1(FTPCIPtr
, char *const, FileInfoListPtr
);
650 int FTPRebuildConnectionInfo(const FTPLIPtr lip
, const FTPCIPtr cip
);
651 int FTPFileExistsStat(const FTPCIPtr cip
, const char *const file
);
652 int FTPFileExistsNlst(const FTPCIPtr cip
, const char *const file
);
653 int FTPFileExists2(const FTPCIPtr cip
, const char *const file
, const int tryMDTM
, const int trySIZE
, const int tryMLST
, const int trySTAT
, const int tryNLST
);
654 int FTPFtw(const FTPCIPtr cip
, const char *const dir
, FTPFtwProc proc
, int maxdepth
);
655 int BufferGets(char *, size_t, int, char *, char **, char **, size_t);
656 void DisposeFileInfoListContents(FileInfoListPtr
);
657 void InitFileInfoList(FileInfoListPtr
);
658 void InitFileInfo(FileInfoPtr
);
659 FileInfoPtr
RemoveFileInfo(FileInfoListPtr
, FileInfoPtr
);
660 FileInfoPtr
AddFileInfo(FileInfoListPtr
, FileInfoPtr
);
661 void SortFileInfoList(FileInfoListPtr
, int, int);
662 void VectorizeFileInfoList(FileInfoListPtr
);
663 void UnvectorizeFileInfoList(FileInfoListPtr
);
664 int ComputeRNames(FileInfoListPtr
, const char *, int, int);
665 int ComputeLNames(FileInfoListPtr
, const char *, const char *, int);
666 int ConcatFileInfoList(FileInfoListPtr
, FileInfoListPtr
);
667 int ConcatFileToFileInfoList(FileInfoListPtr
, char *);
668 int LineListToFileInfoList(LineListPtr
, FileInfoListPtr
);
669 int LineToFileInfoList(LinePtr
, FileInfoListPtr
);
670 void URLCopyToken(char *, size_t, const char *, size_t);
671 int UnMlsT(const char *const, const MLstItemPtr
);
672 int UnMlsD(FileInfoListPtr
, LineListPtr
);
673 int UnLslR(FileInfoListPtr
, LineListPtr
, int);
674 void TraceResponse(const FTPCIPtr
, ResponsePtr
);
675 void PrintResponse(const FTPCIPtr
, LineListPtr
);
676 void DoneWithResponse(const FTPCIPtr
, ResponsePtr
);
677 ResponsePtr
InitResponse(void);
678 void ReInitResponse(const FTPCIPtr
, ResponsePtr
);
679 int GetTelnetString(const FTPCIPtr
, char *, size_t, FILE *, FILE *);
680 int GetResponse(const FTPCIPtr
, ResponsePtr
);
681 int RCmd(const FTPCIPtr
, ResponsePtr
, const char *, ...)
682 #if (defined(__GNUC__)) && (__GNUC__ >= 2)
683 __attribute__ ((format (printf
, 3, 4)))
689 #endif /* __cplusplus */
691 #endif /* _ncftp_h_ */