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 <behlendorf1@llnl.gov>
Signed-off-by: liaoyuxiangqin <guo.yong33@zte.com.cn>
Closes #5047
This commit is contained in:
Brian Behlendorf 2016-08-30 18:56:36 -07:00
parent 3f10fe07d6
commit 9d69e9b268
2 changed files with 6 additions and 6 deletions

View File

@ -69,9 +69,10 @@ usage(void)
(void) fprintf(stderr, (void) fprintf(stderr,
" feature stat <pool>\n" " feature stat <pool>\n"
" print information about enabled features\n" " print information about enabled features\n"
" feature enable [-d desc] <pool> <feature>\n" " feature enable [-r] [-d desc] <pool> <feature>\n"
" add a new enabled feature to the pool\n" " add a new enabled feature to the pool\n"
" -d <desc> sets the feature's description\n" " -d <desc> sets the feature's description\n"
" -r set read-only compatible flag for feature\n"
" feature ref [-md] <pool> <feature>\n" " feature ref [-md] <pool> <feature>\n"
" change the refcount on the given feature\n" " change the refcount on the given feature\n"
" -d decrease instead of increase the refcount\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; feature.fi_feature = SPA_FEATURE_NONE;
optind = 1; optind = 1;
while ((c = getopt(argc, argv, "rmd:")) != -1) { while ((c = getopt(argc, argv, "+rd:")) != -1) {
switch (c) { switch (c) {
case 'r': case 'r':
feature.fi_flags |= ZFEATURE_FLAG_READONLY_COMPAT; 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; feature.fi_feature = SPA_FEATURE_NONE;
optind = 1; optind = 1;
while ((c = getopt(argc, argv, "md")) != -1) { while ((c = getopt(argc, argv, "+md")) != -1) {
switch (c) { switch (c) {
case 'm': case 'm':
feature.fi_flags |= ZFEATURE_FLAG_MOS; feature.fi_flags |= ZFEATURE_FLAG_MOS;
@ -522,7 +523,7 @@ main(int argc, char **argv)
dprintf_setup(&argc, argv); dprintf_setup(&argc, argv);
zfs_prop_init(); zfs_prop_init();
while ((c = getopt(argc, argv, "c:d:")) != -1) { while ((c = getopt(argc, argv, "+c:d:")) != -1) {
switch (c) { switch (c) {
case 'c': case 'c':
g_importargs.cachefile = optarg; g_importargs.cachefile = optarg;

View File

@ -295,7 +295,6 @@ tests = ['zpool_history_001_neg', 'zpool_history_002_pos']
# DISABLED: # DISABLED:
# zpool_import_012_pos - sharenfs issue # zpool_import_012_pos - sharenfs issue
# zpool_import_all_001_pos - partition issue # zpool_import_all_001_pos - partition issue
# zpool_import_features_003_pos - zhack: invalid option -- 'r'
[tests/functional/cli_root/zpool_import] [tests/functional/cli_root/zpool_import]
tests = ['zpool_import_001_pos', 'zpool_import_002_pos', tests = ['zpool_import_001_pos', 'zpool_import_002_pos',
'zpool_import_003_pos', 'zpool_import_004_pos', 'zpool_import_005_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_009_neg', 'zpool_import_010_pos', 'zpool_import_011_neg',
'zpool_import_013_neg', 'zpool_import_013_neg',
'zpool_import_features_001_pos', 'zpool_import_features_002_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_missing_002_pos', 'zpool_import_missing_003_pos',
'zpool_import_rename_001_pos'] 'zpool_import_rename_001_pos']