static void __DAStagePeekCallback( CFTypeRef response, void * context ) { CFMutableArrayRef candidates; DADiskRef disk = context; candidates = ( void * ) DADiskGetContext( disk ); if ( CFArrayGetCount( candidates ) ) { DACallbackRef candidate; candidate = ( void * ) CFArrayGetValueAtIndex( candidates, 0 ); CFRetain( candidate ); CFArrayRemoveValueAtIndex( candidates, 0 ); DADiskPeekCallback( disk, candidate, __DAStagePeekCallback, context ); CFRelease( candidate ); return; } DADiskSetState( disk, kDADiskStateCommandActive, FALSE ); DADiskSetContext( disk, NULL ); DAStageSignal( ); CFRelease( disk ); }
static void __DAStageMountCallback( int status, CFURLRef mountpoint, void * context ) { DADiskRef disk = context; if ( status == 0 ) { /* * We were able to mount the volume. */ DADiskSetBypath( disk, mountpoint ); DADiskSetDescription( disk, kDADiskDescriptionVolumePathKey, mountpoint ); if ( DADiskGetState( disk, kDADiskStateStagedAppear ) ) { DADiskDescriptionChangedCallback( disk, kDADiskDescriptionVolumePathKey ); } } DAUnitSetState( disk, kDAUnitStateCommandActive, FALSE ); DADiskSetState( disk, kDADiskStateCommandActive, FALSE ); DAStageSignal( ); CFRelease( disk ); }
static void __DAStageMountAuthorization( DADiskRef disk ) { /* * We commence the "mount authorization" stage if the conditions are right. */ /* * Commence the mount authorization. */ DADiskSetState( disk, kDADiskStateStagedAuthorize, TRUE ); ///w:start if ( DADiskGetState( disk, _kDADiskStateRequireAuthorize ) ) ///w:stop { DASessionRef session; CFArrayRef sessionList; CFIndex sessionListCount; CFIndex sessionListIndex; CFRetain( disk ); DADiskSetState( disk, kDADiskStateCommandActive, TRUE ); sessionList = gDASessionList; sessionListCount = CFArrayGetCount( sessionList ); for ( sessionListIndex = 0; sessionListIndex < sessionListCount; sessionListIndex++ ) { session = ( void * ) CFArrayGetValueAtIndex( sessionList, sessionListIndex ); if ( strcmp( _DASessionGetName( session ), "SystemUIServer" ) == 0 ) { break; } } if ( sessionListIndex < sessionListCount ) { DAAuthorizeWithCallback( session, _kDAAuthorizeOptionAuthenticateAdministrator, disk, ___UID_ROOT, ___GID_WHEEL, __DAStageMountAuthorizationCallback, disk, _kDAAuthorizeRightMount ); } else { __DAStageMountAuthorizationCallback( kDAReturnNotPrivileged, disk ); } } else { DAStageSignal( ); } }
static void __DAStageAppeared( DADiskRef disk ) { /* * We commence the "appeared" stage if the conditions are right. */ DADiskSetState( disk, kDADiskStateStagedAppear, TRUE ); DADiskAppearedCallback( disk ); DAStageSignal( ); }
static void __DAStageMountApproval( DADiskRef disk ) { /* * We commence the "mount approval" stage if the conditions are right. */ Boolean mount = TRUE; /* * Determine whether the disk is mountable. */ if ( DADiskGetDescription( disk, kDADiskDescriptionVolumeMountableKey ) == kCFBooleanFalse ) { mount = FALSE; } /* * Determine whether the disk is mounted. */ if ( DADiskGetDescription( disk, kDADiskDescriptionVolumePathKey ) ) { mount = FALSE; } /* * Commence the mount approval. */ DADiskSetState( disk, kDADiskStateStagedApprove, TRUE ); if ( mount ) { CFRetain( disk ); DADiskSetState( disk, kDADiskStateCommandActive, TRUE ); DADiskMountApprovalCallback( disk, __DAStageMountApprovalCallback, disk ); } else { DADiskSetState( disk, kDADiskStateStagedMount, TRUE ); DAStageSignal( ); } }
static void __DAStageMountAuthorizationCallback( DAReturn status, void * context ) { DADiskRef disk = context; if ( status ) { /* * The mount was unauthorized. */ DADiskSetState( disk, kDADiskStateStagedMount, TRUE ); } DADiskSetState( disk, kDADiskStateCommandActive, FALSE ); DAStageSignal( ); CFRelease( disk ); }
static void __DAStageMountApprovalCallback( CFTypeRef response, void * context ) { DADiskRef disk = context; DADissenterRef dissenter = response; if ( dissenter ) { /* * The mount was disapproved. */ ///w:start if ( DADissenterGetStatus( dissenter ) == 0xF8DAFF01 ) { DADiskSetState( disk, _kDADiskStateRequireAuthorize, TRUE ); } else if ( DADissenterGetStatus( dissenter ) == 0xF8DAFF02 ) { DADiskSetState( disk, _kDADiskStateMountPreferenceNoWrite, TRUE ); } else if ( DADissenterGetStatus( dissenter ) == 0xF8DAFF03 ) { DADiskSetState( disk, _kDADiskStateRequireAuthorize, TRUE ); DADiskSetState( disk, _kDADiskStateMountPreferenceNoWrite, TRUE ); } else ///w:stop DADiskSetState( disk, kDADiskStateStagedMount, TRUE ); } DADiskSetState( disk, kDADiskStateCommandActive, FALSE ); DAStageSignal( ); CFRelease( disk ); }
static void __DAStageProbeCallback( int status, CFBooleanRef clean, CFStringRef name, CFUUIDRef uuid, void * context ) { DADiskRef disk = context; CFMutableArrayRef keys = NULL; CFStringRef kind = NULL; DALogDebugHeader( "%s -> %s", gDAProcessNameID, gDAProcessNameID ); if ( status ) { CFMutableArrayRef candidates; candidates = ( void * ) DADiskGetContext( disk ); if ( DADiskGetFileSystem( disk ) ) { kind = DAFileSystemGetKind( DADiskGetFileSystem( disk ) ); DALogDebug( " probed disk, id = %@, with %@, failure.", disk, kind ); if ( status != FSUR_UNRECOGNIZED ) { DALogError( "unable to probe %@ (status code 0x%08X).", disk, status ); } } /* * Find a probe candidate for this media object. */ while ( CFArrayGetCount( candidates ) ) { CFDictionaryRef candidate; candidate = CFArrayGetValueAtIndex( candidates, 0 ); if ( candidate ) { DAFileSystemRef filesystem; filesystem = ( void * ) CFDictionaryGetValue( candidate, kDAFileSystemKey ); if ( filesystem ) { CFDictionaryRef properties; properties = CFDictionaryGetValue( candidate, CFSTR( kFSMediaPropertiesKey ) ); if ( properties ) { boolean_t match = FALSE; IOServiceMatchPropertyTable( DADiskGetIOMedia( disk ), properties, &match ); if ( match ) { /* * We have found a probe candidate for this media object. */ kind = DAFileSystemGetKind( filesystem ); DADiskSetFileSystem( disk, filesystem ); if ( CFDictionaryGetValue( candidate, CFSTR( "autodiskmount" ) ) == kCFBooleanFalse ) { DADiskSetOption( disk, kDADiskOptionMountAutomatic, FALSE ); DADiskSetOption( disk, kDADiskOptionMountAutomaticNoDefer, FALSE ); } CFArrayRemoveValueAtIndex( candidates, 0 ); DALogDebug( " probed disk, id = %@, with %@, ongoing.", disk, kind ); DAFileSystemProbe( filesystem, DADiskGetDevice( disk ), __DAStageProbeCallback, context ); return; } } } } CFArrayRemoveValueAtIndex( candidates, 0 ); } } DADiskSetState( disk, kDADiskStateRequireRepair, FALSE ); DADiskSetState( disk, kDADiskStateRequireRepairQuotas, FALSE ); if ( status ) { /* * We have found no probe match for this media object. */ kind = NULL; if ( DADiskGetFileSystem( disk ) ) { DADiskSetFileSystem( disk, NULL ); DALogDebug( " probed disk, id = %@, no match.", disk ); } } else { /* * We have found a probe match for this media object. */ kind = DAFileSystemGetKind( DADiskGetFileSystem( disk ) ); ///w:start if ( DADiskGetDescription( disk, kDADiskDescriptionMediaWritableKey ) == kCFBooleanFalse ) { clean = kCFBooleanTrue; } ///w:stop if ( clean == kCFBooleanFalse ) { DADiskSetState( disk, kDADiskStateRequireRepair, TRUE ); DADiskSetState( disk, kDADiskStateRequireRepairQuotas, TRUE ); } DALogDebug( " probed disk, id = %@, with %@, success.", disk, kind ); } keys = CFArrayCreateMutable( kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks ); if ( keys ) { CFTypeRef object; object = kind ? kCFBooleanTrue : kCFBooleanFalse; if ( DADiskCompareDescription( disk, kDADiskDescriptionVolumeMountableKey, object ) ) { DADiskSetDescription( disk, kDADiskDescriptionVolumeMountableKey, object ); CFArrayAppendValue( keys, kDADiskDescriptionVolumeMountableKey ); } if ( DADiskCompareDescription( disk, kDADiskDescriptionVolumeKindKey, kind ) ) { DADiskSetDescription( disk, kDADiskDescriptionVolumeKindKey, kind ); CFArrayAppendValue( keys, kDADiskDescriptionVolumeKindKey ); } if ( DADiskCompareDescription( disk, kDADiskDescriptionVolumeNameKey, name ) ) { DADiskSetDescription( disk, kDADiskDescriptionVolumeNameKey, name ); CFArrayAppendValue( keys, kDADiskDescriptionVolumeNameKey ); } if ( DADiskCompareDescription( disk, kDADiskDescriptionVolumeUUIDKey, uuid ) ) { DADiskSetDescription( disk, kDADiskDescriptionVolumeUUIDKey, uuid ); CFArrayAppendValue( keys, kDADiskDescriptionVolumeUUIDKey ); } if ( CFArrayGetCount( keys ) ) { if ( DADiskGetState( disk, kDADiskStateStagedAppear ) ) { DADiskDescriptionChangedCallback( disk, keys ); } } CFRelease( keys ); } if ( DADiskGetState( disk, kDADiskStateStagedMount ) == FALSE ) { struct statfs * mountList; int mountListCount; int mountListIndex; /* * Determine whether the disk is mounted. */ mountListCount = getmntinfo( &mountList, MNT_NOWAIT ); for ( mountListIndex = 0; mountListIndex < mountListCount; mountListIndex++ ) { if ( mountList[mountListIndex].f_fsid.val[0] == DADiskGetBSDNode( disk ) ) { /* * We have determined that the disk is mounted. */ CFURLRef path; path = CFURLCreateFromFileSystemRepresentation( kCFAllocatorDefault, ( void * ) mountList[mountListIndex].f_mntonname, strlen( mountList[mountListIndex].f_mntonname ), TRUE ); if ( path ) { _DAMountCreateTrashFolder( disk, path ); DADiskSetBypath( disk, path ); DADiskSetDescription( disk, kDADiskDescriptionVolumePathKey, path ); CFRelease( path ); } if ( strcmp( mountList[mountListIndex].f_mntonname, "/" ) == 0 ) { path = DAMountCreateMountPointWithAction( disk, kDAMountPointActionLink ); if ( path ) { DADiskSetBypath( disk, path ); CFRelease( path ); } DADiskSetOption( disk, kDADiskOptionMountAutomatic, TRUE ); DADiskSetOption( disk, kDADiskOptionMountAutomaticNoDefer, TRUE ); } DADiskSetState( disk, kDADiskStateRequireRepair, FALSE ); DADiskSetState( disk, kDADiskStateRequireRepairQuotas, FALSE ); break; } } } DAUnitSetState( disk, kDAUnitStateCommandActive, FALSE ); DADiskSetState( disk, kDADiskStateCommandActive, FALSE ); DADiskSetContext( disk, NULL ); DAStageSignal( ); CFRelease( disk ); }
DAReturn _DADiskRefresh( DADiskRef disk ) { DAReturn status; status = kDAReturnUnsupported; if ( DADiskGetDescription( disk, kDADiskDescriptionVolumePathKey ) ) { struct statfs * mountList; int mountListCount; int mountListIndex; mountListCount = getmntinfo( &mountList, MNT_NOWAIT ); for ( mountListIndex = 0; mountListIndex < mountListCount; mountListIndex++ ) { if ( strcmp( _DAVolumeGetID( mountList + mountListIndex ), DADiskGetID( disk ) ) == 0 ) { break; } } if ( mountListIndex == mountListCount ) { CFURLRef mountpoint; mountpoint = DADiskGetDescription( disk, kDADiskDescriptionVolumePathKey ); CFRetain( mountpoint ); DAThreadExecute( __DADiskRefreshRemoveMountPoint, ( void * ) mountpoint, NULL, NULL ); DADiskSetBypath( disk, NULL ); if ( DADiskGetDescription( disk, kDADiskDescriptionMediaPathKey ) ) { DADiskSetDescription( disk, kDADiskDescriptionVolumePathKey, NULL ); DADiskDescriptionChangedCallback( disk, kDADiskDescriptionVolumePathKey ); } else { DALogDebugHeader( "bsd [0] -> %s", gDAProcessNameID ); DALogDebug( " removed disk, id = %@.", disk ); DADiskDisappearedCallback( disk ); DADiskSetDescription( disk, kDADiskDescriptionVolumePathKey, NULL ); DADiskSetState( disk, kDADiskStateZombie, TRUE ); ___CFArrayRemoveValue( gDADiskList, disk ); } DAStageSignal( ); } status = kDAReturnSuccess; } else { struct statfs * mountList; int mountListCount; int mountListIndex; mountListCount = getmntinfo( &mountList, MNT_NOWAIT ); for ( mountListIndex = 0; mountListIndex < mountListCount; mountListIndex++ ) { if ( strcmp( _DAVolumeGetID( mountList + mountListIndex ), DADiskGetID( disk ) ) == 0 ) { break; } } if ( mountListIndex < mountListCount ) { CFURLRef path; path = CFURLCreateFromFileSystemRepresentation( kCFAllocatorDefault, ( void * ) mountList[mountListIndex].f_mntonname, strlen( mountList[mountListIndex].f_mntonname ), TRUE ); if ( path ) { DADiskSetBypath( disk, path ); DADiskSetDescription( disk, kDADiskDescriptionVolumePathKey, path ); DADiskDescriptionChangedCallback( disk, kDADiskDescriptionVolumePathKey ); DAStageSignal( ); CFRelease( path ); } } status = kDAReturnSuccess; } return status; }