* configure.in: Add new function/header/type checks for use by
authorJonathan Pryor <jpryor@novell.com>
Mon, 8 Nov 2004 12:13:13 +0000 (12:13 -0000)
committerJonathan Pryor <jpryor@novell.com>
Mon, 8 Nov 2004 12:13:13 +0000 (12:13 -0000)
    MonoPosixHelper (the support directory).
  * support/Makefile.am: Add sys-sendfile.c to the build.
  * support/dirent.c, support/fcntl.c, support/unistd.c: Remove compile-time
    checks for -64 apis (pread64, etc.), as they're superfluous.  GLibc
    #defines the functions to the appropriate -64 counterpart when necessary,
    and Darwin is intrinsically large-file-aware, so manual checking on my
    part is redundant and unnecessary.
  * support/grp.c: Add checks for non-portable functions getgrnam_r,
    getgrgid_r.
  * support/pwd.c: Add checks for non-portable functions getpwnam_r,
    getpwuid_r.
  * support/mph.h: Clean up macro handling for type overflow checking.

svn path=/trunk/mono/; revision=35828

ChangeLog
configure.in
support/Makefile.am
support/dirent.c
support/fcntl.c
support/grp.c
support/mph.h
support/pwd.c
support/unistd.c

index 7bc25401ca8d3dbab1bd5b70ad8e81cea9fccf1e..a3ac07c3a04d83e0bfb35bd5f5eaa237a3b7b386 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2004-11-08  Jonathan Pryor <jonpryor@vt.edu>
+
+       * configure.in: Add new function/header/type checks for use by
+         MonoPosixHelper (the support directory).
+       * support/Makefile.am: Add sys-sendfile.c to the build.
+       * support/dirent.c, support/fcntl.c, support/unistd.c: Remove compile-time
+         checks for -64 apis (pread64, etc.), as they're superfluous.  GLibc 
+         #defines the functions to the appropriate -64 counterpart when necessary,
+         and Darwin is intrinsically large-file-aware, so manual checking on my
+         part is redundant and unnecessary.
+       * support/grp.c: Add checks for non-portable functions getgrnam_r,
+         getgrgid_r.
+       * support/pwd.c: Add checks for non-portable functions getpwnam_r,
+         getpwuid_r.
+       * support/mph.h: Clean up macro handling for type overflow checking.
+
 2004-11-08  Raja R Harinath  <rharinath@novell.com>
 
        * configure.in (mcs_topdir, mcs_topdir_from_srcdir): New 'subst'ed
index f41c9a561cacbab93302c1f729eee1769a3123d9..63aac849f482f5079debf42519b21ff525f6009e 100644 (file)
@@ -1020,6 +1020,20 @@ if test x$platform_win32 = xno; then
                fi
                AC_DEFINE_UNQUOTED(SIGVAL_PTR,$SIGVAL_PTR,[Pointer field name in 'union sigval'])
        fi
+
+       dnl **********************************
+       dnl *** Checks for MonoPosixHelper ***
+       dnl **********************************
+       AC_CHECK_FUNCS(posix_fadvise)
+       AC_CHECK_FUNCS(posix_fallocate)
+       AC_CHECK_FUNCS(fgetgrent)
+       AC_CHECK_FUNCS(fgetpwent)
+       AC_CHECK_FUNCS(fgetpwent)
+       AC_CHECK_HEADERS(sys/sendfile.h)
+       AC_CHECK_FUNCS(sendfile)
+       AC_CHECK_FUNCS(stime)
+       AC_CHECK_FUNCS(ttyname_r)
+       AC_CHECK_SIZEOF(size_t)
 else
        jdk_headers_found=no
        AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
index 9666ce4c5c4a59280f5e4683c87e4716fb569c9b..0b6cc241ac2709cd3f575aa120cebce65963a1b4 100644 (file)
@@ -22,6 +22,7 @@ MPH_SOURCE = \
        stdlib.c \
        sys-mman.c \
        sys-mount.c \
+       sys-sendfile.c \
        sys-stat.c \
        sys-wait.c \
        time.c \
