int mmc_eject(const char *mmc_device) { DADiskRef disk = mmc_device_to_diskref(mmc_device); int rc = -1; if (disk) { struct disk_op_context context; context.operation = "eject"; DADiskEject(disk, kDADiskEjectOptionDefault, disk_op_done_cb, &context); if (run_loop_for_time(10) < 0) fwup_warnx("unmount timed out"); if (context.succeeded) rc = 0; CFRelease(disk); } return rc; }
static void __DAStageDispatch( void * info ) { static Boolean fresh = FALSE; CFIndex count; CFIndex index; Boolean quiet = TRUE; count = CFArrayGetCount( gDADiskList ); for ( index = 0; index < count; index++ ) { DADiskRef disk; disk = ( void * ) CFArrayGetValueAtIndex( gDADiskList, index ); if ( DADiskGetState( disk, kDADiskStateCommandActive ) == FALSE ) { if ( DADiskGetState( disk, kDADiskStateStagedProbe ) == FALSE ) { if ( fresh ) { DAFileSystemListRefresh( ); DAMountMapListRefresh1( ); DAMountMapListRefresh2( ); fresh = FALSE; } __DAStageProbe( disk ); } else if ( DADiskGetState( disk, kDADiskStateStagedPeek ) == FALSE ) { __DAStagePeek( disk ); } ///w:start else if ( DADiskGetState( disk, kDADiskStateRequireRepair ) == FALSE ) { if ( DADiskGetState( disk, kDADiskStateStagedApprove ) == FALSE ) { __DAStageMountApproval( disk ); } else if ( DADiskGetState( disk, kDADiskStateStagedAuthorize ) == FALSE ) { __DAStageMountAuthorization( disk ); } else if ( DADiskGetState( disk, kDADiskStateStagedMount ) == FALSE ) { __DAStageMount( disk ); } else if ( DADiskGetState( disk, kDADiskStateStagedAppear ) == FALSE ) { __DAStageAppeared( disk ); } else { ///w:start if ( gDAConsoleUserList == NULL ) { if ( DADiskGetDescription( disk, kDADiskDescriptionMediaTypeKey ) ) { if ( DAUnitGetState( disk, kDAUnitStateStagedUnreadable ) == FALSE ) { if ( _DAUnitIsUnreadable( disk ) ) { DADiskEject( disk, kDADiskEjectOptionDefault, NULL ); } DAUnitSetState( disk, kDAUnitStateStagedUnreadable, TRUE ); } } } ///w:stop continue; } } ///w:stop else if ( DADiskGetState( disk, kDADiskStateStagedAppear ) == FALSE ) { /* * We stall the "appeared" stage if the conditions are not right. */ if ( DADiskGetState( disk, kDADiskStateRequireRepair ) ) { CFIndex subcount; CFIndex subindex; subcount = CFArrayGetCount( gDADiskList ); for ( subindex = 0; subindex < subcount; subindex++ ) { DADiskRef subdisk; subdisk = ( void * ) CFArrayGetValueAtIndex( gDADiskList, subindex ); if ( DADiskGetBSDUnit( disk ) == DADiskGetBSDUnit( subdisk ) ) { if ( DADiskGetState( subdisk, kDADiskStateStagedProbe ) == FALSE ) { break; } if ( DADiskGetState( subdisk, kDADiskStateStagedAppear ) == FALSE ) { if ( DADiskGetState( subdisk, kDADiskStateRequireRepair ) == FALSE ) { break; } } } } if ( subindex == subcount ) { __DAStageAppeared( disk ); } } else { __DAStageAppeared( disk ); } } else if ( DADiskGetState( disk, kDADiskStateStagedApprove ) == FALSE ) { __DAStageMountApproval( disk ); } else if ( DADiskGetState( disk, kDADiskStateStagedAuthorize ) == FALSE ) { __DAStageMountAuthorization( disk ); } else if ( DADiskGetState( disk, kDADiskStateStagedMount ) == FALSE ) { if ( gDAExit ) { continue; } __DAStageMount( disk ); } else { continue; } } quiet = FALSE; } count = CFArrayGetCount( gDARequestList ); if ( count ) { CFMutableSetRef dependencies; dependencies = CFSetCreateMutable( kCFAllocatorDefault, 0, &kCFTypeSetCallBacks ); if ( dependencies ) { for ( index = 0; index < count; index++ ) { DARequestRef request; request = ( void * ) CFArrayGetValueAtIndex( gDARequestList, index ); if ( request ) { DADiskRef disk; Boolean dispatch = TRUE; disk = DARequestGetDisk( request ); /* * Determine whether the request has undispatched dependencies. */ if ( disk ) { CFArrayRef link; link = DARequestGetLink( request ); if ( link ) { CFIndex subcount; CFIndex subindex; subcount = CFArrayGetCount( link ); for ( subindex = 0; subindex < subcount; subindex++ ) { DARequestRef subrequest; subrequest = ( void * ) CFArrayGetValueAtIndex( link, subindex ); if ( CFSetContainsValue( dependencies, DARequestGetDisk( subrequest ) ) ) { break; } } if ( subindex < subcount ) { dispatch = FALSE; } } if ( CFSetContainsValue( dependencies, disk ) ) { dispatch = FALSE; } } else { if ( index ) { break; } } if ( dispatch ) { /* * Prepare to dispatch the request. */ if ( DARequestGetKind( request ) == _kDADiskMount ) { if ( fresh ) { DAFileSystemListRefresh( ); DAMountMapListRefresh1( ); DAMountMapListRefresh2( ); fresh = FALSE; } } /* * Dispatch the request. */ dispatch = DARequestDispatch( request ); } if ( dispatch ) { CFArrayRemoveValueAtIndex( gDARequestList, index ); count--; index--; } else { /* * Add the request to the undispatched dependencies. */ if ( disk ) { CFArrayRef link; link = DARequestGetLink( request ); if ( link ) { CFIndex subcount; CFIndex subindex; subcount = CFArrayGetCount( link ); for ( subindex = 0; subindex < subcount; subindex++ ) { DARequestRef subrequest; subrequest = ( void * ) CFArrayGetValueAtIndex( link, subindex ); CFSetSetValue( dependencies, DARequestGetDisk( subrequest ) ); } } CFSetSetValue( dependencies, disk ); } } } } CFRelease( dependencies ); } quiet = FALSE; } if ( quiet ) { fresh = TRUE; gDAIdle = TRUE; DAIdleCallback( ); ___vproc_transaction_end( ); if ( gDAConsoleUser ) { /* * Determine whether a unit is unreadable or a volume is unrepairable. */ count = CFArrayGetCount( gDADiskList ); for ( index = 0; index < count; index++ ) { DADiskRef disk; disk = ( void * ) CFArrayGetValueAtIndex( gDADiskList, index ); /* * Determine whether a unit is unreadable. */ if ( DADiskGetDescription( disk, kDADiskDescriptionMediaWholeKey ) == kCFBooleanTrue ) { if ( DAUnitGetState( disk, kDAUnitStateStagedUnreadable ) == FALSE ) { if ( _DAUnitIsUnreadable( disk ) ) { DADialogShowDeviceUnreadable( disk ); } DAUnitSetState( disk, kDAUnitStateStagedUnreadable, TRUE ); } } /* * Determine whether a volume is unrepairable. */ if ( DADiskGetDescription( disk, kDADiskDescriptionVolumePathKey ) ) { if ( DADiskGetState( disk, kDADiskStateStagedUnrepairable ) == FALSE ) { if ( DADiskGetState( disk, kDADiskStateRequireRepair ) ) { if ( DADiskGetOption( disk, kDADiskOptionMountAutomatic ) ) { if ( DADiskGetClaim( disk ) == NULL ) { DADialogShowDeviceUnrepairable( disk ); } } } DADiskSetState( disk, kDADiskStateStagedUnrepairable, TRUE ); } } } } } }