From 9505213b4c7a4058ca353dd84db45abcfd47641a Mon Sep 17 00:00:00 2001 From: Arch Librarian Date: Mon, 20 Sep 2004 16:54:20 +0000 Subject: Better handling of missing services Author: jgg Date: 1999-07-18 23:06:56 GMT Better handling of missing services --- methods/connect.cc | 42 +++++++++++++++++++++++++++++------------- methods/connect.h | 6 +++--- methods/ftp.cc | 4 ++-- methods/http.cc | 4 ++-- 4 files changed, 36 insertions(+), 20 deletions(-) (limited to 'methods') diff --git a/methods/connect.cc b/methods/connect.cc index e17645a96..4d0cf985c 100644 --- a/methods/connect.cc +++ b/methods/connect.cc @@ -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; diff --git a/methods/connect.h b/methods/connect.h index 3af499236..1786a2480 100644 --- a/methods/connect.h +++ b/methods/connect.h @@ -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 #include -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 diff --git a/methods/ftp.cc b/methods/ftp.cc index 7bd0a3e18..420b44764 100644 --- a/methods/ftp.cc +++ b/methods/ftp.cc @@ -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) diff --git a/methods/http.cc b/methods/http.cc index 0a7f04a4f..0c44ea461 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -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; -- cgit v1.2.3