index 48c0b0f0e00ed3ad637702eff3452a70146b96b9..4be44d8a1de7807442ce00d2487817e3760019ae 100644 (file)
@@ -43,14 +43,7 @@ Mono_Posix_Syscall_telldir (DIR *dir)
 }
 
 static void
-copy_dirent (
-       struct Mono_Posix_Syscall__Dirent *to, 
-#ifdef MPH_USE_64_API
-       struct dirent64 *from
-#else
-       struct dirent *from
-#endif
-       )
+copy_dirent (struct Mono_Posix_Syscall__Dirent *to, struct dirent *from)
 {
        to->d_ino    = from->d_ino;
 #ifdef MPH_ON_BSD
@@ -66,22 +59,15 @@ copy_dirent (
 gint32
 Mono_Posix_Syscall_readdir (DIR *dirp, struct Mono_Posix_Syscall__Dirent *entry)
 {
-#ifdef MPH_USE_64_API
-       struct dirent64 *d;
-#else
        struct dirent *d;
-#endif
 
        if (entry == NULL) {
                errno = EFAULT;
                return -1;
        }
 
-#ifdef MPH_USE_64_API
-       d = readdir64 (dirp);
-#else
        d = readdir (dirp);
-#endif
+
        if (d == NULL) {
                return -1;
        }
@@ -94,18 +80,10 @@ Mono_Posix_Syscall_readdir (DIR *dirp, struct Mono_Posix_Syscall__Dirent *entry)
 gint32
 Mono_Posix_Syscall_readdir_r (DIR *dirp, struct Mono_Posix_Syscall__Dirent *entry, void **result)
 {
-#ifdef MPH_USE_64_API
-       struct dirent64 _entry;
-#else
        struct dirent _entry;
-#endif
        int r;
 
-#ifdef MPH_USE_64_API
-       r = readdir64_r (dirp, &_entry, (struct dirent64**) result);
-#else
        r = readdir_r (dirp, &_entry, (struct dirent**) result);
-#endif
 
        if (r == 0 && result != NULL) {
                copy_dirent (entry, &_entry);
index 1631b0ad809704ab48821128831a639252f7ebe9..3e0424cb90135a9b70a0697c58dc6c3d70108794 100644 (file)
@@ -66,11 +66,7 @@ Mono_Posix_Syscall_fcntl_arg (gint32 fd, gint32 cmd, gint64 arg)
 gint32
 Mono_Posix_Syscall_fcntl_lock (gint32 fd, gint32 cmd, struct Mono_Posix_Flock *lock)
 {
-#ifdef MPH_USE_64_API
-       struct flock64 _lock;
-#else
        struct flock _lock;
-#endif
        int r;
 
        if (lock == NULL) {
@@ -107,11 +103,8 @@ Mono_Posix_Syscall_open (const char *pathname, gint32 flags)
 {
        if (Mono_Posix_FromOpenFlags (flags, &flags) == -1)
                return -1;
-#ifdef MPH_USE_64_API
-       return open64 (pathname, flags);
-#else
+
        return open (pathname, flags);
-#endif
 }
 
 gint32
@@ -121,11 +114,8 @@ Mono_Posix_Syscall_open_mode (const char *pathname, gint32 flags, guint32 mode)
                return -1;
        if (Mono_Posix_FromFilePermissions (mode, &mode) == -1)
                return -1;
-#ifdef MPH_USE_64_API
-       return open64 (pathname, flags, mode);
-#else
+
        return open (pathname, flags, mode);
-#endif
 }
 
 gint32
@@ -133,11 +123,8 @@ Mono_Posix_Syscall_creat (const char *pathname, guint32 mode)
 {
        if (Mono_Posix_FromFilePermissions (mode, &mode) == -1)
                return -1;
-#ifdef MPH_USE_64_API
-       return creat64 (pathname, mode);
-#else
+
        return creat (pathname, mode);
-#endif
 }
 
 #ifdef HAVE_POSIX_FADVISE
@@ -151,11 +138,7 @@ Mono_Posix_Syscall_posix_fadvise (gint32 fd, mph_off_t offset, mph_off_t len,
        if (Mono_Posix_FromPosixFadviseAdvice (advice, &advice) == -1)
                return -1;
 
-#ifdef MPH_USE_64_API
-       return posix_fadvise64 (fd, offset, len, advice);
-#else
        return posix_fadvise (fd, (off_t) offset, (off_t) len, advice);
-#endif
 }
 #endif /* ndef HAVE_POSIX_FADVISE */
 
@@ -166,11 +149,7 @@ Mono_Posix_Syscall_posix_fallocate (gint32 fd, mph_off_t offset, mph_size_t len)
        mph_return_if_off_t_overflow (offset);
        mph_return_if_size_t_overflow (len);
 
-#ifdef MPH_USE_64_API
-       return posix_fallocate64 (fd, offset, len);
-#else
-       return posix_fadvise (fd, (off_t) offset, (size_t) len);
-#endif
+       return posix_fallocate (fd, (off_t) offset, (size_t) len);
 }
 #endif /* ndef HAVE_POSIX_FALLOCATE */
 
index 6a0c1cbeb03eb432010fdedb8062a8b382fed7a8..f6c4832cc0cb4c9202e2b97b091d7640d5b389c0 100644 (file)
@@ -146,6 +146,7 @@ Mono_Posix_Syscall_getgrgid (mph_gid_t gid, struct Mono_Posix_Syscall__Group *gb
        return 0;
 }
 
+#ifdef HAVE_GETGRNAM_R
 gint32
 Mono_Posix_Syscall_getgrnam_r (const char *name, 
        struct Mono_Posix_Syscall__Group *gbuf,
@@ -181,7 +182,9 @@ Mono_Posix_Syscall_getgrnam_r (const char *name,
 
        return r;
 }
+#endif /* ndef HAVE_GETGRNAM_R */
 
+#ifdef HAVE_GETGRGID_R
 gint32
 Mono_Posix_Syscall_getgrgid_r (mph_gid_t gid,
        struct Mono_Posix_Syscall__Group *gbuf,
@@ -217,6 +220,7 @@ Mono_Posix_Syscall_getgrgid_r (mph_gid_t gid,
 
        return r;
 }
+#endif /* ndef HAVE_GETGRGID_R */
 
 gint32
 Mono_Posix_Syscall_getgrent (struct Mono_Posix_Syscall__Group *grbuf)
index c0c6f0a4f0a84d8930e9cb37e63b5df1dee6ace3..49a5e9781fcfd121a5998b6adf55b6bc79ad45ef 100644 (file)
 #ifndef INC_mph_H
 #define INC_mph_H
 
-#include <stdint.h>             /* for SIZE_MAX */
+#include <config.h>
+
 #include <limits.h>             /* LONG_MAX, ULONG_MAX */
 #include <errno.h>              /* for ERANGE */
 #include <glib/gtypes.h>        /* for g* types, etc. */
 
-#ifdef _LARGEFILE64_SOURCE
-#define MPH_USE_64_API
+#ifdef HAVE_STDINT_H
+#include <stdint.h>             /* for SIZE_MAX */
 #endif
 
 #if __APPLE__ || __BSD__
@@ -49,41 +50,59 @@ typedef   guint32 mph_uid_t;
 typedef    gint64 mph_time_t;
 typedef    gint64 mph_clock_t;
 
-#define mph_have_long_overflow(var) ((var) > LONG_MAX || (var) < LONG_MIN)
+#ifdef HAVE_LARGE_FILE_SUPPORT
+#define MPH_OFF_T_MAX G_MAXINT64
+#define MPH_OFF_T_MIN G_MININT64
+#else
+#define MPH_OFF_T_MAX G_MAXINT32
+#define MPH_OFF_T_MIN G_MININT32
+#endif
+
+#ifdef SIZE_MAX
+#define MPH_SIZE_T_MAX SIZE_MAX
+#elif SIZEOF_SIZE_T == 8
+#define MPH_SIZE_T_MAX  G_MAXUINT64
+#elif SIZEOF_SIZE_T == 4
+#define MPH_SIZE_T_MAX  G_MAXUINT32
+#else
+#error "sizeof(size_t) is unknown!"
+#endif
 
-#define mph_return_val_if_long_overflow(var, ret) G_STMT_START{ \
-       if (mph_have_long_overflow(var)) { \
+#define _mph_return_val_if_cb_(val, ret, cb) G_STMT_START{ \
+       if (cb (val)) { \
                errno = EOVERFLOW; \
                return ret; \
        }}G_STMT_END
 
+#define mph_have_long_overflow(var) ((var) > LONG_MAX || (var) < LONG_MIN)
+
+#define mph_return_val_if_long_overflow(var, ret) \
+       _mph_return_val_if_cb_(var, ret, mph_have_long_overflow)
+
 #define mph_return_if_long_overflow(var) mph_return_val_if_long_overflow(var, -1)
 
 #define mph_have_ulong_overflow(var) ((var) > ULONG_MAX)
-#define mph_return_val_if_ulong_overflow(var, ret) G_STMT_START{ \
-       if (mph_have_ulong_overflow(var)) { \
-               errno = EOVERFLOW; \
-               return ret; \
-       }}G_STMT_END
+
+#define mph_return_val_if_ulong_overflow(var, ret) \
+       _mph_return_val_if_cb_(var, ret, mph_have_ulong_overflow)
 
 #define mph_return_if_ulong_overflow(var) mph_return_val_if_ulong_overflow(var, -1)
 
-#ifdef SIZE_MAX
-#define mph_have_size_t_overflow(var) ((var) > SIZE_MAX)
-#define mph_return_val_if_size_t_overflow(var, ret) G_STMT_START{ \
-       if (mph_have_size_t_overflow(var)) { \
-               errno = EOVERFLOW; \
-               return ret; \
-       }}G_STMT_END
+#define mph_have_size_t_overflow(var) ((var) > MPH_SIZE_T_MAX)
+
+#define mph_return_val_if_size_t_overflow(var, ret) \
+       _mph_return_val_if_cb_(var, ret, mph_have_size_t_overflow)
+
 #define mph_return_if_size_t_overflow(var) mph_return_val_if_size_t_overflow(var, -1)
-#else
-#define mph_have_size_t_overflow(var) mph_have_ulong_overflow(var)
-#define mph_return_if_size_t_overflow(var) mph_return_if_ulong_overflow(var)
-#define mph_return_val_if_size_t_overflow(var, ret) mph_return_if_ulong_overflow(var, ret)
-#endif
 
-#define mph_return_if_off_t_overflow(var) mph_return_if_long_overflow(var)
-#define mph_return_if_ssize_t_overflow(var) mph_return_if_long_overflow(var)
+#define mph_have_off_t_overflow(var) \
+       (((var) < MPH_OFF_T_MIN) || ((var) > MPH_OFF_T_MAX))
+
+#define mph_return_val_if_off_t_overflow(var, ret) \
+       _mph_return_val_if_cb_(var, ret, mph_have_off_t_overflow)
+
+#define mph_return_if_off_t_overflow(var) mph_return_val_if_size_t_overflow(var, -1)
+
 #define mph_return_if_time_t_overflow(var) mph_return_if_long_overflow(var)
 
 /*
index 25380722ca1446e3e3e41a1b7684fd2a0aeed3cd..05357f4f617603cfa866b81f2582240762da9765 100644 (file)
@@ -137,6 +137,7 @@ Mono_Posix_Syscall_getpwuid (mph_uid_t uid, struct Mono_Posix_Syscall__Passwd *p
        return 0;
 }
 
+#ifdef HAVE_GETPWNAM_R
 gint32
 Mono_Posix_Syscall_getpwnam_r (const char *name, 
        struct Mono_Posix_Syscall__Passwd *pwbuf,
@@ -172,7 +173,9 @@ Mono_Posix_Syscall_getpwnam_r (const char *name,
 
        return r;
 }
+#endif /* ndef HAVE_GETPWNAM_R */
 
+#ifdef HAVE_GETPWUID_R
 gint32
 Mono_Posix_Syscall_getpwuid_r (mph_uid_t uid,
        struct Mono_Posix_Syscall__Passwd *pwbuf,
@@ -208,6 +211,7 @@ Mono_Posix_Syscall_getpwuid_r (mph_uid_t uid,
 
        return r;
 }
+#endif /* ndef HAVE_GETPWUID_R */
 
 gint32
 Mono_Posix_Syscall_getpwent (struct Mono_Posix_Syscall__Passwd *pwbuf)
@@ -251,7 +255,7 @@ Mono_Posix_Syscall_fgetpwent (FILE *stream, struct Mono_Posix_Syscall__Passwd *p
        }
        return 0;
 }
-#endif /* ndef FGETPWENT */
+#endif /* ndef HAVE_FGETPWENT */
 
 G_END_DECLS
 
index 42e02ecc5cc3ddae8296170146e1cae8d8237459..33a640895dc7fc4baee99feb6309fcaea8b195aa 100644 (file)
@@ -19,8 +19,6 @@
 #include <limits.h>
 #include <string.h>     /* for swab(3) on Mac OS X */
 
-#include <glib/gtypes.h>
-
 #include "map.h"
 #include "mph.h"
 
@@ -34,11 +32,8 @@ Mono_Posix_Syscall_lseek (gint32 fd, mph_off_t offset, gint32 whence)
        if (Mono_Posix_FromSeekFlags (whence, &_whence) == -1)
                return -1;
        whence = _whence;
-#ifdef MPH_USE_64_API
-       return lseek64 (fd, offset, whence);
-#else
+
        return lseek (fd, offset, whence);
-#endif
 }
 
 mph_ssize_t
@@ -60,11 +55,8 @@ Mono_Posix_Syscall_pread (gint32 fd, void *buf, mph_size_t count, mph_off_t offs
 {
        mph_return_if_size_t_overflow (count);
        mph_return_if_off_t_overflow (offset);
-#ifdef MPH_USE_64_API
-       return pread64 (fd, buf, (size_t) count, offset);
-#else
+
        return pread (fd, buf, (size_t) count, (off_t) offset);
-#endif
 }
 
 mph_ssize_t
@@ -72,11 +64,8 @@ Mono_Posix_Syscall_pwrite (gint32 fd, const void *buf, mph_size_t count, mph_off
 {
        mph_return_if_size_t_overflow (count);
        mph_return_if_off_t_overflow (offset);
-#ifdef MPH_USE_64_API
-       return pwrite64 (fd, buf, (size_t) count, offset);
-#else
+
        return pwrite (fd, buf, (size_t) count, (off_t) offset);
-#endif
 }
 
 gint32
@@ -210,22 +199,14 @@ gint32
 Mono_Posix_Syscall_truncate (const char *path, mph_off_t length)
 {
        mph_return_if_off_t_overflow (length);
-#ifdef MPH_USE_64_API
-       return truncate64 (path, length);
-#else
        return truncate (path, (off_t) length);
-#endif
 }
 
 gint32
 Mono_Posix_Syscall_ftruncate (int fd, mph_off_t length)
 {
        mph_return_if_off_t_overflow (length);
-#ifdef MPH_USE_64_API
-       return ftruncate64 (fd, length);
-#else
        return ftruncate (fd, (off_t) length);
-#endif
 }
 
 gint32
@@ -234,17 +215,13 @@ Mono_Posix_Syscall_lockf (int fd, int cmd, mph_off_t len)
        mph_return_if_off_t_overflow (len);
        if (Mono_Posix_FromLockFlags (cmd, &cmd) == -1)
                return -1;
-#ifdef MPH_USE_64_API
-       return lockf64 (fd, cmd, len);
-#else
        return lockf (fd, cmd, (off_t) len);
-#endif
 }
 
 void
 Mono_Posix_Syscall_swab (void *from, void *to, mph_ssize_t n)
 {
-       if (n > LONG_MAX || n < LONG_MAX)
+       if (mph_have_long_overflow (n))
                return;
        swab (from, to, (ssize_t) n);
 }