From: Dave V. <va...@us...> - 2012-06-24 05:53:45
|
On a couple of occasions, disk images of mine have become corrupted due to accidental double-mounting in SheepShaver and/or BasiliskII. I propose we try and minimize the chance of this happening. Two situations need to be dealt with: 1. The host OS and SheepShaver (or B2) both have the disk mounted. We already try to prevent this with is_drive_mounted(), but it only works on Linux hosts, and only with real devices, not loop mounts. It should be possible to extend this to OS X. For real devices, using getmntinfo(3) should be straightforward. For disk images (the equivalent of loop mounts), we can use IOKit to try and detect that they're in use, though it uses undocumented IOKit properties. Some code I whipped up, without proper error checking or memory management: NSString *imgPath = @"/my/disk/image.img"; NSData *imgData = [imgPath dataUsingEncoding:NSUTF8StringEncoding]; CFMutableDictionaryRef match = IOServiceMatching("IOHDIXHDDrive"); CFDictionaryAddValue(match, CFSTR(kIOPropertyMatchKey), [NSDictionary dictionaryWithObject: imgData forKey: @"image-path"]); io_service_t serv = IOServiceGetMatchingService(kIOMasterPortDefault, (CFDictionaryRef)match); if (serv) printf("It's mounted!\n"); I don't know if there's a good API to check for loop mounts on Linux. Parse the output of losetup(8)? Some place in sysfs? 2. Multiple instances of B2/SS using the same disk image. We should be able to prevent this by using advisory locks in Sys_open(). What do folks think? Worth working on? Cheers, Dave |