#include <fcntl.h>
#include <util.h>
#include <unistd.h>
#include <string.h>
#include <sys/mount.h>
#include <uuid/uuid.h>
#include <IOKit/IOBSD.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/storage/IOMedia.h>
extern char debug;
extern void plog(const char *, ...);
int
OpenDeviceByUUID(void *uuidp)
{
char devname[ MAXPATHLEN ];
CFStringRef devname_string;
int fd = -1;
CFMutableDictionaryRef matching;
io_service_t media;
uuid_string_t uuid_cstring;
CFStringRef uuid_string;
memcpy(&uuid_cstring, uuidp, sizeof(uuid_cstring));
uuid_string = CFStringCreateWithCString( kCFAllocatorDefault, uuid_cstring, kCFStringEncodingUTF8 );
if ( uuid_string ) {
matching = IOServiceMatching( kIOMediaClass );
if ( matching ) {
CFDictionarySetValue( matching, CFSTR( kIOMediaUUIDKey ), uuid_string );
media = IOServiceGetMatchingService( kIOMasterPortDefault, matching );
if ( media ) {
devname_string = IORegistryEntryCreateCFProperty( media, CFSTR( kIOBSDNameKey ), kCFAllocatorDefault, 0 );
if ( devname_string ) {
if ( CFStringGetCString( devname_string, devname, sizeof( devname ), kCFStringEncodingUTF8 ) ) {
if (debug)
plog("external journal device name = `%s'\n", devname);
fd = opendev( devname, O_RDONLY, 0, NULL );
}
CFRelease( devname_string );
}
IOObjectRelease( media );
}
}
CFRelease( uuid_string );
}
return fd;
}