mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-22 17:35:59 +03:00
Accept multiple mapped device names on many dmsetup command lines.
This commit is contained in:
parent
9a45e3dbbb
commit
fa61ff55de
@ -1,5 +1,6 @@
|
||||
Version 1.02.64 -
|
||||
===================================
|
||||
Accept multiple mapped device names on many dmsetup command lines.
|
||||
Fix dm_udev_wait calls in dmsetup to occur before readahead display not after.
|
||||
Include an implicit dm_task_update_nodes() within dm_udev_wait().
|
||||
Fix _create_and_load_v4 not to lose the --addnodeoncreate setting (1.02.62).
|
||||
|
259
tools/dmsetup.c
259
tools/dmsetup.c
@ -185,13 +185,16 @@ static report_type_t _report_type;
|
||||
* Commands
|
||||
*/
|
||||
|
||||
typedef int (*command_fn) (int argc, char **argv, void *data);
|
||||
struct command;
|
||||
#define CMD_ARGS const struct command *cmd, int argc, char **argv, struct dm_names *names, int multiple_devices
|
||||
typedef int (*command_fn) (CMD_ARGS);
|
||||
|
||||
struct command {
|
||||
const char *name;
|
||||
const char *help;
|
||||
int min_args;
|
||||
int max_args;
|
||||
int repeatable_cmd; /* Repeat to process device list? */
|
||||
command_fn fn;
|
||||
};
|
||||
|
||||
@ -523,7 +526,7 @@ static int _set_task_add_node(struct dm_task *dmt)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _load(int argc, char **argv, void *data __attribute__((unused)))
|
||||
static int _load(CMD_ARGS)
|
||||
{
|
||||
int r = 0;
|
||||
struct dm_task *dmt;
|
||||
@ -583,7 +586,7 @@ static int _load(int argc, char **argv, void *data __attribute__((unused)))
|
||||
return r;
|
||||
}
|
||||
|
||||
static int _create(int argc, char **argv, void *data __attribute__((unused)))
|
||||
static int _create(CMD_ARGS)
|
||||
{
|
||||
int r = 0;
|
||||
struct dm_task *dmt;
|
||||
@ -670,7 +673,7 @@ static int _create(int argc, char **argv, void *data __attribute__((unused)))
|
||||
return r;
|
||||
}
|
||||
|
||||
static int _rename(int argc, char **argv, void *data __attribute__((unused)))
|
||||
static int _rename(CMD_ARGS)
|
||||
{
|
||||
int r = 0;
|
||||
struct dm_task *dmt;
|
||||
@ -721,7 +724,7 @@ static int _rename(int argc, char **argv, void *data __attribute__((unused)))
|
||||
return r;
|
||||
}
|
||||
|
||||
static int _message(int argc, char **argv, void *data __attribute__((unused)))
|
||||
static int _message(CMD_ARGS)
|
||||
{
|
||||
int r = 0, i;
|
||||
size_t sz = 1;
|
||||
@ -786,7 +789,7 @@ static int _message(int argc, char **argv, void *data __attribute__((unused)))
|
||||
return r;
|
||||
}
|
||||
|
||||
static int _setgeometry(int argc, char **argv, void *data __attribute__((unused)))
|
||||
static int _setgeometry(CMD_ARGS)
|
||||
{
|
||||
int r = 0;
|
||||
struct dm_task *dmt;
|
||||
@ -825,7 +828,7 @@ static int _setgeometry(int argc, char **argv, void *data __attribute__((unused)
|
||||
return r;
|
||||
}
|
||||
|
||||
static int _splitname(int argc, char **argv, void *data __attribute__((unused)))
|
||||
static int _splitname(CMD_ARGS)
|
||||
{
|
||||
struct dmsetup_report_obj obj;
|
||||
int r = 1;
|
||||
@ -859,7 +862,7 @@ static uint32_t _get_cookie_value(const char *str_value)
|
||||
return (uint32_t) value;
|
||||
}
|
||||
|
||||
static int _udevflags(int args, char **argv, void *data __attribute__((unused)))
|
||||
static int _udevflags(CMD_ARGS)
|
||||
{
|
||||
uint32_t cookie;
|
||||
uint16_t flags;
|
||||
@ -901,7 +904,7 @@ static int _udevflags(int args, char **argv, void *data __attribute__((unused)))
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _udevcomplete(int argc, char **argv, void *data __attribute__((unused)))
|
||||
static int _udevcomplete(CMD_ARGS)
|
||||
{
|
||||
uint32_t cookie;
|
||||
|
||||
@ -926,30 +929,28 @@ static int _udevcomplete(int argc, char **argv, void *data __attribute__((unused
|
||||
#ifndef UDEV_SYNC_SUPPORT
|
||||
static const char _cmd_not_supported[] = "Command not supported. Recompile with \"--enable-udev-sync\" to enable.";
|
||||
|
||||
static int _udevcreatecookie(int argc, char **argv,
|
||||
void *data __attribute__((unused)))
|
||||
static int _udevcreatecookie(CMD_ARGS)
|
||||
{
|
||||
log_error(_cmd_not_supported);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int _udevreleasecookie(int argc, char **argv,
|
||||
void *data __attribute__((unused)))
|
||||
static int _udevreleasecookie(CMD_ARGS)
|
||||
{
|
||||
log_error(_cmd_not_supported);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int _udevcomplete_all(int argc __attribute__((unused)), char **argv __attribute__((unused)), void *data __attribute__((unused)))
|
||||
static int _udevcomplete_all(CMD_ARGS)
|
||||
{
|
||||
log_error(_cmd_not_supported);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int _udevcookies(int argc __attribute__((unused)), char **argv __attribute__((unused)), void *data __attribute__((unused)))
|
||||
static int _udevcookies(CMD_ARGS)
|
||||
{
|
||||
log_error(_cmd_not_supported);
|
||||
|
||||
@ -1023,8 +1024,7 @@ static int _set_up_udev_support(const char *dev_dir)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _udevcreatecookie(int argc, char **argv,
|
||||
void *data __attribute__((unused)))
|
||||
static int _udevcreatecookie(CMD_ARGS)
|
||||
{
|
||||
uint32_t cookie;
|
||||
|
||||
@ -1037,8 +1037,7 @@ static int _udevcreatecookie(int argc, char **argv,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _udevreleasecookie(int argc, char **argv,
|
||||
void *data __attribute__((unused)))
|
||||
static int _udevreleasecookie(CMD_ARGS)
|
||||
{
|
||||
if (argv[1] && !(_udev_cookie = _get_cookie_value(argv[1])))
|
||||
return 0;
|
||||
@ -1079,7 +1078,7 @@ static char _yes_no_prompt(const char *prompt, ...)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int _udevcomplete_all(int argc __attribute__((unused)), char **argv __attribute__((unused)), void *data __attribute__((unused)))
|
||||
static int _udevcomplete_all(CMD_ARGS)
|
||||
{
|
||||
int max_id, id, sid;
|
||||
struct seminfo sinfo;
|
||||
@ -1128,7 +1127,7 @@ static int _udevcomplete_all(int argc __attribute__((unused)), char **argv __att
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _udevcookies(int argc __attribute__((unused)), char **argv __attribute__((unused)), void *data __attribute__((unused)))
|
||||
static int _udevcookies(CMD_ARGS)
|
||||
{
|
||||
int max_id, id, sid;
|
||||
struct seminfo sinfo;
|
||||
@ -1167,7 +1166,7 @@ static int _udevcookies(int argc __attribute__((unused)), char **argv __attribut
|
||||
}
|
||||
#endif /* UDEV_SYNC_SUPPORT */
|
||||
|
||||
static int _version(int argc __attribute__((unused)), char **argv __attribute__((unused)), void *data __attribute__((unused)))
|
||||
static int _version(CMD_ARGS)
|
||||
{
|
||||
char version[80];
|
||||
|
||||
@ -1249,22 +1248,22 @@ static int _simple(int task, const char *name, uint32_t event_nr, int display)
|
||||
return r;
|
||||
}
|
||||
|
||||
static int _suspend(int argc, char **argv, void *data __attribute__((unused)))
|
||||
static int _suspend(CMD_ARGS)
|
||||
{
|
||||
return _simple(DM_DEVICE_SUSPEND, argc > 1 ? argv[1] : NULL, 0, 1);
|
||||
}
|
||||
|
||||
static int _resume(int argc, char **argv, void *data __attribute__((unused)))
|
||||
static int _resume(CMD_ARGS)
|
||||
{
|
||||
return _simple(DM_DEVICE_RESUME, argc > 1 ? argv[1] : NULL, 0, 1);
|
||||
}
|
||||
|
||||
static int _clear(int argc, char **argv, void *data __attribute__((unused)))
|
||||
static int _clear(CMD_ARGS)
|
||||
{
|
||||
return _simple(DM_DEVICE_CLEAR, argc > 1 ? argv[1] : NULL, 0, 1);
|
||||
}
|
||||
|
||||
static int _wait(int argc, char **argv, void *data __attribute__((unused)))
|
||||
static int _wait(CMD_ARGS)
|
||||
{
|
||||
const char *name = NULL;
|
||||
|
||||
@ -1281,8 +1280,8 @@ static int _wait(int argc, char **argv, void *data __attribute__((unused)))
|
||||
(argc > 1) ? (uint32_t) atoi(argv[argc - 1]) : 0, 1);
|
||||
}
|
||||
|
||||
static int _process_all(int argc, char **argv, int silent,
|
||||
int (*fn) (int argc, char **argv, void *data))
|
||||
static int _process_all(const struct command *cmd, int argc, char **argv, int silent,
|
||||
int (*fn) (CMD_ARGS))
|
||||
{
|
||||
int r = 1;
|
||||
struct dm_names *names;
|
||||
@ -1311,7 +1310,7 @@ static int _process_all(int argc, char **argv, int silent,
|
||||
|
||||
do {
|
||||
names = (struct dm_names *)((char *) names + next);
|
||||
if (!fn(argc, argv, names))
|
||||
if (!fn(cmd, argc, argv, names, 1))
|
||||
r = 0;
|
||||
next = names->next;
|
||||
} while (next);
|
||||
@ -1358,15 +1357,14 @@ static uint64_t _get_device_size(const char *name)
|
||||
return size;
|
||||
}
|
||||
|
||||
static int _error_device(int argc __attribute__((unused)), char **argv __attribute__((unused)), void *data)
|
||||
static int _error_device(CMD_ARGS)
|
||||
{
|
||||
struct dm_names *names = (struct dm_names *) data;
|
||||
struct dm_task *dmt;
|
||||
const char *name;
|
||||
uint64_t size;
|
||||
int r = 0;
|
||||
|
||||
if (data)
|
||||
if (names)
|
||||
name = names->name;
|
||||
else
|
||||
name = argv[1];
|
||||
@ -1406,22 +1404,22 @@ error:
|
||||
return r;
|
||||
}
|
||||
|
||||
static int _remove(int argc, char **argv, void *data __attribute__((unused)))
|
||||
static int _remove(CMD_ARGS)
|
||||
{
|
||||
if (_switches[FORCE_ARG] && argc > 1)
|
||||
(void) _error_device(argc, argv, NULL);
|
||||
(void) _error_device(cmd, argc, argv, NULL, 0);
|
||||
|
||||
return _simple(DM_DEVICE_REMOVE, argc > 1 ? argv[1] : NULL, 0, 0);
|
||||
}
|
||||
|
||||
static int _count_devices(int argc __attribute__((unused)), char **argv __attribute__((unused)), void *data __attribute__((unused)))
|
||||
static int _count_devices(CMD_ARGS)
|
||||
{
|
||||
_num_devices++;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _remove_all(int argc __attribute__((unused)), char **argv __attribute__((unused)), void *data __attribute__((unused)))
|
||||
static int _remove_all(CMD_ARGS)
|
||||
{
|
||||
int r;
|
||||
|
||||
@ -1432,17 +1430,17 @@ static int _remove_all(int argc __attribute__((unused)), char **argv __attribute
|
||||
return r;
|
||||
|
||||
_num_devices = 0;
|
||||
r |= _process_all(argc, argv, 1, _count_devices);
|
||||
r |= _process_all(cmd, argc, argv, 1, _count_devices);
|
||||
|
||||
/* No devices left? */
|
||||
if (!_num_devices)
|
||||
return r;
|
||||
|
||||
r |= _process_all(argc, argv, 1, _error_device);
|
||||
r |= _process_all(cmd, argc, argv, 1, _error_device);
|
||||
r |= _simple(DM_DEVICE_REMOVE_ALL, "", 0, 0) | dm_mknodes(NULL);
|
||||
|
||||
_num_devices = 0;
|
||||
r |= _process_all(argc, argv, 1, _count_devices);
|
||||
r |= _process_all(cmd, argc, argv, 1, _count_devices);
|
||||
if (!_num_devices)
|
||||
return r;
|
||||
|
||||
@ -1459,7 +1457,7 @@ static void _display_dev(struct dm_task *dmt, const char *name)
|
||||
printf("%s\t(%u, %u)\n", name, info.major, info.minor);
|
||||
}
|
||||
|
||||
static int _mknodes(int argc, char **argv, void *data __attribute__((unused)))
|
||||
static int _mknodes(CMD_ARGS)
|
||||
{
|
||||
return dm_mknodes(argc > 1 ? argv[1] : NULL);
|
||||
}
|
||||
@ -1523,7 +1521,7 @@ static int _exec_command(const char *name)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _status(int argc, char **argv, void *data)
|
||||
static int _status(CMD_ARGS)
|
||||
{
|
||||
int r = 0;
|
||||
struct dm_task *dmt;
|
||||
@ -1531,31 +1529,30 @@ static int _status(int argc, char **argv, void *data)
|
||||
uint64_t start, length;
|
||||
char *target_type = NULL;
|
||||
char *params, *c;
|
||||
int cmd;
|
||||
struct dm_names *names = (struct dm_names *) data;
|
||||
int cmdno;
|
||||
const char *name = NULL;
|
||||
int matched = 0;
|
||||
int ls_only = 0;
|
||||
struct dm_info info;
|
||||
|
||||
if (data)
|
||||
if (names)
|
||||
name = names->name;
|
||||
else {
|
||||
if (argc == 1 && !_switches[UUID_ARG] && !_switches[MAJOR_ARG])
|
||||
return _process_all(argc, argv, 0, _status);
|
||||
if (argc == 2)
|
||||
return _process_all(cmd, argc, argv, 0, _status);
|
||||
if (multiple_devices)
|
||||
name = argv[1];
|
||||
}
|
||||
|
||||
if (!strcmp(argv[0], "table"))
|
||||
cmd = DM_DEVICE_TABLE;
|
||||
if (!strcmp(cmd->name, "table"))
|
||||
cmdno = DM_DEVICE_TABLE;
|
||||
else
|
||||
cmd = DM_DEVICE_STATUS;
|
||||
cmdno = DM_DEVICE_STATUS;
|
||||
|
||||
if (!strcmp(argv[0], "ls"))
|
||||
if (!strcmp(cmd->name, "ls"))
|
||||
ls_only = 1;
|
||||
|
||||
if (!(dmt = dm_task_create(cmd)))
|
||||
if (!(dmt = dm_task_create(cmdno)))
|
||||
return 0;
|
||||
|
||||
if (!_set_task_device(dmt, name, 0))
|
||||
@ -1593,12 +1590,12 @@ static int _status(int argc, char **argv, void *data)
|
||||
_switches[VERBOSE_ARG]) {
|
||||
if (!matched && _switches[VERBOSE_ARG])
|
||||
_display_info(dmt);
|
||||
if (data && !_switches[VERBOSE_ARG])
|
||||
if (multiple_devices && !_switches[VERBOSE_ARG])
|
||||
printf("%s: ", name);
|
||||
if (target_type) {
|
||||
/* Suppress encryption key */
|
||||
if (!_switches[SHOWKEYS_ARG] &&
|
||||
cmd == DM_DEVICE_TABLE &&
|
||||
cmdno == DM_DEVICE_TABLE &&
|
||||
!strcmp(target_type, "crypt")) {
|
||||
c = params;
|
||||
while (*c && *c != ' ')
|
||||
@ -1616,7 +1613,7 @@ static int _status(int argc, char **argv, void *data)
|
||||
matched = 1;
|
||||
} while (next);
|
||||
|
||||
if (data && _switches[VERBOSE_ARG] && matched && !ls_only)
|
||||
if (multiple_devices && _switches[VERBOSE_ARG] && matched && !ls_only)
|
||||
printf("\n");
|
||||
|
||||
if (matched && _switches[EXEC_ARG] && _command && !_exec_command(name))
|
||||
@ -1630,7 +1627,7 @@ static int _status(int argc, char **argv, void *data)
|
||||
}
|
||||
|
||||
/* Show target names and their version numbers */
|
||||
static int _targets(int argc __attribute__((unused)), char **argv __attribute__((unused)), void *data __attribute__((unused)))
|
||||
static int _targets(CMD_ARGS)
|
||||
{
|
||||
int r = 0;
|
||||
struct dm_task *dmt;
|
||||
@ -1662,20 +1659,19 @@ static int _targets(int argc __attribute__((unused)), char **argv __attribute__(
|
||||
return r;
|
||||
}
|
||||
|
||||
static int _info(int argc, char **argv, void *data)
|
||||
static int _info(CMD_ARGS)
|
||||
{
|
||||
int r = 0;
|
||||
|
||||
struct dm_task *dmt;
|
||||
struct dm_names *names = (struct dm_names *) data;
|
||||
char *name = NULL;
|
||||
|
||||
if (data)
|
||||
if (names)
|
||||
name = names->name;
|
||||
else {
|
||||
if (argc == 1 && !_switches[UUID_ARG] && !_switches[MAJOR_ARG])
|
||||
return _process_all(argc, argv, 0, _info);
|
||||
if (argc == 2)
|
||||
return _process_all(cmd, argc, argv, 0, _info);
|
||||
if (multiple_devices)
|
||||
name = argv[1];
|
||||
}
|
||||
|
||||
@ -1701,22 +1697,21 @@ static int _info(int argc, char **argv, void *data)
|
||||
return r;
|
||||
}
|
||||
|
||||
static int _deps(int argc, char **argv, void *data)
|
||||
static int _deps(CMD_ARGS)
|
||||
{
|
||||
int r = 0;
|
||||
uint32_t i;
|
||||
struct dm_deps *deps;
|
||||
struct dm_task *dmt;
|
||||
struct dm_info info;
|
||||
struct dm_names *names = (struct dm_names *) data;
|
||||
char *name = NULL;
|
||||
|
||||
if (data)
|
||||
if (names)
|
||||
name = names->name;
|
||||
else {
|
||||
if (argc == 1 && !_switches[UUID_ARG] && !_switches[MAJOR_ARG])
|
||||
return _process_all(argc, argv, 0, _deps);
|
||||
if (argc == 2)
|
||||
return _process_all(cmd, argc, argv, 0, _deps);
|
||||
if (multiple_devices)
|
||||
name = argv[1];
|
||||
}
|
||||
|
||||
@ -1750,7 +1745,7 @@ static int _deps(int argc, char **argv, void *data)
|
||||
if (_switches[VERBOSE_ARG])
|
||||
_display_info(dmt);
|
||||
|
||||
if (data && !_switches[VERBOSE_ARG])
|
||||
if (multiple_devices && !_switches[VERBOSE_ARG])
|
||||
printf("%s: ", name);
|
||||
printf("%d dependencies\t:", deps->count);
|
||||
|
||||
@ -1760,7 +1755,7 @@ static int _deps(int argc, char **argv, void *data)
|
||||
(int) MINOR(deps->device[i]));
|
||||
printf("\n");
|
||||
|
||||
if (data && _switches[VERBOSE_ARG])
|
||||
if (multiple_devices && _switches[VERBOSE_ARG])
|
||||
printf("\n");
|
||||
|
||||
r = 1;
|
||||
@ -1770,10 +1765,8 @@ static int _deps(int argc, char **argv, void *data)
|
||||
return r;
|
||||
}
|
||||
|
||||
static int _display_name(int argc __attribute__((unused)), char **argv __attribute__((unused)), void *data)
|
||||
static int _display_name(CMD_ARGS)
|
||||
{
|
||||
struct dm_names *names = (struct dm_names *) data;
|
||||
|
||||
printf("%s\t(%d, %d)\n", names->name,
|
||||
(int) MAJOR(names->dev), (int) MINOR(names->dev));
|
||||
|
||||
@ -2085,10 +2078,8 @@ static void _display_tree_walk_children(struct dm_tree_node *node,
|
||||
}
|
||||
}
|
||||
|
||||
static int _add_dep(int argc __attribute__((unused)), char **argv __attribute__((unused)), void *data)
|
||||
static int _add_dep(CMD_ARGS)
|
||||
{
|
||||
struct dm_names *names = (struct dm_names *) data;
|
||||
|
||||
if (!dm_tree_add_dev(_dtree, (unsigned) MAJOR(names->dev), (unsigned) MINOR(names->dev)))
|
||||
return 0;
|
||||
|
||||
@ -2098,7 +2089,7 @@ static int _add_dep(int argc __attribute__((unused)), char **argv __attribute__(
|
||||
/*
|
||||
* Create and walk dependency tree
|
||||
*/
|
||||
static int _build_whole_deptree(void)
|
||||
static int _build_whole_deptree(const struct command *cmd)
|
||||
{
|
||||
if (_dtree)
|
||||
return 1;
|
||||
@ -2106,17 +2097,15 @@ static int _build_whole_deptree(void)
|
||||
if (!(_dtree = dm_tree_create()))
|
||||
return 0;
|
||||
|
||||
if (!_process_all(0, NULL, 0, _add_dep))
|
||||
if (!_process_all(cmd, 0, NULL, 0, _add_dep))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _display_tree(int argc __attribute__((unused)),
|
||||
char **argv __attribute__((unused)),
|
||||
void *data __attribute__((unused)))
|
||||
static int _display_tree(CMD_ARGS)
|
||||
{
|
||||
if (!_build_whole_deptree())
|
||||
if (!_build_whole_deptree(cmd))
|
||||
return 0;
|
||||
|
||||
_display_tree_walk_children(dm_tree_find_node(_dtree, 0, 0), 0);
|
||||
@ -2581,7 +2570,7 @@ FIELD_O(NAME, dm_split_name, STR, "LVLayer", lv_layer, 7, dm_lv_layer_name, "lv_
|
||||
static const char *default_report_options = "name,major,minor,attr,open,segments,events,uuid";
|
||||
static const char *splitname_report_options = "vg_name,lv_name,lv_layer";
|
||||
|
||||
static int _report_init(struct command *c)
|
||||
static int _report_init(const struct command *cmd)
|
||||
{
|
||||
char *options = (char *) default_report_options;
|
||||
const char *keys = "";
|
||||
@ -2592,7 +2581,7 @@ static int _report_init(struct command *c)
|
||||
size_t len = 0;
|
||||
int r = 0;
|
||||
|
||||
if (c && !strcmp(c->name, "splitname"))
|
||||
if (cmd && !strcmp(cmd->name, "splitname"))
|
||||
options = (char *) splitname_report_options;
|
||||
|
||||
/* emulate old dmsetup behaviour */
|
||||
@ -2638,7 +2627,7 @@ static int _report_init(struct command *c)
|
||||
if (_switches[SORT_ARG] && _string_args[SORT_ARG]) {
|
||||
keys = _string_args[SORT_ARG];
|
||||
buffered = 1;
|
||||
if (c && (!strcmp(c->name, "status") || !strcmp(c->name, "table"))) {
|
||||
if (cmd && (!strcmp(cmd->name, "status") || !strcmp(cmd->name, "table"))) {
|
||||
err("--sort is not yet supported with status and table");
|
||||
goto out;
|
||||
}
|
||||
@ -2672,7 +2661,7 @@ static int _report_init(struct command *c)
|
||||
options, separator, flags, keys, NULL)))
|
||||
goto out;
|
||||
|
||||
if ((_report_type & DR_TREE) && !_build_whole_deptree()) {
|
||||
if ((_report_type & DR_TREE) && !_build_whole_deptree(cmd)) {
|
||||
err("Internal device dependency tree creation failed.");
|
||||
goto out;
|
||||
}
|
||||
@ -2695,56 +2684,56 @@ out:
|
||||
/*
|
||||
* List devices
|
||||
*/
|
||||
static int _ls(int argc, char **argv, void *data)
|
||||
static int _ls(CMD_ARGS)
|
||||
{
|
||||
if ((_switches[TARGET_ARG] && _target) ||
|
||||
(_switches[EXEC_ARG] && _command))
|
||||
return _status(argc, argv, data);
|
||||
return _status(cmd, argc, argv, NULL, 0);
|
||||
else if ((_switches[TREE_ARG]))
|
||||
return _display_tree(argc, argv, data);
|
||||
return _display_tree(cmd, 0, NULL, NULL, 0);
|
||||
else
|
||||
return _process_all(argc, argv, 0, _display_name);
|
||||
return _process_all(cmd, argc, argv, 0, _display_name);
|
||||
}
|
||||
|
||||
static int _help(int argc, char **argv, void *data);
|
||||
static int _help(CMD_ARGS);
|
||||
|
||||
/*
|
||||
* Dispatch table
|
||||
*/
|
||||
static struct command _commands[] = {
|
||||
{"help", "[-c|-C|--columns]", 0, 0, _help},
|
||||
{"help", "[-c|-C|--columns]", 0, 0, 0, _help},
|
||||
{"create", "<dev_name> [-j|--major <major> -m|--minor <minor>]\n"
|
||||
"\t [-U|--uid <uid>] [-G|--gid <gid>] [-M|--mode <octal_mode>]\n"
|
||||
"\t [-u|uuid <uuid>] [{--addnodeonresume|--addnodeoncreate}]\n"
|
||||
"\t [--notable | --table <table> | <table_file>]",
|
||||
1, 2, _create},
|
||||
{"remove", "[-f|--force] <device>", 0, 1, _remove},
|
||||
{"remove_all", "[-f|--force]", 0, 0, _remove_all},
|
||||
{"suspend", "[--noflush] <device>", 0, 1, _suspend},
|
||||
{"resume", "<device> [{--addnodeonresume|--addnodeoncreate}]", 0, 1, _resume},
|
||||
{"load", "<device> [<table_file>]", 0, 2, _load},
|
||||
{"clear", "<device>", 0, 1, _clear},
|
||||
{"reload", "<device> [<table_file>]", 0, 2, _load},
|
||||
{"rename", "<device> [--setuuid] <new_name_or_uuid>", 1, 2, _rename},
|
||||
{"message", "<device> <sector> <message>", 2, -1, _message},
|
||||
{"ls", "[--target <target_type>] [--exec <command>] [--tree [-o options]]", 0, 0, _ls},
|
||||
{"info", "[<device>]", 0, 1, _info},
|
||||
{"deps", "[<device>]", 0, 1, _deps},
|
||||
{"status", "[<device>] [--target <target_type>]", 0, 1, _status},
|
||||
{"table", "[<device>] [--target <target_type>] [--showkeys]", 0, 1, _status},
|
||||
{"wait", "<device> [<event_nr>]", 0, 2, _wait},
|
||||
{"mknodes", "[<device>]", 0, 1, _mknodes},
|
||||
{"udevcreatecookie", "", 0, 0, _udevcreatecookie},
|
||||
{"udevreleasecookie", "[<cookie>]", 0, 1, _udevreleasecookie},
|
||||
{"udevflags", "<cookie>", 1, 1, _udevflags},
|
||||
{"udevcomplete", "<cookie>", 1, 1, _udevcomplete},
|
||||
{"udevcomplete_all", "", 0, 0, _udevcomplete_all},
|
||||
{"udevcookies", "", 0, 0, _udevcookies},
|
||||
{"targets", "", 0, 0, _targets},
|
||||
{"version", "", 0, 0, _version},
|
||||
{"setgeometry", "<device> <cyl> <head> <sect> <start>", 5, 5, _setgeometry},
|
||||
{"splitname", "<device> [<subsystem>]", 1, 2, _splitname},
|
||||
{NULL, NULL, 0, 0, NULL}
|
||||
1, 2,0, _create},
|
||||
{"remove", "[-f|--force] <device>", 0, -1, 1, _remove},
|
||||
{"remove_all", "[-f|--force]", 0, 0, 0, _remove_all},
|
||||
{"suspend", "[--noflush] <device>", 0, -1, 1, _suspend},
|
||||
{"resume", "<device> [{--addnodeonresume|--addnodeoncreate}]", 0, -1, 1, _resume},
|
||||
{"load", "<device> [<table_file>]", 0, 2, 0, _load},
|
||||
{"clear", "<device>", 0, -1, 1, _clear},
|
||||
{"reload", "<device> [<table_file>]", 0, 2, 0, _load},
|
||||
{"rename", "<device> [--setuuid] <new_name_or_uuid>", 1, 2, 0, _rename},
|
||||
{"message", "<device> <sector> <message>", 2, -1, 0, _message},
|
||||
{"ls", "[--target <target_type>] [--exec <command>] [--tree [-o options]]", 0, 0, 0, _ls},
|
||||
{"info", "[<device>]", 0, -1, 1, _info},
|
||||
{"deps", "[<device>]", 0, -1, 1, _deps},
|
||||
{"status", "[<device>] [--target <target_type>]", 0, -1, 1, _status},
|
||||
{"table", "[<device>] [--target <target_type>] [--showkeys]", 0, -1, 1, _status},
|
||||
{"wait", "<device> [<event_nr>]", 0, 2, 0, _wait},
|
||||
{"mknodes", "[<device>]", 0, -1, 1, _mknodes},
|
||||
{"udevcreatecookie", "", 0, 0, 0, _udevcreatecookie},
|
||||
{"udevreleasecookie", "[<cookie>]", 0, 1, 0, _udevreleasecookie},
|
||||
{"udevflags", "<cookie>", 1, 1, 0, _udevflags},
|
||||
{"udevcomplete", "<cookie>", 1, 1, 0, _udevcomplete},
|
||||
{"udevcomplete_all", "", 0, 0, 0, _udevcomplete_all},
|
||||
{"udevcookies", "", 0, 0, 0, _udevcookies},
|
||||
{"targets", "", 0, 0, 0, _targets},
|
||||
{"version", "", 0, 0, 0, _version},
|
||||
{"setgeometry", "<device> <cyl> <head> <sect> <start>", 5, 5, 0, _setgeometry},
|
||||
{"splitname", "<device> [<subsystem>]", 1, 2, 0, _splitname},
|
||||
{NULL, NULL, 0, 0, 0, NULL}
|
||||
};
|
||||
|
||||
static void _usage(FILE *out)
|
||||
@ -2777,9 +2766,7 @@ static void _losetup_usage(FILE *out)
|
||||
"[-o offset] [-f|loop_device] [file]\n\n");
|
||||
}
|
||||
|
||||
static int _help(int argc __attribute__((unused)),
|
||||
char **argv __attribute__((unused)),
|
||||
void *data __attribute__((unused)))
|
||||
static int _help(CMD_ARGS)
|
||||
{
|
||||
_usage(stderr);
|
||||
|
||||
@ -2792,7 +2779,7 @@ static int _help(int argc __attribute__((unused)),
|
||||
dm_report_free(_report);
|
||||
_report = NULL;
|
||||
}
|
||||
(void) _report_init(NULL);
|
||||
(void) _report_init(cmd);
|
||||
}
|
||||
|
||||
return 1;
|
||||
@ -3357,9 +3344,10 @@ static int _process_switches(int *argc, char ***argv, const char *dev_dir)
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct command *c;
|
||||
int r = 1;
|
||||
const char *dev_dir;
|
||||
const struct command *cmd;
|
||||
int multiple_devices;
|
||||
|
||||
(void) setlocale(LC_ALL, "");
|
||||
|
||||
@ -3378,12 +3366,12 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
if (_switches[HELP_ARG]) {
|
||||
c = _find_command("help");
|
||||
cmd = _find_command("help");
|
||||
goto doit;
|
||||
}
|
||||
|
||||
if (_switches[VERSION_ARG]) {
|
||||
c = _find_command("version");
|
||||
cmd = _find_command("version");
|
||||
goto doit;
|
||||
}
|
||||
|
||||
@ -3392,27 +3380,27 @@ int main(int argc, char **argv)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!(c = _find_command(argv[0]))) {
|
||||
if (!(cmd = _find_command(argv[0]))) {
|
||||
fprintf(stderr, "Unknown command\n");
|
||||
_usage(stderr);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (argc < c->min_args + 1 ||
|
||||
(c->max_args >= 0 && argc > c->max_args + 1)) {
|
||||
if (argc < cmd->min_args + 1 ||
|
||||
(cmd->max_args >= 0 && argc > cmd->max_args + 1)) {
|
||||
fprintf(stderr, "Incorrect number of arguments\n");
|
||||
_usage(stderr);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!_switches[COLS_ARG] && !strcmp(c->name, "splitname"))
|
||||
if (!_switches[COLS_ARG] && !strcmp(cmd->name, "splitname"))
|
||||
_switches[COLS_ARG]++;
|
||||
|
||||
if (_switches[COLS_ARG]) {
|
||||
if (!_report_init(c))
|
||||
if (!_report_init(cmd))
|
||||
goto out;
|
||||
if (!_report) {
|
||||
if (!strcmp(c->name, "info"))
|
||||
if (!strcmp(cmd->name, "info"))
|
||||
r = 0; /* info -c -o help */
|
||||
goto out;
|
||||
}
|
||||
@ -3424,10 +3412,13 @@ int main(int argc, char **argv)
|
||||
#endif
|
||||
|
||||
doit:
|
||||
if (!c->fn(argc, argv, NULL)) {
|
||||
fprintf(stderr, "Command failed\n");
|
||||
goto out;
|
||||
}
|
||||
multiple_devices = (argc > 1);
|
||||
do {
|
||||
if (!cmd->fn(cmd, argc--, argv++, NULL, multiple_devices)) {
|
||||
fprintf(stderr, "Command failed\n");
|
||||
goto out;
|
||||
}
|
||||
} while (cmd->repeatable_cmd && argc > 1);
|
||||
|
||||
r = 0;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user