diff options
| -rw-r--r-- | rbutil/rbutilqt/base/utils.cpp | 39 | ||||
| -rw-r--r-- | rbutil/rbutilqt/rbutilqt.cpp | 2 |
2 files changed, 40 insertions, 1 deletions
diff --git a/rbutil/rbutilqt/base/utils.cpp b/rbutil/rbutilqt/base/utils.cpp index cffa4b1..eec03fe 100644 --- a/rbutil/rbutilqt/base/utils.cpp +++ b/rbutil/rbutilqt/base/utils.cpp @@ -749,6 +749,45 @@ bool Utils::ejectDevice(QString device) return success; #endif +#if defined(Q_OS_MACX) + // FIXME: FSUnmountVolumeSync is deprecated starting with 10.8. + // Use DADiskUnmount / DiskArbitration framework eventually. + // BSD label does not include folder. + QString bsd = Utils::resolveDevicename(device).remove("/dev/"); + OSStatus result; + ItemCount index = 1; + bool found = false; + + do { + FSVolumeRefNum volrefnum; + + result = FSGetVolumeInfo(kFSInvalidVolumeRefNum, index, &volrefnum, + kFSVolInfoFSInfo, NULL, NULL, NULL); + if(result == noErr) { + GetVolParmsInfoBuffer volparms; + HParamBlockRec hpb; + hpb.ioParam.ioNamePtr = NULL; + hpb.ioParam.ioVRefNum = volrefnum; + hpb.ioParam.ioBuffer = (Ptr)&volparms; + hpb.ioParam.ioReqCount = sizeof(volparms); + + if(PBHGetVolParmsSync(&hpb) == noErr) { + if(volparms.vMServerAdr == 0) { + if(bsd == (char*)volparms.vMDeviceID) { + pid_t dissenter; + result = FSUnmountVolumeSync(volrefnum, 0, &dissenter); + found = true; + break; + } + } + } + } + index++; + } while(result == noErr); + if(result == noErr && found) + return true; + +#endif return false; } diff --git a/rbutil/rbutilqt/rbutilqt.cpp b/rbutil/rbutilqt/rbutilqt.cpp index aa0c365..0cdd836 100644 --- a/rbutil/rbutilqt/rbutilqt.cpp +++ b/rbutil/rbutilqt/rbutilqt.cpp @@ -111,7 +111,7 @@ RbUtilQt::RbUtilQt(QWidget *parent) : QMainWindow(parent) } #endif -#if !defined(Q_OS_WIN32) +#if !defined(Q_OS_WIN32) && !defined(Q_OS_MACX) /* eject funtionality is only implemented on W32 right now. */ ui.buttonEject->setEnabled(false); #endif |