[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