Better handling of missing services
authorArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:54:20 +0000 (16:54 +0000)
committerArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:54:20 +0000 (16:54 +0000)
Author: jgg
Date: 1999-07-18 23:06:56 GMT
Better handling of missing services

methods/connect.cc
methods/connect.h
methods/ftp.cc
methods/http.cc

index e17645a..4d0cf98 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: connect.cc,v 1.2 1999/07/10 05:39:29 jgg Exp $
+// $Id: connect.cc,v 1.3 1999/07/18 23:06:56 jgg Exp $
 /* ######################################################################
 
    Connect - Replacement connect call
@@ -75,7 +75,7 @@ static bool DoConnect(struct addrinfo *Addr,string Host,
 // Connect - Connect to a server                                       /*{{{*/
 // ---------------------------------------------------------------------
 /* Performs a connection to the server */
-bool Connect(string Host,int Port,const char *Service,int &Fd,
+bool Connect(string Host,int Port,const char *Service,int DefPort,int &Fd,
             unsigned long TimeOut,pkgAcqMethod *Owner)
 {
    if (_error->PendingError() == true)
@@ -106,22 +106,38 @@ bool Connect(string Host,int Port,const char *Service,int &Fd,
       struct addrinfo Hints;
       memset(&Hints,0,sizeof(Hints));
       Hints.ai_socktype = SOCK_STREAM;
+      Hints.ai_protocol = IPPROTO_TCP;       // Right?
       
       // Resolve both the host and service simultaneously
-      int Res;
-      if ((Res = getaddrinfo(Host.c_str(),S,&Hints,&LastHostAddr)) != 0 ||
-         LastHostAddr == 0)
+      while (1)
       {
-        if (Res == EAI_SERVICE)
-           return _error->Error("Could not resolve service '%s'",S);
-        
-        if (Res == EAI_NONAME)
-           return _error->Error("Could not resolve '%s'",Host.c_str());
-        
-        return _error->Error("Something wicked happend resolving '%s/%s'",
-                             Host.c_str(),S);
+        int Res;
+        if ((Res = getaddrinfo(Host.c_str(),S,&Hints,&LastHostAddr)) != 0 ||
+            LastHostAddr == 0)
+        {
+           if (Res == EAI_SERVICE)
+              return _error->Error("Could not resolve service '%s'",S);
+           
+           if (Res == EAI_NONAME)
+           {
+              if (DefPort != 0)
+              {
+                 snprintf(S,sizeof(S),"%u",DefPort);
+                 DefPort = 0;
+                 continue;
+              }
+              return _error->Error("Could not resolve '%s'",Host.c_str());
+           }
+           
+           return _error->Error("Something wicked happend resolving '%s/%s'",
+                                Host.c_str(),S);
+        }
+        break;
       }
       
+      if (LastHostAddr->ai_family == AF_UNIX)
+        return _error->Error("getaddrinfo returned a unix domain socket\n");
+      
       LastHost = Host;
       LastPort = Port;
       LastUsed = 0;
index 3af4992..1786a24 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: connect.h,v 1.1 1999/05/29 03:25:03 jgg Exp $
+// $Id: connect.h,v 1.2 1999/07/18 23:06:56 jgg Exp $
 /* ######################################################################
 
    Connect - Replacement connect call
@@ -13,7 +13,7 @@
 #include <string>
 #include <apt-pkg/acquire-method.h>
 
-bool Connect(string To,int Port,const char *Service,int &Fd,
-            unsigned long TimeOut,pkgAcqMethod *Owner);
+bool Connect(string To,int Port,const char *Service,int DefPort,
+            int &Fd,unsigned long TimeOut,pkgAcqMethod *Owner);
 
 #endif
index 7bd0a3e..420b447 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: ftp.cc,v 1.13 1999/05/29 03:25:03 jgg Exp $
+// $Id: ftp.cc,v 1.14 1999/07/18 23:06:56 jgg Exp $
 /* ######################################################################
 
    HTTP Aquire Method - This is the FTP aquire method for APT.
@@ -125,7 +125,7 @@ bool FTPConn::Open(pkgAcqMethod *Owner)
    }
 
    // Connect to the remote server
-   if (Connect(Host,Port,"ftp",ServerFd,TimeOut,Owner) == false)
+   if (Connect(Host,Port,"ftp",21,ServerFd,TimeOut,Owner) == false)
       return false;
    socklen_t Len = sizeof(Peer);
    if (getpeername(ServerFd,(sockaddr *)&Peer,&Len) != 0)
index 0a7f04a..0c44ea4 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: http.cc,v 1.35 1999/06/05 07:30:18 jgg Exp $
+// $Id: http.cc,v 1.36 1999/07/18 23:06:56 jgg Exp $
 /* ######################################################################
 
    HTTP Aquire Method - This is the HTTP aquire method for APT.
@@ -305,7 +305,7 @@ bool ServerState::Open()
    }
    
    // Connect to the remote server
-   if (Connect(Host,Port,"http",ServerFd,TimeOut,Owner) == false)
+   if (Connect(Host,Port,"http",80,ServerFd,TimeOut,Owner) == false)
       return false;
    
    return true;