diff options
author | Brad Smith <brad@comstyle.com> | 2012-02-25 09:28:43 +0100 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2012-02-25 09:42:24 +0100 |
commit | 71a6d334321d42fd0f02646d1649405ccf197c00 (patch) | |
tree | f05a45ad836c4f045e89fcb2ad457d21c392562d /source3 | |
parent | 0fbefbcb54eb0610d4cbd3579914f884d0ae6fa5 (diff) | |
download | samba-71a6d334321d42fd0f02646d1649405ccf197c00.tar.gz samba-71a6d334321d42fd0f02646d1649405ccf197c00.tar.bz2 samba-71a6d334321d42fd0f02646d1649405ccf197c00.zip |
s3: Fix bug 8777, sys_statvfs() wrapper support for OpenBSD/FreeBSD/DragonFly
Diffstat (limited to 'source3')
-rw-r--r-- | source3/configure.in | 10 | ||||
-rw-r--r-- | source3/modules/vfs_default.c | 2 | ||||
-rw-r--r-- | source3/smbd/statvfs.c | 43 |
3 files changed, 50 insertions, 5 deletions
diff --git a/source3/configure.in b/source3/configure.in index 7b90c8f075..dc47f13ff6 100644 --- a/source3/configure.in +++ b/source3/configure.in @@ -6838,13 +6838,21 @@ CFLAGS=$CFLAGS_SAVE # Start AC_CHECK_FUNC(getmntent) -AC_CHECK_HEADERS(sys/statfs.h) +AC_CHECK_HEADERS(sys/param.h sys/statfs.h sys/mount.h) AC_MSG_CHECKING([vfs_fileid: checking for statfs() and struct statfs.f_fsid)]) AC_CACHE_VAL(vfsfileid_cv_statfs,[ AC_TRY_RUN([ #include <sys/types.h> + #ifdef HAVE_SYS_PARAM_H + #include <sys/param.h> + #endif + #ifdef HAVE_SYS_MOUNT_H + #include <sys/mount.h> + #endif + #ifdef HAVE_SYS_STATFS_H #include <sys/statfs.h> + #endif int main(void) { struct statfs fsd; diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index f556f1c496..d81adadfec 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -111,7 +111,7 @@ static uint32_t vfswrap_fs_capabilities(struct vfs_handle_struct *handle, NTSTATUS status; int ret = -1; -#if defined(DARWINOS) +#if defined(DARWINOS) || (defined(BSD) && defined(MNT_RDONLY)) struct vfs_statvfs_struct statbuf; ZERO_STRUCT(statbuf); sys_statvfs(conn->connectpath, &statbuf); diff --git a/source3/smbd/statvfs.c b/source3/smbd/statvfs.c index 2de015a2df..bcdcd91c87 100644 --- a/source3/smbd/statvfs.c +++ b/source3/smbd/statvfs.c @@ -49,9 +49,7 @@ static int linux_statvfs(const char *path, vfs_statvfs_struct *statbuf) } return result; } -#endif - -#if defined(DARWINOS) +#elif defined(DARWINOS) #include <sys/attr.h> @@ -125,6 +123,43 @@ static int darwin_statvfs(const char *path, vfs_statvfs_struct *statbuf) return 0; } +#elif defined(BSD) && defined(MNT_RDONLY) +static int bsd_statvfs(const char *path, vfs_statvfs_struct *statbuf) +{ + struct statfs statfs_buf; + int result; + + result = statfs(path, &statfs_buf); + if (result != 0) { + return result; + } + + statbuf->OptimalTransferSize = statfs_buf.f_iosize; + statbuf->BlockSize = statfs_buf.f_bsize; + statbuf->TotalBlocks = statfs_buf.f_blocks; + statbuf->BlocksAvail = statfs_buf.f_bfree; + statbuf->UserBlocksAvail = statfs_buf.f_bavail; + statbuf->TotalFileNodes = statfs_buf.f_files; + statbuf->FreeFileNodes = statfs_buf.f_ffree; + statbuf->FsIdentifier = + (((uint64_t) statfs_buf.f_fsid.val[0] << 32) & 0xffffffff00000000LL) | + (uint64_t) statfs_buf.f_fsid.val[1]; + /* Try to extrapolate some of the fs flags into the + * capabilities + */ + statbuf->FsCapabilities = + FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES; +#ifdef MNT_ACLS + if (statfs_buf.f_flags & MNT_ACLS) + statbuf->FsCapabilities |= FILE_PERSISTENT_ACLS; +#endif + if (statfs_buf.f_flags & MNT_QUOTA) + statbuf->FsCapabilities |= FILE_VOLUME_QUOTAS; + if (statfs_buf.f_flags & MNT_RDONLY) + statbuf->FsCapabilities |= FILE_READ_ONLY_VOLUME; + + return 0; +} #endif /* @@ -139,6 +174,8 @@ int sys_statvfs(const char *path, vfs_statvfs_struct *statbuf) return linux_statvfs(path, statbuf); #elif defined(DARWINOS) return darwin_statvfs(path, statbuf); +#elif defined(BSD) && defined(MNT_RDONLY) + return bsd_statvfs(path, statbuf); #else /* BB change this to return invalid level */ #ifdef EOPNOTSUPP |