]> git.saurik.com Git - apt.git/blobdiff - methods/ftp.cc
merged from donkult
[apt.git] / methods / ftp.cc
index fafa10534c4fd38e26e6fb19b65a6cedb3d2f483..eb7fedd85509bca7e838670d829ebad976ed8f40 100644 (file)
@@ -19,6 +19,7 @@
 #include <apt-pkg/acquire-method.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/hashes.h>
 #include <apt-pkg/acquire-method.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/hashes.h>
+#include <apt-pkg/netrc.h>
 
 #include <sys/stat.h>
 #include <sys/time.h>
 
 #include <sys/stat.h>
 #include <sys/time.h>
@@ -68,7 +69,8 @@ time_t FtpMethod::FailTime = 0;
 // ---------------------------------------------------------------------
 /* */
 FTPConn::FTPConn(URI Srv) : Len(0), ServerFd(-1), DataFd(-1), 
 // ---------------------------------------------------------------------
 /* */
 FTPConn::FTPConn(URI Srv) : Len(0), ServerFd(-1), DataFd(-1), 
-                            DataListenFd(-1), ServerName(Srv)
+                            DataListenFd(-1), ServerName(Srv),
+                           ForceExtended(false), TryPassive(true)
 {
    Debug = _config->FindB("Debug::Acquire::Ftp",false);
    PasvAddr = 0;
 {
    Debug = _config->FindB("Debug::Acquire::Ftp",false);
    PasvAddr = 0;
@@ -112,23 +114,28 @@ bool FTPConn::Open(pkgAcqMethod *Owner)
    Close();
    
    // Determine the proxy setting
    Close();
    
    // Determine the proxy setting
-   if (getenv("ftp_proxy") == 0)
+   string SpecificProxy = _config->Find("Acquire::ftp::Proxy::" + ServerName.Host);
+   if (!SpecificProxy.empty())
    {
    {
-      string DefProxy = _config->Find("Acquire::ftp::Proxy");
-      string SpecificProxy = _config->Find("Acquire::ftp::Proxy::" + ServerName.Host);
-      if (SpecificProxy.empty() == false)
-      {
-        if (SpecificProxy == "DIRECT")
-           Proxy = "";
-        else
-           Proxy = SpecificProxy;
-      }   
-      else
-        Proxy = DefProxy;
+          if (SpecificProxy == "DIRECT")
+                  Proxy = "";
+          else
+                  Proxy = SpecificProxy;
    }
    else
    }
    else
-      Proxy = getenv("ftp_proxy");
-   
+   {
+          string DefProxy = _config->Find("Acquire::ftp::Proxy");
+          if (!DefProxy.empty())
+          {
+                  Proxy = DefProxy;
+          }
+          else
+          {
+                  char* result = getenv("ftp_proxy");
+                  Proxy = result ? result : "";
+          }
+   }
+
    // Parse no_proxy, a , separated list of domains
    if (getenv("no_proxy") != 0)
    {
    // Parse no_proxy, a , separated list of domains
    if (getenv("no_proxy") != 0)
    {
@@ -201,7 +208,7 @@ bool FTPConn::Login()
       if (ReadResp(Tag,Msg) == false)
         return false;
       if (Tag >= 400)
       if (ReadResp(Tag,Msg) == false)
         return false;
       if (Tag >= 400)
-        return _error->Error(_("Server refused our connection and said: %s"),Msg.c_str());
+        return _error->Error(_("The server refused the connection and said: %s"),Msg.c_str());
       
       // Send the user
       if (WriteMsg(Tag,Msg,"USER %s",User.c_str()) == false)
       
       // Send the user
       if (WriteMsg(Tag,Msg,"USER %s",User.c_str()) == false)
@@ -229,7 +236,7 @@ bool FTPConn::Login()
       if (ReadResp(Tag,Msg) == false)
         return false;
       if (Tag >= 400)
       if (ReadResp(Tag,Msg) == false)
         return false;
       if (Tag >= 400)
-        return _error->Error(_("Server refused our connection and said: %s"),Msg.c_str());
+        return _error->Error(_("The server refused the connection and said: %s"),Msg.c_str());
       
       // Perform proxy script execution
       Configuration::Item const *Opts = _config->Tree("Acquire::ftp::ProxyLogin");
       
       // Perform proxy script execution
       Configuration::Item const *Opts = _config->Tree("Acquire::ftp::ProxyLogin");
@@ -443,7 +450,7 @@ bool FTPConn::WriteMsg(unsigned int &Ret,string &Text,const char *Fmt,...)
       int Res = write(ServerFd,S + Start,Len);
       if (Res <= 0)
       {
       int Res = write(ServerFd,S + Start,Len);
       if (Res <= 0)
       {
-        _error->Errno("write",_("Write Error"));
+        _error->Errno("write",_("Write error"));
         Close();
         return false;
       }
         Close();
         return false;
       }
@@ -553,7 +560,7 @@ bool FTPConn::ExtGoPasv()
    string::const_iterator List[4];
    unsigned Count = 0;
    Pos++;
    string::const_iterator List[4];
    unsigned Count = 0;
    Pos++;
-   for (string::const_iterator I = Msg.begin() + Pos; I < Msg.end(); I++)
+   for (string::const_iterator I = Msg.begin() + Pos; I < Msg.end(); ++I)
    {
       if (*I != Msg[Pos])
         continue;
    {
       if (*I != Msg[Pos])
         continue;
@@ -655,8 +662,7 @@ bool FTPConn::ModTime(const char *Path, time_t &Time)
       return true;
    
    // Parse it
       return true;
    
    // Parse it
-   StrToTime(Msg,Time);
-   return true;
+   return FTPMDTMStrToTime(Msg.c_str(), Time);
 }
                                                                        /*}}}*/
 // FTPConn::CreateDataFd - Get a data connection                       /*{{{*/
 }
                                                                        /*}}}*/
 // FTPConn::CreateDataFd - Get a data connection                       /*{{{*/
@@ -977,7 +983,9 @@ bool FtpMethod::Fetch(FetchItem *Itm)
    FetchResult Res;
    Res.Filename = Itm->DestFile;
    Res.IMSHit = false;
    FetchResult Res;
    Res.Filename = Itm->DestFile;
    Res.IMSHit = false;
-   
+
+   maybe_add_auth (Get, _config->FindFile("Dir::Etc::netrc"));
+
    // Connect to the server
    if (Server == 0 || Server->Comp(Get) == false)
    {
    // Connect to the server
    if (Server == 0 || Server->Comp(Get) == false)
    {
@@ -1055,9 +1063,12 @@ bool FtpMethod::Fetch(FetchItem *Itm)
         UBuf.modtime = FailTime;
         utime(FailFile.c_str(),&UBuf);
         
         UBuf.modtime = FailTime;
         utime(FailFile.c_str(),&UBuf);
         
-        // If the file is missing we hard fail otherwise transient fail
-        if (Missing == true)
+        // If the file is missing we hard fail and delete the destfile
+        // otherwise transient fail
+        if (Missing == true) {
+           unlink(FailFile.c_str());
            return false;
            return false;
+        }
         Fail(true);
         return true;
       }
         Fail(true);
         return true;
       }
@@ -1098,11 +1109,11 @@ int main(int argc,const char *argv[])
         char S[300];
         snprintf(S,sizeof(S),"http_proxy=%s",getenv("ftp_proxy"));
         putenv(S);
         char S[300];
         snprintf(S,sizeof(S),"http_proxy=%s",getenv("ftp_proxy"));
         putenv(S);
-        putenv("no_proxy=");
+        putenv((char *)"no_proxy=");
         
         // Run the http method
         string Path = flNotFile(argv[0]) + "http";
         
         // Run the http method
         string Path = flNotFile(argv[0]) + "http";
-        execl(Path.c_str(),Path.c_str(),0);
+        execl(Path.c_str(),Path.c_str(),(char *)NULL);
         cerr << _("Unable to invoke ") << Path << endl;
         exit(100);
       }      
         cerr << _("Unable to invoke ") << Path << endl;
         exit(100);
       }