support for servers that does not permit NOOP

This commit is contained in:
Chee Yee
2025-01-10 21:05:16 -08:00
parent 3e4b5e3ea2
commit e5d5ddb8bc
2 changed files with 31 additions and 31 deletions
+29 -29
View File
@@ -125,7 +125,7 @@ int FtpClient::Connect(const std::string &url, const std::string &user, const st
}
mp_ftphandle->handle = sControl;
if (ReadResponse('2', mp_ftphandle) == 0)
if (ReadResponse("2", mp_ftphandle) == 0)
{
close(mp_ftphandle->handle);
mp_ftphandle->handle = 0;
@@ -142,7 +142,7 @@ int FtpClient::Connect(const std::string &url, const std::string &user, const st
cmd = "USER anonymous";
}
if (!FtpSendCmd(cmd, '3', mp_ftphandle))
if (!FtpSendCmd(cmd, "3", mp_ftphandle))
{
if (mp_ftphandle->ctrl != NULL)
return 1;
@@ -161,7 +161,7 @@ int FtpClient::Connect(const std::string &url, const std::string &user, const st
cmd = "PASS " + pass;
int ret;
if ((ret = FtpSendCmd(cmd, '2', mp_ftphandle)))
if ((ret = FtpSendCmd(cmd, "2", mp_ftphandle)))
{
mp_ftphandle->is_connected = true;
}
@@ -179,7 +179,7 @@ int FtpClient::Connect(const std::string &url, const std::string &user, const st
*
* return 1 if proper response received, 0 otherwise
*/
int FtpClient::FtpSendCmd(const std::string &cmd, char expected_resp, ftphandle *nControl)
int FtpClient::FtpSendCmd(const std::string &cmd, const std::string &expected_resp, ftphandle *nControl)
{
char buf[512];
int x;
@@ -205,7 +205,7 @@ int FtpClient::FtpSendCmd(const std::string &cmd, char expected_resp, ftphandle
* return 0 if first char doesn't match
* return 1 if first char matches
*/
int FtpClient::ReadResponse(char c, ftphandle *nControl)
int FtpClient::ReadResponse(const std::string &c, ftphandle *nControl)
{
char match[5];
@@ -228,7 +228,7 @@ int FtpClient::ReadResponse(char c, ftphandle *nControl)
} while (strncmp(nControl->response, match, 4));
}
if (nControl->response[0] == c)
if (c.find(nControl->response[0]) != std::string::npos)
return 1;
return 0;
}
@@ -368,7 +368,7 @@ int FtpClient::FtpAccess(const std::string &path, accesstype type, transfermode
return 0;
}
sprintf(buf, "TYPE %c", mode);
if (!FtpSendCmd(buf, '2', nControl))
if (!FtpSendCmd(buf, "2", nControl))
return 0;
switch (type)
@@ -477,7 +477,7 @@ int FtpClient::FtpAcceptConnection(ftphandle *nData, ftphandle *nControl)
{
close(nData->handle);
nData->handle = 0;
ReadResponse('2', nControl);
ReadResponse("2", nControl);
rv = 0;
}
@@ -521,7 +521,7 @@ int FtpClient::FtpOpenPasv(ftphandle *nControl, ftphandle **nData, transfermode
memset(&sin, 0, l);
sin.in.sin_family = AF_INET;
if (!FtpSendCmd("PASV", '2', nControl))
if (!FtpSendCmd("PASV", "2", nControl))
return -1;
cp = strchr(nControl->response, '(');
if (cp == NULL)
@@ -542,7 +542,7 @@ int FtpClient::FtpOpenPasv(ftphandle *nControl, ftphandle **nData, transfermode
{
char buf[512];
sprintf(buf, "REST %lld", mp_ftphandle->offset);
if (!FtpSendCmd(buf, '3', nControl))
if (!FtpSendCmd(buf, "3", nControl))
return 0;
}
@@ -592,7 +592,7 @@ int FtpClient::FtpOpenPasv(ftphandle *nControl, ftphandle **nData, transfermode
return -1;
}
if (!ReadResponse('1', nControl))
if (!ReadResponse("1", nControl))
{
close(sData);
return -1;
@@ -717,7 +717,7 @@ int FtpClient::FtpOpenPort(ftphandle *nControl, ftphandle **nData, transfermode
(unsigned char)sin.sa.sa_data[5],
(unsigned char)sin.sa.sa_data[0],
(unsigned char)sin.sa.sa_data[1]);
if (!FtpSendCmd(buf, '2', nControl))
if (!FtpSendCmd(buf, "2", nControl))
{
close(sData);
return -1;
@@ -727,7 +727,7 @@ int FtpClient::FtpOpenPort(ftphandle *nControl, ftphandle **nData, transfermode
{
char buf[512];
sprintf(buf, "REST %lld", mp_ftphandle->offset);
if (!FtpSendCmd(buf, '3', nControl))
if (!FtpSendCmd(buf, "3", nControl))
{
close(sData);
return 0;
@@ -747,7 +747,7 @@ int FtpClient::FtpOpenPort(ftphandle *nControl, ftphandle **nData, transfermode
return -1;
}
if (!FtpSendCmd(cmd, '1', nControl))
if (!FtpSendCmd(cmd, "1", nControl))
{
FtpClose(*nData);
*nData = NULL;
@@ -1045,7 +1045,7 @@ int FtpClient::FtpClose(ftphandle *nData)
ctrl = nData->ctrl;
free(nData);
if (ctrl)
return ReadResponse('2', ctrl);
return ReadResponse("2", ctrl);
return 1;
}
@@ -1061,7 +1061,7 @@ int FtpClient::Quit()
strcpy(mp_ftphandle->response, "error: no anwser from server\n");
return 0;
}
FtpSendCmd("QUIT", '2', mp_ftphandle);
FtpSendCmd("QUIT", "2", mp_ftphandle);
shutdown(mp_ftphandle->handle, SHUT_WR);
struct linger lng = {1, 0};
setsockopt(mp_ftphandle->handle, SOL_SOCKET, SO_LINGER, &lng, sizeof(lng));
@@ -1105,7 +1105,7 @@ int FtpClient::RawRead(void *buf, int max, ftphandle *handle)
int FtpClient::Site(const std::string &cmd)
{
std::string tmp = "SITE " + cmd;
if (!FtpSendCmd(tmp, '2', mp_ftphandle))
if (!FtpSendCmd(tmp, "2", mp_ftphandle))
return 0;
return 1;
}
@@ -1118,7 +1118,7 @@ int FtpClient::Site(const std::string &cmd)
int FtpClient::Raw(const std::string &cmd)
{
if (!FtpSendCmd(cmd, '2', mp_ftphandle))
if (!FtpSendCmd(cmd, "2", mp_ftphandle))
return 0;
return 1;
}
@@ -1137,7 +1137,7 @@ int FtpClient::SysType(char *buf, int max)
int l = max;
char *b = buf;
char *s;
if (!FtpSendCmd("SYST", '2', mp_ftphandle))
if (!FtpSendCmd("SYST", "2", mp_ftphandle))
return 0;
s = &mp_ftphandle->response[4];
while ((--l) && (*s != ' '))
@@ -1154,7 +1154,7 @@ int FtpClient::SysType(char *buf, int max)
int FtpClient::Mkdir(const std::string &path)
{
std::string cmd = "MKD " + path;
if (!FtpSendCmd(cmd, '2', mp_ftphandle))
if (!FtpSendCmd(cmd, "2", mp_ftphandle))
return 0;
return 1;
}
@@ -1167,7 +1167,7 @@ int FtpClient::Mkdir(const std::string &path)
int FtpClient::Chdir(const std::string &path)
{
std::string cmd = "CWD " + path;
if (!FtpSendCmd(cmd, '2', mp_ftphandle))
if (!FtpSendCmd(cmd, "2", mp_ftphandle))
return 0;
return 1;
}
@@ -1179,7 +1179,7 @@ int FtpClient::Chdir(const std::string &path)
*/
int FtpClient::Cdup()
{
if (!FtpSendCmd("CDUP", '2', mp_ftphandle))
if (!FtpSendCmd("CDUP", "2", mp_ftphandle))
return 0;
return 1;
}
@@ -1191,7 +1191,7 @@ int FtpClient::Cdup()
*/
bool FtpClient::Noop()
{
if (!FtpSendCmd("NOOP", '2', mp_ftphandle))
if (!FtpSendCmd("NOOP", "25", mp_ftphandle))
return 0;
return 1;
}
@@ -1209,7 +1209,7 @@ bool FtpClient::Ping()
int FtpClient::Rmdir(const std::string &path)
{
std::string cmd = "RMD " + path;
if (!FtpSendCmd(cmd, '2', mp_ftphandle))
if (!FtpSendCmd(cmd, "2", mp_ftphandle))
return 0;
return 1;
}
@@ -1272,11 +1272,11 @@ int FtpClient::Size(const std::string &path, int64_t *size)
return 0;
sprintf(cmd, "TYPE %c", FtpClient::transfermode::image);
if (!FtpSendCmd(cmd, '2', mp_ftphandle))
if (!FtpSendCmd(cmd, "2", mp_ftphandle))
return 0;
sprintf(cmd, "SIZE %s", path.c_str());
if (!FtpSendCmd(cmd, '2', mp_ftphandle))
if (!FtpSendCmd(cmd, "2", mp_ftphandle))
rv = 0;
else
{
@@ -1408,10 +1408,10 @@ int FtpClient::Put(const std::string &inputfile, const std::string &path, uint64
int FtpClient::Rename(const std::string &src, const std::string &dst)
{
std::string cmd = "RNFR " + src;
if (!FtpSendCmd(cmd, '3', mp_ftphandle))
if (!FtpSendCmd(cmd, "3", mp_ftphandle))
return 0;
cmd = "RNTO " + dst;
if (!FtpSendCmd(cmd, '2', mp_ftphandle))
if (!FtpSendCmd(cmd, "2", mp_ftphandle))
return 0;
return 1;
@@ -1420,7 +1420,7 @@ int FtpClient::Rename(const std::string &src, const std::string &dst)
int FtpClient::Delete(const std::string &path)
{
std::string cmd = "DELE " + path;
if (!FtpSendCmd(cmd, '2', mp_ftphandle))
if (!FtpSendCmd(cmd, "2", mp_ftphandle))
return 0;
return 1;
}
+2 -2
View File
@@ -114,12 +114,12 @@ private:
char server[128];
int server_port;
int FtpSendCmd(const std::string &cmd, char expected_resp, ftphandle *nControl);
int FtpSendCmd(const std::string &cmd, const std::string &expected_resp, ftphandle *nControl);
ftphandle *RawOpen(const std::string &path, accesstype type, transfermode mode);
int RawClose(ftphandle *handle);
int RawWrite(void *buf, int len, ftphandle *handle);
int RawRead(void *buf, int max, ftphandle *handle);
int ReadResponse(char c, ftphandle *nControl);
int ReadResponse(const std::string &c, ftphandle *nControl);
int Readline(char *buf, int max, ftphandle *nControl);
int Writeline(char *buf, int len, ftphandle *nData);
void ClearHandle();