From patchwork Fri Aug 2 11:36:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Uwe Schuster X-Patchwork-Id: 1141108 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=googlegroups.com (client-ip=2607:f8b0:4864:20::b3a; helo=mail-yb1-xb3a.google.com; envelope-from=swupdate+bncbcvk3t7xzipbbvoasdvakgqexg2lhmy@googlegroups.com; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=googlegroups.com header.i=@googlegroups.com header.b="RBOv5aB9"; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="lhoKZrzQ"; dkim-atps=neutral Received: from mail-yb1-xb3a.google.com (mail-yb1-xb3a.google.com [IPv6:2607:f8b0:4864:20::b3a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 460Q9l1LVXz9s7T for ; Fri, 2 Aug 2019 21:36:57 +1000 (AEST) Received: by mail-yb1-xb3a.google.com with SMTP id y9sf42673448ybq.7 for ; Fri, 02 Aug 2019 04:36:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20161025; h=sender:date:from:to:message-id:subject:mime-version :x-original-sender:precedence:mailing-list:list-id:list-post :list-help:list-archive:list-subscribe:list-unsubscribe; bh=yv9dXzlpyAhzwQngtfqSVCiWriVz+nr5/gh3gQwnolY=; b=RBOv5aB9lzb2TPQWu4ccdN9NPgfluSmhDIAW4q17s8AQA/AAi59b0I5HsaGgUmzQi7 oMMBV+lUApJvb8by9f4iTa9/LJqSu4t8jNppTqtavWc+GsG8CoKUB1p72LCHNhbbhI8P /nnCeTp6heN1TFNDgkd5pZYd8w91IkJkSDR2T8QAKsIMuq53qoWAz9vsgGjdugOZWICq +47zFwr2LElqy1m68K5th9DiMBg4Uwebxjixgd2w+dUCNJGOmPm1NNHQHQSkev/lJVen 3a35gJIAvWoNNQTS7EHBnp7UfEsTOUdwctOqfmRPoQ1HIC4CdMd/7yGm+ER5AzeKweQn ekCg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:message-id:subject:mime-version:x-original-sender :precedence:mailing-list:list-id:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=yv9dXzlpyAhzwQngtfqSVCiWriVz+nr5/gh3gQwnolY=; b=lhoKZrzQaB5NYrlMGKuwlCuDalntAlakNnkoT+C9b/N8P22f9ESnKNCxpVzmX7z9f7 bcG6ZEmlvHS7PTjo5TUNdU9b1BKr9lbOKPwgxlvDqqJU9YK5tHy0N0u/X3sXxE0EzADf 3hzxJ9PvDisEkBWtMAHMo+0GB7ZuYtXQ8ozmjDsYhRU38whMqWtmBHlPIelIClNYcLvu M4rNivYOVrFQKuJ2Lwcdoptai449d2HSiaHCmEwBAZRLcdja1SIMQ2NSMcfdksMSMOdh PBujT4BGMojMC0XVTKdkfSQ5xApyd/jf5HvZFXhsPy3UudDuPbgrwAhJ0TBfMrQF3/Zv 95gw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=sender:x-gm-message-state:date:from:to:message-id:subject :mime-version:x-original-sender:precedence:mailing-list:list-id :x-spam-checked-in-group:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=yv9dXzlpyAhzwQngtfqSVCiWriVz+nr5/gh3gQwnolY=; b=FrP6FGw2c9FtMXEazfoy2DX4CDDsNkgDAFUUx/SQbjP0hZBcNxc730xrlfhk+ImoMI NsOHi+RtW3zuTHJ6CcO+rM7DqHcpBjxW1DcpbV92FExydS0ZeXBMQAUdpIQCfsCe/mHm Nw3VOWo6CypaTVyXPQqmc1AM6H8/oPa2f7vNhWNOQ0cV3zA3Z/9oz7mBsSyMB2tPkU+6 SAamhsgQY1oMGF+ocVtIHSRyNBMUINSWDMcL+FZd3HUikPD3uQhOnpEpDDVf8sfO/PHP b9ySLrtst9ox9p5kAyB5bTpRR7ffkdxT8wxURmsa7oLk+14pMF82l6NPNYlJT8BJpL4O er3g== Sender: swupdate@googlegroups.com X-Gm-Message-State: APjAAAX4xkt2UC0irMHGeq7b1cUwm6n2dkcIAfTbRcB/r/JGFjB2hLB8 zp/lMlE/Ee5Q5PPodprWYBY= X-Google-Smtp-Source: APXvYqwHv5f6feasfdA0P+Ua+x7FfqLUhbArh0TWvBL6XogNQXhO/YAtYH2KUSVLu1GV5mrWgYq5GA== X-Received: by 2002:a5b:b0f:: with SMTP id z15mr2257372ybp.298.1564745814032; Fri, 02 Aug 2019 04:36:54 -0700 (PDT) X-BeenThere: swupdate@googlegroups.com Received: by 2002:a25:5f4b:: with SMTP id h11ls13423207ybm.9.gmail; Fri, 02 Aug 2019 04:36:53 -0700 (PDT) X-Received: by 2002:a25:bbd2:: with SMTP id c18mr31997251ybk.3.1564745813472; Fri, 02 Aug 2019 04:36:53 -0700 (PDT) Date: Fri, 2 Aug 2019 04:36:53 -0700 (PDT) From: Uwe Schuster To: swupdate Message-Id: <2710c0a6-1ffb-4182-943e-33cb7fd41c50@googlegroups.com> Subject: [swupdate] [libubootenv] [PATCH] uboot_env: Add parsing of .flag variable also when env is read from a default env file MIME-Version: 1.0 X-Original-Sender: uwe.schuster68@gmail.com Precedence: list Mailing-list: list swupdate@googlegroups.com; contact swupdate+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: swupdate@googlegroups.com X-Google-Group-Id: 605343134186 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , This patch fixes the default env flag parsing issue reported in https://groups.google.com/d/msg/swupdate/ShdD10dl7Pc/ULUYSpFDCAAJ: 3. When reading the variables from the default env file (like after an > erased env flash area or with -f command line flag) and if the .flags > variable is part of the default env file, it is not parsed, as when read > from normal u-boot env > --- src/uboot_env.c | 150 +++++++++++++++++++++++++++--------------------- 1 file changed, 85 insertions(+), 65 deletions(-) @@ -981,10 +989,22 @@ int libuboot_load_file(struct uboot_ctx *ctx, const char *filename) name = buf; - libuboot_set_env(ctx, name, value); + if (!strcmp(name, ".flags")) + flagsvar = strdup(value); + else + libuboot_set_env(ctx, name, value); } - fclose(fp); + + /* + * Parse .flags and set the attributes for a variable + */ + if (flagsvar) { + libuboot_parseflags(ctx, flagsvar); + } + + free(flagsvar); free(buf); + fclose(fp); return 0; } diff --git a/src/uboot_env.c b/src/uboot_env.c index 726c433..91f94e7 100644 --- a/src/uboot_env.c +++ b/src/uboot_env.c @@ -745,6 +745,73 @@ int libuboot_env_store(struct uboot_ctx *ctx) return ret; } +static void libuboot_parseflags(struct uboot_ctx *ctx, char* flagsvar) +{ + char *pvar; + char *pval; + struct var_entry *entry; + +#if !defined(NDEBUG) + fprintf(stdout, "Environment FLAGS %s\n", flagsvar); +#endif + pvar = flagsvar; + + while (*pvar && (pvar - flagsvar) < strlen(flagsvar)) { + char *pnext; + pval = strchr(pvar, ':'); + if (!pval) + break; + + *pval++ = '\0'; + pnext = strchr(pval, ','); + if (!pnext) + pnext = flagsvar + strlen(flagsvar); + else + *pnext++ = '\0'; + + entry = __libuboot_get_env(&ctx->varlist, pvar); + if (entry) { + for (int i = 0; i < strlen(pval); i++) { + switch (pval[i]) { + case 's': + entry->type = TYPE_ATTR_STRING; + break; + case 'd': + entry->type = TYPE_ATTR_DECIMAL; + break; + case 'x': + entry->type = TYPE_ATTR_HEX; + break; + case 'b': + entry->type = TYPE_ATTR_BOOL; + break; + case 'i': + entry->type = TYPE_ATTR_IP; + break; + case 'm': + entry->type = TYPE_ATTR_MAC; + break; + case 'a': + entry->access = ACCESS_ATTR_ANY; + break; + case 'r': + entry->access = ACCESS_ATTR_READ_ONLY; + break; + case 'o': + entry->access = ACCESS_ATTR_WRITE_ONCE; + break; + case 'c': + entry->access = ACCESS_ATTR_CHANGE_DEFAULT; + break; + default: /* ignore it */ + break; + } + } + } + pvar = pnext; + } +} + static int libuboot_load(struct uboot_ctx *ctx) { int ret, i; @@ -871,72 +938,11 @@ static int libuboot_load(struct uboot_ctx *ctx) /* * Parse .flags and set the attributes for a variable */ - char *pvar; - char *pval; if (flagsvar) { -#if !defined(NDEBUG) - fprintf(stdout, "Environment FLAGS %s\n", flagsvar); -#endif - pvar = flagsvar; - - while (*pvar && (pvar - flagsvar) < strlen(flagsvar)) { - char *pnext; - pval = strchr(pvar, ':'); - if (!pval) - break; - - *pval++ = '\0'; - pnext = strchr(pval, ','); - if (!pnext) - pnext = flagsvar + strlen(flagsvar); - else - *pnext++ = '\0'; - - entry = __libuboot_get_env(&ctx->varlist, pvar); - if (entry) { - for (int i = 0; i < strlen(pval); i++) { - switch (pval[i]) { - case 's': - entry->type = TYPE_ATTR_STRING; - break; - case 'd': - entry->type = TYPE_ATTR_DECIMAL; - break; - case 'x': - entry->type = TYPE_ATTR_HEX; - break; - case 'b': - entry->type = TYPE_ATTR_BOOL; - break; - case 'i': - entry->type = TYPE_ATTR_IP; - break; - case 'm': - entry->type = TYPE_ATTR_MAC; - break; - case 'a': - entry->access = ACCESS_ATTR_ANY; - break; - case 'r': - entry->access = ACCESS_ATTR_READ_ONLY; - break; - case 'o': - entry->access = ACCESS_ATTR_WRITE_ONCE; - break; - case 'c': - entry->access = ACCESS_ATTR_CHANGE_DEFAULT; - break; - default: /* ignore it */ - break; - } - } - } - - pvar = pnext; - } + libuboot_parseflags(ctx, flagsvar); } - free(flagsvar); + free(flagsvar); free(buf[0]); return ctx->valid ? 0 : -ENODATA; @@ -963,6 +969,8 @@ int libuboot_load_file(struct uboot_ctx *ctx, const char *filename) return -ENOMEM; } + char *flagsvar = NULL; + while (fgets(buf, LINE_LENGTH, fp)) { int len = strlen(buf);