From patchwork Tue Nov 19 17:31:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Byrne X-Patchwork-Id: 1197561 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=quarantine dis=none) header.from=origamienergy.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=origamienergy.com header.i=@origamienergy.com header.b="eqfOI1R+"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=amazonses.com header.i=@amazonses.com header.b="V5Z3vMWV"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 47HXtr36cGz9sPL for ; Wed, 20 Nov 2019 04:31:48 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 20A5CC21F97; Tue, 19 Nov 2019 17:31:45 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 40B92C21F18; Tue, 19 Nov 2019 17:31:43 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 6ED53C21F18; Tue, 19 Nov 2019 17:31:42 +0000 (UTC) Received: from a6-148.smtp-out.eu-west-1.amazonses.com (a6-148.smtp-out.eu-west-1.amazonses.com [54.240.6.148]) by lists.denx.de (Postfix) with ESMTPS id 12AC6C21C2C for ; Tue, 19 Nov 2019 17:31:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=awgt3ic55kqhwizgro5hhdlz56bi7lbf; d=origamienergy.com; t=1574184701; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version:Content-Transfer-Encoding; bh=wzPFyAJh7E/fTPAwCl8cQO+KSG34+VxI1DB72xe7FKE=; b=eqfOI1R+bBr6jRF+H2ZgzOliYXC0DtebrWHWmJpF7io/c2PVfYoPcLEfSUOH/O0c ttxXX2b7IUhn2ZnyaSLBb9xKGpY3U/mLMqs3l6urJuFBl0/9uLrqZKUIyyzJwcZxXeu hz0O3Xp0Nz6VG6JHpcgrs22qlLylryOOKele6PFo= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=ihchhvubuqgjsxyuhssfvqohv7z3u4hn; d=amazonses.com; t=1574184701; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version:Content-Transfer-Encoding:Feedback-ID; bh=wzPFyAJh7E/fTPAwCl8cQO+KSG34+VxI1DB72xe7FKE=; b=V5Z3vMWVpMGJVVhURk0dgwXtX0aZ9EH4sAwaNuLkg7xjUvUoL5lXaC4vD3QKqFQq a9ieNtkiffIBUVZO16CGuduyAOwhnDIRA3qkTv1OiomKWrchAmDXUaRJW7SCOysdgnw 7XeLvmveXiUQqmKWMULlIlaTEvtVcsSVEOUp1a8g= From: James Byrne To: u-boot@lists.denx.de Date: Tue, 19 Nov 2019 17:31:41 +0000 Message-ID: <0102016e84b84c9c-991687db-659e-4ede-b45e-20864255e87d-000000@eu-west-1.amazonses.com> X-Mailer: git-send-email 2.24.0 MIME-Version: 1.0 X-SES-Outgoing: 2019.11.19-54.240.6.148 Feedback-ID: 1.eu-west-1.sQ65CuNSNkrvjFrT7j7oeWmhxZgivYoP5c3BHSC7Qc8=:AmazonSES Cc: Leo Ruan , Joe Hershberger , Heinrich Schuchardt Subject: [U-Boot] [PATCH] env: Provide programmatic equivalent to 'setenv -f' X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Add env_force() to provide an equivalent to 'setenv -f' that can be used programmatically. Also tighten up the definition of argv in _do_env_set() so that 'const char *' pointers are used. Signed-off-by: James Byrne --- cmd/nvedit.c | 43 +++++++++++++++++++++++++++++-------------- include/env.h | 13 +++++++++++++ 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/cmd/nvedit.c b/cmd/nvedit.c index 99a3bc57b1..1f363ba9f4 100644 --- a/cmd/nvedit.c +++ b/cmd/nvedit.c @@ -221,10 +221,12 @@ DONE: * Set a new environment variable, * or replace or delete an existing one. */ -static int _do_env_set(int flag, int argc, char * const argv[], int env_flag) +static int _do_env_set(int flag, int argc, const char * const argv[], + int env_flag) { int i, len; - char *name, *value, *s; + const char *name; + char *value, *s; struct env_entry e, *ep; debug("Initial value for argc=%d\n", argc); @@ -235,7 +237,7 @@ static int _do_env_set(int flag, int argc, char * const argv[], int env_flag) #endif while (argc > 1 && **(argv + 1) == '-') { - char *arg = *++argv; + const char *arg = *++argv; --argc; while (*++arg) { @@ -277,7 +279,7 @@ static int _do_env_set(int flag, int argc, char * const argv[], int env_flag) return 1; } for (i = 2, s = value; i < argc; ++i) { - char *v = argv[i]; + const char *v = argv[i]; while ((*s++ = *v++) != '\0') ; @@ -299,18 +301,30 @@ static int _do_env_set(int flag, int argc, char * const argv[], int env_flag) return 0; } -int env_set(const char *varname, const char *varvalue) +static int do_programmatic_env_set(int argc, const char * const argv[]) { - const char * const argv[4] = { "setenv", varname, varvalue, NULL }; - /* before import into hashtable */ if (!(gd->flags & GD_FLG_ENV_READY)) return 1; - if (varvalue == NULL || varvalue[0] == '\0') - return _do_env_set(0, 2, (char * const *)argv, H_PROGRAMMATIC); - else - return _do_env_set(0, 3, (char * const *)argv, H_PROGRAMMATIC); + if (!argv[argc - 1] || argv[argc - 1][0] == '\0') + argc--; + + return _do_env_set(0, argc, argv, H_PROGRAMMATIC); +} + +int env_set(const char *varname, const char *varvalue) +{ + const char * const argv[4] = {"setenv", varname, varvalue, NULL}; + + return do_programmatic_env_set(3, argv); +} + +int env_force(const char *varname, const char *varvalue) +{ + const char * const argv[5] = {"setenv", "-f", varname, varvalue, NULL}; + + return do_programmatic_env_set(4, argv); } /** @@ -382,7 +396,8 @@ static int do_env_set(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (argc < 2) return CMD_RET_USAGE; - return _do_env_set(flag, argc, argv, H_INTERACTIVE); + return _do_env_set(flag, argc, (const char * const *)argv, + H_INTERACTIVE); } /* @@ -643,12 +658,12 @@ static int do_env_edit(cmd_tbl_t *cmdtp, int flag, int argc, if (buffer[0] == '\0') { const char * const _argv[3] = { "setenv", argv[1], NULL }; - return _do_env_set(0, 2, (char * const *)_argv, H_INTERACTIVE); + return _do_env_set(0, 2, _argv, H_INTERACTIVE); } else { const char * const _argv[4] = { "setenv", argv[1], buffer, NULL }; - return _do_env_set(0, 3, (char * const *)_argv, H_INTERACTIVE); + return _do_env_set(0, 3, _argv, H_INTERACTIVE); } } #endif /* CONFIG_CMD_EDITENV */ diff --git a/include/env.h b/include/env.h index b72239f6a5..37bbf1117d 100644 --- a/include/env.h +++ b/include/env.h @@ -145,6 +145,19 @@ int env_get_yesno(const char *var); */ int env_set(const char *varname, const char *value); +/** + * env_force() - forcibly set an environment variable + * + * This sets or deletes the value of an environment variable. It is the same + * as env_set(), except that the variable will be forcibly updated/deleted, + * even if it has access protection flags set. + * + * @varname: Variable to adjust + * @value: Value to set for the variable, or NULL or "" to delete the variable + * @return 0 if OK, 1 on error + */ +int env_force(const char *varname, const char *varvalue); + /** * env_get_ulong() - Return an environment variable as an integer value *