Explorar el Código

Final rfc2553 changes
Author: jgg
Date: 1999-05-26 04:08:39 GMT
Final rfc2553 changes

Arch Librarian hace 22 años
padre
commit
533151d3ff
Se han modificado 3 ficheros con 120 adiciones y 10 borrados
  1. 9 4
      methods/http.cc
  2. 91 4
      methods/rfc2553emu.cc
  3. 20 2
      methods/rfc2553emu.h

+ 9 - 4
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");

+ 91 - 4
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

+ 20 - 2
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