1422f8ec3SStefano Ceccherini /* 22d294045SStephan Aßmus * Copyright 2002-2009, Haiku Inc. All rights reserved. 3422f8ec3SStefano Ceccherini * Distributed under the terms of the MIT License. 4422f8ec3SStefano Ceccherini * 5422f8ec3SStefano Ceccherini * Authors: 6422f8ec3SStefano Ceccherini * Jonas Sundstrom, jonas.sundstrom@kirilla.com 72d294045SStephan Aßmus * Stephan Aßmus <superstippi@gmx.de> 8422f8ec3SStefano Ceccherini */ 917049c45SAxel Dörfler 10422f8ec3SStefano Ceccherini #include <fs_info.h> 11422f8ec3SStefano Ceccherini 1217049c45SAxel Dörfler #include <stdio.h> 1317049c45SAxel Dörfler #include <string.h> 1417049c45SAxel Dörfler 152d294045SStephan Aßmus #include <DiskDevice.h> 162d294045SStephan Aßmus #include <DiskDeviceRoster.h> 172d294045SStephan Aßmus #include <Volume.h> 182d294045SStephan Aßmus 19191732a4SStefano Ceccherini 20191732a4SStefano Ceccherini static void 21191732a4SStefano Ceccherini usage() 22191732a4SStefano Ceccherini { 23191732a4SStefano Ceccherini fprintf(stderr, 24191732a4SStefano Ceccherini "Usage: isvolume {-OPTION} [volumename]\n" 25191732a4SStefano Ceccherini " Where OPTION is one of:\n" 26191732a4SStefano Ceccherini " -readonly - volume is read-only\n" 272d294045SStephan Aßmus " -readonly-partion - partition for the volume is read-only\n" 28191732a4SStefano Ceccherini " -query - volume supports queries\n" 29191732a4SStefano Ceccherini " -attribute - volume supports attributes\n" 30191732a4SStefano Ceccherini " -mime - volume supports MIME information\n" 31191732a4SStefano Ceccherini " -shared - volume is shared\n" 32191732a4SStefano Ceccherini " -persistent - volume is backed on permanent storage\n" 33191732a4SStefano Ceccherini " -removable - volume is on removable media\n" 34191732a4SStefano Ceccherini " If the option is true for the named volume, 'yes' is printed\n" 35191732a4SStefano Ceccherini " and if the option is false, 'no' is printed. Multiple options\n" 36191732a4SStefano Ceccherini " can be specified in which case all of them must be true.\n\n" 372d294045SStephan Aßmus " If no volume is specified, the volume of the current directory is " 382d294045SStephan Aßmus "assumed.\n"); 39191732a4SStefano Ceccherini } 40191732a4SStefano Ceccherini 4117049c45SAxel Dörfler 42422f8ec3SStefano Ceccherini int 43aacebf53SMichael Lotz main(int argc, char** argv) 44422f8ec3SStefano Ceccherini { 45422f8ec3SStefano Ceccherini dev_t volumeDevice = dev_for_path("."); 46422f8ec3SStefano Ceccherini uint32 isVolumeFlags = 0; 47422f8ec3SStefano Ceccherini fs_info volumeInfo; 482d294045SStephan Aßmus bool doPartitionReadOnlyCheck = false; 4917049c45SAxel Dörfler 50422f8ec3SStefano Ceccherini for (int i = 1; i < argc; i++) { 51422f8ec3SStefano Ceccherini if (!strcmp(argv[i], "--help")) { 52191732a4SStefano Ceccherini usage(); 53422f8ec3SStefano Ceccherini return 0; 5417049c45SAxel Dörfler } 5517049c45SAxel Dörfler 56422f8ec3SStefano Ceccherini if (argv[i][0] == '-') { 572d294045SStephan Aßmus if (strcmp(argv[i], "-readonly") == 0) 58422f8ec3SStefano Ceccherini isVolumeFlags |= B_FS_IS_READONLY; 592d294045SStephan Aßmus else if (strcmp(argv[i], "-query") == 0) 60422f8ec3SStefano Ceccherini isVolumeFlags |= B_FS_HAS_QUERY; 612d294045SStephan Aßmus else if (strcmp(argv[i], "-attribute") == 0) 62422f8ec3SStefano Ceccherini isVolumeFlags |= B_FS_HAS_ATTR; 632d294045SStephan Aßmus else if (strcmp(argv[i], "-mime") == 0) 64422f8ec3SStefano Ceccherini isVolumeFlags |= B_FS_HAS_MIME; 652d294045SStephan Aßmus else if (strcmp(argv[i], "-shared") == 0) 66422f8ec3SStefano Ceccherini isVolumeFlags |= B_FS_IS_SHARED; 672d294045SStephan Aßmus else if (strcmp(argv[i], "-persistent") == 0) 68422f8ec3SStefano Ceccherini isVolumeFlags |= B_FS_IS_PERSISTENT; 692d294045SStephan Aßmus else if (strcmp(argv[i], "-removable") == 0) 70422f8ec3SStefano Ceccherini isVolumeFlags |= B_FS_IS_REMOVABLE; 712d294045SStephan Aßmus else if (strcmp(argv[i], "-readonly-partion")) 722d294045SStephan Aßmus doPartitionReadOnlyCheck = true; 73422f8ec3SStefano Ceccherini else { 74422f8ec3SStefano Ceccherini fprintf(stderr, 752d294045SStephan Aßmus "%s: option %s is not understood (use --help for help)\n", 762d294045SStephan Aßmus argv[0], argv[i]); 7713b0cc8cSStefano Ceccherini return 1; 7817049c45SAxel Dörfler } 79422f8ec3SStefano Ceccherini } else { 80422f8ec3SStefano Ceccherini volumeDevice = dev_for_path(argv[i]); 8117049c45SAxel Dörfler 82422f8ec3SStefano Ceccherini if (volumeDevice < 0) { 832d294045SStephan Aßmus fprintf(stderr, "%s: can't get information about volume: %s\n", 842d294045SStephan Aßmus argv[0], argv[i]); 8513b0cc8cSStefano Ceccherini return 1; 8617049c45SAxel Dörfler } 8717049c45SAxel Dörfler } 8817049c45SAxel Dörfler } 8917049c45SAxel Dörfler 902d294045SStephan Aßmus if (doPartitionReadOnlyCheck) { 912d294045SStephan Aßmus // This requires an extra code-path, because volumes may now appear 922d294045SStephan Aßmus // writable, but only because of the "write" file-system overlay. 932d294045SStephan Aßmus BVolume volume(volumeDevice); 942d294045SStephan Aßmus status_t ret = volume.InitCheck(); 952d294045SStephan Aßmus if (ret != B_OK) { 96*8110732bSAlex Smith fprintf(stderr, "%s: failed to get BVolume for device %" B_PRIdDEV 97*8110732bSAlex Smith ": %s\n", argv[0], volumeDevice, strerror(ret)); 982d294045SStephan Aßmus return 1; 992d294045SStephan Aßmus } 1002d294045SStephan Aßmus 1012d294045SStephan Aßmus BDiskDeviceRoster roster; 1022d294045SStephan Aßmus BDiskDevice diskDevice; 1032d294045SStephan Aßmus BPartition* partition; 1045be48305SStephan Aßmus ret = roster.FindPartitionByVolume(volume, &diskDevice, &partition); 1052d294045SStephan Aßmus if (ret != B_OK) { 106*8110732bSAlex Smith fprintf(stderr, "%s: failed to get partition for device %" B_PRIdDEV 107*8110732bSAlex Smith ": %s\n", argv[0], volumeDevice, strerror(ret)); 1082d294045SStephan Aßmus return 1; 1092d294045SStephan Aßmus } 1102d294045SStephan Aßmus // check this option directly and not via fs_stat_dev() 1112d294045SStephan Aßmus if (partition->IsReadOnly()) { 1122d294045SStephan Aßmus printf("yes\n"); 1132d294045SStephan Aßmus return 0; 1142d294045SStephan Aßmus } 1152d294045SStephan Aßmus } 1162d294045SStephan Aßmus 117422f8ec3SStefano Ceccherini if (fs_stat_dev(volumeDevice, &volumeInfo) == B_OK) { 118422f8ec3SStefano Ceccherini if (volumeInfo.flags & isVolumeFlags) 11917049c45SAxel Dörfler printf("yes\n"); 12017049c45SAxel Dörfler else 12117049c45SAxel Dörfler printf("no\n"); 12217049c45SAxel Dörfler 123422f8ec3SStefano Ceccherini return 0; 124422f8ec3SStefano Ceccherini } else { 125*8110732bSAlex Smith fprintf(stderr, "%s: can't get information about dev_t: %" B_PRIdDEV 126*8110732bSAlex Smith "\n", argv[0], volumeDevice); 12713b0cc8cSStefano Ceccherini return 1; 12817049c45SAxel Dörfler } 12917049c45SAxel Dörfler } 130