X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/b8eba208daebe3e3f235983e44da9c398d6f7a57..7cafe70555740bd0acbf0b8d2193b95423e7436b:/methods/ftp.cc diff --git a/methods/ftp.cc b/methods/ftp.cc index 7764acf6a..dbc5f25d1 100644 --- a/methods/ftp.cc +++ b/methods/ftp.cc @@ -18,7 +18,6 @@ #include #include -#include #include #include #include @@ -39,7 +38,6 @@ // Internet stuff #include -#include #include #include @@ -499,12 +497,25 @@ bool FTPConn::GoPasv() // Unsupported function string::size_type Pos = Msg.find('('); - if (Tag >= 400 || Pos == string::npos) + if (Tag >= 400) + return true; + + //wu-2.6.2(1) ftp server, returns + //227 Entering Passive Mode 193,219,28,140,150,111 + //without parentheses, let's try to cope with it. + //wget(1) and ftp(1) can. + if (Pos == string::npos) + Pos = Msg.rfind(' '); + else + ++Pos; + + // Still unsupported function + if (Pos == string::npos) return true; // Scan it unsigned a0,a1,a2,a3,p0,p1; - if (sscanf(Msg.c_str() + Pos,"(%u,%u,%u,%u,%u,%u)",&a0,&a1,&a2,&a3,&p0,&p1) != 6) + if (sscanf(Msg.c_str() + Pos,"%u,%u,%u,%u,%u,%u",&a0,&a1,&a2,&a3,&p0,&p1) != 6) return true; /* Some evil servers return 0 to mean their addr. We can actually speak @@ -746,7 +757,7 @@ bool FTPConn::CreateDataFd() } // Bind and listen - if (bind(DataListenFd,BindAddr->ai_addr,BindAddr->ai_addrlen) < 0) + if (::bind(DataListenFd,BindAddr->ai_addr,BindAddr->ai_addrlen) < 0) { freeaddrinfo(BindAddr); return _error->Errno("bind",_("Could not bind a socket")); @@ -951,7 +962,7 @@ bool FTPConn::Get(const char *Path,FileFd &To,unsigned long long Resume, // FtpMethod::FtpMethod - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ -FtpMethod::FtpMethod() : pkgAcqMethod("1.0",SendConfig) +FtpMethod::FtpMethod() : aptMethod("ftp","1.0",SendConfig) { signal(SIGTERM,SigTerm); signal(SIGINT,SigTerm); @@ -986,13 +997,10 @@ void FtpMethod::SigTerm(int) /* We stash the desired pipeline depth */ bool FtpMethod::Configuration(string Message) { - if (pkgAcqMethod::Configuration(Message) == false) + if (aptMethod::Configuration(Message) == false) return false; - - TimeOut = _config->FindI("Acquire::Ftp::Timeout",TimeOut); - // no more active ftp, sorry - DropPrivsOrDie(); + TimeOut = _config->FindI("Acquire::Ftp::Timeout",TimeOut); return true; } @@ -1064,7 +1072,7 @@ bool FtpMethod::Fetch(FetchItem *Itm) } // Open the file - Hashes Hash; + Hashes Hash(Itm->ExpectedHashes); { FileFd Fd(Itm->DestFile,FileFd::WriteAny); if (_error->PendingError() == true) @@ -1073,7 +1081,7 @@ bool FtpMethod::Fetch(FetchItem *Itm) URIStart(Res); FailFile = Itm->DestFile; - FailFile.c_str(); // Make sure we dont do a malloc in the signal handler + FailFile.c_str(); // Make sure we don't do a malloc in the signal handler FailFd = Fd.Fd(); bool Missing; @@ -1091,7 +1099,7 @@ bool FtpMethod::Fetch(FetchItem *Itm) // If the file is missing we hard fail and delete the destfile // otherwise transient fail if (Missing == true) { - unlink(FailFile.c_str()); + RemoveFile("ftp", FailFile); return false; } Fail(true); @@ -1119,9 +1127,7 @@ bool FtpMethod::Fetch(FetchItem *Itm) /*}}}*/ int main(int, const char *argv[]) -{ - setlocale(LC_ALL, ""); - +{ /* See if we should be come the http client - we do this for http proxy urls */ if (getenv("ftp_proxy") != 0) @@ -1144,8 +1150,5 @@ int main(int, const char *argv[]) exit(100); } } - - FtpMethod Mth; - - return Mth.Run(); + return FtpMethod().Run(); }