diff -ruw perl-5.10.1/ext/Errno/Errno_pm.PL perl-5.10.1-haiku/ext/Errno/Errno_pm.PL
--- perl-5.10.1/ext/Errno/Errno_pm.PL	2009-06-27 16:09:45.059768832 +0000
+++ perl-5.10.1-haiku/ext/Errno/Errno_pm.PL	2011-03-01 18:01:57.984350720 +0000
@@ -159,10 +159,14 @@
 	# we might miss out on compiler-specific ones
 	$file{"$ENV{GUSI}include:sys:errno.h"} = 1;
 
-    } elsif ($^O eq 'beos' || $^O eq 'haiku') {
+    } elsif ($^O eq 'beos') {
 	# hidden in a special place
 	$file{'/boot/develop/headers/posix/errno.h'} = 1;
 
+    } elsif ($^O eq 'haiku') {
+	# hidden in a special place
+	$file{'/boot/system/develop/headers/posix/errno.h'} = 1;
+
     } elsif ($^O eq 'vos') {
 	# avoid problem where cpp returns non-POSIX pathnames
 	$file{'/system/include_library/errno.h'} = 1;
diff -ruw perl-5.10.1/hints/haiku.sh perl-5.10.1-haiku/hints/haiku.sh
--- perl-5.10.1/hints/haiku.sh  2009-02-12 23:58:12.063176704 +0100
+++ perl-5.10.1-haiku/hints/haiku.sh    1970-01-01 01:00:00.000000000 +0100
@@ -1,34 +1 @@
-# Haiku hints file
-# $Id$
-
-prefix="/boot/common"
-
-libpth='/boot/home/config/lib /boot/common/lib /system/lib'
-usrinc='/boot/develop/headers/posix'
-locinc='/boot/home/config/include /boot/common/include /boot/develop/headers'
-
-libc='/system/lib/libroot.so'
-libs='-lnetwork'
-
-# Use Haiku's malloc() by default.
-case "$usemymalloc" in
-'') usemymalloc='n' ;;
-esac
-
-# Haiku generally supports hard links, but the default file system (BFS)
-# doesn't. So better avoid using hard links.
-d_link='undef'
-dont_use_nlink='define'
-
-# The array syserrlst[] is useless for the most part.
-# Large negative numbers really kind of suck in arrays.
-d_syserrlst='undef'
-
-# Haiku uses gcc.
-cc="gcc"
-ld='gcc'
-
-# The runtime loader library path variable is LIBRARY_PATH.
-case "$ldlibpthname" in
-'') ldlibpthname=LIBRARY_PATH ;;
-esac
+# haiku sets all its specifics via Configure
diff -ruw perl-5.10.1/installperl perl-5.10.1-haiku/installperl
--- perl-5.10.1/installperl	2009-08-13 22:40:10.066846720 +0000
+++ perl-5.10.1-haiku/installperl	2011-02-28 17:24:45.324272128 +0000
@@ -409,6 +409,11 @@
 	mkpath("$installarchlib/CORE/mpeix", $opts{verbose}, 0777);
 	push(@corefiles,'mpeix/mpeixish.h');
     }
+    if ($^O eq 'haiku') {
+	# Haiku needs haikuish.h installed as well.
+	mkpath("$installarchlib/CORE/haiku", $opts{verbose}, 0777);
+	push(@corefiles,'haiku/haikuish.h');
+    }
     # If they have built sperl.o...
     push(@corefiles,'sperl.o') if -f 'sperl.o';
 }
