home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.ncftp.com
/
ftp.ncftp.com.zip
/
ftp.ncftp.com
/
ncftp
/
older_versions
/
ncftp-3.2.2-src.tar.bz2
/
ncftp-3.2.2-src.tar
/
ncftp-3.2.2
/
libncftp
/
c_chdirlist.c
< prev
next >
Wrap
C/C++ Source or Header
|
2008-07-13
|
2KB
|
90 lines
/* c_chdirlist.c
*
* Copyright (c) 1996-2005 Mike Gleason, NcFTP Software.
* All rights reserved.
*
*/
#include "syshdrs.h"
#ifdef PRAGMA_HDRSTOP
# pragma hdrstop
#endif
#define _CRT_SECURE_NO_WARNINGS 1
int
FTPChdirList(FTPCIPtr cip, FTPLineListPtr const cdlist, char *const newCwd, const size_t newCwdSize, int flags)
{
size_t len;
char *cdstr;
FTPLinePtr lp;
int lastSubDir;
int mkd, pwd;
int result;
/* Retain backwards compatibility with earlier library versions. */
if (flags == kChdirOnly)
flags = kChdirFullPath;
if ((flags & kChdirFullPath) != 0) {
len = 0;
for (lp = cdlist->first; lp != NULL; lp = lp->next) {
len += strlen(lp->line);
len++; /* account for delimiting slash */
}
cdstr = malloc(len + 1);
if (cdstr == NULL)
return (cip->errNo = kErrMallocFailed);
cdstr[0] = '\0';
for (lp = cdlist->first; lp != NULL; lp = lp->next) {
strcat(cdstr, lp->line);
if (lp->next != NULL)
strcat(cdstr, "/");
}
if (FTPChdir3(cip, cdstr, newCwd, newCwdSize, (flags & ~kChdirOneSubdirAtATime)) == kNoErr) {
free(cdstr);
return (kNoErr);
}
free(cdstr);
}
if ((flags & kChdirOneSubdirAtATime) != 0) {
mkd = (flags & kChdirAndMkdir);
pwd = (flags & kChdirAndGetCWD);
lastSubDir = 0;
result = kNoErr;
for (lp = cdlist->first; lp != NULL; lp = lp->next) {
if (lp->next == NULL)
lastSubDir = 1;
if (strcmp(lp->line, ".") == 0) {
result = 0;
if ((lastSubDir != 0) && (pwd != 0))
result = FTPGetCWD(cip, newCwd, newCwdSize);
} else if ((lastSubDir != 0) && (pwd != 0)) {
result = FTPChdirAndGetCWD(cip, (*lp->line != '\0') ? lp->line : "/", newCwd, newCwdSize);
} else {
result = FTPChdir(cip, (*lp->line != '\0') ? lp->line : "/");
}
if (result < 0) {
if ((mkd != 0) && (*lp->line != '\0')) {
if (FTPCmd(cip, "MKD %s", lp->line) == 2) {
result = FTPChdir(cip, lp->line);
} else {
/* couldn't change nor create */
cip->errNo = result;
}
} else {
cip->errNo = result;
}
}
if (result != kNoErr)
break;
}
return (result);
}
return (kErrBadParameter);
} /* FTPChdirList */