diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2017-03-16 13:32:34 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2017-03-16 14:27:29 +0100 |
commit | 89135e5522720bc75615a6ec22bb8bcb7b4994e2 (patch) | |
tree | 3565e64a8903117f80c1e78de0407068d4815f5e | |
parent | 898a46705d8e672932e8668149e94bb0c9f9a878 (diff) | |
download | dt-utils-89135e5522720bc75615a6ec22bb8bcb7b4994e2.tar.gz dt-utils-89135e5522720bc75615a6ec22bb8bcb7b4994e2.tar.xz |
barebox-state: Add force switch
The force switch allows to read from a state even when the
keystore blobs cannot be read.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | src/barebox-state.c | 9 | ||||
-rw-r--r-- | src/barebox-state/backend.c | 10 | ||||
-rw-r--r-- | src/barebox-state/backend_format_raw.c | 10 | ||||
-rw-r--r-- | src/barebox-state/state.c | 5 | ||||
-rw-r--r-- | src/barebox-state/state.h | 5 | ||||
-rw-r--r-- | src/state.h | 3 |
6 files changed, 29 insertions, 13 deletions
diff --git a/src/barebox-state.c b/src/barebox-state.c index 25f3bc3..c9b000c 100644 --- a/src/barebox-state.c +++ b/src/barebox-state.c @@ -37,6 +37,8 @@ #include <dt/dt.h> #include <state.h> +static int force; + struct state_variable; static int __state_uint8_set(struct state_variable *var, const char *val); @@ -360,7 +362,7 @@ struct state *state_get(const char *name, bool readonly) return ERR_PTR(ret); } - state = state_new_from_node(node, devpath, offset, size, readonly); + state = state_new_from_node(node, devpath, offset, size, readonly, force); if (IS_ERR(state)) { pr_err("unable to initialize state: %s\n", strerror(PTR_ERR(state))); @@ -380,6 +382,7 @@ static struct option long_options[] = { {"name", required_argument, 0, 'n' }, {"dump", no_argument, 0, 'd' }, {"dump-shell", no_argument, 0, OPT_DUMP_SHELL }, + {"force", no_argument, 0, 'f' }, {"verbose", no_argument, 0, 'v' }, {"help", no_argument, 0, 'h' }, }; @@ -394,6 +397,7 @@ static void usage(char *name) "-n, --name <name> specify the state to use (default=\"state\"). Multiple states are allowed.\n" "-d, --dump dump the state\n" "--dump-shell dump the state suitable for shell sourcing\n" +"-f, --force ignore errors (like missing hmac algo)\n" "-v, --verbose increase verbosity\n" "-q, --quiet decrease verbosity\n" "--help this help\n", @@ -476,6 +480,9 @@ int main(int argc, char *argv[]) ++nr_states; break; } + case 'f': + force = 1; + break; case ':': case '?': default: diff --git a/src/barebox-state/backend.c b/src/barebox-state/backend.c index 2f2e6df..5b96951 100644 --- a/src/barebox-state/backend.c +++ b/src/barebox-state/backend.c @@ -101,13 +101,14 @@ out: static int state_format_init(struct state_backend *backend, struct device_d *dev, const char *backend_format, - struct device_node *node, const char *state_name) + struct device_node *node, const char *state_name, + int force) { int ret; if (!strcmp(backend_format, "raw")) { ret = backend_format_raw_create(&backend->format, node, - state_name, dev); + state_name, dev, force); } else if (!strcmp(backend_format, "dtb")) { ret = backend_format_dtb_create(&backend->format, dev); } else { @@ -145,17 +146,18 @@ static void state_format_free(struct state_backend_format *format) * For blockdevices it makes sense to align them on blocksize. * @param storagetype Type of the storage backend. This may be NULL where we * autoselect some backwardscompatible backend options + * @param force If true, ignore errors like missing hmac * @return 0 on success, -errno otherwise */ int state_backend_init(struct state_backend *backend, struct device_d *dev, struct device_node *node, const char *backend_format, const char *storage_path, const char *state_name, const char *of_path, off_t offset, size_t max_size, - uint32_t stridesize, const char *storagetype) + uint32_t stridesize, const char *storagetype, int force) { int ret; - ret = state_format_init(backend, dev, backend_format, node, state_name); + ret = state_format_init(backend, dev, backend_format, node, state_name, force); if (ret) return ret; diff --git a/src/barebox-state/backend_format_raw.c b/src/barebox-state/backend_format_raw.c index ebcae36..f9102d4 100644 --- a/src/barebox-state/backend_format_raw.c +++ b/src/barebox-state/backend_format_raw.c @@ -285,7 +285,7 @@ static int backend_format_raw_init_digest(struct state_backend_format_raw *raw, int backend_format_raw_create(struct state_backend_format **format, struct device_node *node, const char *secret_name, - struct device_d *dev) + struct device_d *dev, int force) { struct state_backend_format_raw *raw; int ret; @@ -301,8 +301,12 @@ int backend_format_raw_create(struct state_backend_format **format, } else if (ret) { dev_err(raw->dev, "Failed initializing digest for raw format, %d\n", ret); - free(raw); - return ret; + if (force) { + dev_warn(raw->dev, "Continuing anyway (forced)\n"); + } else { + free(raw); + return ret; + } } raw->format.pack = backend_format_raw_pack; diff --git a/src/barebox-state/state.c b/src/barebox-state/state.c index 28cfb83..a141da4 100644 --- a/src/barebox-state/state.c +++ b/src/barebox-state/state.c @@ -425,7 +425,8 @@ void state_release(struct state *state) * there are no repairs done. */ struct state *state_new_from_node(struct device_node *node, char *path, - off_t offset, size_t max_size, bool readonly) + off_t offset, size_t max_size, bool readonly, + int force) { struct state *state; int ret = 0; @@ -490,7 +491,7 @@ struct state *state_new_from_node(struct device_node *node, char *path, ret = state_backend_init(&state->backend, &state->dev, node, backend_type, path, alias, of_path, offset, - max_size, stridesize, storage_type); + max_size, stridesize, storage_type, force); if (ret) goto out_release_state; diff --git a/src/barebox-state/state.h b/src/barebox-state/state.h index 48a6785..6939cf4 100644 --- a/src/barebox-state/state.h +++ b/src/barebox-state/state.h @@ -197,7 +197,7 @@ struct device_node *state_to_node(struct state *state, enum state_convert conv); int backend_format_raw_create(struct state_backend_format **format, struct device_node *node, const char *secret_name, - struct device_d *dev); + struct device_d *dev, int force); int backend_format_dtb_create(struct state_backend_format **format, struct device_d *dev); int state_storage_init(struct state_backend_storage *storage, @@ -223,7 +223,8 @@ int state_backend_init(struct state_backend *backend, struct device_d *dev, struct device_node *node, const char *backend_format, const char *storage_path, const char *state_name, const char *of_path, off_t offset, size_t max_size, - uint32_t stridesize, const char *storagetype); + uint32_t stridesize, const char *storagetype, + int force); void state_backend_set_readonly(struct state_backend *backend); void state_backend_free(struct state_backend *backend); void state_storage_free(struct state_backend_storage *storage); diff --git a/src/state.h b/src/state.h index bc9a574..44e56b4 100644 --- a/src/state.h +++ b/src/state.h @@ -11,7 +11,8 @@ int state_backend_raw_file(struct state *state, const char *of_path, const char *path, off_t offset, size_t size); struct state *state_new_from_node(struct device_node *node, char *path, - off_t offset, size_t max_size, bool readonly); + off_t offset, size_t max_size, bool readonly, + int force); void state_release(struct state *state); struct state *state_by_name(const char *name); |