diff -ruw perl-5.10.1/lib/File/Temp/t/lock.t perl-5.10.1-haiku/lib/File/Temp/t/lock.t
--- perl-5.10.1/lib/File/Temp/t/lock.t	2009-02-12 22:58:13.009699328 +0000
+++ perl-5.10.1-haiku/lib/File/Temp/t/lock.t	2011-02-28 17:24:45.354418688 +0000
@@ -8,7 +8,8 @@
 BEGIN {
 # see if we have O_EXLOCK
   eval { &Fcntl::O_EXLOCK; };
-  if ($@) {
+  if ($@  || $^O eq 'haiku') {
+    # haiku doesn't implement O_EXLOCK yet (but it defines the value)
     plan skip_all => 'Do not seem to have O_EXLOCK';
   } else {
     plan tests => 4;
diff -ruw perl-5.10.1/lib/File/Temp.pm perl-5.10.1-haiku/lib/File/Temp.pm
--- perl-5.10.1/lib/File/Temp.pm	2009-06-30 13:13:54.013369344 +0000
+++ perl-5.10.1-haiku/lib/File/Temp.pm	2011-02-28 17:24:45.347602944 +0000
@@ -1978,7 +1978,8 @@
     #   on Win9x the link count remains 1
     # On NFS the link count may still be 1 but we cant know that
     # we are on NFS
-    return ( $fh[3] == 0 or $^O eq 'cygwin' ? 1 : 0);
+    # On haiku, the link count seems to be always 1 (at least for BFS)
+    return ( $fh[3] == 0 or $^O eq 'cygwin' or $^O eq 'haiku' ? 1 : 0);
 
   } else {
     _deferred_unlink($fh, $path, 0);
diff -ruw perl-5.10.1/t/run/exit.t perl-5.10.1-haiku/t/run/exit.t
--- perl-5.10.1/t/run/exit.t	2009-08-04 15:48:30.014155776 +0000
+++ perl-5.10.1-haiku/t/run/exit.t	2011-02-28 17:24:45.362283008 +0000
@@ -57,18 +57,18 @@
 if (!$vms_exit_mode) {
   my $posix_ok = eval { require POSIX; };
   my $wait_macros_ok = defined &POSIX::WIFEXITED;
-  eval { POSIX::WIFEXITED(${^CHILD_ERROR_NATIVE}) };
+  eval { POSIX::WIFEXITED($?) };
   $wait_macros_ok = 0 if $@;
   $exit = run('exit 42');
   is( $exit >> 8, 42,             'Non-zero exit' );
   is( $exit, $?,                  'Non-zero exit $?' );
-  isnt( !${^CHILD_ERROR_NATIVE}, 0, 'Non-zero exit ${^CHILD_ERROR_NATIVE}' );
+  isnt( ${^CHILD_ERROR_NATIVE}, 0, 'Non-zero exit ${^CHILD_ERROR_NATIVE}' );
   SKIP: {
     skip("No POSIX", 3) unless $posix_ok;
     skip("No POSIX wait macros", 3) unless $wait_macros_ok;
-    ok(POSIX::WIFEXITED(${^CHILD_ERROR_NATIVE}), "WIFEXITED");
-    ok(!POSIX::WIFSIGNALED(${^CHILD_ERROR_NATIVE}), "WIFSIGNALED");
-    is(POSIX::WEXITSTATUS(${^CHILD_ERROR_NATIVE}), 42, "WEXITSTATUS");
+    ok(POSIX::WIFEXITED($?), "WIFEXITED");
+    ok(!POSIX::WIFSIGNALED($?), "WIFSIGNALED");
+    is(POSIX::WEXITSTATUS($?), 42, "WEXITSTATUS");
   }
 
   SKIP: {
@@ -87,9 +87,9 @@
     SKIP: {
       skip("No POSIX", 3) unless $posix_ok;
       skip("No POSIX wait macros", 3) unless $wait_macros_ok;
-      ok(!POSIX::WIFEXITED(${^CHILD_ERROR_NATIVE}), "WIFEXITED");
-      ok(POSIX::WIFSIGNALED(${^CHILD_ERROR_NATIVE}), "WIFSIGNALED");
-      is(POSIX::WTERMSIG(${^CHILD_ERROR_NATIVE}), 15, "WTERMSIG");
+      ok(!POSIX::WIFEXITED($?), "WIFEXITED");
+      ok(POSIX::WIFSIGNALED($?), "WIFSIGNALED");
+      is(POSIX::WTERMSIG($?), 15, "WTERMSIG");
     }
   }
 
