diff options
-rw-r--r-- | methods/http.cc | 13 | ||||
-rw-r--r-- | methods/rfc2553emu.cc | 95 | ||||
-rw-r--r-- | methods/rfc2553emu.h | 22 |
3 files changed, 120 insertions, 10 deletions
diff --git a/methods/http.cc b/methods/http.cc index 0c0acf60f..067d80564 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: http.cc,v 1.31 1999/05/25 05:56:24 jgg Exp $ +// $Id: http.cc,v 1.32 1999/05/26 04:08:39 jgg Exp $ /* ###################################################################### HTTP Aquire Method - This is the HTTP aquire method for APT. @@ -338,10 +338,15 @@ bool ServerState::Open() LastHost = Host; LastPort = Port; } - - // Connect to the server + + // 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); + // Get a socket -// Owner->Status("Connecting to %s (%s)",Host.c_str(),inet_ntoa(LastHostA)); if ((ServerFd = socket(LastHostAddr->ai_family,LastHostAddr->ai_socktype, LastHostAddr->ai_protocol)) < 0) return _error->Errno("socket","Could not create a socket"); diff --git a/methods/rfc2553emu.cc b/methods/rfc2553emu.cc index 66fe781fb..1b0628f98 100644 --- a/methods/rfc2553emu.cc +++ b/methods/rfc2553emu.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: rfc2553emu.cc,v 1.1 1999/05/25 05:56:24 jgg Exp $ +// $Id: rfc2553emu.cc,v 1.2 1999/05/26 04:08:39 jgg Exp $ /* ###################################################################### RFC 2553 Emulation - Provides emulation for RFC 2553 getaddrinfo, @@ -14,9 +14,13 @@ #include "rfc2553emu.h" #include <stdlib.h> #include <arpa/inet.h> -#include <iostream.h> +#include <string.h> +#include <stdio.h> #ifndef HAVE_GETADDRINFO +// getaddrinfo - Resolve a hostname /*{{{*/ +// --------------------------------------------------------------------- +/* */ int getaddrinfo(const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res) @@ -123,7 +127,10 @@ int getaddrinfo(const char *nodename, const char *servname, return 0; } - + /*}}}*/ +// freeaddrinfo - Free the result of getaddrinfo /*{{{*/ +// --------------------------------------------------------------------- +/* */ void freeaddrinfo(struct addrinfo *ai) { struct addrinfo *Tmp; @@ -135,5 +142,85 @@ void freeaddrinfo(struct addrinfo *ai) free(ai); } } - + /*}}}*/ #endif // HAVE_GETADDRINFO + +#ifndef HAVE_GETNAMEINFO +// getnameinfo - Convert a sockaddr to a string /*{{{*/ +// --------------------------------------------------------------------- +/* */ +int getnameinfo(const struct sockaddr *sa, socklen_t salen, + char *host, size_t hostlen, + char *serv, size_t servlen, + int flags) +{ + struct sockaddr_in *sin = (struct sockaddr_in *)sa; + + // This routine only support internet addresses + if (sa->sa_family != AF_INET) + return EAI_ADDRFAMILY; + + if (host != 0) + { + // Try to resolve the hostname + if ((flags & NI_NUMERICHOST) != NI_NUMERICHOST) + { + struct hostent *Ent = gethostbyaddr((char *)&sin->sin_addr,sizeof(sin->sin_addr), + AF_INET); + if (Ent != 0) + strncpy(host,Ent->h_name,hostlen); + else + { + if ((flags & NI_NAMEREQD) == NI_NAMEREQD) + { + if (h_errno == TRY_AGAIN) + return EAI_AGAIN; + if (h_errno == NO_RECOVERY) + return EAI_FAIL; + return EAI_NONAME; + } + + flags |= NI_NUMERICHOST; + } + } + + // Resolve as a plain numberic + if ((flags & NI_NUMERICHOST) == NI_NUMERICHOST) + { + strncpy(host,inet_ntoa(sin->sin_addr),hostlen); + } + } + + if (serv != 0) + { + // Try to resolve the hostname + if ((flags & NI_NUMERICSERV) != NI_NUMERICSERV) + { + struct servent *Ent; + if ((flags & NI_DATAGRAM) == NI_DATAGRAM) + Ent = getservbyport(sin->sin_port,"udp"); + else + Ent = getservbyport(sin->sin_port,"tcp"); + + if (Ent != 0) + strncpy(serv,Ent->s_name,servlen); + else + { + if ((flags & NI_NAMEREQD) == NI_NAMEREQD) + return EAI_NONAME; + + flags |= NI_NUMERICSERV; + } + } + + // Resolve as a plain numberic + if ((flags & NI_NUMERICSERV) == NI_NUMERICSERV) + { + snprintf(serv,servlen,"%u",sin->sin_port); + } + } + + return 0; +} + /*}}}*/ +#endif // HAVE_GETNAMEINFO diff --git a/methods/rfc2553emu.h b/methods/rfc2553emu.h index e24e7a3c1..5b9abbd84 100644 --- a/methods/rfc2553emu.h +++ b/methods/rfc2553emu.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: rfc2553emu.h,v 1.1 1999/05/25 05:56:24 jgg Exp $ +// $Id: rfc2553emu.h,v 1.2 1999/05/26 04:08:39 jgg Exp $ /* ###################################################################### RFC 2553 Emulation - Provides emulation for RFC 2553 getaddrinfo, @@ -31,6 +31,11 @@ #define HAVE_GETADDRINFO #endif +// Autosense getnameinfo +#if defined(NI_NUMERICHOST) +#define HAVE_GETNAMEINFO +#endif + // getaddrinfo support? #ifndef HAVE_GETADDRINFO #error Boink @@ -67,7 +72,6 @@ #define EAI_SOCKTYPE -6 #define EAI_SERVICE -7 #define EAI_ADDRFAMILY -8 - #define EAI_ADDRFAMILY -8 #define EAI_SYSTEM -10 #endif @@ -80,6 +84,20 @@ char *host, size_t hostlen, char *serv, size_t servlen, int flags); + + #ifndef NI_MAXHOST + #define NI_MAXHOST 1025 + #define NI_MAXSERV 32 + #endif + + #ifndef NI_NUMERICHOST + #define NI_NUMERICHOST (1<<0) + #define NI_NUMERICSERV (1<<1) +// #define NI_NOFQDN (1<<2) + #define NI_NAMEREQD (1<<3) + #define NI_DATAGRAM (1<<4) + #endif + #endif #endif |