From patchwork Wed Jul 17 08:25:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: AKASHI Takahiro X-Patchwork-Id: 1133181 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) 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=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="YTcl8WFe"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 45pVkZ5RH3z9sLt for ; Wed, 17 Jul 2019 18:27:34 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 56702C21DDC; Wed, 17 Jul 2019 08:27:14 +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=RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, 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 BC967C21E2C; Wed, 17 Jul 2019 08:25:49 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 2AB88C21DB5; Wed, 17 Jul 2019 08:25:30 +0000 (UTC) Received: from mail-pf1-f196.google.com (mail-pf1-f196.google.com [209.85.210.196]) by lists.denx.de (Postfix) with ESMTPS id 24EB8C21C3F for ; Wed, 17 Jul 2019 08:25:29 +0000 (UTC) Received: by mail-pf1-f196.google.com with SMTP id g2so10479753pfq.0 for ; Wed, 17 Jul 2019 01:25:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UKAmKxPVEObhckeUdjAIwc1vFkcmMaqz/6TJNtwgOJ0=; b=YTcl8WFeoNGydbyGJ9NHpPKLltP7/233odMvUmCEC0UvS5r6gDYVJw/Q7tONOhs54V MfduZbDrOzif+5D69VsnPlaOEXg6Y4isxwQuV6aUOlhZ5ZKnp3/WrSFfslkjrMjbcfQx CbY/GylTWm3nyOT3vtWbZODW2AjC2C87OyVoetElSmJ7anv5nt/TCZk8UAOSbNOHyeFB pvUkPCeY7xTOt6WDYvn3pxaKLA8GZ2XZgIuAajodig3G6F0LtKK79z64s1Voj1IEXX1H 6vB3LPEpI3nzSnAG5cJyJpdRZDtIbvACxR+g8HDkf2HKyqnT/POkTGSs+z1T/Myk0CBM H+qQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=UKAmKxPVEObhckeUdjAIwc1vFkcmMaqz/6TJNtwgOJ0=; b=MMiLZ6WQDqIABjHTnS6bheWy8LHSGexo2KMX3BWINNMA5TEibdUCR5cCYPqJ0FEzaq 9FWPD7htUP21p1RQBlRG2/qG+kYi6uoa6vVYvuNbH0YlJMwJEVfsX+Ur1boSjYIKRbau H//6wEaRbRJhXCE+ITiBdCPYPKIw4djtbt1LCaTlsU650KAAdZAzZP9wY/5hNJ0MmoT4 IDTguLGrAxvxmSJh+pEQiTZ1ereU/NOcVer70JYrbyfJ4NnMpEeAeHi5cOsTmG8aD19a JGDIAyC4hkCV1ph2K9CwhqM5tg5AIZ7w19gI9C/obDH+fscdjrpMeDt1ebU7BMCSVdz9 x0Kg== X-Gm-Message-State: APjAAAXlSx7aXdEpd5KJXV/djflcEALjJok/LKwMy3pRE+BFl9YH3j4J KZs9ewLhWlu9uB3Yb8q7NUnWHw== X-Google-Smtp-Source: APXvYqx+R3TbB1SUB2H6ggwXGUmNE5aH8qxGRNTgksx54uRfYSsxJ7Xlw5Anzk4dYKys6Jnt7n/rxA== X-Received: by 2002:a63:2a83:: with SMTP id q125mr32989451pgq.102.1563351927699; Wed, 17 Jul 2019 01:25:27 -0700 (PDT) Received: from linaro.org ([121.95.100.191]) by smtp.googlemail.com with ESMTPSA id p23sm25751215pfn.10.2019.07.17.01.25.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Jul 2019 01:25:27 -0700 (PDT) From: AKASHI Takahiro To: trini@konsulko.com, xypron.glpk@gmx.de, agraf@csgraf.de, wd@denx.de Date: Wed, 17 Jul 2019 17:25:12 +0900 Message-Id: <20190717082525.891-4-takahiro.akashi@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190717082525.891-1-takahiro.akashi@linaro.org> References: <20190717082525.891-1-takahiro.akashi@linaro.org> MIME-Version: 1.0 Cc: u-boot@lists.denx.de Subject: [U-Boot] [RFC, PATCH v4 03/16] env: extend interfaces to label variable with context 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" The following interfaces are extended to allow for accepting an additional argument, env_context. env_get() -> env_get_ext() env_set() -> env_get_ext() Relevant env commands are synced with this change to maintain the semantics of existing U-Boot environment. Signed-off-by: AKASHI Takahiro --- cmd/nvedit.c | 82 ++++++++++++++++++++++++++++++++++------------- include/exports.h | 3 ++ 2 files changed, 62 insertions(+), 23 deletions(-) diff --git a/cmd/nvedit.c b/cmd/nvedit.c index 49d3b5bdf466..cc80ba712767 100644 --- a/cmd/nvedit.c +++ b/cmd/nvedit.c @@ -87,7 +87,7 @@ int get_env_id(void) * * Returns 0 in case of error, or length of printed string */ -static int env_print(char *name, int flag) +static int env_print_ext(enum env_context ctx, char *name, int flag) { char *res = NULL; ssize_t len; @@ -96,6 +96,7 @@ static int env_print(char *name, int flag) ENTRY e, *ep; e.key = name; + e.context = ctx; e.data = NULL; hsearch_r(e, FIND, &ep, &env_htab, flag); if (ep == NULL) @@ -105,7 +106,7 @@ static int env_print(char *name, int flag) } /* print whole list */ - len = hexport_r(&env_htab, '\n', flag, &res, 0, 0, NULL); + len = hexport_ext(&env_htab, ctx, '\n', flag, &res, 0, 0, NULL); if (len > 0) { puts(res); @@ -118,17 +119,15 @@ static int env_print(char *name, int flag) return 0; } -static int do_env_print(cmd_tbl_t *cmdtp, int flag, int argc, - char * const argv[]) +static int do_env_print_ext(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[], enum env_context ctx) { int i; int rcode = 0; int env_flag = H_HIDE_DOT; -#if defined(CONFIG_CMD_NVEDIT_EFI) - if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'e') - return do_env_print_efi(cmdtp, flag, --argc, ++argv); -#endif + if (ctx == ENVCTX_UEFI) + return do_env_print_efi(cmdtp, flag, argc, argv); if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'a') { argc--; @@ -138,7 +137,7 @@ static int do_env_print(cmd_tbl_t *cmdtp, int flag, int argc, if (argc == 1) { /* print all env vars */ - rcode = env_print(NULL, env_flag); + rcode = env_print_ext(ctx, NULL, env_flag); if (!rcode) return 1; printf("\nEnvironment size: %d/%ld bytes\n", @@ -149,7 +148,7 @@ static int do_env_print(cmd_tbl_t *cmdtp, int flag, int argc, /* print selected env vars */ env_flag &= ~H_HIDE_DOT; for (i = 1; i < argc; ++i) { - int rc = env_print(argv[i], env_flag); + int rc = env_print_ext(ctx, argv[i], env_flag); if (!rc) { printf("## Error: \"%s\" not defined\n", argv[i]); ++rcode; @@ -159,6 +158,19 @@ static int do_env_print(cmd_tbl_t *cmdtp, int flag, int argc, return rcode; } +static int do_env_print(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ +#if defined(CONFIG_CMD_NVEDIT_EFI) + if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'e') + return do_env_print_ext(cmdtp, flag, --argc, ++argv, + ENVCTX_UEFI); + else +#endif + + return do_env_print_ext(cmdtp, flag, argc, argv, ENVCTX_UBOOT); +} + #ifdef CONFIG_CMD_GREPENV static int do_env_grep(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) @@ -220,7 +232,8 @@ 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, char * const argv[], int env_flag, + enum env_context ctx) { int i, len; char *name, *value, *s; @@ -228,10 +241,8 @@ static int _do_env_set(int flag, int argc, char * const argv[], int env_flag) debug("Initial value for argc=%d\n", argc); -#if CONFIG_IS_ENABLED(CMD_NVEDIT_EFI) - if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'e') - return do_env_set_efi(NULL, flag, --argc, ++argv); -#endif + if (ctx == ENVCTX_UEFI) + return do_env_set_efi(NULL, flag, argc, argv); while (argc > 1 && **(argv + 1) == '-') { char *arg = *++argv; @@ -286,6 +297,7 @@ static int _do_env_set(int flag, int argc, char * const argv[], int env_flag) *--s = '\0'; e.key = name; + e.context = ctx; e.data = value; hsearch_r(e, ENTER, &ep, &env_htab, env_flag); free(value); @@ -298,7 +310,8 @@ 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) +int env_set_ext(const enum env_context ctx, + const char *varname, const char *varvalue) { const char * const argv[4] = { "setenv", varname, varvalue, NULL }; @@ -307,9 +320,16 @@ int env_set(const char *varname, const char *varvalue) return 1; if (varvalue == NULL || varvalue[0] == '\0') - return _do_env_set(0, 2, (char * const *)argv, H_PROGRAMMATIC); + return _do_env_set(0, 2, (char * const *)argv, H_PROGRAMMATIC, + ctx); else - return _do_env_set(0, 3, (char * const *)argv, H_PROGRAMMATIC); + return _do_env_set(0, 3, (char * const *)argv, H_PROGRAMMATIC, + ctx); +} + +int env_set(const char *varname, const char *varvalue) +{ + return env_set_ext(ENVCTX_UBOOT, varname, varvalue); } /** @@ -393,7 +413,14 @@ 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); +#if CONFIG_IS_ENABLED(CMD_NVEDIT_EFI) + if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'e') + return _do_env_set(flag, --argc, ++argv, H_INTERACTIVE, + ENVCTX_UEFI); + else +#endif + + return _do_env_set(flag, argc, argv, H_INTERACTIVE, ENVCTX_UBOOT); } /* @@ -471,7 +498,7 @@ int do_env_ask(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) } /* Continue calling setenv code */ - return _do_env_set(flag, len, local_args, H_INTERACTIVE); + return _do_env_set(flag, len, local_args, H_INTERACTIVE, ENVCTX_UBOOT); } #endif @@ -654,12 +681,14 @@ 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, (char * const *)_argv, H_INTERACTIVE, + ENVCTX_UBOOT); } 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, (char * const *)_argv, H_INTERACTIVE, + ENVCTX_UBOOT); } } #endif /* CONFIG_CMD_EDITENV */ @@ -670,7 +699,7 @@ static int do_env_edit(cmd_tbl_t *cmdtp, int flag, int argc, * return address of storage for that variable, * or NULL if not found */ -char *env_get(const char *name) +char *env_get_ext(const enum env_context ctx, const char *name) { if (gd->flags & GD_FLG_ENV_READY) { /* after import into hashtable */ ENTRY e, *ep; @@ -678,6 +707,7 @@ char *env_get(const char *name) WATCHDOG_RESET(); e.key = name; + e.context = ctx; e.data = NULL; hsearch_r(e, FIND, &ep, &env_htab, 0); @@ -691,6 +721,11 @@ char *env_get(const char *name) return NULL; } +char *env_get(const char *name) +{ + return env_get_ext(ENVCTX_UBOOT, name); +} + /* * Look up variable from environment for restricted C runtime env. */ @@ -1173,6 +1208,7 @@ static int do_env_exists(cmd_tbl_t *cmdtp, int flag, int argc, return CMD_RET_USAGE; e.key = argv[1]; + e.context = ENVCTX_UBOOT; e.data = NULL; hsearch_r(e, FIND, &ep, &env_htab, 0); diff --git a/include/exports.h b/include/exports.h index a4b862f19178..0c39d9f16f3d 100644 --- a/include/exports.h +++ b/include/exports.h @@ -26,8 +26,11 @@ unsigned long get_timer(unsigned long); int vprintf(const char *, va_list); unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base); int strict_strtoul(const char *cp, unsigned int base, unsigned long *res); +enum env_context; /* defined in environment.h */ char *env_get(const char *name); +char *env_get_ext(enum env_context, const char *name); int env_set(const char *varname, const char *value); +int env_set_ext(enum env_context, const char *varname, const char *value); long simple_strtol(const char *cp, char **endp, unsigned int base); int strcmp(const char *cs, const char *ct); unsigned long ustrtoul(const char *cp, char **endp, unsigned int base);