summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2017-03-16 13:32:34 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2017-03-16 14:27:29 +0100
commit89135e5522720bc75615a6ec22bb8bcb7b4994e2 (patch)
tree3565e64a8903117f80c1e78de0407068d4815f5e
parent898a46705d8e672932e8668149e94bb0c9f9a878 (diff)
downloaddt-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.c9
-rw-r--r--src/barebox-state/backend.c10
-rw-r--r--src/barebox-state/backend_format_raw.c10
-rw-r--r--src/barebox-state/state.c5
-rw-r--r--src/barebox-state/state.h5
-rw-r--r--src/state.h3
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);