Commit 0d29ba96 authored by Alexandre Julliard's avatar Alexandre Julliard

ntdll: Added NetBSD fstatvfs support.

parent 26172f8a
...@@ -1550,6 +1550,42 @@ NTSTATUS WINAPI NtQueryAttributesFile( const OBJECT_ATTRIBUTES *attr, FILE_BASIC ...@@ -1550,6 +1550,42 @@ NTSTATUS WINAPI NtQueryAttributesFile( const OBJECT_ATTRIBUTES *attr, FILE_BASIC
} }
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__APPLE__)
/* helper for FILE_GetDeviceInfo to hide some platform differences in fstatfs */
static inline get_device_info_fstatfs( FILE_FS_DEVICE_INFORMATION *info, const char *fstypename,
size_t fstypesize, unsigned int flags )
{
if (!strncmp("cd9660", fstypename, fstypesize) ||
!strncmp("udf", fstypename, fstypesize))
{
info->DeviceType = FILE_DEVICE_CD_ROM_FILE_SYSTEM;
/* Don't assume read-only, let the mount options set it below */
info->Characteristics |= FILE_REMOVABLE_MEDIA;
}
else if (!strncmp("nfs", fstypename, fstypesize) ||
!strncmp("nwfs", fstypename, fstypesize) ||
!strncmp("smbfs", fstypename, fstypesize) ||
!strncmp("afpfs", fstypename, fstypesize))
{
info->DeviceType = FILE_DEVICE_NETWORK_FILE_SYSTEM;
info->Characteristics |= FILE_REMOTE_DEVICE;
}
else if (!strncmp("procfs", fstypename, fstypesize))
info->DeviceType = FILE_DEVICE_VIRTUAL_DISK;
else
info->DeviceType = FILE_DEVICE_DISK_FILE_SYSTEM;
if (flags & MNT_RDONLY)
info->Characteristics |= FILE_READ_ONLY_DEVICE;
if (!(flags & MNT_LOCAL))
{
info->DeviceType = FILE_DEVICE_NETWORK_FILE_SYSTEM;
info->Characteristics |= FILE_REMOTE_DEVICE;
}
}
#endif
/****************************************************************************** /******************************************************************************
* FILE_GetDeviceInfo * FILE_GetDeviceInfo
* *
...@@ -1627,37 +1663,19 @@ NTSTATUS FILE_GetDeviceInfo( int fd, FILE_FS_DEVICE_INFORMATION *info ) ...@@ -1627,37 +1663,19 @@ NTSTATUS FILE_GetDeviceInfo( int fd, FILE_FS_DEVICE_INFORMATION *info )
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__APPLE__) #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__APPLE__)
struct statfs stfs; struct statfs stfs;
/* The proper way to do this in FreeBSD seems to be with the
* name rather than the type, since their linux-compatible
* fstatfs call converts the name to one of the Linux types.
*/
if (fstatfs( fd, &stfs ) < 0) if (fstatfs( fd, &stfs ) < 0)
info->DeviceType = FILE_DEVICE_DISK_FILE_SYSTEM; info->DeviceType = FILE_DEVICE_DISK_FILE_SYSTEM;
else if (!strncmp("cd9660", stfs.f_fstypename, sizeof(stfs.f_fstypename)) ||
!strncmp("udf", stfs.f_fstypename, sizeof(stfs.f_fstypename)))
{
info->DeviceType = FILE_DEVICE_CD_ROM_FILE_SYSTEM;
/* Don't assume read-only, let the mount options set it below */
info->Characteristics |= FILE_REMOVABLE_MEDIA;
}
else if (!strncmp("nfs", stfs.f_fstypename, sizeof(stfs.f_fstypename)) ||
!strncmp("nwfs", stfs.f_fstypename, sizeof(stfs.f_fstypename)))
{
info->DeviceType = FILE_DEVICE_NETWORK_FILE_SYSTEM;
info->Characteristics |= FILE_REMOTE_DEVICE;
}
else if (!strncmp("procfs", stfs.f_fstypename,
sizeof(stfs.f_fstypename)))
info->DeviceType = FILE_DEVICE_VIRTUAL_DISK;
else else
get_device_info_fstatfs( info, stfs.f_fstypename,
sizeof(stfs.f_fstypename), stfs.f_flags );
#elif defined(__NetBSD__)
struct statvfs stfs;
if (fstatvfs( fd, &stfs) < 0)
info->DeviceType = FILE_DEVICE_DISK_FILE_SYSTEM; info->DeviceType = FILE_DEVICE_DISK_FILE_SYSTEM;
if (stfs.f_flags & MNT_RDONLY) else
info->Characteristics |= FILE_READ_ONLY_DEVICE; get_device_info_fstatfs( info, stfs.f_fstypename,
if (!(stfs.f_flags & MNT_LOCAL)) sizeof(stfs.f_fstypename), stfs.f_flag );
{
info->DeviceType = FILE_DEVICE_NETWORK_FILE_SYSTEM;
info->Characteristics |= FILE_REMOTE_DEVICE;
}
#elif defined(sun) #elif defined(sun)
/* Use dkio to work out device types */ /* Use dkio to work out device types */
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment