summaryrefslogtreecommitdiff
path: root/infrastructure/m4/ax_check_syscall_lseek.m4
diff options
context:
space:
mode:
Diffstat (limited to 'infrastructure/m4/ax_check_syscall_lseek.m4')
-rw-r--r--infrastructure/m4/ax_check_syscall_lseek.m4111
1 files changed, 78 insertions, 33 deletions
diff --git a/infrastructure/m4/ax_check_syscall_lseek.m4 b/infrastructure/m4/ax_check_syscall_lseek.m4
index 9fd04c81..4fec851a 100644
--- a/infrastructure/m4/ax_check_syscall_lseek.m4
+++ b/infrastructure/m4/ax_check_syscall_lseek.m4
@@ -11,12 +11,14 @@ dnl @category C
dnl @author Martin Ebourne
dnl @version 2005/07/03
dnl @license AllPermissive
+dnl
-AC_DEFUN([AX_CHECK_SYSCALL_LSEEK], [
- AC_REQUIRE([AX_FUNC_SYSCALL])dnl
- if test "x$ac_cv_header_sys_syscall_h" = "xyes"; then
- AC_CACHE_CHECK([[whether syscall lseek requires dummy parameter]], [box_cv_have_lseek_dummy_param],
- [AC_TRY_RUN(
+AC_DEFUN(
+ [AX_TRY_RUN_FD],
+ [
+ AC_REQUIRE([AX_FUNC_SYSCALL])dnl
+ if test "x$ac_cv_header_sys_syscall_h" = "xyes"; then
+ AC_TRY_RUN(
[
$ac_includes_default
#include <fcntl.h>
@@ -30,40 +32,83 @@ AC_DEFUN([AX_CHECK_SYSCALL_LSEEK], [
#endif
int main()
{
- int fh = creat("lseektest", 0600);
- int res = 0;
- if(fh>=0)
+ int fd = creat("lseektest", 0600);
+ int res = 1;
+ if(fd>=0)
{
+ $1
+ close(fd);
+ }
+ unlink("lseektest");
+ return abs(res);
+ }
+ ],
+ [$2],
+ [$3],
+ [$3 # assume not for cross-compiling]
+ )
+ fi
+ ])dnl
+
+AC_DEFUN([AX_CHECK_SYSCALL_LSEEK_DUMMY_PARAM], [
+ AC_CACHE_CHECK(
+ [[whether syscall lseek requires dummy parameter]],
+ [box_cv_have_lseek_dummy_param],
+ [AX_TRY_RUN_FD(
+ [
// 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
+ // 1, the program will return 1 and we will define
+ // HAVE_LSEEK_DUMMY_PARAM
// (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");
- return res!=-1;
- }
- ],
- [box_cv_have_lseek_dummy_param=yes],
- [box_cv_have_lseek_dummy_param=no],
- [box_cv_have_lseek_dummy_param=no # assume not for cross-compiling]
- )])
- if test "x$box_cv_have_lseek_dummy_param" = "xyes"; then
- AC_DEFINE([HAVE_LSEEK_DUMMY_PARAM], 1,
- [Define to 1 if syscall lseek requires a dummy middle parameter])
- fi
+ // offset.
+ res = (syscall(SYS_lseek, fd, (int32_t)10, SEEK_SET, 99) == 10) ? 0 : 1;
+ ],
+ dnl if the test program succeeds (res == 0):
+ [box_cv_have_lseek_dummy_param=no],
+ dnl if the test program fails (res != 0):
+ [box_cv_have_lseek_dummy_param=yes],
+ )]
+ )
+ if test "x$box_cv_have_lseek_dummy_param" != "xno"; then
+ AC_DEFINE([HAVE_LSEEK_DUMMY_PARAM], 1,
+ [Define to 1 if syscall lseek requires a dummy middle parameter])
fi
- if test "x$box_cv_have_lseek_dummy_param" = "xno"
- then
- m4_ifvaln([$1],[$1],[:])dnl
- m4_ifvaln([$2],[else $2])dnl
+])
+
+# Please note: this does not appear to work! Do not rely on it without further testing:
+AC_DEFUN([AX_CHECK_SYSCALL_LSEEK_64_BIT], [
+ AC_CACHE_CHECK(
+ [[whether syscall lseek takes a 64-bit offset parameter]],
+ [box_cv_have_lseek_64_bit],
+ [AX_TRY_RUN_FD(
+ [
+ // Try to seek to a position that requires a 64-bit representation, and check the return
+ // value, which is the current position.
+ if(syscall(SYS_lseek, fd, (int64_t)5, SEEK_SET) != 5)
+ {
+ res = 2;
+ }
+ else if(syscall(SYS_lseek, fd, (int64_t)10, SEEK_CUR) != 15)
+ {
+ res = 3;
+ }
+ else
+ {
+ res = 0;
+ }
+ ],
+ dnl if the test program succeeds (res == 0):
+ [box_cv_have_lseek_64_bit=yes],
+ dnl if the test program fails (res != 0):
+ [box_cv_have_lseek_64_bit=no]
+ )]
+ )
+ if test "x$box_cv_have_lseek_64_bit" != "xno"; then
+ AC_DEFINE([HAVE_LSEEK_64_BIT], 1,
+ [Define to 1 if syscall lseek takes a 64-bit offset])
fi
- ])dnl
+])