ntdll: Remove the IOKit code and reuse the FreeBSD implementation for MacOS.
FILE_GetDeviceInfo needs to be efficient, and IOKit is much too slow to be used here.
This commit is contained in:
parent
42418fbbe8
commit
c727986499
|
@ -55,12 +55,6 @@
|
||||||
# include <sys/statfs.h>
|
# include <sys/statfs.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_IOKIT_IOKITLIB_H
|
|
||||||
# include <IOKit/IOKitLib.h>
|
|
||||||
# include <CoreFoundation/CFNumber.h> /* for kCFBooleanTrue, kCFBooleanFalse */
|
|
||||||
# include <paths.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define NONAMELESSUNION
|
#define NONAMELESSUNION
|
||||||
#define NONAMELESSSTRUCT
|
#define NONAMELESSSTRUCT
|
||||||
#include "ntstatus.h"
|
#include "ntstatus.h"
|
||||||
|
@ -1629,7 +1623,7 @@ NTSTATUS FILE_GetDeviceInfo( int fd, FILE_FS_DEVICE_INFORMATION *info )
|
||||||
info->DeviceType = FILE_DEVICE_DISK_FILE_SYSTEM;
|
info->DeviceType = FILE_DEVICE_DISK_FILE_SYSTEM;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
#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
|
/* The proper way to do this in FreeBSD seems to be with the
|
||||||
|
@ -1638,23 +1632,15 @@ NTSTATUS FILE_GetDeviceInfo( int fd, FILE_FS_DEVICE_INFORMATION *info )
|
||||||
*/
|
*/
|
||||||
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,
|
else if (!strncmp("cd9660", stfs.f_fstypename, sizeof(stfs.f_fstypename)) ||
|
||||||
sizeof(stfs.f_fstypename)))
|
!strncmp("udf", stfs.f_fstypename, sizeof(stfs.f_fstypename)))
|
||||||
{
|
{
|
||||||
info->DeviceType = FILE_DEVICE_CD_ROM_FILE_SYSTEM;
|
info->DeviceType = FILE_DEVICE_CD_ROM_FILE_SYSTEM;
|
||||||
/* Don't assume read-only, let the mount options set it
|
/* Don't assume read-only, let the mount options set it below */
|
||||||
* below
|
|
||||||
*/
|
|
||||||
info->Characteristics |= FILE_REMOVABLE_MEDIA;
|
info->Characteristics |= FILE_REMOVABLE_MEDIA;
|
||||||
}
|
}
|
||||||
else if (!strncmp("nfs", stfs.f_fstypename,
|
else if (!strncmp("nfs", stfs.f_fstypename, sizeof(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("nwfs", stfs.f_fstypename,
|
|
||||||
sizeof(stfs.f_fstypename)))
|
|
||||||
{
|
{
|
||||||
info->DeviceType = FILE_DEVICE_NETWORK_FILE_SYSTEM;
|
info->DeviceType = FILE_DEVICE_NETWORK_FILE_SYSTEM;
|
||||||
info->Characteristics |= FILE_REMOTE_DEVICE;
|
info->Characteristics |= FILE_REMOTE_DEVICE;
|
||||||
|
@ -1671,65 +1657,6 @@ NTSTATUS FILE_GetDeviceInfo( int fd, FILE_FS_DEVICE_INFORMATION *info )
|
||||||
info->DeviceType = FILE_DEVICE_NETWORK_FILE_SYSTEM;
|
info->DeviceType = FILE_DEVICE_NETWORK_FILE_SYSTEM;
|
||||||
info->Characteristics |= FILE_REMOTE_DEVICE;
|
info->Characteristics |= FILE_REMOTE_DEVICE;
|
||||||
}
|
}
|
||||||
#elif defined (__APPLE__)
|
|
||||||
struct statfs stfs;
|
|
||||||
kern_return_t kernResult = KERN_FAILURE;
|
|
||||||
mach_port_t masterPort;
|
|
||||||
char bsdName[6]; /* disk#\0 */
|
|
||||||
const char *name;
|
|
||||||
|
|
||||||
info->DeviceType = FILE_DEVICE_DISK_FILE_SYSTEM;
|
|
||||||
|
|
||||||
if (fstatfs( fd, &stfs ) < 0) return FILE_GetNtStatus();
|
|
||||||
|
|
||||||
/* stfs.f_type is reserved (always set to 0) so use IOKit */
|
|
||||||
name = stfs.f_mntfromname + strlen(_PATH_DEV);
|
|
||||||
memcpy( bsdName, name, min(strlen(name)+1,sizeof(bsdName)) );
|
|
||||||
bsdName[sizeof(bsdName)-1] = 0;
|
|
||||||
|
|
||||||
kernResult = IOMasterPort(MACH_PORT_NULL, &masterPort);
|
|
||||||
|
|
||||||
if (kernResult == KERN_SUCCESS)
|
|
||||||
{
|
|
||||||
CFMutableDictionaryRef matching = IOBSDNameMatching(masterPort, 0, bsdName);
|
|
||||||
|
|
||||||
if (matching)
|
|
||||||
{
|
|
||||||
CFStringRef type;
|
|
||||||
CFMutableDictionaryRef properties;
|
|
||||||
io_service_t devService = IOServiceGetMatchingService(masterPort, matching);
|
|
||||||
|
|
||||||
if (IORegistryEntryCreateCFProperties(devService,
|
|
||||||
&properties,
|
|
||||||
kCFAllocatorDefault, 0) != KERN_SUCCESS)
|
|
||||||
return FILE_GetNtStatus(); /* FIXME */
|
|
||||||
if ( CFEqual(
|
|
||||||
CFDictionaryGetValue(properties, CFSTR("Removable")),
|
|
||||||
kCFBooleanTrue)
|
|
||||||
) info->Characteristics |= FILE_REMOVABLE_MEDIA;
|
|
||||||
|
|
||||||
if ( CFEqual(
|
|
||||||
CFDictionaryGetValue(properties, CFSTR("Writable")),
|
|
||||||
kCFBooleanFalse)
|
|
||||||
) info->Characteristics |= FILE_READ_ONLY_DEVICE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
NB : mounted disk image (.img/.dmg) don't provide specific type
|
|
||||||
*/
|
|
||||||
if ( (type = CFDictionaryGetValue(properties, CFSTR("Type"))) )
|
|
||||||
{
|
|
||||||
if ( CFStringCompare(type, CFSTR("CD-ROM"), 0) == kCFCompareEqualTo
|
|
||||||
|| CFStringCompare(type, CFSTR("DVD-ROM"), 0) == kCFCompareEqualTo
|
|
||||||
)
|
|
||||||
{
|
|
||||||
info->DeviceType = FILE_DEVICE_CD_ROM_FILE_SYSTEM;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (properties)
|
|
||||||
CFRelease(properties);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#elif defined(sun)
|
#elif defined(sun)
|
||||||
/* Use dkio to work out device types */
|
/* Use dkio to work out device types */
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue