mirror of
git://sourceware.org/git/lvm2.git
synced 2025-10-19 07:33:14 +03:00
Compare commits
1 Commits
dev-dct-cm
...
dev-dct-cm
Author | SHA1 | Date | |
---|---|---|---|
|
9d5d52b35e |
File diff suppressed because it is too large
Load Diff
@@ -548,13 +548,6 @@ static int is_desc_line(char *str)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int is_id_line(char *str)
|
|
||||||
{
|
|
||||||
if (!strncmp(str, "ID:", 3))
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* parse str for anything that can appear in a position,
|
* parse str for anything that can appear in a position,
|
||||||
* like VG, VG|LV, VG|LV_linear|LV_striped, etc
|
* like VG, VG|LV, VG|LV_linear|LV_striped, etc
|
||||||
@@ -1061,52 +1054,6 @@ void print_expanded(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int opt_arg_matches(struct opt_arg *oa1, struct opt_arg *oa2)
|
|
||||||
{
|
|
||||||
if (oa1->opt != oa2->opt)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* FIXME: some cases may need more specific val_bits checks */
|
|
||||||
if (oa1->def.val_bits != oa2->def.val_bits)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (oa1->def.str && oa2->def.str && strcmp(oa1->def.str, oa2->def.str))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (oa1->def.num != oa2->def.num)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Do NOT compare lv_types because we are checking if two
|
|
||||||
* command lines are ambiguous before the LV type is known.
|
|
||||||
*/
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int pos_arg_matches(struct pos_arg *pa1, struct pos_arg *pa2)
|
|
||||||
{
|
|
||||||
if (pa1->pos != pa2->pos)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* FIXME: some cases may need more specific val_bits checks */
|
|
||||||
if (pa1->def.val_bits != pa2->def.val_bits)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (pa1->def.str && pa2->def.str && strcmp(pa1->def.str, pa2->def.str))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (pa1->def.num != pa2->def.num)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Do NOT compare lv_types because we are checking if two
|
|
||||||
* command lines are ambiguous before the LV type is known.
|
|
||||||
*/
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *opt_to_enum_str(int opt)
|
static const char *opt_to_enum_str(int opt)
|
||||||
{
|
{
|
||||||
return opt_names[opt].name;
|
return opt_names[opt].name;
|
||||||
@@ -1126,35 +1073,11 @@ static char *flags_to_str(int flags)
|
|||||||
return buf_flags;
|
return buf_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_command_count(void)
|
void print_define_command_count(void)
|
||||||
{
|
{
|
||||||
struct command *cmd;
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
printf("/* Do not edit. This file is generated by scripts/create-commands */\n");
|
printf("/* Do not edit. This file is generated by scripts/create-commands */\n");
|
||||||
printf("/* using command definitions from scripts/command-lines.in */\n");
|
printf("/* using command definitions from scripts/command-lines.in */\n");
|
||||||
printf("#define COMMAND_COUNT %d\n", cmd_count);
|
printf("#define COMMAND_COUNT %d\n", cmd_count);
|
||||||
|
|
||||||
printf("enum {\n");
|
|
||||||
for (i = 0; i < cmd_count; i++) {
|
|
||||||
cmd = &cmd_array[i];
|
|
||||||
|
|
||||||
if (!cmd->command_line_id) {
|
|
||||||
printf("Missing ID: at %d\n", i);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 0; j < i; j++) {
|
|
||||||
if (!strcmp(cmd->command_line_id, cmd_array[j].command_line_id))
|
|
||||||
goto next;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\t%s_CMD,\n", cmd->command_line_id);
|
|
||||||
next:
|
|
||||||
;
|
|
||||||
}
|
|
||||||
printf("\tCOMMAND_ID_COUNT,\n");
|
|
||||||
printf("};\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int is_common_opt(int opt)
|
static int is_common_opt(int opt)
|
||||||
@@ -1280,7 +1203,6 @@ void print_command_struct(int only_usage)
|
|||||||
|
|
||||||
printf("/* Do not edit. This file is generated by scripts/create-commands */\n");
|
printf("/* Do not edit. This file is generated by scripts/create-commands */\n");
|
||||||
printf("/* using command definitions from scripts/command-lines.in */\n");
|
printf("/* using command definitions from scripts/command-lines.in */\n");
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
for (i = 0; i < cmd_count; i++) {
|
for (i = 0; i < cmd_count; i++) {
|
||||||
cmd = &cmd_array[i];
|
cmd = &cmd_array[i];
|
||||||
@@ -1293,8 +1215,6 @@ void print_command_struct(int only_usage)
|
|||||||
}
|
}
|
||||||
|
|
||||||
printf("commands[%d].name = \"%s\";\n", i, cmd->name);
|
printf("commands[%d].name = \"%s\";\n", i, cmd->name);
|
||||||
printf("commands[%d].command_line_id = \"%s\";\n", i, cmd->command_line_id);
|
|
||||||
printf("commands[%d].command_line_enum = %s_CMD;\n", i, cmd->command_line_id);
|
|
||||||
printf("commands[%d].fn = %s;\n", i, cmd->name);
|
printf("commands[%d].fn = %s;\n", i, cmd->name);
|
||||||
printf("commands[%d].ro_count = %d;\n", i, cmd->ro_count);
|
printf("commands[%d].ro_count = %d;\n", i, cmd->ro_count);
|
||||||
printf("commands[%d].rp_count = %d;\n", i, cmd->rp_count);
|
printf("commands[%d].rp_count = %d;\n", i, cmd->rp_count);
|
||||||
@@ -1435,67 +1355,6 @@ void print_command_struct(int only_usage)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct cmd_pair {
|
|
||||||
int i, j;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void print_ambiguous(void)
|
|
||||||
{
|
|
||||||
struct command *cmd, *dup;
|
|
||||||
struct cmd_pair dups[64] = { 0 };
|
|
||||||
int found = 0;
|
|
||||||
int i, j, f, ro, rp;
|
|
||||||
|
|
||||||
for (i = 0; i < cmd_count; i++) {
|
|
||||||
cmd = &cmd_array[i];
|
|
||||||
|
|
||||||
for (j = 0; j < cmd_count; j++) {
|
|
||||||
dup = &cmd_array[j];
|
|
||||||
|
|
||||||
if (i == j)
|
|
||||||
continue;
|
|
||||||
if (strcmp(cmd->name, dup->name))
|
|
||||||
continue;
|
|
||||||
if (cmd->ro_count != dup->ro_count)
|
|
||||||
continue;
|
|
||||||
if (cmd->oo_count != dup->oo_count)
|
|
||||||
continue;
|
|
||||||
if (cmd->rp_count != dup->rp_count)
|
|
||||||
continue;
|
|
||||||
if (cmd->op_count != dup->op_count)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
for (ro = 0; ro < cmd->ro_count; ro++) {
|
|
||||||
if (!opt_arg_matches(&cmd->required_opt_args[ro],
|
|
||||||
&dup->required_opt_args[ro]))
|
|
||||||
goto next;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (rp = 0; rp < cmd->rp_count; rp++) {
|
|
||||||
if (!pos_arg_matches(&cmd->required_pos_args[rp],
|
|
||||||
&dup->required_pos_args[rp]))
|
|
||||||
goto next;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (f = 0; f < found; f++) {
|
|
||||||
if ((dups[f].i == j) && (dups[f].j == i))
|
|
||||||
goto next;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Ambiguous commands %d and %d:\n", i, j);
|
|
||||||
print_usage(cmd, 0);
|
|
||||||
print_usage(dup, 0);
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
dups[found].i = i;
|
|
||||||
dups[found].j = j;
|
|
||||||
found++;
|
|
||||||
next:
|
|
||||||
;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_command_list(void)
|
void print_command_list(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@@ -1524,11 +1383,10 @@ static void print_help(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
printf("%s --output struct|count|usage|expanded <filename>\n", argv[0]);
|
printf("%s --output struct|count|usage|expanded <filename>\n", argv[0]);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("struct: print C structures.\n");
|
printf("struct: print C structures.\n");
|
||||||
printf("usage: print usage format.\n");
|
printf("usage: print usage format.\n");
|
||||||
printf("expanded: print expanded input format.\n");
|
printf("expanded: print expanded input format.\n");
|
||||||
printf("count: print #define COMMAND_COUNT <Number>\n");
|
printf("count: print #define COMMAND_COUNT <Number>\n");
|
||||||
printf("ambiguous: print commands differing only by LV types\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
@@ -1602,8 +1460,6 @@ int main(int argc, char *argv[])
|
|||||||
continue;
|
continue;
|
||||||
if (line[0] == '\n')
|
if (line[0] == '\n')
|
||||||
continue;
|
continue;
|
||||||
if (line[0] == '-' && line[1] == '-' && line[2] == '-')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if ((n = strchr(line, '\n')))
|
if ((n = strchr(line, '\n')))
|
||||||
*n = '\0';
|
*n = '\0';
|
||||||
@@ -1642,11 +1498,6 @@ int main(int argc, char *argv[])
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_id_line(line_argv[0])) {
|
|
||||||
cmd->command_line_id = strdup(line_argv[1]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* OO_FOO: ... */
|
/* OO_FOO: ... */
|
||||||
if (is_oo_definition(line_argv[0])) {
|
if (is_oo_definition(line_argv[0])) {
|
||||||
add_oo_definition_line(line_argv[0], line_orig);
|
add_oo_definition_line(line_argv[0], line_orig);
|
||||||
@@ -1699,13 +1550,11 @@ int main(int argc, char *argv[])
|
|||||||
else if (!strcmp(outputformat, "struct"))
|
else if (!strcmp(outputformat, "struct"))
|
||||||
print_command_struct(0);
|
print_command_struct(0);
|
||||||
else if (!strcmp(outputformat, "count"))
|
else if (!strcmp(outputformat, "count"))
|
||||||
print_command_count();
|
print_define_command_count();
|
||||||
else if (!strcmp(outputformat, "usage"))
|
else if (!strcmp(outputformat, "usage"))
|
||||||
print_command_struct(1);
|
print_command_struct(1);
|
||||||
else if (!strcmp(outputformat, "expanded"))
|
else if (!strcmp(outputformat, "expanded"))
|
||||||
print_expanded();
|
print_expanded();
|
||||||
else if (!strcmp(outputformat, "ambiguous"))
|
|
||||||
print_ambiguous();
|
|
||||||
else
|
else
|
||||||
print_help(argc, argv);
|
print_help(argc, argv);
|
||||||
}
|
}
|
||||||
|
@@ -1,132 +1,3 @@
|
|||||||
/* Do not edit. This file is generated by scripts/create-commands */
|
/* Do not edit. This file is generated by scripts/create-commands */
|
||||||
/* using command definitions from scripts/command-lines.in */
|
/* using command definitions from scripts/command-lines.in */
|
||||||
#define COMMAND_COUNT 146
|
#define COMMAND_COUNT 144
|
||||||
enum {
|
|
||||||
lvchange_properties_CMD,
|
|
||||||
lvchange_resync_CMD,
|
|
||||||
lvchange_syncaction_CMD,
|
|
||||||
lvchange_rebuild_CMD,
|
|
||||||
lvchange_activate_CMD,
|
|
||||||
lvchange_refresh_CMD,
|
|
||||||
lvchange_monitor_CMD,
|
|
||||||
lvchange_poll_CMD,
|
|
||||||
lvchange_persistent_CMD,
|
|
||||||
lvconvert_merge_CMD,
|
|
||||||
lvconvert_combine_split_snapshot_CMD,
|
|
||||||
lvconvert_to_thin_with_external_CMD,
|
|
||||||
lvconvert_to_cache_vol_CMD,
|
|
||||||
lvconvert_to_thinpool_CMD,
|
|
||||||
lvconvert_to_cachepool_CMD,
|
|
||||||
lvconvert_to_mirror_CMD,
|
|
||||||
lvconvert_to_mirror_or_raid1_CMD,
|
|
||||||
lvconvert_raid1_to_mirror_CMD,
|
|
||||||
lvconvert_mirror_to_raid1_CMD,
|
|
||||||
lvconvert_general_to_raid_CMD,
|
|
||||||
lvconvert_change_mirror_images_CMD,
|
|
||||||
lvconvert_raid_to_striped_CMD,
|
|
||||||
lvconvert_raid_or_mirror_to_linear_CMD,
|
|
||||||
lvconvert_split_mirror_images_to_new_CMD,
|
|
||||||
lvconvert_split_mirror_images_and_track_CMD,
|
|
||||||
lvconvert_repair_pvs_or_thinpool_CMD,
|
|
||||||
lvconvert_replace_pv_CMD,
|
|
||||||
lvconvert_change_mirrorlog_CMD,
|
|
||||||
lvconvert_split_and_keep_cachepool_CMD,
|
|
||||||
lvconvert_split_and_delete_cachepool_CMD,
|
|
||||||
lvconvert_split_cow_snapshot_CMD,
|
|
||||||
lvconvert_poll_mirror_CMD,
|
|
||||||
lvconvert_swap_pool_metadata_CMD,
|
|
||||||
lvcreate_error_vol_CMD,
|
|
||||||
lvcreate_zero_vol_CMD,
|
|
||||||
lvcreate_linear_CMD,
|
|
||||||
lvcreate_striped_CMD,
|
|
||||||
lvcreate_mirror_CMD,
|
|
||||||
lvcreate_raid_any_CMD,
|
|
||||||
lvcreate_cow_snapshot_CMD,
|
|
||||||
lvcreate_cow_snapshot_with_virtual_origin_CMD,
|
|
||||||
lvcreate_thinpool_CMD,
|
|
||||||
lvcreate_cachepool_CMD,
|
|
||||||
lvcreate_thin_vol_CMD,
|
|
||||||
lvcreate_thin_snapshot_CMD,
|
|
||||||
lvcreate_thin_snapshot_of_external_CMD,
|
|
||||||
lvcreate_thin_vol_with_thinpool_CMD,
|
|
||||||
lvcreate_thin_vol_with_thinpool_or_sparse_snapshot_CMD,
|
|
||||||
lvcreate_convert_to_cache_vol_with_cachepool_CMD,
|
|
||||||
lvcreate_cache_vol_with_new_origin_CMD,
|
|
||||||
lvdisplay_general_CMD,
|
|
||||||
lvextend_by_size_CMD,
|
|
||||||
lvextend_by_pv_CMD,
|
|
||||||
lvextend_pool_metadata_by_size_CMD,
|
|
||||||
lvextend_by_policy_CMD,
|
|
||||||
lvmconfig_general_CMD,
|
|
||||||
lvreduce_general_CMD,
|
|
||||||
lvremove_general_CMD,
|
|
||||||
lvrename_vg_lv_lv_CMD,
|
|
||||||
lvrename_lv_lv_CMD,
|
|
||||||
lvresize_by_size_CMD,
|
|
||||||
lvresize_by_pv_CMD,
|
|
||||||
lvresize_pool_metadata_by_size_CMD,
|
|
||||||
lvs_general_CMD,
|
|
||||||
lvscan_general_CMD,
|
|
||||||
pvchange_properties_all_CMD,
|
|
||||||
pvchange_properties_some_CMD,
|
|
||||||
pvresize_general_CMD,
|
|
||||||
pvck_general_CMD,
|
|
||||||
pvcreate_general_CMD,
|
|
||||||
pvdisplay_general_CMD,
|
|
||||||
pvmove_one_CMD,
|
|
||||||
pvmove_any_CMD,
|
|
||||||
pvremove_general_CMD,
|
|
||||||
pvs_general_CMD,
|
|
||||||
pvscan_show_CMD,
|
|
||||||
pvscan_cache_CMD,
|
|
||||||
vgcfgbackup_general_CMD,
|
|
||||||
vgcfgrestore_by_vg_CMD,
|
|
||||||
vgcfgrestore_by_file_CMD,
|
|
||||||
vgchange_properties_CMD,
|
|
||||||
vgchange_monitor_CMD,
|
|
||||||
vgchange_poll_CMD,
|
|
||||||
vgchange_activate_CMD,
|
|
||||||
vgchange_refresh_CMD,
|
|
||||||
vgchange_lockstart_CMD,
|
|
||||||
vgchange_lockstop_CMD,
|
|
||||||
vgck_general_CMD,
|
|
||||||
vgconvert_general_CMD,
|
|
||||||
vgcreate_general_CMD,
|
|
||||||
vgdisplay_general_CMD,
|
|
||||||
vgexport_some_CMD,
|
|
||||||
vgexport_all_CMD,
|
|
||||||
vgextend_general_CMD,
|
|
||||||
vgimport_some_CMD,
|
|
||||||
vgimport_all_CMD,
|
|
||||||
vgimportclone_general_CMD,
|
|
||||||
vgmerge_general_CMD,
|
|
||||||
vgmknodes_general_CMD,
|
|
||||||
vgreduce_by_pv_CMD,
|
|
||||||
vgreduce_all_CMD,
|
|
||||||
vgreduce_missing_CMD,
|
|
||||||
vgremove_general_CMD,
|
|
||||||
vgrename_by_name_CMD,
|
|
||||||
vgrename_by_uuid_CMD,
|
|
||||||
vgs_general_CMD,
|
|
||||||
vgscan_general_CMD,
|
|
||||||
vgsplit_by_pv_to_existing_CMD,
|
|
||||||
vgsplit_by_lv_to_existing_CMD,
|
|
||||||
vgsplit_by_pv_to_new_CMD,
|
|
||||||
vgsplit_by_lv_to_new_CMD,
|
|
||||||
devtypes_general_CMD,
|
|
||||||
fullreport_general_CMD,
|
|
||||||
lastlog_general_CMD,
|
|
||||||
lvpoll_general_CMD,
|
|
||||||
formats_general_CMD,
|
|
||||||
help_general_CMD,
|
|
||||||
version_general_CMD,
|
|
||||||
pvdata_general_CMD,
|
|
||||||
segtypes_general_CMD,
|
|
||||||
systemid_general_CMD,
|
|
||||||
tags_general_CMD,
|
|
||||||
lvmchange_general_CMD,
|
|
||||||
lvmdiskscan_general_CMD,
|
|
||||||
lvmsadc_general_CMD,
|
|
||||||
lvmsar_general_CMD,
|
|
||||||
COMMAND_ID_COUNT,
|
|
||||||
};
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -18,26 +18,8 @@
|
|||||||
|
|
||||||
struct cmd_context;
|
struct cmd_context;
|
||||||
|
|
||||||
/* old per-command-name function */
|
/* command functions */
|
||||||
typedef int (*command_fn) (struct cmd_context *cmd, int argc, char **argv);
|
typedef int (*command_fn) (struct cmd_context * cmd, int argc, char **argv);
|
||||||
|
|
||||||
/* new per-command-line-id functions */
|
|
||||||
typedef int (*command_line_fn) (struct cmd_context *cmd, int argc, char **argv);
|
|
||||||
|
|
||||||
struct command_function {
|
|
||||||
int command_line_enum;
|
|
||||||
command_line_fn fn;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct command_name {
|
|
||||||
const char *name;
|
|
||||||
const char *desc; /* general command description from commands.h */
|
|
||||||
unsigned int flags;
|
|
||||||
|
|
||||||
/* union of {required,optional}_opt_args for all commands with this name */
|
|
||||||
int valid_args[ARG_COUNT];
|
|
||||||
int num_args;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Command defintion
|
* Command defintion
|
||||||
@@ -131,13 +113,9 @@ struct command {
|
|||||||
const char *desc; /* specific command description from command-lines.h */
|
const char *desc; /* specific command description from command-lines.h */
|
||||||
const char *usage; /* excludes common options like --help, --debug */
|
const char *usage; /* excludes common options like --help, --debug */
|
||||||
const char *usage_common; /* includes commmon options like --help, --debug */
|
const char *usage_common; /* includes commmon options like --help, --debug */
|
||||||
const char *command_line_id;
|
|
||||||
int command_line_enum; /* <command_line_id>_CMD */
|
|
||||||
|
|
||||||
struct command_name *cname;
|
struct command_name *cname;
|
||||||
|
command_fn fn;
|
||||||
command_fn fn; /* old style */
|
|
||||||
struct command_function *functions; /* new style */
|
|
||||||
|
|
||||||
unsigned int flags; /* copied from command_name.flags from commands.h */
|
unsigned int flags; /* copied from command_name.flags from commands.h */
|
||||||
|
|
||||||
@@ -166,4 +144,14 @@ struct command {
|
|||||||
int pos_count;
|
int pos_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct command_name {
|
||||||
|
const char *name;
|
||||||
|
const char *desc; /* general command description from commands.h */
|
||||||
|
unsigned int flags;
|
||||||
|
|
||||||
|
/* union of {required,optional}_opt_args for all commands with this name */
|
||||||
|
int valid_args[ARG_COUNT];
|
||||||
|
int num_args;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -49,7 +49,7 @@ extern char *optarg;
|
|||||||
# define OPTIND_INIT 1
|
# define OPTIND_INIT 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "command-lines-count.h"
|
#include "command-lines-count.h" /* #define COMMAND_COUNT, generated from command-lines.in */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Table of valid --option values.
|
* Table of valid --option values.
|
||||||
@@ -85,22 +85,6 @@ struct command_name command_names[MAX_COMMAND_NAMES] = {
|
|||||||
static struct command commands[COMMAND_COUNT];
|
static struct command commands[COMMAND_COUNT];
|
||||||
static struct cmdline_context _cmdline;
|
static struct cmdline_context _cmdline;
|
||||||
|
|
||||||
/*
|
|
||||||
* Table of command line functions
|
|
||||||
*
|
|
||||||
* This table could be auto-generated once all commands have been converted
|
|
||||||
* to use these functions instead of the old per-command-name function.
|
|
||||||
* For now, any command id not included here uses the old command fn.
|
|
||||||
*/
|
|
||||||
struct command_function command_functions[COMMAND_ID_COUNT] = {
|
|
||||||
{ lvmconfig_general_CMD, lvmconfig },
|
|
||||||
};
|
|
||||||
#if 0
|
|
||||||
{ lvchange_properties_CMD, lvchange_properties_cmd },
|
|
||||||
{ lvchange_activate_CMD, lvchange_activate_cmd },
|
|
||||||
{ lvchange_refresh_CMD, lvchange_refresh_cmd },
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Command line args */
|
/* Command line args */
|
||||||
unsigned arg_count(const struct cmd_context *cmd, int a)
|
unsigned arg_count(const struct cmd_context *cmd, int a)
|
||||||
{
|
{
|
||||||
@@ -803,17 +787,6 @@ static struct command_name *_find_command_name(const char *name)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct command_function *_find_command_function(int command_line_enum)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < COMMAND_ID_COUNT; i++) {
|
|
||||||
if (command_functions[i].command_line_enum == command_line_enum)
|
|
||||||
return &command_functions[i];
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _define_commands(void)
|
static void _define_commands(void)
|
||||||
{
|
{
|
||||||
/* command-lines.h defines command[] structs, generated from command-lines.in */
|
/* command-lines.h defines command[] structs, generated from command-lines.in */
|
||||||
@@ -837,7 +810,6 @@ void lvm_register_commands(void)
|
|||||||
log_error(INTERNAL_ERROR "Failed to find command name %s.", commands[i].name);
|
log_error(INTERNAL_ERROR "Failed to find command name %s.", commands[i].name);
|
||||||
commands[i].cname = cname;
|
commands[i].cname = cname;
|
||||||
commands[i].flags = cname->flags;
|
commands[i].flags = cname->flags;
|
||||||
commands[i].functions = _find_command_function(commands[i].command_line_enum);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_cmdline.command_names = command_names;
|
_cmdline.command_names = command_names;
|
||||||
@@ -991,7 +963,7 @@ static int _command_required_pos_matches(struct cmd_context *cmd, int ci, int rp
|
|||||||
|
|
||||||
#define HELP_LINE_SIZE 1024
|
#define HELP_LINE_SIZE 1024
|
||||||
|
|
||||||
static void _print_usage(const char *usage, int only_required)
|
static void _print_usage(const char *usage)
|
||||||
{
|
{
|
||||||
char buf[HELP_LINE_SIZE];
|
char buf[HELP_LINE_SIZE];
|
||||||
int optional_ui = 0;
|
int optional_ui = 0;
|
||||||
@@ -1048,9 +1020,6 @@ static void _print_usage(const char *usage, int only_required)
|
|||||||
if (bi)
|
if (bi)
|
||||||
log_print("%s", buf);
|
log_print("%s", buf);
|
||||||
|
|
||||||
if (only_required)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* copy the optional opt_args
|
* copy the optional opt_args
|
||||||
*/
|
*/
|
||||||
@@ -1172,7 +1141,7 @@ static struct command *_find_command(struct cmd_context *cmd, const char *path,
|
|||||||
const char *name;
|
const char *name;
|
||||||
int match_count, match_count_ro, match_count_rp, mismatch_count;
|
int match_count, match_count_ro, match_count_rp, mismatch_count;
|
||||||
int best_i = 0, best_count = 0;
|
int best_i = 0, best_count = 0;
|
||||||
int closest_i = 0, closest_count_ro = 0;
|
int closest_i = 0, closest_count = 0;
|
||||||
int ro, rp;
|
int ro, rp;
|
||||||
int i, j;
|
int i, j;
|
||||||
int accepted, count;
|
int accepted, count;
|
||||||
@@ -1242,10 +1211,10 @@ static struct command *_find_command(struct cmd_context *cmd, const char *path,
|
|||||||
/* if cmd is missing any required opt/pos args, it can't be this command. */
|
/* if cmd is missing any required opt/pos args, it can't be this command. */
|
||||||
|
|
||||||
if (mismatch_count) {
|
if (mismatch_count) {
|
||||||
/* save "closest" command that doesn't match */
|
/* save i/match_count for "closest" command that doesn't match */
|
||||||
if (match_count_ro && (match_count_ro > closest_count_ro)) {
|
if (!closest_count || (match_count > closest_count)) {
|
||||||
closest_i = i;
|
closest_i = i;
|
||||||
closest_count_ro = match_count_ro;
|
closest_count = match_count;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -1277,10 +1246,10 @@ static struct command *_find_command(struct cmd_context *cmd, const char *path,
|
|||||||
|
|
||||||
if (!best_count) {
|
if (!best_count) {
|
||||||
/* cmd did not have all the required opt/pos args of any command */
|
/* cmd did not have all the required opt/pos args of any command */
|
||||||
log_error("Failed to find a matching command definition.");
|
log_error("Failed to find a matching command definition.\n");
|
||||||
if (closest_count_ro) {
|
if (closest_count) {
|
||||||
log_warn("Closest command usage is:");
|
log_warn("Closest command usage is:");
|
||||||
_print_usage(_cmdline.commands[closest_i].usage, 1);
|
_print_usage(_cmdline.commands[closest_i].usage);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -1323,17 +1292,6 @@ static struct command *_find_command(struct cmd_context *cmd, const char *path,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* --type is one option that when set but not accepted by the
|
|
||||||
* command, will not be ignored to make a match. Perhaps there
|
|
||||||
* are others like this, and perhaps this is a property that
|
|
||||||
* should be encoded in args.h?
|
|
||||||
*/
|
|
||||||
if (!accepted && (i == type_ARG)) {
|
|
||||||
log_error("Failed to find a matching command definition with --type.");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!accepted) {
|
if (!accepted) {
|
||||||
log_warn("Ignoring option which is not used by the specified command: %s.",
|
log_warn("Ignoring option which is not used by the specified command: %s.",
|
||||||
arg_long_option_name(i));
|
arg_long_option_name(i));
|
||||||
@@ -1373,7 +1331,7 @@ static struct command *_find_command(struct cmd_context *cmd, const char *path,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
log_debug("command line id: %s (%d)", commands[best_i].command_line_id, best_i);
|
log_debug("Command definition (%d): %s", best_i, commands[best_i].usage);
|
||||||
|
|
||||||
return &commands[best_i];
|
return &commands[best_i];
|
||||||
}
|
}
|
||||||
@@ -1405,14 +1363,14 @@ static int _usage(const char *name, int help_count)
|
|||||||
|
|
||||||
usage_common = _cmdline.commands[i].usage_common;
|
usage_common = _cmdline.commands[i].usage_common;
|
||||||
|
|
||||||
_print_usage(_cmdline.commands[i].usage, 0);
|
_print_usage(_cmdline.commands[i].usage);
|
||||||
log_print(" "); /* for built-in \n */
|
log_print(" "); /* for built-in \n */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Common options are printed once for all variants of a command name. */
|
/* Common options are printed once for all variants of a command name. */
|
||||||
if (usage_common) {
|
if (usage_common) {
|
||||||
log_print("Common options:");
|
log_print("Common options:");
|
||||||
_print_usage(usage_common, 0);
|
_print_usage(usage_common);
|
||||||
log_print(" "); /* for built-in \n */
|
log_print(" "); /* for built-in \n */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1427,8 +1385,6 @@ static int _usage(const char *name, int help_count)
|
|||||||
log_print(". Select indicates that a required positional parameter can");
|
log_print(". Select indicates that a required positional parameter can");
|
||||||
log_print(" be omitted if the --select option is used.");
|
log_print(" be omitted if the --select option is used.");
|
||||||
log_print(". --size Number can be replaced with --extents NumberExtents.");
|
log_print(". --size Number can be replaced with --extents NumberExtents.");
|
||||||
log_print(". --name is usually specified for lvcreate, but is not among");
|
|
||||||
log_print(" the required parameters because names can be generated.");
|
|
||||||
log_print(". For required options listed in parentheses, e.g. (--A, --B),");
|
log_print(". For required options listed in parentheses, e.g. (--A, --B),");
|
||||||
log_print(" any one is required, after which the others are optional.");
|
log_print(" any one is required, after which the others are optional.");
|
||||||
log_print(". The _new suffix indicates the VG or LV must not yet exist.");
|
log_print(". The _new suffix indicates the VG or LV must not yet exist.");
|
||||||
@@ -2260,7 +2216,7 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
|
|||||||
log_debug("Parsing: %s", cmd->cmd_line);
|
log_debug("Parsing: %s", cmd->cmd_line);
|
||||||
|
|
||||||
if (!(cmd->command = _find_command(cmd, cmd_name, &argc, argv)))
|
if (!(cmd->command = _find_command(cmd, cmd_name, &argc, argv)))
|
||||||
return_ECMD_FAILED;
|
return ENO_SUCH_CMD;
|
||||||
|
|
||||||
set_cmd_name(cmd_name);
|
set_cmd_name(cmd_name);
|
||||||
|
|
||||||
@@ -2418,12 +2374,10 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->command->functions)
|
/*
|
||||||
/* A command-line--specific function is used */
|
* FIXME Break up into multiple functions.
|
||||||
ret = cmd->command->functions->fn(cmd, argc, argv);
|
*/
|
||||||
else
|
ret = cmd->command->fn(cmd, argc, argv);
|
||||||
/* The old style command-name function is used */
|
|
||||||
ret = cmd->command->fn(cmd, argc, argv);
|
|
||||||
|
|
||||||
lvmlockd_disconnect();
|
lvmlockd_disconnect();
|
||||||
fin_locking();
|
fin_locking();
|
||||||
|
@@ -2346,12 +2346,8 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
|
|||||||
struct dm_str_list *sl;
|
struct dm_str_list *sl;
|
||||||
struct dm_list final_lvs;
|
struct dm_list final_lvs;
|
||||||
struct lv_list *final_lvl;
|
struct lv_list *final_lvl;
|
||||||
struct dm_list found_arg_lvnames;
|
|
||||||
struct glv_list *glvl, *tglvl;
|
struct glv_list *glvl, *tglvl;
|
||||||
int do_report_ret_code = 1;
|
int do_report_ret_code = 1;
|
||||||
uint32_t lv_types;
|
|
||||||
struct logical_volume *lv;
|
|
||||||
struct lv_segment *seg;
|
|
||||||
|
|
||||||
log_set_report_object_type(LOG_REPORT_OBJECT_TYPE_LV);
|
log_set_report_object_type(LOG_REPORT_OBJECT_TYPE_LV);
|
||||||
|
|
||||||
@@ -2360,7 +2356,6 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
|
|||||||
stack;
|
stack;
|
||||||
|
|
||||||
dm_list_init(&final_lvs);
|
dm_list_init(&final_lvs);
|
||||||
dm_list_init(&found_arg_lvnames);
|
|
||||||
|
|
||||||
if (!vg_check_status(vg, EXPORTED_VG)) {
|
if (!vg_check_status(vg, EXPORTED_VG)) {
|
||||||
ret_max = ECMD_FAILED;
|
ret_max = ECMD_FAILED;
|
||||||
@@ -2454,7 +2449,6 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
|
|||||||
if (lvargs_supplied && str_list_match_item(arg_lvnames, lvl->lv->name)) {
|
if (lvargs_supplied && str_list_match_item(arg_lvnames, lvl->lv->name)) {
|
||||||
/* Remove LV from list of unprocessed LV names */
|
/* Remove LV from list of unprocessed LV names */
|
||||||
str_list_del(arg_lvnames, lvl->lv->name);
|
str_list_del(arg_lvnames, lvl->lv->name);
|
||||||
str_list_add(cmd->mem, &found_arg_lvnames, lvl->lv->name);
|
|
||||||
process_lv = 1;
|
process_lv = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2502,64 +2496,6 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
|
|||||||
if (lv_is_removed(lvl->lv))
|
if (lv_is_removed(lvl->lv))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/*
|
|
||||||
* If the command definition specifies one required positional
|
|
||||||
* LV (possibly repeatable), and specifies accepted LV types,
|
|
||||||
* then verify that the LV being processed matches one of those
|
|
||||||
* types.
|
|
||||||
*
|
|
||||||
* process_each_lv() can only be used for commands that have
|
|
||||||
* one positional LV arg (optionally repeating, where each is
|
|
||||||
* processed independently.) It cannot work for commands that
|
|
||||||
* have different required LVs in designated positions, like
|
|
||||||
* 'lvrename LV1 LV2', where each LV is not processed
|
|
||||||
* independently. That means that this LV type check only
|
|
||||||
* needs to check the lv_type of the first positional arg.
|
|
||||||
*
|
|
||||||
* There is one command that violates this rule by stealing
|
|
||||||
* the first positional LV arg before calling process_each_lv:
|
|
||||||
* lvconvert --type snapshot LV_linear_striped_raid LV_snapshot
|
|
||||||
* This code cannot validate that case. process_each_lv() sees
|
|
||||||
* a single LV name arg, but it's in pos 2. Could we work around
|
|
||||||
* this by looking at the final positional arg rather than always
|
|
||||||
* looking at pos 1?
|
|
||||||
*
|
|
||||||
* This only validates types for required LV positional args
|
|
||||||
* (currently there are no command specifications that include
|
|
||||||
* specific LV types in optional positional args.)
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((cmd->command->rp_count == 1) &&
|
|
||||||
val_bit_is_set(cmd->command->required_pos_args[0].def.val_bits, lv_VAL) &&
|
|
||||||
cmd->command->required_pos_args[0].def.lv_types) {
|
|
||||||
|
|
||||||
lv_types = cmd->command->required_pos_args[0].def.lv_types;
|
|
||||||
lv = lvl->lv;
|
|
||||||
seg = first_seg(lv);
|
|
||||||
|
|
||||||
if ((lv_is_cow(lv) && !(lv_types & ARG_DEF_LV_SNAPSHOT)) ||
|
|
||||||
(lv_is_thin_volume(lv) && !(lv_types & ARG_DEF_LV_THIN)) ||
|
|
||||||
(lv_is_thin_pool(lv) && !(lv_types & ARG_DEF_LV_THINPOOL)) ||
|
|
||||||
(lv_is_cache(lv) && !(lv_types & ARG_DEF_LV_CACHE)) ||
|
|
||||||
(lv_is_cache_pool(lv) && !(lv_types & ARG_DEF_LV_CACHEPOOL)) ||
|
|
||||||
(lv_is_mirror(lv) && !(lv_types & ARG_DEF_LV_MIRROR)) ||
|
|
||||||
(lv_is_raid(lv) && !(lv_types & (ARG_DEF_LV_RAID | ARG_DEF_LV_RAID0 | ARG_DEF_LV_RAID1 | ARG_DEF_LV_RAID4 | ARG_DEF_LV_RAID5 | ARG_DEF_LV_RAID6 | ARG_DEF_LV_RAID10))) ||
|
|
||||||
(segtype_is_striped(seg->segtype) && !(lv_types & ARG_DEF_LV_STRIPED)) ||
|
|
||||||
(segtype_is_linear(seg->segtype) && !(lv_types & ARG_DEF_LV_LINEAR))) {
|
|
||||||
/*
|
|
||||||
* If a named LV arg cannot be processed it's an error, otherwise
|
|
||||||
* the LV is skipped and doesn't cause the command to fail.
|
|
||||||
*/
|
|
||||||
if (str_list_match_item(&found_arg_lvnames, lv->name)) {
|
|
||||||
log_error("Operation not permitted on LV %s with type %s.", display_lvname(lv), seg->segtype->name);
|
|
||||||
ret_max = ECMD_FAILED;
|
|
||||||
} else {
|
|
||||||
log_warn("Operation not permitted on LV %s with type %s.", display_lvname(lv), seg->segtype->name);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log_very_verbose("Processing LV %s in VG %s.", lvl->lv->name, vg->name);
|
log_very_verbose("Processing LV %s in VG %s.", lvl->lv->name, vg->name);
|
||||||
|
|
||||||
ret = process_single_lv(cmd, lvl->lv, handle);
|
ret = process_single_lv(cmd, lvl->lv, handle);
|
||||||
|
Reference in New Issue
Block a user