diff --git a/src/modules/spider/spider.c b/src/modules/spider/spider.c
index fc2370a03cf6d3d217b9a50b96e6ca4aefa0a889..f0f4d2380de0c9b0f1156652061dcbe4d500f527 100644
--- a/src/modules/spider/spider.c
+++ b/src/modules/spider/spider.c
@@ -2,15 +2,13 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: spider.c,v 1.128 2004/10/07 22:49:58 nilsson Exp $
+|| $Id: spider.c,v 1.129 2005/04/09 10:39:22 grubba Exp $
 */
 
 #include "global.h"
 #include "config.h"
 
 
-#include "machine.h"
-
 #include <sys/types.h>
 #include <sys/stat.h>
 #ifdef HAVE_SYS_MMAN_H
@@ -34,10 +32,19 @@
 #include <unistd.h>
 #endif
 
+/* Some <sys/mman.h>'s (eg AIX 5L/ia64) contain a #define of MAP_VARIABLE
+ * for use as the opposite of MAP_FIXED.
+ *
+ * "program.h" included indirectly below has a conflicting definition of
+ * MAP_VARIABLE.
+ */
+#ifdef MAP_VARIABLE
+#undef MAP_VARIABLE
+#endif /* MAP_VARIABLE */
+
 #include "fdlib.h"
 #include "stralloc.h"
 #include "pike_macros.h"
-#include "machine.h"
 #include "object.h"
 #include "constants.h"
 #include "interpret.h"
diff --git a/src/modules/spider/xml.c b/src/modules/spider/xml.c
index 2c7b7eb7708d09b26c3696d1fdcf63c3b9e480f2..22a387fb8275ba1495a6209f2e49ea9f87b283a3 100644
--- a/src/modules/spider/xml.c
+++ b/src/modules/spider/xml.c
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: xml.c,v 1.72 2004/11/18 01:47:23 mast Exp $
+|| $Id: xml.c,v 1.73 2005/04/09 10:40:47 grubba Exp $
 */
 
 #include "global.h"
@@ -3188,7 +3188,8 @@ static void autoconvert(INT32 args)
 
 	  push_constant_text("Locale.Charset.decoder");
 	  APPLY_MASTER("resolv",1);
-	  push_string(make_shared_binary_string(STR0(s)+encstart,pos-encstart));
+	  push_string(make_shared_binary_string0(STR0(s)+encstart,
+						 pos-encstart));
 	  f_call_function(2);
 	  push_constant_text("feed");
 	  f_index(2);
diff --git a/src/modules/system/system.c b/src/modules/system/system.c
index cdffae799429c05dffd5953af3b47433600f759b..ed4383c35fa11d86d9514674e35a0c90bf9e786e 100644
--- a/src/modules/system/system.c
+++ b/src/modules/system/system.c
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: system.c,v 1.176 2005/02/16 19:36:59 grubba Exp $
+|| $Id: system.c,v 1.177 2005/04/09 10:42:22 grubba Exp $
 */
 
 /*
@@ -630,7 +630,7 @@ void f_cleargroups(INT32 args)
 #endif
 
   pop_n_elems(args);
-  err = setgroups(0, gids);
+  err = setgroups(0, (gid_t *)gids);
   if (err < 0) {
     report_error("cleargroups");
   }
@@ -1768,6 +1768,7 @@ int get_inet_addr(PIKE_SOCKADDR *addr,char *name,char *service, INT_TYPE port, i
     name = NULL;
 
 #ifdef HAVE_GETADDRINFO
+/*   fprintf(stderr, "get_inet_addr(): Trying getaddrinfo\n"); */
   if(!name) {
     hints.ai_flags = AI_PASSIVE;
     /* Avoid creating an IPv6 address for "*". */
@@ -1778,27 +1779,36 @@ int get_inet_addr(PIKE_SOCKADDR *addr,char *name,char *service, INT_TYPE port, i
   if(!service)
     sprintf(servnum_buf, "%"PRINTPIKEINT"d", (port<0? 0:port));
   if(!getaddrinfo(name, (service? service : servnum_buf), &hints, &res)) {
-    struct addrinfo *p;
+    struct addrinfo *p, *found = NULL;
     size_t addr_len=0;
     for(p=res; p; p=p->ai_next) {
-      if(p->ai_addrlen > 0 && p->ai_addrlen <= sizeof(*addr))
-	break;
+      if(p->ai_addrlen > addr_len &&
+	 p->ai_addrlen <= sizeof(*addr) &&
+	 p->ai_addr)
+	addr_len = (found = p)->ai_addrlen;
+    }
+    if(found) {
+/*       fprintf(stderr, "Got %d bytes (family: %d (%d))\n", */
+/* 	      addr_len, found->ai_addr->sa_family, found->ai_family); */
+      MEMCPY((char *)addr, (char *)found->ai_addr, addr_len);
     }
-    if(p && p->ai_addr)
-      MEMCPY((char *)addr, (char *)p->ai_addr, addr_len = p->ai_addrlen);
     freeaddrinfo(res);
-    if(addr_len)
+    if(addr_len) {
+/*       fprintf(stderr, "family: %d\n", SOCKADDR_FAMILY(*addr)); */
       return addr_len;
+    }
   }
 #endif /* HAVE_GETADDRINFO */
   
   SOCKADDR_FAMILY(*addr) = AF_INET;
   if(!name)
   {
+/*     fprintf(stderr, "get_inet_addr(): ANY\n"); */
     addr->ipv4.sin_addr.s_addr=htonl(INADDR_ANY);
   }
   else if(my_isipnr(name)) /* I do not entirely trust inet_addr */
   {
+/*     fprintf(stderr, "get_inet_addr(): IP\n"); */
     if (((IN_ADDR_T)inet_addr(name)) == ((IN_ADDR_T)-1))
       Pike_error("Malformed ip number.\n");
 
@@ -1808,6 +1818,7 @@ int get_inet_addr(PIKE_SOCKADDR *addr,char *name,char *service, INT_TYPE port, i
   {
 #ifdef GETHOST_DECLARE
     GETHOST_DECLARE;
+/*     fprintf(stderr, "get_inet_addr(): Trying gethostbyname()\n"); */
     CALL_GETHOSTBYNAME(name);
 
     if(!ret) {
@@ -1841,6 +1852,7 @@ int get_inet_addr(PIKE_SOCKADDR *addr,char *name,char *service, INT_TYPE port, i
   if(service) {
 #ifdef GETSERV_DECLARE
     GETSERV_DECLARE;
+/*     fprintf(stderr, "get_inet_addr(): Trying getserv()\n"); */
     CALL_GETSERVBYNAME(service, (udp? "udp":"tcp"));
 
     if(!ret) {
@@ -1859,10 +1871,13 @@ int get_inet_addr(PIKE_SOCKADDR *addr,char *name,char *service, INT_TYPE port, i
       Pike_error("Invalid service\n");
     }
 #endif
-  } else if(port >= 0)
+  } else if(port >= 0) {
+/*     fprintf(stderr, "get_inet_addr(): port()\n"); */
     addr->ipv4.sin_port = htons((unsigned INT16)port);
-  else
+  } else {
+/*     fprintf(stderr, "get_inet_addr(): ANY port()\n"); */
     addr->ipv4.sin_port = 0;
+  }
 
   return (SOCKADDR_FAMILY(*addr) == AF_INET? sizeof(addr->ipv4):sizeof(*addr));
 }