Lines Matching full:drive
54 int CheckValid(const struct drive *drive) {
55 if ((drive->gpt.valid_headers != MASK_BOTH) ||
56 (drive->gpt.valid_entries != MASK_BOTH)) {
63 int Load(struct drive *drive, uint8_t **buf,
86 if (-1 == lseek(drive->fd, sector * sector_bytes, SEEK_SET)) {
91 nread = read(drive->fd, *buf, count);
106 int ReadPMBR(struct drive *drive) {
107 if (-1 == lseek(drive->fd, 0, SEEK_SET))
110 int nread = read(drive->fd, &drive->pmbr, sizeof(struct pmbr));
117 int WritePMBR(struct drive *drive) {
118 if (-1 == lseek(drive->fd, 0, SEEK_SET))
121 int nwrote = write(drive->fd, &drive->pmbr, sizeof(struct pmbr));
128 int Save(struct drive *drive, const uint8_t *buf,
138 if (-1 == lseek(drive->fd, sector * sector_bytes, SEEK_SET))
141 nwrote = write(drive->fd, buf, count);
148 static int GptLoad(struct drive *drive, uint32_t sector_bytes) {
149 drive->gpt.sector_bytes = sector_bytes;
150 if (drive->size % drive->gpt.sector_bytes) {
152 (long long unsigned int)drive->size, drive->gpt.sector_bytes);
155 drive->gpt.streaming_drive_sectors = drive->size / drive->gpt.sector_bytes;
158 if (!(drive->gpt.flags & GPT_FLAG_EXTERNAL)) {
159 drive->gpt.gpt_drive_sectors = drive->gpt.streaming_drive_sectors;
163 if (CGPT_OK != Load(drive, &drive->gpt.primary_header,
165 drive->gpt.sector_bytes, GPT_HEADER_SECTORS)) {
169 if (CGPT_OK != Load(drive, &drive->gpt.secondary_header,
170 drive->gpt.gpt_drive_sectors - GPT_PMBR_SECTORS,
171 drive->gpt.sector_bytes, GPT_HEADER_SECTORS)) {
175 GptHeader* primary_header = (GptHeader*)drive->gpt.primary_header;
176 if (CheckHeader(primary_header, 0, drive->gpt.streaming_drive_sectors,
177 drive->gpt.gpt_drive_sectors,
178 drive->gpt.flags) == 0) {
179 if (CGPT_OK != Load(drive, &drive->gpt.primary_entries,
181 drive->gpt.sector_bytes,
189 GptHeader* secondary_header = (GptHeader*)drive->gpt.secondary_header;
190 if (CheckHeader(secondary_header, 1, drive->gpt.streaming_drive_sectors,
191 drive->gpt.gpt_drive_sectors,
192 drive->gpt.flags) == 0) {
193 if (CGPT_OK != Load(drive, &drive->gpt.secondary_entries,
195 drive->gpt.sector_bytes,
206 static int GptSave(struct drive *drive) {
208 if (drive->gpt.modified & GPT_MODIFIED_HEADER1) {
209 if (CGPT_OK != Save(drive, drive->gpt.primary_header,
211 drive->gpt.sector_bytes, GPT_HEADER_SECTORS)) {
217 if (drive->gpt.modified & GPT_MODIFIED_HEADER2) {
218 if(CGPT_OK != Save(drive, drive->gpt.secondary_header,
219 drive->gpt.gpt_drive_sectors - GPT_PMBR_SECTORS,
220 drive->gpt.sector_bytes, GPT_HEADER_SECTORS)) {
225 GptHeader* primary_header = (GptHeader*)drive->gpt.primary_header;
226 if (drive->gpt.modified & GPT_MODIFIED_ENTRIES1) {
227 if (CGPT_OK != Save(drive, drive->gpt.primary_entries,
229 drive->gpt.sector_bytes,
235 GptHeader* secondary_header = (GptHeader*)drive->gpt.secondary_header;
236 if (drive->gpt.modified & GPT_MODIFIED_ENTRIES2) {
237 if (CGPT_OK != Save(drive, drive->gpt.secondary_entries,
239 drive->gpt.sector_bytes,
246 if (drive->gpt.primary_header)
247 free(drive->gpt.primary_header);
248 drive->gpt.primary_header = 0;
249 if (drive->gpt.primary_entries)
250 free(drive->gpt.primary_entries);
251 drive->gpt.primary_entries = 0;
252 if (drive->gpt.secondary_header)
253 free(drive->gpt.secondary_header);
254 drive->gpt.secondary_header = 0;
255 if (drive->gpt.secondary_entries)
256 free(drive->gpt.secondary_entries);
257 drive->gpt.secondary_entries = 0;
262 * Query drive size and bytes per sector. Return zero on success. On error,
289 int DriveOpen(const char *drive_path, struct drive *drive, int mode,
294 require(drive);
297 memset(drive, 0, sizeof(struct drive));
299 drive->fd = open(drive_path, mode |
304 if (drive->fd == -1) {
311 if (ObtainDriveSize(drive->fd, &gpt_drive_size, §or_bytes) != 0) {
312 Error("Can't get drive size and bytes per sector for %s: %s\n",
317 drive->gpt.gpt_drive_sectors = gpt_drive_size / sector_bytes;
319 drive->size = gpt_drive_size;
320 drive->gpt.flags = 0;
322 drive->size = drive_size;
323 drive->gpt.flags = GPT_FLAG_EXTERNAL;
327 if (GptLoad(drive, sector_bytes)) {
335 (void) DriveClose(drive, 0);
340 int DriveClose(struct drive *drive, int update_as_needed) {
344 if (GptSave(drive)) {
352 fsync(drive->fd);
354 close(drive->fd);
697 uint32_t GetNumberOfEntries(const struct drive *drive) {
698 GptHeader *header = GetGptHeader(&drive->gpt);
729 void SetPriority(struct drive *drive, int secondary, uint32_t entry_index,
733 entry = GetEntry(&drive->gpt, secondary, entry_index);
737 int GetPriority(struct drive *drive, int secondary, uint32_t entry_index) {
739 entry = GetEntry(&drive->gpt, secondary, entry_index);
743 void SetTries(struct drive *drive, int secondary, uint32_t entry_index,
747 entry = GetEntry(&drive->gpt, secondary, entry_index);
751 int GetTries(struct drive *drive, int secondary, uint32_t entry_index) {
753 entry = GetEntry(&drive->gpt, secondary, entry_index);
757 void SetSuccessful(struct drive *drive, int secondary, uint32_t entry_index,
761 entry = GetEntry(&drive->gpt, secondary, entry_index);
765 int GetSuccessful(struct drive *drive, int secondary, uint32_t entry_index) {
767 entry = GetEntry(&drive->gpt, secondary, entry_index);
771 void SetRaw(struct drive *drive, int secondary, uint32_t entry_index,
774 entry = GetEntry(&drive->gpt, secondary, entry_index);
778 void UpdateAllEntries(struct drive *drive) {
779 RepairEntries(&drive->gpt, MASK_PRIMARY);
780 RepairHeader(&drive->gpt, MASK_PRIMARY);
782 drive->gpt.modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 |
784 UpdateCrc(&drive->gpt);
787 int IsUnused(struct drive *drive, int secondary, uint32_t index) {
789 entry = GetEntry(&drive->gpt, secondary, index);
793 int IsKernel(struct drive *drive, int secondary, uint32_t index) {
795 entry = GetEntry(&drive->gpt, secondary, index);
957 primary_header->my_lba = GPT_PMBR_SECTORS; /* the second sector on drive */
968 struct drive drive;
975 if (CGPT_OK != DriveOpen(params->drive_name, &drive, O_RDONLY,
979 if (GPT_SUCCESS != (gpt_retval = GptSanityCheck(&drive.gpt))) {
987 int numEntries = GetNumberOfEntries(&drive);
990 GptEntry *entry = GetEntry(&drive.gpt, ANY_VALID, i);
1000 DriveClose(&drive, 0);