From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from metis.ext.pengutronix.de ([92.198.50.35]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1TCQaT-0005NI-4d for barebox@lists.infradead.org; Fri, 14 Sep 2012 07:45:18 +0000 From: Sascha Hauer Date: Fri, 14 Sep 2012 09:45:11 +0200 Message-Id: <1347608713-10133-2-git-send-email-s.hauer@pengutronix.de> In-Reply-To: <1347608713-10133-1-git-send-email-s.hauer@pengutronix.de> References: <1347608713-10133-1-git-send-email-s.hauer@pengutronix.de> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: barebox-bounces@lists.infradead.org Errors-To: barebox-bounces+u.kleine-koenig=pengutronix.de@lists.infradead.org Subject: [PATCH 1/3] Add barebox update infrastructure To: barebox@lists.infradead.org Signed-off-by: Sascha Hauer --- commands/Kconfig | 5 +++ commands/Makefile | 1 + commands/barebox-update.c | 80 +++++++++++++++++++++++++++++++++ common/Kconfig | 3 ++ common/Makefile | 1 + common/bbu.c | 110 +++++++++++++++++++++++++++++++++++++++++++++ include/bbu.h | 37 +++++++++++++++ 7 files changed, 237 insertions(+) create mode 100644 commands/barebox-update.c create mode 100644 common/bbu.c create mode 100644 include/bbu.h diff --git a/commands/Kconfig b/commands/Kconfig index f2756cc..0ed0d69 100644 --- a/commands/Kconfig +++ b/commands/Kconfig @@ -470,6 +470,11 @@ config CMD_OFTREE prompt "oftree" select FDT +config CMD_BAREBOX_UPDATE + tristate + select BAREBOX_UPDATE + prompt "barebox-update" + endmenu config CMD_TIMEOUT diff --git a/commands/Makefile b/commands/Makefile index ccebd7f..62762de 100644 --- a/commands/Makefile +++ b/commands/Makefile @@ -74,3 +74,4 @@ obj-$(CONFIG_CMD_BASENAME) += basename.o obj-$(CONFIG_CMD_DIRNAME) += dirname.o obj-$(CONFIG_CMD_READLINK) += readlink.o obj-$(CONFIG_CMD_LN) += ln.o +obj-$(CONFIG_CMD_BAREBOX_UPDATE)+= barebox-update.o diff --git a/commands/barebox-update.c b/commands/barebox-update.c new file mode 100644 index 0000000..db8ae7d --- /dev/null +++ b/commands/barebox-update.c @@ -0,0 +1,80 @@ +/* + * barebox-update.c - update barebox + * + * Copyright (c) 2012 Sascha Hauer , Pengutronix + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#include +#include +#include +#include +#include +#include +#include + +static int do_barebox_update(int argc, char *argv[]) +{ + int opt, ret; + struct bbu_data data = {}; + + while ((opt = getopt(argc, argv, "t:yf:l")) > 0) { + switch (opt) { + case 'f': + data.force = simple_strtoul(optarg, NULL, 0); + data.flags |= BBU_FLAG_FORCE; + break; + case 't': + data.handler_name = optarg; + break; + case 'y': + data.flags |= BBU_FLAG_YES; + break; + case 'l': + printf("registered handlers:\n"); + bbu_handlers_list(); + return 0; + default: + return COMMAND_ERROR_USAGE; + } + } + + if (!(argc - optind)) + return COMMAND_ERROR_USAGE; + + data.imagefile = argv[optind]; + + data.image = read_file(data.imagefile, &data.len); + if (!data.image) + return -errno; + + ret = barebox_update(&data); + + free(data.image); + + return ret; +} + +BAREBOX_CMD_HELP_START(barebox_update) +BAREBOX_CMD_HELP_USAGE("barebox_update [OPTIONS ]\n") +BAREBOX_CMD_HELP_OPT("-t ", "\n") +BAREBOX_CMD_HELP_OPT("-y\t", "yes. Do not ask for confirmation\n") +BAREBOX_CMD_HELP_OPT("-f ", "Set force level\n") +BAREBOX_CMD_HELP_OPT("-l\t", "list registered targets\n") +BAREBOX_CMD_HELP_END + +BAREBOX_CMD_START(barebox_update) + .cmd = do_barebox_update, + .usage = "update barebox", + BAREBOX_CMD_HELP(cmd_barebox_update_help) +BAREBOX_CMD_END diff --git a/common/Kconfig b/common/Kconfig index b97392c..a6f6c0f 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -58,6 +58,9 @@ config GLOBALVAR config STDDEV bool +config BAREBOX_UPDATE + bool + menu "General Settings " config LOCALVERSION diff --git a/common/Makefile b/common/Makefile index df9f301..07c422a 100644 --- a/common/Makefile +++ b/common/Makefile @@ -37,6 +37,7 @@ obj-$(CONFIG_MENU) += menu.o obj-$(CONFIG_PASSWORD) += password.o obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_FLEXIBLE_BOOTARGS) += bootargs.o +obj-$(CONFIG_BAREBOX_UPDATE) += bbu.o extra-$(CONFIG_MODULES) += module.lds ifdef CONFIG_DEFAULT_ENVIRONMENT diff --git a/common/bbu.c b/common/bbu.c new file mode 100644 index 0000000..928c34b --- /dev/null +++ b/common/bbu.c @@ -0,0 +1,110 @@ +/* + * bbu.c - barebox update functions + * + * Copyright (c) 2012 Sascha Hauer , Pengutronix + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#include +#include +#include +#include +#include + +static LIST_HEAD(bbu_image_handlers); + +int bbu_force(struct bbu_data *data, const char *fmt, ...) +{ + va_list args; + + printf("UPDATE: "); + + va_start(args, fmt); + + vprintf(fmt, args); + + va_end(args); + + if (!(data->flags & BBU_FLAG_FORCE)) + goto out; + + if (!data->force) + goto out; + + data->force--; + + printf(" (forced)\n"); + + return 1; +out: + printf("\n"); + + return 0; +} + +int bbu_confirm(struct bbu_data *data) +{ + int key; + + if (data->flags & BBU_FLAG_YES) + return 1; + + printf("update barebox from %s to %s (y/n)?\n", + data->imagefile, data->handler_name); + + key = read_key(); + if (key == 'y') + return 1; + return 0; +} + +int barebox_update(struct bbu_data *data) +{ + struct bbu_handler *handler; + int ret; + + list_for_each_entry(handler, &bbu_image_handlers, list) { + if (!data->handler_name) { + if (handler->flags & BBU_HANDLER_FLAG_DEFAULT) { + data->handler_name = handler->name; + goto found; + } + continue; + } + if (!strcmp(handler->name, data->handler_name)) + goto found; + } + + return -ENODEV; + +found: + + ret = handler->handler(handler, data); + return ret; +} + +void bbu_handlers_list(void) +{ + struct bbu_handler *handler; + + list_for_each_entry(handler, &bbu_image_handlers, list) + printf("%s%s\n", handler->name, + handler->flags & BBU_HANDLER_FLAG_DEFAULT ? + " (default)" : ""); +} + +int bbu_register_handler(struct bbu_handler *handler) +{ + list_add_tail(&handler->list, &bbu_image_handlers); + return 0; +} diff --git a/include/bbu.h b/include/bbu.h new file mode 100644 index 0000000..ce1a608 --- /dev/null +++ b/include/bbu.h @@ -0,0 +1,37 @@ +#ifndef __INCLUDE_BBU_H +#define __INCLUDE_BBU_H + +struct bbu_data { +#define BBU_FLAG_FORCE (1 << 0) +#define BBU_FLAG_YES (1 << 1) + unsigned long flags; + int force; + void *image; + const char *imagefile; + size_t len; + const char *handler_name; +}; + +struct bbu_handler { + int (*handler)(struct bbu_handler *, struct bbu_data *); + void *handler_data; + const char *name; + struct list_head list; +#define BBU_HANDLER_FLAG_DEFAULT (1 << 0) + unsigned long flags; +}; + +int bbu_force(struct bbu_data *, const char *fmt, ...) + __attribute__ ((format(__printf__, 2, 3))); + +int bbu_confirm(struct bbu_data *); + +int bbu_register_handler(struct bbu_handler *); + +int barebox_update(struct bbu_data *); + +int barebox_arm_update(struct bbu_handler *, struct bbu_data *data); + +void bbu_handlers_list(void); + +#endif /* __INCLUDE_BBU_H */ -- 1.7.10.4 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox