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
+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
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?))
stdlib.c \
sys-mman.c \
sys-mount.c \
+ sys-sendfile.c \
sys-stat.c \
sys-wait.c \
time.c \
}
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
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;
}
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);
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) {
{
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
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
{
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
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 */
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 */
return 0;
}
+#ifdef HAVE_GETGRNAM_R
gint32
Mono_Posix_Syscall_getgrnam_r (const char *name,
struct Mono_Posix_Syscall__Group *gbuf,
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,
return r;
}
+#endif /* ndef HAVE_GETGRGID_R */
gint32
Mono_Posix_Syscall_getgrent (struct Mono_Posix_Syscall__Group *grbuf)
#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__
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)
/*
return 0;
}
+#ifdef HAVE_GETPWNAM_R
gint32
Mono_Posix_Syscall_getpwnam_r (const char *name,
struct Mono_Posix_Syscall__Passwd *pwbuf,
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,
return r;
}
+#endif /* ndef HAVE_GETPWUID_R */
gint32
Mono_Posix_Syscall_getpwent (struct Mono_Posix_Syscall__Passwd *pwbuf)
}
return 0;
}
-#endif /* ndef FGETPWENT */
+#endif /* ndef HAVE_FGETPWENT */
G_END_DECLS
#include <limits.h>
#include <string.h> /* for swab(3) on Mac OS X */
-#include <glib/gtypes.h>
-
#include "map.h"
#include "mph.h"
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
{
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
{
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
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
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);
}