diff --git a/src/ChangeLog b/src/ChangeLog
index 7c85fb59..48fe91a1 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,10 @@
+2001-12-11  Hrvoje Niksic  <hniksic@arsdigita.com>
+
+	* host.c: New type ipv4_address.  Use it consistently instead of
+	`unsigned char[4]' and `unsigned char *'.
+	(pretty_print_address): Accept a `const void *', to require even
+	less casting.
+
 2001-12-11  Hrvoje Niksic  <hniksic@arsdigita.com>
 
 	* ftp-ls.c (ftp_parse_vms_ls): Fix obvious memory leaks.
diff --git a/src/host.c b/src/host.c
index fb997733..ddc04445 100644
--- a/src/host.c
+++ b/src/host.c
@@ -65,7 +65,8 @@ extern int h_errno;
 # endif
 #endif
 
-#define IP4_ADDRESS_LENGTH 4
+/* An IPv4 address is simply a 4-byte quantity. */
+typedef unsigned char ipv4_address[4];
 
 /* Mapping between known hosts and to lists of their addresses. */
 
@@ -76,7 +77,7 @@ static struct hash_table *host_name_addresses_map;
 
 struct address_list {
   int count;			/* number of adrresses */
-  unsigned char *buffer;	/* buffer which holds all of them. */
+  ipv4_address *addresses;	/* pointer to the string of addresses */
 
   int faulty;			/* number of addresses known not to
 				   work. */
@@ -84,8 +85,6 @@ struct address_list {
 				   not. */
 };
 
-#define ADDR_LOCATION(al, index) ((al)->buffer + index * IP4_ADDRESS_LENGTH)
-
 /* Get the bounds of the address list.  */
 
 void
@@ -102,7 +101,7 @@ address_list_copy_one (struct address_list *al, int index,
 		       unsigned char *ip_store)
 {
   assert (index >= al->faulty && index < al->count);
-  memcpy (ip_store, ADDR_LOCATION (al, index), IP4_ADDRESS_LENGTH);
+  memcpy (ip_store, al->addresses + index, sizeof (ipv4_address));
 }
 
 /* Check whether two address lists have all their IPs in common.  */
@@ -114,8 +113,8 @@ address_list_match_all (struct address_list *al1, struct address_list *al2)
     return 1;
   if (al1->count != al2->count)
     return 0;
-  return 0 == memcmp (al1->buffer, al2->buffer,
-		      al1->count * IP4_ADDRESS_LENGTH);
+  return 0 == memcmp (al1->addresses, al2->addresses,
+		      al1->count * sizeof (ipv4_address));
 }
 
 /* Mark the INDEXth element of AL as faulty, so that the next time
@@ -151,13 +150,13 @@ address_list_new (char **h_addr_list)
   while (h_addr_list[count])
     ++count;
   assert (count > 0);
-  al->count    = count;
-  al->faulty   = 0;
-  al->buffer   = xmalloc (count * IP4_ADDRESS_LENGTH);
-  al->refcount = 1;
+  al->count     = count;
+  al->faulty    = 0;
+  al->addresses = xmalloc (count * sizeof (ipv4_address));
+  al->refcount  = 1;
 
   for (i = 0; i < count; i++)
-    memcpy (ADDR_LOCATION (al, i), h_addr_list[i], IP4_ADDRESS_LENGTH);
+    memcpy (al->addresses + i, h_addr_list[i], sizeof (ipv4_address));
 
   return al;
 }
@@ -168,11 +167,11 @@ static struct address_list *
 address_list_new_one (const char *addr)
 {
   struct address_list *al = xmalloc (sizeof (struct address_list));
-  al->count    = 1;
-  al->faulty   = 0;
-  al->buffer   = xmalloc (IP4_ADDRESS_LENGTH);
-  al->refcount = 1;
-  memcpy (ADDR_LOCATION (al, 0), addr, IP4_ADDRESS_LENGTH);
+  al->count     = 1;
+  al->faulty    = 0;
+  al->addresses = xmalloc (sizeof (ipv4_address));
+  al->refcount  = 1;
+  memcpy (al->addresses, addr, sizeof (ipv4_address));
 
   return al;
 }
@@ -180,7 +179,7 @@ address_list_new_one (const char *addr)
 static void
 address_list_delete (struct address_list *al)
 {
-  xfree (al->buffer);
+  xfree (al->addresses);
   xfree (al);
 }
 
@@ -200,7 +199,7 @@ address_list_release (struct address_list *al)
    #including the netinet stuff.  */
 
 char *
-pretty_print_address (const unsigned char *addr)
+pretty_print_address (const void *addr)
 {
   return inet_ntoa (*(struct in_addr *)addr);
 }
@@ -224,8 +223,7 @@ cache_host_lookup (const char *host, struct address_list *al)
       int i;
       debug_logprintf ("Caching %s =>", host);
       for (i = 0; i < al->count; i++)
-	debug_logprintf (" %s",
-			 pretty_print_address (ADDR_LOCATION (al, i)));
+	debug_logprintf (" %s", pretty_print_address (al->addresses + i));
       debug_logprintf ("\n");
     }
 #endif
@@ -250,7 +248,7 @@ lookup_host (const char *host, int silent)
 	 we copy the correct four bytes.  */
       int offset;
 #ifdef WORDS_BIGENDIAN
-      offset = sizeof (unsigned long) - IP4_ADDRESS_LENGTH;
+      offset = sizeof (unsigned long) - sizeof (ipv4_address);
 #else
       offset = 0;
 #endif
diff --git a/src/host.h b/src/host.h
index 7cd395dc..f99c636c 100644
--- a/src/host.h
+++ b/src/host.h
@@ -37,7 +37,7 @@ void address_list_release PARAMS ((struct address_list *));
 
 /* This was originally going to be a macro, but then every caller
    would have to #include the netinet stuff.  */
-char *pretty_print_address PARAMS ((const unsigned char *));
+char *pretty_print_address PARAMS ((const void *));
 
 int accept_domain PARAMS ((struct url *));
 int sufmatch PARAMS ((const char **, const char *));