Lines Matching refs:drive

70 int CheckValid(const struct drive *drive) {  in CheckValid()  argument
71 if ((drive->gpt.valid_headers != MASK_BOTH) || in CheckValid()
72 (drive->gpt.valid_entries != MASK_BOTH)) { in CheckValid()
79 int Load(struct drive *drive, uint8_t *buf, in Load() argument
100 if (-1 == lseek(drive->fd, sector * sector_bytes, SEEK_SET)) { in Load()
105 nread = read(drive->fd, buf, count); in Load()
115 int ReadPMBR(struct drive *drive) { in ReadPMBR() argument
116 if (-1 == lseek(drive->fd, 0, SEEK_SET)) in ReadPMBR()
119 int nread = read(drive->fd, &drive->pmbr, sizeof(struct pmbr)); in ReadPMBR()
126 int WritePMBR(struct drive *drive) { in WritePMBR() argument
127 if (-1 == lseek(drive->fd, 0, SEEK_SET)) in WritePMBR()
130 int nwrote = write(drive->fd, &drive->pmbr, sizeof(struct pmbr)); in WritePMBR()
137 int Save(struct drive *drive, const uint8_t *buf, in Save() argument
147 if (-1 == lseek(drive->fd, sector * sector_bytes, SEEK_SET)) in Save()
150 nwrote = write(drive->fd, buf, count); in Save()
157 static int GptLoad(struct drive *drive, uint32_t sector_bytes) { in GptLoad() argument
158 drive->gpt.sector_bytes = sector_bytes; in GptLoad()
159 if (drive->size % drive->gpt.sector_bytes) { in GptLoad()
161 (long long unsigned int)drive->size, drive->gpt.sector_bytes); in GptLoad()
164 drive->gpt.streaming_drive_sectors = drive->size / drive->gpt.sector_bytes; in GptLoad()
166 drive->gpt.primary_header = malloc(drive->gpt.sector_bytes); in GptLoad()
167 drive->gpt.secondary_header = malloc(drive->gpt.sector_bytes); in GptLoad()
168 drive->gpt.primary_entries = malloc(GPT_ENTRIES_ALLOC_SIZE); in GptLoad()
169 drive->gpt.secondary_entries = malloc(GPT_ENTRIES_ALLOC_SIZE); in GptLoad()
170 if (!drive->gpt.primary_header || !drive->gpt.secondary_header || in GptLoad()
171 !drive->gpt.primary_entries || !drive->gpt.secondary_entries) in GptLoad()
175 if (!(drive->gpt.flags & GPT_FLAG_EXTERNAL)) { in GptLoad()
176 drive->gpt.gpt_drive_sectors = drive->gpt.streaming_drive_sectors; in GptLoad()
180 if (CGPT_OK != Load(drive, drive->gpt.primary_header, in GptLoad()
182 drive->gpt.sector_bytes, GPT_HEADER_SECTORS)) { in GptLoad()
186 if (CGPT_OK != Load(drive, drive->gpt.secondary_header, in GptLoad()
187 drive->gpt.gpt_drive_sectors - GPT_PMBR_SECTORS, in GptLoad()
188 drive->gpt.sector_bytes, GPT_HEADER_SECTORS)) { in GptLoad()
192 GptHeader* primary_header = (GptHeader*)drive->gpt.primary_header; in GptLoad()
193 if (CheckHeader(primary_header, 0, drive->gpt.streaming_drive_sectors, in GptLoad()
194 drive->gpt.gpt_drive_sectors, in GptLoad()
195 drive->gpt.flags, in GptLoad()
196 drive->gpt.sector_bytes) == 0) { in GptLoad()
197 if (CGPT_OK != Load(drive, drive->gpt.primary_entries, in GptLoad()
199 drive->gpt.sector_bytes, in GptLoad()
201 drive->gpt.sector_bytes))) { in GptLoad()
210 GptHeader* secondary_header = (GptHeader*)drive->gpt.secondary_header; in GptLoad()
211 if (CheckHeader(secondary_header, 1, drive->gpt.streaming_drive_sectors, in GptLoad()
212 drive->gpt.gpt_drive_sectors, in GptLoad()
213 drive->gpt.flags, in GptLoad()
214 drive->gpt.sector_bytes) == 0) { in GptLoad()
215 if (CGPT_OK != Load(drive, drive->gpt.secondary_entries, in GptLoad()
217 drive->gpt.sector_bytes, in GptLoad()
219 drive->gpt.sector_bytes))) { in GptLoad()
231 static int GptSave(struct drive *drive) { in GptSave() argument
234 if (!(drive->gpt.ignored & MASK_PRIMARY)) { in GptSave()
235 if (drive->gpt.modified & GPT_MODIFIED_HEADER1) { in GptSave()
236 if (CGPT_OK != Save(drive, drive->gpt.primary_header, in GptSave()
238 drive->gpt.sector_bytes, GPT_HEADER_SECTORS)) { in GptSave()
243 GptHeader* primary_header = (GptHeader*)drive->gpt.primary_header; in GptSave()
244 if (drive->gpt.modified & GPT_MODIFIED_ENTRIES1) { in GptSave()
245 if (CGPT_OK != Save(drive, drive->gpt.primary_entries, in GptSave()
247 drive->gpt.sector_bytes, in GptSave()
249 drive->gpt.sector_bytes))) { in GptSave()
256 if (drive->gpt.modified & (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1)) in GptSave()
257 if (fsync(drive->fd) < 0 && errno == EIO) { in GptSave()
264 if (!errors && !(drive->gpt.ignored & MASK_SECONDARY)) { in GptSave()
265 if (drive->gpt.modified & GPT_MODIFIED_HEADER2) { in GptSave()
266 if (CGPT_OK != Save(drive, drive->gpt.secondary_header, in GptSave()
267 drive->gpt.gpt_drive_sectors - GPT_PMBR_SECTORS, in GptSave()
268 drive->gpt.sector_bytes, GPT_HEADER_SECTORS)) { in GptSave()
273 GptHeader* secondary_header = (GptHeader*)drive->gpt.secondary_header; in GptSave()
274 if (drive->gpt.modified & GPT_MODIFIED_ENTRIES2) { in GptSave()
275 if (CGPT_OK != Save(drive, drive->gpt.secondary_entries, in GptSave()
277 drive->gpt.sector_bytes, in GptSave()
279 drive->gpt.sector_bytes))) { in GptSave()
317 int DriveOpen(const char *drive_path, struct drive *drive, int mode, in DriveOpen() argument
322 require(drive); in DriveOpen()
325 memset(drive, 0, sizeof(struct drive)); in DriveOpen()
327 drive->fd = open(drive_path, mode | in DriveOpen()
332 if (drive->fd == -1) { in DriveOpen()
338 if (ObtainDriveSize(drive->fd, &gpt_drive_size, &sector_bytes) != 0) { in DriveOpen()
344 drive->gpt.gpt_drive_sectors = gpt_drive_size / sector_bytes; in DriveOpen()
346 drive->size = gpt_drive_size; in DriveOpen()
347 drive->gpt.flags = 0; in DriveOpen()
349 drive->size = drive_size; in DriveOpen()
350 drive->gpt.flags = GPT_FLAG_EXTERNAL; in DriveOpen()
354 if (GptLoad(drive, sector_bytes)) { in DriveOpen()
362 (void) DriveClose(drive, 0); in DriveOpen()
367 int DriveClose(struct drive *drive, int update_as_needed) { in DriveClose() argument
371 if (GptSave(drive)) { in DriveClose()
376 free(drive->gpt.primary_header); in DriveClose()
377 drive->gpt.primary_header = NULL; in DriveClose()
378 free(drive->gpt.primary_entries); in DriveClose()
379 drive->gpt.primary_entries = NULL; in DriveClose()
380 free(drive->gpt.secondary_header); in DriveClose()
381 drive->gpt.secondary_header = NULL; in DriveClose()
382 free(drive->gpt.secondary_entries); in DriveClose()
383 drive->gpt.secondary_entries = NULL; in DriveClose()
388 fsync(drive->fd); in DriveClose()
390 close(drive->fd); in DriveClose()
739 uint32_t GetNumberOfEntries(const struct drive *drive) { in GetNumberOfEntries() argument
740 GptHeader *header = GetGptHeader(&drive->gpt); in GetNumberOfEntries()
771 void SetRequired(struct drive *drive, int secondary, uint32_t entry_index, in SetRequired() argument
775 entry = GetEntry(&drive->gpt, secondary, entry_index); in SetRequired()
779 int GetRequired(struct drive *drive, int secondary, uint32_t entry_index) { in GetRequired() argument
781 entry = GetEntry(&drive->gpt, secondary, entry_index); in GetRequired()
785 void SetLegacyBoot(struct drive *drive, int secondary, uint32_t entry_index, in SetLegacyBoot() argument
789 entry = GetEntry(&drive->gpt, secondary, entry_index); in SetLegacyBoot()
793 int GetLegacyBoot(struct drive *drive, int secondary, uint32_t entry_index) { in GetLegacyBoot() argument
795 entry = GetEntry(&drive->gpt, secondary, entry_index); in GetLegacyBoot()
799 void SetPriority(struct drive *drive, int secondary, uint32_t entry_index, in SetPriority() argument
803 entry = GetEntry(&drive->gpt, secondary, entry_index); in SetPriority()
807 int GetPriority(struct drive *drive, int secondary, uint32_t entry_index) { in GetPriority() argument
809 entry = GetEntry(&drive->gpt, secondary, entry_index); in GetPriority()
813 void SetTries(struct drive *drive, int secondary, uint32_t entry_index, in SetTries() argument
817 entry = GetEntry(&drive->gpt, secondary, entry_index); in SetTries()
821 int GetTries(struct drive *drive, int secondary, uint32_t entry_index) { in GetTries() argument
823 entry = GetEntry(&drive->gpt, secondary, entry_index); in GetTries()
827 void SetSuccessful(struct drive *drive, int secondary, uint32_t entry_index, in SetSuccessful() argument
831 entry = GetEntry(&drive->gpt, secondary, entry_index); in SetSuccessful()
835 int GetSuccessful(struct drive *drive, int secondary, uint32_t entry_index) { in GetSuccessful() argument
837 entry = GetEntry(&drive->gpt, secondary, entry_index); in GetSuccessful()
841 void SetErrorCounter(struct drive *drive, int secondary, uint32_t entry_index, in SetErrorCounter() argument
846 entry = GetEntry(&drive->gpt, secondary, entry_index); in SetErrorCounter()
850 int GetErrorCounter(struct drive *drive, int secondary, uint32_t entry_index) { in GetErrorCounter() argument
852 entry = GetEntry(&drive->gpt, secondary, entry_index); in GetErrorCounter()
856 void SetRaw(struct drive *drive, int secondary, uint32_t entry_index, in SetRaw() argument
859 entry = GetEntry(&drive->gpt, secondary, entry_index); in SetRaw()
863 void UpdateAllEntries(struct drive *drive) { in UpdateAllEntries() argument
864 RepairEntries(&drive->gpt, MASK_PRIMARY); in UpdateAllEntries()
865 RepairHeader(&drive->gpt, MASK_PRIMARY); in UpdateAllEntries()
867 drive->gpt.modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 | in UpdateAllEntries()
869 UpdateCrc(&drive->gpt); in UpdateAllEntries()
872 int IsUnused(struct drive *drive, int secondary, uint32_t index) { in IsUnused() argument
874 entry = GetEntry(&drive->gpt, secondary, index); in IsUnused()
878 int IsKernel(struct drive *drive, int secondary, uint32_t index) { in IsKernel() argument
880 entry = GetEntry(&drive->gpt, secondary, index); in IsKernel()
1053 struct drive drive; in CgptGetNumNonEmptyPartitions() local
1060 if (CGPT_OK != DriveOpen(params->drive_name, &drive, O_RDONLY, in CgptGetNumNonEmptyPartitions()
1064 if (GPT_SUCCESS != (gpt_retval = GptValidityCheck(&drive.gpt))) { in CgptGetNumNonEmptyPartitions()
1072 int numEntries = GetNumberOfEntries(&drive); in CgptGetNumNonEmptyPartitions()
1075 GptEntry *entry = GetEntry(&drive.gpt, ANY_VALID, i); in CgptGetNumNonEmptyPartitions()
1085 DriveClose(&drive, 0); in CgptGetNumNonEmptyPartitions()