[Box Backup-commit] COMMIT r2059 - in box/trunk: infrastructure/m4 lib/intercept

boxbackup-dev@fluffy.co.uk boxbackup-dev@fluffy.co.uk
Wed, 23 Jan 2008 22:46:06 +0000 (UTC)


Author: chris
Date: 2008-01-23 22:46:06 +0000 (Wed, 23 Jan 2008)
New Revision: 2059

Modified:
   box/trunk/infrastructure/m4/ax_check_syscall_lseek.m4
   box/trunk/lib/intercept/intercept.cpp
Log:
Fix raidfile tests on FreeBSD 7


Modified: box/trunk/infrastructure/m4/ax_check_syscall_lseek.m4
===================================================================
--- box/trunk/infrastructure/m4/ax_check_syscall_lseek.m4	2008-01-23 21:18:07 UTC (rev 2058)
+++ box/trunk/infrastructure/m4/ax_check_syscall_lseek.m4	2008-01-23 22:46:06 UTC (rev 2059)
@@ -24,7 +24,7 @@
           #ifdef HAVE___SYSCALL_NEED_DEFN
             extern "C" off_t __syscall(quad_t number, ...);
           #endif
-          #ifndef HAVE_SYSCALL
+          #ifdef HAVE___SYSCALL // always use it if we have it
             #undef syscall
             #define syscall __syscall
           #endif
@@ -33,7 +33,18 @@
           int res = 0;
           if(fh>=0)
           {
-            res = syscall(SYS_lseek, fh, 0, SEEK_SET, 99);
+            // This test tries first to seek to position 0, with NO
+            // "dummy argument". If lseek does actually require a dummy
+            // argument, then it will eat SEEK_SET for the offset and
+            // try to use 99 as whence, which is invalid, so res will be
+            // -1, the program will return zero and 
+            // have_lseek_dummy_param=yes 
+            // (whew! that took 1 hour to figure out)
+            // The "dummy argument" probably means that it takes a 64-bit
+            // offset, so this was probably a bug anyway, and now that
+            // we cast the offset to off_t, it should never be needed
+            // (if my reasoning is correct).
+            res = syscall(SYS_lseek, fh, (off_t)0, SEEK_SET, 99);
             close(fh);
           }
           unlink("lseektest");

Modified: box/trunk/lib/intercept/intercept.cpp
===================================================================
--- box/trunk/lib/intercept/intercept.cpp	2008-01-23 21:18:07 UTC (rev 2058)
+++ box/trunk/lib/intercept/intercept.cpp	2008-01-23 22:46:06 UTC (rev 2059)
@@ -50,11 +50,14 @@
 	extern "C" off_t
 	TEST_lseek(int fildes, off_t offset, int whence);
 #else
+	// if we have __syscall, we should use it for everything
+	// (on FreeBSD 7 this is required for 64-bit alignment of off_t).
+	// if not, we should continue to use the old syscall().
 	#ifdef HAVE___SYSCALL_NEED_DEFN
 		// Need this, not declared in syscall.h nor unistd.h
 		extern "C" off_t __syscall(quad_t number, ...);
 	#endif
-	#ifndef HAVE_SYSCALL
+	#ifdef HAVE___SYSCALL
 		#undef syscall
 		#define syscall __syscall
 	#endif