Xamarin Public Jenkins (auto-signing) 8fc30896db Imported Upstream version 5.12.0.220
Former-commit-id: c477e03582759447177c6d4bf412cd2355aad476
2018-04-24 09:31:23 +00:00

263 lines
5.7 KiB
C

/*
* <sys/sendfile.h> wrapper functions.
*
* Authors:
* Jonathan Pryor (jonpryor@vt.edu)
*
* Copyright (C) 2004-2006 Jonathan Pryor
*/
#include <errno.h>
#include <string.h>
#include "mph.h"
#include "map.h"
#ifdef HAVE_PATHCONF_H
#include <pathconf.h>
#endif
#ifdef HAVE_SYS_STATVFS_H
#include <sys/statvfs.h>
#elif defined (HAVE_STATFS) || defined (HAVE_FSTATFS)
#include <sys/vfs.h>
#endif /* def HAVE_SYS_STATVFS_H */
#ifdef HAVE_GETFSSTAT
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
#include <sys/ucred.h>
#include <sys/mount.h>
#include <unistd.h> /* for pathconf */
#endif /* def HAVE_GETFSSTAT */
#include "mono/utils/mono-compiler.h"
G_BEGIN_DECLS
#ifdef HAVE_SYS_STATVFS_H
int
Mono_Posix_ToStatvfs (void *_from, struct Mono_Posix_Statvfs *to)
{
struct statvfs *from = _from;
to->f_bsize = from->f_bsize;
to->f_frsize = from->f_frsize;
to->f_blocks = from->f_blocks;
to->f_bfree = from->f_bfree;
to->f_bavail = from->f_bavail;
to->f_files = from->f_files;
to->f_ffree = from->f_ffree;
to->f_favail = from->f_favail;
/*
* On AIX with -D_ALL_SOURCE, fsid_t is a struct
* See: github.com/python/cpython/pull/4972
*/
#if defined(_AIX) && defined(_ALL_SOURCE)
to->f_fsid = from->f_fsid.val[0];
#else
to->f_fsid = from->f_fsid;
#endif
to->f_namemax = from->f_namemax;
if (Mono_Posix_ToMountFlags (from->f_flag, &to->f_flag) != 0)
return -1;
return 0;
}
int
Mono_Posix_FromStatvfs (struct Mono_Posix_Statvfs *from, void *_to)
{
struct statvfs *to = _to;
guint64 flag;
to->f_bsize = from->f_bsize;
to->f_frsize = from->f_frsize;
to->f_blocks = from->f_blocks;
to->f_bfree = from->f_bfree;
to->f_bavail = from->f_bavail;
to->f_files = from->f_files;
to->f_ffree = from->f_ffree;
to->f_favail = from->f_favail;
#if defined(_AIX) && defined(_ALL_SOURCE)
to->f_fsid.val[0] = from->f_fsid;
#else
to->f_fsid = from->f_fsid;
#endif
to->f_namemax = from->f_namemax;
if (Mono_Posix_FromMountFlags (from->f_flag, &flag) != 0)
return -1;
to->f_flag = flag;
return 0;
}
#endif /* ndef HAVE_SYS_STATVFS_H */
/*
* System V-compatible definitions
*/
#ifdef HAVE_STATVFS
gint32
Mono_Posix_Syscall_statvfs (const char *path, struct Mono_Posix_Statvfs *buf)
{
struct statvfs s;
int r;
if (buf == NULL) {
errno = EFAULT;
return -1;
}
if ((r = statvfs (path, &s)) == 0)
r = Mono_Posix_ToStatvfs (&s, buf);
return r;
}
#endif /* ndef HAVA_STATVFS */
#ifdef HAVE_FSTATVFS
gint32
Mono_Posix_Syscall_fstatvfs (gint32 fd, struct Mono_Posix_Statvfs *buf)
{
struct statvfs s;
int r;
if (buf == NULL) {
errno = EFAULT;
return -1;
}
if ((r = fstatvfs (fd, &s)) == 0)
r = Mono_Posix_ToStatvfs (&s, buf);
return r;
}
#endif /* ndef HAVA_FSTATVFS */
/*
* BSD-compatible definitions.
*
* Linux also provides these, but are deprecated in favor of (f)statvfs.
* Android NDK unified headers define HAVE_FSTATFS but also HAVE_SYS_STATVFS_H
* which makes these duplicates of the functions defined above
*/
#if (defined (HAVE_STATFS) || defined (HAVE_FSTATFS)) && !defined (HAVE_STATVFS) && !defined(ANDROID_UNIFIED_HEADERS)
int
Mono_Posix_ToStatvfs (void *_from, struct Mono_Posix_Statvfs *to)
{
struct statfs *from = _from;
to->f_bsize = from->f_bsize;
to->f_frsize = from->f_bsize;
to->f_blocks = from->f_blocks;
to->f_bfree = from->f_bfree;
to->f_bavail = from->f_bavail;
to->f_files = from->f_files;
to->f_ffree = from->f_ffree;
to->f_favail = from->f_ffree; /* OSX doesn't have f_avail */
// from->f_fsid is an int32[2], to->f_fsid is a uint64,
// so this shouldn't lose anything.
memcpy (&to->f_fsid, &from->f_fsid, sizeof(to->f_fsid));
#if HAVE_STRUCT_STATFS_F_FLAGS
if (Mono_Posix_ToMountFlags (from->f_flags, &to->f_flag) != 0)
return -1;
#endif /* def HAVE_STRUCT_STATFS_F_FLAGS */
return 0;
}
int
Mono_Posix_FromStatvfs (struct Mono_Posix_Statvfs *from, void *_to)
{
struct statfs *to = _to;
guint64 flag;
to->f_bsize = from->f_bsize;
to->f_blocks = from->f_blocks;
to->f_bfree = from->f_bfree;
to->f_bavail = from->f_bavail;
to->f_files = from->f_files;
to->f_ffree = from->f_ffree;
// from->f_fsid is an int32[2], to->f_fsid is a uint64,
// so this shouldn't lose anything.
memcpy (&to->f_fsid, &from->f_fsid, sizeof(to->f_fsid));
#if HAVE_STRUCT_STATFS_F_FLAGS
if (Mono_Posix_FromMountFlags (from->f_flag, &flag) != 0)
return -1;
to->f_flags = flag;
#endif /* def HAVE_STRUCT_STATFS_F_FLAGS */
return 0;
}
static void
set_namemax (const char *path, struct Mono_Posix_Statvfs *buf)
{
buf->f_namemax = pathconf (path, _PC_NAME_MAX);
}
static void
set_fnamemax (int fd, struct Mono_Posix_Statvfs *buf)
{
buf->f_namemax = fpathconf (fd, _PC_NAME_MAX);
}
#endif /* (def HAVE_STATFS || def HAVE_FSTATFS) && !def HAVE_STATVFS */
#if !defined (HAVE_STATVFS) && defined (HAVE_STATFS) && (!defined(ANDROID_UNIFIED_HEADERS) || __ANDROID_API__ >= 19)
gint32
Mono_Posix_Syscall_statvfs (const char *path, struct Mono_Posix_Statvfs *buf)
{
struct statfs s;
int r;
if (buf == NULL) {
errno = EFAULT;
return -1;
}
if ((r = statfs (path, &s)) == 0 &&
(r = Mono_Posix_ToStatvfs (&s, buf)) == 0) {
set_namemax (path, buf);
}
return r;
}
#endif /* !def HAVE_STATVFS && def HAVE_STATFS */
#if !defined (HAVE_STATVFS) && defined (HAVE_STATFS) && (!defined(ANDROID_UNIFIED_HEADERS) || __ANDROID_API__ >= 19)
gint32
Mono_Posix_Syscall_fstatvfs (gint32 fd, struct Mono_Posix_Statvfs *buf)
{
struct statfs s;
int r;
if (buf == NULL) {
errno = EFAULT;
return -1;
}
if ((r = fstatfs (fd, &s)) == 0 &&
(r = Mono_Posix_ToStatvfs (&s, buf)) == 0) {
set_fnamemax (fd, buf);
}
return r;
}
#endif /* !def HAVE_FSTATVFS && def HAVE_STATFS */
G_END_DECLS
/*
* vim: noexpandtab
*/