]>
Commit | Line | Data |
---|---|---|
53e1b683 | 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
8c1be37e LP |
2 | #pragma once |
3 | ||
8c1be37e LP |
4 | #include <stdbool.h> |
5 | ||
dccca82b LP |
6 | #include "sd-id128.h" |
7 | ||
8c1be37e LP |
8 | #include "macro.h" |
9 | ||
10 | typedef struct DissectedImage DissectedImage; | |
11 | typedef struct DissectedPartition DissectedPartition; | |
18b5886e | 12 | typedef struct DecryptedImage DecryptedImage; |
8c1be37e LP |
13 | |
14 | struct DissectedPartition { | |
15 | bool found:1; | |
16 | bool rw:1; | |
17 | int partno; /* -1 if there was no partition and the images contains a file system directly */ | |
18 | int architecture; /* Intended architecture: either native, secondary or unset (-1). */ | |
be30ad41 | 19 | sd_id128_t uuid; /* Partition entry UUID as reported by the GPT */ |
8c1be37e LP |
20 | char *fstype; |
21 | char *node; | |
18b5886e LP |
22 | char *decrypted_node; |
23 | char *decrypted_fstype; | |
8c1be37e LP |
24 | }; |
25 | ||
26 | enum { | |
27 | PARTITION_ROOT, | |
28 | PARTITION_ROOT_SECONDARY, /* Secondary architecture */ | |
29 | PARTITION_HOME, | |
30 | PARTITION_SRV, | |
31 | PARTITION_ESP, | |
a8c47660 | 32 | PARTITION_XBOOTLDR, |
8c1be37e | 33 | PARTITION_SWAP, |
4623e8e6 LP |
34 | PARTITION_ROOT_VERITY, /* verity data for the PARTITION_ROOT partition */ |
35 | PARTITION_ROOT_SECONDARY_VERITY, /* verity data for the PARTITION_ROOT_SECONDARY partition */ | |
8c1be37e LP |
36 | _PARTITION_DESIGNATOR_MAX, |
37 | _PARTITION_DESIGNATOR_INVALID = -1 | |
38 | }; | |
39 | ||
4623e8e6 LP |
40 | static inline int PARTITION_VERITY_OF(int p) { |
41 | if (p == PARTITION_ROOT) | |
42 | return PARTITION_ROOT_VERITY; | |
43 | if (p == PARTITION_ROOT_SECONDARY) | |
44 | return PARTITION_ROOT_SECONDARY_VERITY; | |
45 | return _PARTITION_DESIGNATOR_INVALID; | |
46 | } | |
47 | ||
18b5886e | 48 | typedef enum DissectImageFlags { |
2d3a5a73 LP |
49 | DISSECT_IMAGE_READ_ONLY = 1 << 0, |
50 | DISSECT_IMAGE_DISCARD_ON_LOOP = 1 << 1, /* Turn on "discard" if on a loop device and file system supports it */ | |
51 | DISSECT_IMAGE_DISCARD = 1 << 2, /* Turn on "discard" if file system supports it, on all block devices */ | |
52 | DISSECT_IMAGE_DISCARD_ON_CRYPTO = 1 << 3, /* Turn on "discard" also on crypto devices */ | |
971e2ef0 ZJS |
53 | DISSECT_IMAGE_DISCARD_ANY = DISSECT_IMAGE_DISCARD_ON_LOOP | |
54 | DISSECT_IMAGE_DISCARD | | |
55 | DISSECT_IMAGE_DISCARD_ON_CRYPTO, | |
2d3a5a73 LP |
56 | DISSECT_IMAGE_GPT_ONLY = 1 << 4, /* Only recognize images with GPT partition tables */ |
57 | DISSECT_IMAGE_REQUIRE_ROOT = 1 << 5, /* Don't accept disks without root partition */ | |
58 | DISSECT_IMAGE_MOUNT_ROOT_ONLY = 1 << 6, /* Mount only the root partition */ | |
59 | DISSECT_IMAGE_MOUNT_NON_ROOT_ONLY = 1 << 7, /* Mount only non-root partitions */ | |
03bcb6d4 | 60 | DISSECT_IMAGE_VALIDATE_OS = 1 << 8, /* Refuse mounting images that aren't identifyable as OS images */ |
052eaf5c | 61 | DISSECT_IMAGE_NO_UDEV = 1 << 9, /* Don't wait for udev initializing things */ |
18b5886e | 62 | } DissectImageFlags; |
8c1be37e LP |
63 | |
64 | struct DissectedImage { | |
4623e8e6 LP |
65 | bool encrypted:1; |
66 | bool verity:1; /* verity available and usable */ | |
67 | bool can_verity:1; /* verity available, but not necessarily used */ | |
3b925504 | 68 | |
8c1be37e | 69 | DissectedPartition partitions[_PARTITION_DESIGNATOR_MAX]; |
3b925504 LP |
70 | |
71 | char *hostname; | |
72 | sd_id128_t machine_id; | |
73 | char **machine_info; | |
74 | char **os_release; | |
8c1be37e LP |
75 | }; |
76 | ||
c34b75a1 | 77 | int probe_filesystem(const char *node, char **ret_fstype); |
9b6deb03 | 78 | int dissect_image(int fd, const void *root_hash, size_t root_hash_size, DissectImageFlags flags, DissectedImage **ret); |
4526113f | 79 | int dissect_image_and_warn(int fd, const char *name, const void *root_hash, size_t root_hash_size, DissectImageFlags flags, DissectedImage **ret); |
8c1be37e LP |
80 | |
81 | DissectedImage* dissected_image_unref(DissectedImage *m); | |
82 | DEFINE_TRIVIAL_CLEANUP_FUNC(DissectedImage*, dissected_image_unref); | |
83 | ||
4623e8e6 LP |
84 | int dissected_image_decrypt(DissectedImage *m, const char *passphrase, const void *root_hash, size_t root_hash_size, DissectImageFlags flags, DecryptedImage **ret); |
85 | int dissected_image_decrypt_interactively(DissectedImage *m, const char *passphrase, const void *root_hash, size_t root_hash_size, DissectImageFlags flags, DecryptedImage **ret); | |
2d3a5a73 | 86 | int dissected_image_mount(DissectedImage *m, const char *dest, uid_t uid_shift, DissectImageFlags flags); |
18b5886e | 87 | |
3b925504 LP |
88 | int dissected_image_acquire_metadata(DissectedImage *m); |
89 | ||
18b5886e LP |
90 | DecryptedImage* decrypted_image_unref(DecryptedImage *p); |
91 | DEFINE_TRIVIAL_CLEANUP_FUNC(DecryptedImage*, decrypted_image_unref); | |
92 | int decrypted_image_relinquish(DecryptedImage *d); | |
8c1be37e LP |
93 | |
94 | const char* partition_designator_to_string(int i) _const_; | |
95 | int partition_designator_from_string(const char *name) _pure_; | |
78ebe980 LP |
96 | |
97 | int root_hash_load(const char *image, void **ret, size_t *ret_size); |