1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef __UPDATER_FS_MANAGER_PARTITIONS_H 17 #define __UPDATER_FS_MANAGER_PARTITIONS_H 18 19 #include <fcntl.h> 20 #include <string> 21 #include <vector> 22 #include <sys/types.h> 23 24 25 namespace Updater { 26 #define RD_MODE (O_RDONLY) 27 #define WR_MODE (O_WRONLY) 28 #define RW_MODE (O_RDWR) 29 #define EX_MODE (O_EXCL) 30 31 typedef enum { 32 PARTITION_NEW, 33 PARTITION_OLD, 34 } PartitionChange; 35 36 typedef enum { 37 NORMAL_CHANGE, 38 NOT_CHANGE, 39 NEW_PARTITION, 40 START_CHANGE, 41 LENGTH_CHANGE, 42 PARTNUM_CHANGE, 43 PARTNAME_CHANGE, 44 FSTYPE_CHANGE, 45 } PartitionChangeType; 46 47 typedef enum { 48 GPT, 49 MBR, 50 } DiskType; 51 52 typedef enum { 53 NORMAL, 54 LOGICAL, 55 EXTENDED, 56 } PartitionType; 57 58 typedef enum { 59 DEVICE_UNKNOWN = 0, 60 DEVICE_SCSI = 1, 61 DEVICE_EMMC = 2, 62 } DeviceType; 63 64 /** We can address 2^63 sectors */ 65 typedef off64_t updater_sector_t; 66 67 struct Partition; 68 using PartitonList = std::vector<struct Partition *>; 69 70 struct BlockDevice { 71 std::string devPath; 72 std::string model; // description of hardware(manufacturer, model) 73 DeviceType type; // SCSI, MMC, etc 74 size_t sectorSize; // logical sector size 75 size_t physSectorSize; // physical sector size 76 updater_sector_t length; // device length (LBA) */ 77 bool readOnly; 78 int fd; 79 void *specific; 80 }; 81 82 struct Partition { 83 size_t start; 84 size_t length; 85 int partNum; // Partition number. 86 int partfd; 87 std::string devName; 88 std::string partName; 89 std::string fsType; // File system type, ext4, f2fs etc. 90 PartitionType type; 91 PartitionChangeType changeType; 92 }; 93 94 struct Disk { 95 struct BlockDevice* dev; 96 PartitonList partList; 97 DiskType type; 98 int partsum; 99 }; 100 101 struct BlockSpecific { 102 int fd; 103 int major; 104 int minor; 105 }; 106 107 #define BLOCK_SPECIFIC(dev) ((BlockSpecific*) (dev)->specific) 108 extern int DiskAlloc(const std::string &path); 109 extern int ProbeAllPartitions(); 110 extern Disk *GetRegisterBlockDisk(const std::string &path); 111 extern struct Partition *GetPartition(const Disk &disk, int partn); 112 extern int GetPartitionNumByPartName(const std::string &partname, const PartitonList &plist); 113 extern int DoPartitions(PartitonList &nlist); 114 extern bool SetBlockDeviceMode(BlockDevice &dev); 115 } // Updater 116 #endif // __UPDATER_FS_MANAGER_PARTITIONS_H 117 118