int main(int argc, char** argv) { dev_t volumeDevice = dev_for_path("."); uint32 isVolumeFlags = 0; fs_info volumeInfo; bool doPartitionReadOnlyCheck = false; for (int i = 1; i < argc; i++) { if (!strcmp(argv[i], "--help")) { usage(); return 0; } if (argv[i][0] == '-') { if (strcmp(argv[i], "-readonly") == 0) isVolumeFlags |= B_FS_IS_READONLY; else if (strcmp(argv[i], "-query") == 0) isVolumeFlags |= B_FS_HAS_QUERY; else if (strcmp(argv[i], "-attribute") == 0) isVolumeFlags |= B_FS_HAS_ATTR; else if (strcmp(argv[i], "-mime") == 0) isVolumeFlags |= B_FS_HAS_MIME; else if (strcmp(argv[i], "-shared") == 0) isVolumeFlags |= B_FS_IS_SHARED; else if (strcmp(argv[i], "-persistent") == 0) isVolumeFlags |= B_FS_IS_PERSISTENT; else if (strcmp(argv[i], "-removable") == 0) isVolumeFlags |= B_FS_IS_REMOVABLE; else if (strcmp(argv[i], "-readonly-partion")) doPartitionReadOnlyCheck = true; else { fprintf(stderr, "%s: option %s is not understood (use --help for help)\n", argv[0], argv[i]); return 1; } } else { volumeDevice = dev_for_path(argv[i]); if (volumeDevice < 0) { fprintf(stderr, "%s: can't get information about volume: %s\n", argv[0], argv[i]); return 1; } } } if (doPartitionReadOnlyCheck) { // This requires an extra code-path, because volumes may now appear // writable, but only because of the "write" file-system overlay. BVolume volume(volumeDevice); status_t ret = volume.InitCheck(); if (ret != B_OK) { fprintf(stderr, "%s: failed to get BVolume for device %ld: %s\n", argv[0], volumeDevice, strerror(ret)); return 1; } BDiskDeviceRoster roster; BDiskDevice diskDevice; BPartition* partition; ret = roster.FindPartitionByVolume(volume, &diskDevice, &partition); if (ret != B_OK) { fprintf(stderr, "%s: failed to get partition for device %ld: %s\n", argv[0], volumeDevice, strerror(ret)); return 1; } // check this option directly and not via fs_stat_dev() if (partition->IsReadOnly()) { printf("yes\n"); return 0; } } if (fs_stat_dev(volumeDevice, &volumeInfo) == B_OK) { if (volumeInfo.flags & isVolumeFlags) printf("yes\n"); else printf("no\n"); return 0; } else { fprintf(stderr, "%s: can't get information about dev_t: %ld\n", argv[0], volumeDevice); return 1; } }
void MainWindow::_UpdateMenus(BDiskDevice* disk, partition_id selectedPartition, partition_id parentID) { while (BMenuItem* item = fFormatMenu->RemoveItem(0L)) delete item; while (BMenuItem* item = fDiskInitMenu->RemoveItem(0L)) delete item; fCreateMI->SetEnabled(false); fUnmountMI->SetEnabled(false); fDiskInitMenu->SetEnabled(false); fFormatMenu->SetEnabled(false); if (!disk) { fWipeMI->SetEnabled(false); fEjectMI->SetEnabled(false); fSurfaceTestMI->SetEnabled(false); } else { // fWipeMI->SetEnabled(true); fWipeMI->SetEnabled(false); fEjectMI->SetEnabled(disk->IsRemovableMedia()); // fSurfaceTestMI->SetEnabled(true); fSurfaceTestMI->SetEnabled(false); // Create menu and items BPartition* parentPartition = NULL; if (selectedPartition <= -2) { // a partitionable space item is selected parentPartition = disk->FindDescendant(parentID); } if (parentPartition && parentPartition->ContainsPartitioningSystem()) fCreateMI->SetEnabled(true); bool prepared = disk->PrepareModifications() == B_OK; fFormatMenu->SetEnabled(prepared); fDeleteMI->SetEnabled(prepared); BPartition* partition = disk->FindDescendant(selectedPartition); BDiskSystem diskSystem; fDDRoster.RewindDiskSystems(); while (fDDRoster.GetNextDiskSystem(&diskSystem) == B_OK) { if (!diskSystem.SupportsInitializing()) continue; BMessage* message = new BMessage(MSG_INITIALIZE); message->AddInt32("parent id", parentID); message->AddString("disk system", diskSystem.PrettyName()); BString label = diskSystem.PrettyName(); label << B_UTF8_ELLIPSIS; BMenuItem* item = new BMenuItem(label.String(), message); // TODO: Very unintuitive that we have to use PrettyName (vs Name) item->SetEnabled(partition != NULL && partition->CanInitialize(diskSystem.PrettyName())); if (disk->ID() == selectedPartition && !diskSystem.IsFileSystem()) { // Disk is selected, and DiskSystem is a partition map fDiskInitMenu->AddItem(item); } else if (diskSystem.IsFileSystem()) { // Otherwise a filesystem fFormatMenu->AddItem(item); } } // Mount items if (partition) { fFormatMenu->SetEnabled(!partition->IsMounted() && !partition->IsReadOnly() && partition->Device()->HasMedia() && fFormatMenu->CountItems() > 0); fDiskInitMenu->SetEnabled(!partition->IsMounted() && !partition->IsReadOnly() && partition->Device()->HasMedia() && partition->IsDevice() && fDiskInitMenu->CountItems() > 0); fDeleteMI->SetEnabled(!partition->IsMounted() && !partition->IsDevice()); fMountMI->SetEnabled(!partition->IsMounted()); bool unMountable = false; if (partition->IsMounted()) { // see if this partition is the boot volume BVolume volume; BVolume bootVolume; if (BVolumeRoster().GetBootVolume(&bootVolume) == B_OK && partition->GetVolume(&volume) == B_OK) { unMountable = volume != bootVolume; } else unMountable = true; } fUnmountMI->SetEnabled(unMountable); } else { fDeleteMI->SetEnabled(false); fMountMI->SetEnabled(false); fFormatMenu->SetEnabled(false); fDiskInitMenu->SetEnabled(false); } if (prepared) disk->CancelModifications(); fMountAllMI->SetEnabled(true); } if (selectedPartition < 0) { fDeleteMI->SetEnabled(false); fMountMI->SetEnabled(false); } }