From patchwork Tue Nov 24 13:21:13 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Fenkart X-Patchwork-Id: 548066 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id CDE331402DD for ; Wed, 25 Nov 2015 00:31:52 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=jQGIolbF; dkim-atps=neutral Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 23A084BD83; Tue, 24 Nov 2015 14:31:14 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id KScazOkXFshO; Tue, 24 Nov 2015 14:31:14 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id C83FE4BD84; Tue, 24 Nov 2015 14:30:47 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 75F644B976 for ; Tue, 24 Nov 2015 14:21:43 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id NLp_DcSRkOMZ for ; Tue, 24 Nov 2015 14:21:43 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-wm0-f50.google.com (mail-wm0-f50.google.com [74.125.82.50]) by theia.denx.de (Postfix) with ESMTPS id 28DA24BA16 for ; Tue, 24 Nov 2015 14:21:39 +0100 (CET) Received: by wmuu63 with SMTP id u63so96144384wmu.0 for ; Tue, 24 Nov 2015 05:21:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=xEhNJljPh5PGkJ/Sn6m2ohNdwwTHIQlcIz/HGK1cW+o=; b=jQGIolbFMx+/4sjZmCmiVpQK0R/XrIGUMK5v9yj7/edSzUj64DdDqjd95v4zj2JY/e SS4Z6HyW3AhlRicY8lmvm+0GgmSBo4iJe7TBOxzfA9BYBdK4FUeUlldCYzMAwoDVfbjn W/2XhnzymjwrzPEcUeL4owW0+j7umubZEEXJItSWoCEQFUfdsnglDI1AwInJIhAfhTJM 1rRIgWKuGcFaerRzTohIR/kVBYKFtW6ufP6pCklguw94VXMDN7Gy/1gyuiaftzcv7uPA yRTrcBzXjGVnXxOwv1GAo4MysS5Aokco6Qx6epKhlsqXdkXL6wzQx3+KhPe95Z6pvpKI KcXA== X-Received: by 10.28.26.147 with SMTP id a141mr24075673wma.36.1448371299460; Tue, 24 Nov 2015 05:21:39 -0800 (PST) Received: from localhost (ip-89-176-167-254.net.upcbroadband.cz. [89.176.167.254]) by smtp.gmail.com with ESMTPSA id jm4sm1458523wjb.7.2015.11.24.05.21.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 24 Nov 2015 05:21:39 -0800 (PST) From: Andreas Fenkart X-Google-Original-From: Andreas Fenkart To: u-boot@lists.denx.de Date: Tue, 24 Nov 2015 14:21:13 +0100 Message-Id: <1448371275-900-4-git-send-email-andreas.fenkart@dev.digitalstrom.org> X-Mailer: git-send-email 2.6.2 In-Reply-To: <1448371275-900-1-git-send-email-andreas.fenkart@dev.digitalstrom.org> References: <1448371275-900-1-git-send-email-andreas.fenkart@dev.digitalstrom.org> X-Mailman-Approved-At: Tue, 24 Nov 2015 14:30:29 +0100 Subject: [U-Boot] [PATCH 3/5] tools: env: introduce setenv/printenv argument structs X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" goal is to use getopt for all argument parsing instead of adhoc parsing in fw_getenv/fw_setenv functions Signed-off-by: Andreas Fenkart --- tools/env/fw_env.h | 9 ++++ tools/env/fw_env_main.c | 111 +++++++++++++++++++++++++++++++----------------- 2 files changed, 81 insertions(+), 39 deletions(-) diff --git a/tools/env/fw_env.h b/tools/env/fw_env.h index aff471b..4ac7de4 100644 --- a/tools/env/fw_env.h +++ b/tools/env/fw_env.h @@ -52,6 +52,15 @@ "bootm" #endif +struct printenv_args { +}; +extern struct printenv_args printenv_args; + +struct setenv_args { + char *script_file; +}; +extern struct setenv_args setenv_args; + extern int fw_printenv(int argc, char *argv[]); extern char *fw_getenv (char *name); extern int fw_setenv (int argc, char *argv[]); diff --git a/tools/env/fw_env_main.c b/tools/env/fw_env_main.c index ce50d58..f45c94a 100644 --- a/tools/env/fw_env_main.c +++ b/tools/env/fw_env_main.c @@ -45,6 +45,9 @@ static struct option long_options[] = { {NULL, 0, NULL, 0} }; +struct printenv_args printenv_args; +struct setenv_args setenv_args; + void usage(void) { @@ -72,33 +75,11 @@ void usage(void) ); } -int main(int argc, char *argv[]) +int parse_printenv_args(int argc, char *argv[]) { - char *p; - char *cmdname = *argv; - char *script_file = NULL; int c; - const char *lockname = "/var/lock/" CMD_PRINTENV ".lock"; - int lockfd = -1; - int retval = EXIT_SUCCESS; - - lockfd = open(lockname, O_WRONLY | O_CREAT | O_TRUNC, 0666); - if (-1 == lockfd) { - fprintf(stderr, "Error opening lock file %s\n", lockname); - return EXIT_FAILURE; - } - - if (-1 == flock(lockfd, LOCK_EX)) { - fprintf(stderr, "Error locking file %s\n", lockname); - close(lockfd); - return EXIT_FAILURE; - } - if ((p = strrchr (cmdname, '/')) != NULL) { - cmdname = p + 1; - } - - while ((c = getopt_long (argc, argv, "a:ns:h", + while ((c = getopt_long (argc, argv, "a:nh", long_options, NULL)) != EOF) { switch (c) { case 'a': @@ -107,40 +88,92 @@ int main(int argc, char *argv[]) case 'n': /* handled in fw_printenv */ break; + case 'h': + usage(); + exit(EXIT_SUCCESS); + break; + default: /* '?' */ + usage(); + exit(EXIT_FAILURE); + break; + } + } + return 0; +} + +int parse_setenv_args(int argc, char *argv[]) +{ + int c; + while ((c = getopt_long (argc, argv, "a:s:h", + long_options, NULL)) != EOF) { + switch (c) { + case 'a': + /* AES key, handled later */ + break; case 's': - script_file = optarg; + setenv_args.script_file = optarg; break; case 'h': usage(); - goto exit; + exit(EXIT_SUCCESS); + break; default: /* '?' */ - fprintf(stderr, "Try `%s --help' for more information." - "\n", cmdname); - retval = EXIT_FAILURE; - goto exit; + usage(); + exit(EXIT_FAILURE); + break; } } + return 0; +} + +int main(int argc, char *argv[]) +{ + char *cmdname = *argv; + const char *lockname = "/var/lock/" CMD_PRINTENV ".lock"; + int lockfd = -1; + int retval = EXIT_SUCCESS; + + if (strrchr(cmdname, '/') != NULL) + cmdname = strrchr(cmdname, '/') + 1; + + if (strcmp(cmdname, CMD_PRINTENV) == 0) { + if (parse_printenv_args(argc, argv)) + exit(EXIT_FAILURE); + } else if (strcmp(cmdname, CMD_SETENV) == 0) { + if (parse_setenv_args(argc, argv)) + exit(EXIT_FAILURE); + } else { + fprintf(stderr, + "Identity crisis - may be called as `%s' or as `%s' but not as `%s'\n", + CMD_PRINTENV, CMD_SETENV, cmdname); + exit(EXIT_FAILURE); + } + + lockfd = open(lockname, O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (-1 == lockfd) { + fprintf(stderr, "Error opening lock file %s\n", lockname); + return EXIT_FAILURE; + } + + if (-1 == flock(lockfd, LOCK_EX)) { + fprintf(stderr, "Error locking file %s\n", lockname); + close(lockfd); + return EXIT_FAILURE; + } if (strcmp(cmdname, CMD_PRINTENV) == 0) { if (fw_printenv(argc, argv) != 0) retval = EXIT_FAILURE; } else if (strcmp(cmdname, CMD_SETENV) == 0) { - if (!script_file) { + if (!setenv_args.script_file) { if (fw_setenv(argc, argv) != 0) retval = EXIT_FAILURE; } else { - if (fw_parse_script(script_file) != 0) + if (fw_parse_script(setenv_args.script_file) != 0) retval = EXIT_FAILURE; } - } else { - fprintf(stderr, - "Identity crisis - may be called as `" CMD_PRINTENV - "' or as `" CMD_SETENV "' but not as `%s'\n", - cmdname); - retval = EXIT_FAILURE; } -exit: flock(lockfd, LOCK_UN); close(lockfd); return retval;