xref: /aosp_15_r20/external/vboot_reference/cgpt/cgpt_edit.c (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2018 The ChromiumOS Authors
2*8617a60dSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
3*8617a60dSAndroid Build Coastguard Worker  * found in the LICENSE file.
4*8617a60dSAndroid Build Coastguard Worker  */
5*8617a60dSAndroid Build Coastguard Worker 
6*8617a60dSAndroid Build Coastguard Worker #include "cgpt.h"
7*8617a60dSAndroid Build Coastguard Worker #include "cgptlib_internal.h"
8*8617a60dSAndroid Build Coastguard Worker #include "cgpt_params.h"
9*8617a60dSAndroid Build Coastguard Worker #include "vboot_host.h"
10*8617a60dSAndroid Build Coastguard Worker 
CgptEdit(CgptEditParams * params)11*8617a60dSAndroid Build Coastguard Worker int CgptEdit(CgptEditParams *params) {
12*8617a60dSAndroid Build Coastguard Worker   struct drive drive;
13*8617a60dSAndroid Build Coastguard Worker   GptHeader *h;
14*8617a60dSAndroid Build Coastguard Worker   int gpt_retval;
15*8617a60dSAndroid Build Coastguard Worker 
16*8617a60dSAndroid Build Coastguard Worker   if (params == NULL)
17*8617a60dSAndroid Build Coastguard Worker     return CGPT_FAILED;
18*8617a60dSAndroid Build Coastguard Worker 
19*8617a60dSAndroid Build Coastguard Worker   if (CGPT_OK != DriveOpen(params->drive_name, &drive, O_RDWR,
20*8617a60dSAndroid Build Coastguard Worker                            params->drive_size))
21*8617a60dSAndroid Build Coastguard Worker     return CGPT_FAILED;
22*8617a60dSAndroid Build Coastguard Worker 
23*8617a60dSAndroid Build Coastguard Worker   if (GPT_SUCCESS != (gpt_retval = GptValidityCheck(&drive.gpt))) {
24*8617a60dSAndroid Build Coastguard Worker     Error("GptValidityCheck() returned %d: %s\n",
25*8617a60dSAndroid Build Coastguard Worker           gpt_retval, GptError(gpt_retval));
26*8617a60dSAndroid Build Coastguard Worker     goto bad;
27*8617a60dSAndroid Build Coastguard Worker   }
28*8617a60dSAndroid Build Coastguard Worker 
29*8617a60dSAndroid Build Coastguard Worker   if (CGPT_OK != CheckValid(&drive)) {
30*8617a60dSAndroid Build Coastguard Worker     Error("Please run 'cgpt repair' before changing settings.\n");
31*8617a60dSAndroid Build Coastguard Worker     goto bad;
32*8617a60dSAndroid Build Coastguard Worker   }
33*8617a60dSAndroid Build Coastguard Worker 
34*8617a60dSAndroid Build Coastguard Worker   h = (GptHeader *)drive.gpt.primary_header;
35*8617a60dSAndroid Build Coastguard Worker   if (params->set_unique) {
36*8617a60dSAndroid Build Coastguard Worker     memcpy(&h->disk_uuid, &params->unique_guid, sizeof(h->disk_uuid));
37*8617a60dSAndroid Build Coastguard Worker   }
38*8617a60dSAndroid Build Coastguard Worker   // Copy to secondary
39*8617a60dSAndroid Build Coastguard Worker   RepairHeader(&drive.gpt, MASK_PRIMARY);
40*8617a60dSAndroid Build Coastguard Worker   drive.gpt.modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_HEADER2);
41*8617a60dSAndroid Build Coastguard Worker 
42*8617a60dSAndroid Build Coastguard Worker   UpdateCrc(&drive.gpt);
43*8617a60dSAndroid Build Coastguard Worker 
44*8617a60dSAndroid Build Coastguard Worker   // Write it all out.
45*8617a60dSAndroid Build Coastguard Worker   return DriveClose(&drive, 1);
46*8617a60dSAndroid Build Coastguard Worker 
47*8617a60dSAndroid Build Coastguard Worker bad:
48*8617a60dSAndroid Build Coastguard Worker 
49*8617a60dSAndroid Build Coastguard Worker   DriveClose(&drive, 0);
50*8617a60dSAndroid Build Coastguard Worker   return CGPT_FAILED;
51*8617a60dSAndroid Build Coastguard Worker }
52