Merge pull request #17076 from poettering/dissect-cleanup
minor cleanups to the dissector code
This commit is contained in:
commit
eb5e26112e
|
@ -1513,7 +1513,7 @@ static int read_mount_options(sd_bus_message *message, sd_bus_error *error, Moun
|
|||
while ((r = sd_bus_message_read(message, "(ss)", &partition, &mount_options)) > 0) {
|
||||
_cleanup_free_ char *previous = NULL, *escaped = NULL;
|
||||
_cleanup_free_ MountOptions *o = NULL;
|
||||
int partition_designator;
|
||||
PartitionDesignator partition_designator;
|
||||
|
||||
if (chars_intersect(mount_options, WHITESPACE))
|
||||
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
|
||||
|
|
|
@ -1483,7 +1483,7 @@ int config_parse_root_image_options(
|
|||
MountOptions *o = NULL;
|
||||
_cleanup_free_ char *mount_options_resolved = NULL;
|
||||
const char *mount_options = NULL, *partition = "root";
|
||||
int partition_designator;
|
||||
PartitionDesignator partition_designator;
|
||||
|
||||
/* Format is either 'root:foo' or 'foo' (root is implied) */
|
||||
if (!isempty(*second)) {
|
||||
|
@ -4946,7 +4946,7 @@ int config_parse_mount_images(
|
|||
for (;;) {
|
||||
_cleanup_free_ char *partition = NULL, *mount_options = NULL, *mount_options_resolved = NULL;
|
||||
MountOptions *o = NULL;
|
||||
int partition_designator;
|
||||
PartitionDesignator partition_designator;
|
||||
|
||||
r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options, NULL);
|
||||
if (r == -ENOMEM)
|
||||
|
|
|
@ -456,7 +456,7 @@ static int action_dissect(DissectedImage *m, LoopDevice *d) {
|
|||
(void) table_set_empty_string(t, "-");
|
||||
(void) table_set_align_percent(t, table_get_cell(t, 0, 7), 100);
|
||||
|
||||
for (unsigned i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
|
||||
for (PartitionDesignator i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
|
||||
DissectedPartition *p = m->partitions + i;
|
||||
|
||||
if (!p->found)
|
||||
|
|
|
@ -325,7 +325,6 @@ int dissect_image(
|
|||
int r, generic_nr;
|
||||
struct stat st;
|
||||
sd_device *q;
|
||||
unsigned i;
|
||||
|
||||
assert(fd >= 0);
|
||||
assert(ret);
|
||||
|
@ -420,7 +419,7 @@ int dissect_image(
|
|||
m->verity = root_hash && verity_data;
|
||||
m->can_verity = !!verity_data;
|
||||
|
||||
options = mount_options_from_part(mount_options, PARTITION_ROOT);
|
||||
options = mount_options_from_designator(mount_options, PARTITION_ROOT);
|
||||
if (options) {
|
||||
o = strdup(options);
|
||||
if (!o)
|
||||
|
@ -504,7 +503,8 @@ int dissect_image(
|
|||
continue;
|
||||
|
||||
if (is_gpt) {
|
||||
int designator = _PARTITION_DESIGNATOR_INVALID, architecture = _ARCHITECTURE_INVALID;
|
||||
PartitionDesignator designator = _PARTITION_DESIGNATOR_INVALID;
|
||||
int architecture = _ARCHITECTURE_INVALID;
|
||||
const char *stype, *sid, *fstype = NULL;
|
||||
sd_id128_t type_id, id;
|
||||
bool rw = true;
|
||||
|
@ -716,7 +716,7 @@ int dissect_image(
|
|||
if (!n)
|
||||
return -ENOMEM;
|
||||
|
||||
options = mount_options_from_part(mount_options, designator);
|
||||
options = mount_options_from_designator(mount_options, designator);
|
||||
if (options) {
|
||||
o = strdup(options);
|
||||
if (!o)
|
||||
|
@ -773,7 +773,7 @@ int dissect_image(
|
|||
if (!n)
|
||||
return -ENOMEM;
|
||||
|
||||
options = mount_options_from_part(mount_options, PARTITION_XBOOTLDR);
|
||||
options = mount_options_from_designator(mount_options, PARTITION_XBOOTLDR);
|
||||
if (options) {
|
||||
o = strdup(options);
|
||||
if (!o)
|
||||
|
@ -827,7 +827,7 @@ int dissect_image(
|
|||
if (multiple_generic)
|
||||
return -ENOTUNIQ;
|
||||
|
||||
options = mount_options_from_part(mount_options, PARTITION_ROOT);
|
||||
options = mount_options_from_designator(mount_options, PARTITION_ROOT);
|
||||
if (options) {
|
||||
o = strdup(options);
|
||||
if (!o)
|
||||
|
@ -866,7 +866,7 @@ int dissect_image(
|
|||
b = NULL;
|
||||
|
||||
/* Fill in file system types if we don't know them yet. */
|
||||
for (i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
|
||||
for (PartitionDesignator i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
|
||||
DissectedPartition *p = m->partitions + i;
|
||||
|
||||
if (!p->found)
|
||||
|
@ -894,12 +894,10 @@ int dissect_image(
|
|||
}
|
||||
|
||||
DissectedImage* dissected_image_unref(DissectedImage *m) {
|
||||
unsigned i;
|
||||
|
||||
if (!m)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
|
||||
for (PartitionDesignator i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
|
||||
free(m->partitions[i].fstype);
|
||||
free(m->partitions[i].node);
|
||||
free(m->partitions[i].decrypted_fstype);
|
||||
|
@ -1557,7 +1555,6 @@ int dissected_image_decrypt(
|
|||
|
||||
#if HAVE_LIBCRYPTSETUP
|
||||
_cleanup_(decrypted_image_unrefp) DecryptedImage *d = NULL;
|
||||
unsigned i;
|
||||
int r;
|
||||
#endif
|
||||
|
||||
|
@ -1585,7 +1582,7 @@ int dissected_image_decrypt(
|
|||
if (!d)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
|
||||
for (PartitionDesignator i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
|
||||
DissectedPartition *p = m->partitions + i;
|
||||
int k;
|
||||
|
||||
|
@ -2039,14 +2036,14 @@ int dissect_image_and_warn(
|
|||
}
|
||||
}
|
||||
|
||||
bool dissected_image_can_do_verity(const DissectedImage *image, unsigned partition_designator) {
|
||||
bool dissected_image_can_do_verity(const DissectedImage *image, PartitionDesignator partition_designator) {
|
||||
if (image->single_file_system)
|
||||
return partition_designator == PARTITION_ROOT && image->can_verity;
|
||||
|
||||
return PARTITION_VERITY_OF(partition_designator) >= 0;
|
||||
}
|
||||
|
||||
bool dissected_image_has_verity(const DissectedImage *image, unsigned partition_designator) {
|
||||
bool dissected_image_has_verity(const DissectedImage *image, PartitionDesignator partition_designator) {
|
||||
int k;
|
||||
|
||||
if (image->single_file_system)
|
||||
|
@ -2068,10 +2065,10 @@ MountOptions* mount_options_free_all(MountOptions *options) {
|
|||
return NULL;
|
||||
}
|
||||
|
||||
const char* mount_options_from_part(const MountOptions *options, int designator) {
|
||||
MountOptions *m;
|
||||
const char* mount_options_from_designator(const MountOptions *options, PartitionDesignator designator) {
|
||||
const MountOptions *m;
|
||||
|
||||
LIST_FOREACH(mount_options, m, (MountOptions *)options)
|
||||
LIST_FOREACH(mount_options, m, options)
|
||||
if (designator == m->partition_designator && !isempty(m->options))
|
||||
return m->options;
|
||||
|
||||
|
@ -2164,4 +2161,4 @@ static const char *const partition_designator_table[] = {
|
|||
[PARTITION_VAR] = "var",
|
||||
};
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP(partition_designator, int);
|
||||
DEFINE_STRING_TABLE_LOOKUP(partition_designator, PartitionDesignator);
|
||||
|
|
|
@ -27,7 +27,7 @@ struct DissectedPartition {
|
|||
char *mount_options;
|
||||
};
|
||||
|
||||
enum {
|
||||
typedef enum PartitionDesignator {
|
||||
PARTITION_ROOT,
|
||||
PARTITION_ROOT_SECONDARY, /* Secondary architecture */
|
||||
PARTITION_HOME,
|
||||
|
@ -41,9 +41,9 @@ enum {
|
|||
PARTITION_VAR,
|
||||
_PARTITION_DESIGNATOR_MAX,
|
||||
_PARTITION_DESIGNATOR_INVALID = -1
|
||||
};
|
||||
} PartitionDesignator;
|
||||
|
||||
static inline int PARTITION_VERITY_OF(int p) {
|
||||
static inline PartitionDesignator PARTITION_VERITY_OF(PartitionDesignator p) {
|
||||
if (p == PARTITION_ROOT)
|
||||
return PARTITION_ROOT_VERITY;
|
||||
if (p == PARTITION_ROOT_SECONDARY)
|
||||
|
@ -87,14 +87,14 @@ struct DissectedImage {
|
|||
};
|
||||
|
||||
struct MountOptions {
|
||||
int partition_designator;
|
||||
PartitionDesignator partition_designator;
|
||||
char *options;
|
||||
LIST_FIELDS(MountOptions, mount_options);
|
||||
};
|
||||
|
||||
MountOptions* mount_options_free_all(MountOptions *options);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(MountOptions*, mount_options_free_all);
|
||||
const char* mount_options_from_part(const MountOptions *options, int designator);
|
||||
const char* mount_options_from_designator(const MountOptions *options, PartitionDesignator designator);
|
||||
|
||||
int probe_filesystem(const char *node, char **ret_fstype);
|
||||
int dissect_image(int fd, const void *root_hash, size_t root_hash_size, const char *verity_data, const MountOptions *mount_options, DissectImageFlags flags, DissectedImage **ret);
|
||||
|
@ -114,11 +114,11 @@ DecryptedImage* decrypted_image_unref(DecryptedImage *p);
|
|||
DEFINE_TRIVIAL_CLEANUP_FUNC(DecryptedImage*, decrypted_image_unref);
|
||||
int decrypted_image_relinquish(DecryptedImage *d);
|
||||
|
||||
const char* partition_designator_to_string(int i) _const_;
|
||||
int partition_designator_from_string(const char *name) _pure_;
|
||||
const char* partition_designator_to_string(PartitionDesignator d) _const_;
|
||||
PartitionDesignator partition_designator_from_string(const char *name) _pure_;
|
||||
|
||||
int verity_metadata_load(const char *image, const char *root_hash_path, void **ret_roothash, size_t *ret_roothash_size, char **ret_verity_data, char **ret_roothashsig);
|
||||
bool dissected_image_can_do_verity(const DissectedImage *image, unsigned partition_designator);
|
||||
bool dissected_image_has_verity(const DissectedImage *image, unsigned partition_designator);
|
||||
bool dissected_image_can_do_verity(const DissectedImage *image, PartitionDesignator d);
|
||||
bool dissected_image_has_verity(const DissectedImage *image, PartitionDesignator d);
|
||||
|
||||
int mount_image_privately_interactively(const char *path, DissectImageFlags flags, char **ret_directory, LoopDevice **ret_loop_device, DecryptedImage **ret_decrypted_image);
|
||||
|
|
|
@ -7,26 +7,26 @@
|
|||
|
||||
#include "id128-util.h"
|
||||
|
||||
/* We only support root disk discovery for x86, x86-64, Itanium and ARM for
|
||||
* now, since EFI for anything else doesn't really exist, and we only
|
||||
* care for root partitions on the same disk as the EFI ESP. */
|
||||
/* We only support root disk discovery for x86, x86-64, Itanium and ARM for now, since EFI for anything else
|
||||
* doesn't really exist, and we only care for root partitions on the same disk as the EFI ESP. */
|
||||
|
||||
#define GPT_ROOT_X86 SD_ID128_MAKE(44,47,95,40,f2,97,41,b2,9a,f7,d1,31,d5,f0,45,8a)
|
||||
#define GPT_ROOT_X86_64 SD_ID128_MAKE(4f,68,bc,e3,e8,cd,4d,b1,96,e7,fb,ca,f9,84,b7,09)
|
||||
#define GPT_ROOT_ARM SD_ID128_MAKE(69,da,d7,10,2c,e4,4e,3c,b1,6c,21,a1,d4,9a,be,d3)
|
||||
#define GPT_ROOT_ARM_64 SD_ID128_MAKE(b9,21,b0,45,1d,f0,41,c3,af,44,4c,6f,28,0d,3f,ae)
|
||||
#define GPT_ROOT_IA64 SD_ID128_MAKE(99,3d,8d,3d,f8,0e,42,25,85,5a,9d,af,8e,d7,ea,97)
|
||||
#define GPT_ESP SD_ID128_MAKE(c1,2a,73,28,f8,1f,11,d2,ba,4b,00,a0,c9,3e,c9,3b)
|
||||
#define GPT_XBOOTLDR SD_ID128_MAKE(bc,13,c2,ff,59,e6,42,62,a3,52,b2,75,fd,6f,71,72)
|
||||
#define GPT_SWAP SD_ID128_MAKE(06,57,fd,6d,a4,ab,43,c4,84,e5,09,33,c8,4b,4f,4f)
|
||||
#define GPT_HOME SD_ID128_MAKE(93,3a,c7,e1,2e,b4,4f,13,b8,44,0e,14,e2,ae,f9,15)
|
||||
#define GPT_SRV SD_ID128_MAKE(3b,8f,84,25,20,e0,4f,3b,90,7f,1a,25,a7,6f,98,e8)
|
||||
#define GPT_VAR SD_ID128_MAKE(4d,21,b0,16,b5,34,45,c2,a9,fb,5c,16,e0,91,fd,2d)
|
||||
#define GPT_TMP SD_ID128_MAKE(7e,c6,f5,57,3b,c5,4a,ca,b2,93,16,ef,5d,f6,39,d1)
|
||||
#define GPT_USER_HOME SD_ID128_MAKE(77,3f,91,ef,66,d4,49,b5,bd,83,d6,83,bf,40,ad,16)
|
||||
#define GPT_ROOT_X86 SD_ID128_MAKE(44,47,95,40,f2,97,41,b2,9a,f7,d1,31,d5,f0,45,8a)
|
||||
#define GPT_ROOT_X86_64 SD_ID128_MAKE(4f,68,bc,e3,e8,cd,4d,b1,96,e7,fb,ca,f9,84,b7,09)
|
||||
#define GPT_ROOT_ARM SD_ID128_MAKE(69,da,d7,10,2c,e4,4e,3c,b1,6c,21,a1,d4,9a,be,d3)
|
||||
#define GPT_ROOT_ARM_64 SD_ID128_MAKE(b9,21,b0,45,1d,f0,41,c3,af,44,4c,6f,28,0d,3f,ae)
|
||||
#define GPT_ROOT_IA64 SD_ID128_MAKE(99,3d,8d,3d,f8,0e,42,25,85,5a,9d,af,8e,d7,ea,97)
|
||||
#define GPT_ESP SD_ID128_MAKE(c1,2a,73,28,f8,1f,11,d2,ba,4b,00,a0,c9,3e,c9,3b)
|
||||
#define GPT_XBOOTLDR SD_ID128_MAKE(bc,13,c2,ff,59,e6,42,62,a3,52,b2,75,fd,6f,71,72)
|
||||
#define GPT_SWAP SD_ID128_MAKE(06,57,fd,6d,a4,ab,43,c4,84,e5,09,33,c8,4b,4f,4f)
|
||||
#define GPT_HOME SD_ID128_MAKE(93,3a,c7,e1,2e,b4,4f,13,b8,44,0e,14,e2,ae,f9,15)
|
||||
#define GPT_SRV SD_ID128_MAKE(3b,8f,84,25,20,e0,4f,3b,90,7f,1a,25,a7,6f,98,e8)
|
||||
#define GPT_VAR SD_ID128_MAKE(4d,21,b0,16,b5,34,45,c2,a9,fb,5c,16,e0,91,fd,2d)
|
||||
#define GPT_TMP SD_ID128_MAKE(7e,c6,f5,57,3b,c5,4a,ca,b2,93,16,ef,5d,f6,39,d1)
|
||||
#define GPT_USER_HOME SD_ID128_MAKE(77,3f,91,ef,66,d4,49,b5,bd,83,d6,83,bf,40,ad,16)
|
||||
#define GPT_LINUX_GENERIC SD_ID128_MAKE(0f,c6,3d,af,84,83,47,72,8e,79,3d,69,d8,47,7d,e4)
|
||||
|
||||
/* Verity partitions for the root partitions above (we only define them for the root partitions, because only they are
|
||||
* are commonly read-only and hence suitable for verity). */
|
||||
/* Verity partitions for the root partitions above (we only define them for the root partitions, because only
|
||||
* they are are commonly read-only and hence suitable for verity). */
|
||||
#define GPT_ROOT_X86_VERITY SD_ID128_MAKE(d1,3c,5d,3b,b5,d1,42,2a,b2,9f,94,54,fd,c8,9d,76)
|
||||
#define GPT_ROOT_X86_64_VERITY SD_ID128_MAKE(2c,73,57,ed,eb,d2,46,d9,ae,c1,23,d4,37,ec,2b,f5)
|
||||
#define GPT_ROOT_ARM_VERITY SD_ID128_MAKE(73,86,cd,f2,20,3c,47,a9,a4,98,f2,ec,ce,45,a2,d6)
|
||||
|
@ -62,15 +62,12 @@
|
|||
#define GPT_FLAG_NO_BLOCK_IO_PROTOCOL (1ULL << 1)
|
||||
#define GPT_FLAG_LEGACY_BIOS_BOOTABLE (1ULL << 2)
|
||||
|
||||
/* Flags we recognize on the root, swap, home and srv partitions when
|
||||
* doing auto-discovery. These happen to be identical to what
|
||||
* Microsoft defines for its own Basic Data Partitions, but that's
|
||||
* just because we saw no point in defining any other values here. */
|
||||
/* Flags we recognize on the root, swap, home and srv partitions when doing auto-discovery. These happen to
|
||||
* be identical to what Microsoft defines for its own Basic Data Partitions, but that's just because we saw
|
||||
* no point in defining any other values here. */
|
||||
#define GPT_FLAG_READ_ONLY (1ULL << 60)
|
||||
#define GPT_FLAG_NO_AUTO (1ULL << 63)
|
||||
|
||||
#define GPT_LINUX_GENERIC SD_ID128_MAKE(0f,c6,3d,af,84,83,47,72,8e,79,3d,69,d8,47,7d,e4)
|
||||
|
||||
const char *gpt_partition_type_uuid_to_string(sd_id128_t id);
|
||||
const char *gpt_partition_type_uuid_to_string_harder(
|
||||
sd_id128_t id,
|
||||
|
|
|
@ -421,11 +421,6 @@ tests += [
|
|||
[],
|
||||
'', 'manual'],
|
||||
|
||||
[['src/test/test-dissect-image.c'],
|
||||
[],
|
||||
[libblkid],
|
||||
'', 'manual'],
|
||||
|
||||
[['src/test/test-signal-util.c'],
|
||||
[],
|
||||
[]],
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <linux/loop.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "dissect-image.h"
|
||||
#include "log.h"
|
||||
#include "loop-util.h"
|
||||
#include "string-util.h"
|
||||
#include "tests.h"
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
_cleanup_(loop_device_unrefp) LoopDevice *d = NULL;
|
||||
_cleanup_(dissected_image_unrefp) DissectedImage *m = NULL;
|
||||
int r, i;
|
||||
|
||||
test_setup_logging(LOG_DEBUG);
|
||||
|
||||
if (argc < 2) {
|
||||
log_error("Requires one command line argument.");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
r = loop_device_make_by_path(argv[1], O_RDONLY, LO_FLAGS_PARTSCAN, &d);
|
||||
if (r < 0) {
|
||||
log_error_errno(r, "Failed to set up loopback device: %m");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
r = dissect_image(d->fd, NULL, 0, NULL, NULL, DISSECT_IMAGE_REQUIRE_ROOT|DISSECT_IMAGE_RELAX_VAR_CHECK, &m);
|
||||
if (r < 0) {
|
||||
log_error_errno(r, "Failed to dissect image: %m");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
for (i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
|
||||
|
||||
if (!m->partitions[i].found)
|
||||
continue;
|
||||
|
||||
printf("Found %s partition, %s of type %s at #%i (%s)\n",
|
||||
partition_designator_to_string(i),
|
||||
m->partitions[i].rw ? "writable" : "read-only",
|
||||
strna(m->partitions[i].fstype),
|
||||
m->partitions[i].partno,
|
||||
strna(m->partitions[i].node));
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
Loading…
Reference in New Issue