diff options
author | Arch Librarian <arch@canonical.com> | 2004-09-20 16:53:53 +0000 |
---|---|---|
committer | Arch Librarian <arch@canonical.com> | 2004-09-20 16:53:53 +0000 |
commit | 0837bd25607acd90944a4bfded58d582371ba112 (patch) | |
tree | d18775a4fdba1b54f7de5a542340eb085c64dc52 /methods/ftp.cc | |
parent | b3e53cecf4e761ff9d9b0a139ca71f0d67848041 (diff) |
Multiprotocol connect
Author: jgg
Date: 1999-05-29 03:25:03 GMT
Multiprotocol connect
Diffstat (limited to 'methods/ftp.cc')
-rw-r--r-- | methods/ftp.cc | 74 |
1 files changed, 8 insertions, 66 deletions
diff --git a/methods/ftp.cc b/methods/ftp.cc index efc50c205..7bd0a3e18 100644 --- a/methods/ftp.cc +++ b/methods/ftp.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: ftp.cc,v 1.12 1999/05/28 07:04:45 jgg Exp $ +// $Id: ftp.cc,v 1.13 1999/05/29 03:25:03 jgg Exp $ /* ###################################################################### HTTP Aquire Method - This is the FTP aquire method for APT. @@ -36,6 +36,7 @@ #include <netdb.h> #include "rfc2553emu.h" +#include "connect.h" #include "ftp.h" /*}}}*/ @@ -81,9 +82,6 @@ void FTPConn::Close() // --------------------------------------------------------------------- /* Connect to the server using a non-blocking connection and perform a login. */ -string LastHost; -int LastPort = 0; -struct addrinfo *LastHostAddr = 0; bool FTPConn::Open(pkgAcqMethod *Owner) { // Use the already open connection if possible. @@ -125,70 +123,14 @@ bool FTPConn::Open(pkgAcqMethod *Owner) Port = Proxy.Port; Host = Proxy.Host; } - - /* We used a cached address record.. Yes this is against the spec but - the way we have setup our rotating dns suggests that this is more - sensible */ - if (LastHost != Host || LastPort != Port) - { - Owner->Status("Connecting to %s",Host.c_str()); - - // Lookup the host - char S[30] = "ftp"; - if (Port != 0) - snprintf(S,sizeof(S),"%u",Port); - - // Free the old address structure - if (LastHostAddr != 0) - { - freeaddrinfo(LastHostAddr); - LastHostAddr = 0; - } - - // We only understand SOCK_STREAM sockets. - struct addrinfo Hints; - memset(&Hints,0,sizeof(Hints)); - Hints.ai_socktype = SOCK_STREAM; - - // Resolve both the host and service simultaneously - if (getaddrinfo(Host.c_str(),S,&Hints,&LastHostAddr) != 0 || - LastHostAddr == 0) - return _error->Error("Could not resolve '%s'",Host.c_str()); - LastHost = Host; - LastPort = Port; - } - - // Get the printable IP address - char Name[NI_MAXHOST]; - Name[0] = 0; - getnameinfo(LastHostAddr->ai_addr,LastHostAddr->ai_addrlen, - Name,sizeof(Name),0,0,NI_NUMERICHOST); - Owner->Status("Connecting to %s (%s)",Host.c_str(),Name); + // Connect to the remote server + if (Connect(Host,Port,"ftp",ServerFd,TimeOut,Owner) == false) + return false; + socklen_t Len = sizeof(Peer); + if (getpeername(ServerFd,(sockaddr *)&Peer,&Len) != 0) + return _error->Errno("getpeername","Unable to determine the peer name"); - // Get a socket - if ((ServerFd = socket(LastHostAddr->ai_family,LastHostAddr->ai_socktype, - LastHostAddr->ai_protocol)) < 0) - return _error->Errno("socket","Could not create a socket"); - SetNonBlock(ServerFd,true); - if (connect(ServerFd,LastHostAddr->ai_addr,LastHostAddr->ai_addrlen) < 0 && - errno != EINPROGRESS) - return _error->Errno("connect","Cannot initiate the connection " - "to %s (%s).",Host.c_str(),Name); - Peer = *((struct sockaddr_in *)LastHostAddr->ai_addr); - - /* This implements a timeout for connect by opening the connection - nonblocking */ - if (WaitFd(ServerFd,true,TimeOut) == false) - return _error->Error("Could not connect to %s (%s), " - "connection timed out",Host.c_str(),Name); - unsigned int Err; - unsigned int Len = sizeof(Err); - if (getsockopt(ServerFd,SOL_SOCKET,SO_ERROR,&Err,&Len) != 0) - return _error->Errno("getsockopt","Failed"); - if (Err != 0) - return _error->Error("Could not connect to %s (%s).",Host.c_str(),Name); - Owner->Status("Logging in"); return Login(); } |