From 9d69e9b268a1a0af3117871608fd3a87db1ce586 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Tue, 30 Aug 2016 18:56:36 -0700 Subject: [PATCH] Fix zhack argument processing The argument processing is zhack makes the assumption that getopt() will not permute argv. This isn't true for the GNU implementation of getopt() unless the optstring is prefixed with a '+'. In which case this is equivalent to setting the POSIXLY_CORRECT environment variable In addition, update the usage() and optstrings to reflect the existing supported options. Signed-off-by: Brian Behlendorf Signed-off-by: liaoyuxiangqin Closes #5047 --- cmd/zhack/zhack.c | 9 +++++---- tests/runfiles/linux.run | 3 +-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/zhack/zhack.c b/cmd/zhack/zhack.c index cc4f174c66..e76945141a 100644 --- a/cmd/zhack/zhack.c +++ b/cmd/zhack/zhack.c @@ -69,9 +69,10 @@ usage(void) (void) fprintf(stderr, " feature stat \n" " print information about enabled features\n" - " feature enable [-d desc] \n" + " feature enable [-r] [-d desc] \n" " add a new enabled feature to the pool\n" " -d sets the feature's description\n" + " -r set read-only compatible flag for feature\n" " feature ref [-md] \n" " change the refcount on the given feature\n" " -d decrease instead of increase the refcount\n" @@ -318,7 +319,7 @@ zhack_do_feature_enable(int argc, char **argv) feature.fi_feature = SPA_FEATURE_NONE; optind = 1; - while ((c = getopt(argc, argv, "rmd:")) != -1) { + while ((c = getopt(argc, argv, "+rd:")) != -1) { switch (c) { case 'r': feature.fi_flags |= ZFEATURE_FLAG_READONLY_COMPAT; @@ -416,7 +417,7 @@ zhack_do_feature_ref(int argc, char **argv) feature.fi_feature = SPA_FEATURE_NONE; optind = 1; - while ((c = getopt(argc, argv, "md")) != -1) { + while ((c = getopt(argc, argv, "+md")) != -1) { switch (c) { case 'm': feature.fi_flags |= ZFEATURE_FLAG_MOS; @@ -522,7 +523,7 @@ main(int argc, char **argv) dprintf_setup(&argc, argv); zfs_prop_init(); - while ((c = getopt(argc, argv, "c:d:")) != -1) { + while ((c = getopt(argc, argv, "+c:d:")) != -1) { switch (c) { case 'c': g_importargs.cachefile = optarg; diff --git a/tests/runfiles/linux.run b/tests/runfiles/linux.run index 5685ea21ba..783eef94f4 100644 --- a/tests/runfiles/linux.run +++ b/tests/runfiles/linux.run @@ -295,7 +295,6 @@ tests = ['zpool_history_001_neg', 'zpool_history_002_pos'] # DISABLED: # zpool_import_012_pos - sharenfs issue # zpool_import_all_001_pos - partition issue -# zpool_import_features_003_pos - zhack: invalid option -- 'r' [tests/functional/cli_root/zpool_import] tests = ['zpool_import_001_pos', 'zpool_import_002_pos', 'zpool_import_003_pos', 'zpool_import_004_pos', 'zpool_import_005_pos', @@ -303,7 +302,7 @@ tests = ['zpool_import_001_pos', 'zpool_import_002_pos', 'zpool_import_009_neg', 'zpool_import_010_pos', 'zpool_import_011_neg', 'zpool_import_013_neg', 'zpool_import_features_001_pos', 'zpool_import_features_002_neg', - 'zpool_import_missing_001_pos', + 'zpool_import_features_003_pos','zpool_import_missing_001_pos', 'zpool_import_missing_002_pos', 'zpool_import_missing_003_pos', 'zpool_import_rename_001_pos']