diff options
Diffstat (limited to 'infrastructure/m4/ax_check_syscall_lseek.m4')
-rw-r--r-- | infrastructure/m4/ax_check_syscall_lseek.m4 | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/infrastructure/m4/ax_check_syscall_lseek.m4 b/infrastructure/m4/ax_check_syscall_lseek.m4 new file mode 100644 index 00000000..9fd04c81 --- /dev/null +++ b/infrastructure/m4/ax_check_syscall_lseek.m4 @@ -0,0 +1,69 @@ +dnl @synopsis AX_CHECK_SYSCALL_LSEEK([ACTION-IF-TRUE], [ACTION-IF-FALSE]) +dnl +dnl This macro will find out if the lseek syscall requires a dummy middle +dnl parameter +dnl +dnl The following defines will be set as appropriate: +dnl HAVE_LSEEK_DUMMY_PARAM +dnl Also ACTION-IF-TRUE and ACTION-IF-FALSE are run as appropriate +dnl +dnl @category C +dnl @author Martin Ebourne +dnl @version 2005/07/03 +dnl @license AllPermissive + +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_includes_default + #include <fcntl.h> + #include <sys/syscall.h> + #ifdef HAVE___SYSCALL_NEED_DEFN + extern "C" off_t __syscall(quad_t number, ...); + #endif + #ifdef HAVE___SYSCALL // always use it if we have it + #undef syscall + #define syscall __syscall + #endif + int main() + { + int fh = creat("lseektest", 0600); + int res = 0; + if(fh>=0) + { + // 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"); + 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 + fi + if test "x$box_cv_have_lseek_dummy_param" = "xno" + then + m4_ifvaln([$1],[$1],[:])dnl + m4_ifvaln([$2],[else $2])dnl + fi + ])dnl |