mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
Add --table argument to dmsetup for a one-line table.
Abort if errors are found during cmdline option processing.
This commit is contained in:
parent
438abca889
commit
8df67fbf36
@ -1,5 +1,7 @@
|
|||||||
Version 1.02.09 -
|
Version 1.02.09 -
|
||||||
==============================
|
==============================
|
||||||
|
Add --table argument to dmsetup for a one-line table.
|
||||||
|
Abort if errors are found during cmdline option processing.
|
||||||
Add lockfs indicator to debug output.
|
Add lockfs indicator to debug output.
|
||||||
|
|
||||||
Version 1.02.08 - 17 July 2006
|
Version 1.02.08 - 17 July 2006
|
||||||
|
@ -4,7 +4,7 @@ dmsetup \- low level logical volume management
|
|||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.ad l
|
.ad l
|
||||||
.B dmsetup create
|
.B dmsetup create
|
||||||
.I device_name [-u uuid] [--notable] [table_file]
|
.I device_name [-u uuid] [--notable | --table <table> | table_file]
|
||||||
.br
|
.br
|
||||||
.B dmsetup remove
|
.B dmsetup remove
|
||||||
.I [-f|--force] device_name
|
.I [-f|--force] device_name
|
||||||
@ -19,13 +19,13 @@ dmsetup \- low level logical volume management
|
|||||||
.I device_name
|
.I device_name
|
||||||
.br
|
.br
|
||||||
.B dmsetup load
|
.B dmsetup load
|
||||||
.I device_name [table_file]
|
.I device_name [--table <table> | table_file]
|
||||||
.br
|
.br
|
||||||
.B dmsetup clear
|
.B dmsetup clear
|
||||||
.I device_name
|
.I device_name
|
||||||
.br
|
.br
|
||||||
.B dmsetup reload
|
.B dmsetup reload
|
||||||
.I device_name [table_file]
|
.I device_name [--table <table> | table_file]
|
||||||
.br
|
.br
|
||||||
.B dmsetup rename
|
.B dmsetup rename
|
||||||
.I device_name new_name
|
.I device_name new_name
|
||||||
@ -101,6 +101,9 @@ Specify which fields to display. Only \fB-o\ name\fP is supported.
|
|||||||
.IP \fB-r|--readonly
|
.IP \fB-r|--readonly
|
||||||
.br
|
.br
|
||||||
Set the table being loaded read-only.
|
Set the table being loaded read-only.
|
||||||
|
.IP \fB--table\ <table>
|
||||||
|
.br
|
||||||
|
Specify a one-line table directly on the command line.
|
||||||
.IP \fB-u|--uuid
|
.IP \fB-u|--uuid
|
||||||
.br
|
.br
|
||||||
Specify the uuid.
|
Specify the uuid.
|
||||||
@ -112,10 +115,10 @@ Produce additional output.
|
|||||||
Display the library and kernel driver version.
|
Display the library and kernel driver version.
|
||||||
.SH COMMANDS
|
.SH COMMANDS
|
||||||
.IP \fBcreate
|
.IP \fBcreate
|
||||||
.I device_name [-u uuid] [--notable] [table_file]
|
.I device_name [-u uuid] [--notable | --table <table> | table_file]
|
||||||
.br
|
.br
|
||||||
Creates a device with the given name.
|
Creates a device with the given name.
|
||||||
If table_file is supplied, the table is loaded and made live.
|
If table_file or <table> is supplied, the table is loaded and made live.
|
||||||
Otherwise a table is read from standard input unless --notable is used.
|
Otherwise a table is read from standard input unless --notable is used.
|
||||||
The optional uuid can be used in place of
|
The optional uuid can be used in place of
|
||||||
device_name in subsequent dmsetup commands.
|
device_name in subsequent dmsetup commands.
|
||||||
@ -160,10 +163,10 @@ device/nodevice; active, open, rw, uuid.
|
|||||||
Others specify how the tree is displayed:
|
Others specify how the tree is displayed:
|
||||||
ascii, utf, vt100; compact, inverted, notrunc.
|
ascii, utf, vt100; compact, inverted, notrunc.
|
||||||
.IP \fBload|reload
|
.IP \fBload|reload
|
||||||
.I device_name [table_file]
|
.I device_name [--table <table> | table_file]
|
||||||
.br
|
.br
|
||||||
Loads table_file into the inactive table slot for device_name.
|
Loads <table> or table_file into the inactive table slot for device_name.
|
||||||
If table_file is not supplied, reads a table from standard input.
|
If neither is supplied, reads a table from standard input.
|
||||||
.IP \fBmknodes
|
.IP \fBmknodes
|
||||||
.I [device_name]
|
.I [device_name]
|
||||||
.br
|
.br
|
||||||
|
114
tools/dmsetup.c
114
tools/dmsetup.c
@ -98,6 +98,7 @@ enum {
|
|||||||
NOOPENCOUNT_ARG,
|
NOOPENCOUNT_ARG,
|
||||||
NOTABLE_ARG,
|
NOTABLE_ARG,
|
||||||
OPTIONS_ARG,
|
OPTIONS_ARG,
|
||||||
|
TABLE_ARG,
|
||||||
TARGET_ARG,
|
TARGET_ARG,
|
||||||
TREE_ARG,
|
TREE_ARG,
|
||||||
UID_ARG,
|
UID_ARG,
|
||||||
@ -112,6 +113,7 @@ static int _values[NUM_SWITCHES];
|
|||||||
static int _num_devices;
|
static int _num_devices;
|
||||||
static char *_uuid;
|
static char *_uuid;
|
||||||
static char *_fields;
|
static char *_fields;
|
||||||
|
static char *_table;
|
||||||
static char *_target;
|
static char *_target;
|
||||||
static char *_command;
|
static char *_command;
|
||||||
static struct dm_tree *_dtree;
|
static struct dm_tree *_dtree;
|
||||||
@ -119,17 +121,55 @@ static struct dm_tree *_dtree;
|
|||||||
/*
|
/*
|
||||||
* Commands
|
* Commands
|
||||||
*/
|
*/
|
||||||
|
static int _parse_line(struct dm_task *dmt, char *buffer, const char *file,
|
||||||
|
int line)
|
||||||
|
{
|
||||||
|
char ttype[LINE_SIZE], *ptr, *comment;
|
||||||
|
unsigned long long start, size;
|
||||||
|
int n;
|
||||||
|
|
||||||
|
/* trim trailing space */
|
||||||
|
for (ptr = buffer + strlen(buffer) - 1; ptr >= buffer; ptr--)
|
||||||
|
if (!isspace((int) *ptr))
|
||||||
|
break;
|
||||||
|
ptr++;
|
||||||
|
*ptr = '\0';
|
||||||
|
|
||||||
|
/* trim leading space */
|
||||||
|
for (ptr = buffer; *ptr && isspace((int) *ptr); ptr++)
|
||||||
|
;
|
||||||
|
|
||||||
|
if (!*ptr || *ptr == '#')
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (sscanf(ptr, "%llu %llu %s %n",
|
||||||
|
&start, &size, ttype, &n) < 3) {
|
||||||
|
err("Invalid format on line %d of table %s", line, file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr += n;
|
||||||
|
if ((comment = strchr(ptr, (int) '#')))
|
||||||
|
*comment = '\0';
|
||||||
|
|
||||||
|
if (!dm_task_add_target(dmt, start, size, ttype, ptr))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int _parse_file(struct dm_task *dmt, const char *file)
|
static int _parse_file(struct dm_task *dmt, const char *file)
|
||||||
{
|
{
|
||||||
char *buffer = NULL;
|
char *buffer = NULL;
|
||||||
size_t buffer_size = 0;
|
size_t buffer_size = 0;
|
||||||
char ttype[LINE_SIZE], *ptr, *comment;
|
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
unsigned long long start, size;
|
int r = 0, line = 0;
|
||||||
int r = 0, n, line = 0;
|
|
||||||
|
/* one-line table on cmdline */
|
||||||
|
if (_table)
|
||||||
|
return _parse_line(dmt, _table, "", ++line);
|
||||||
|
|
||||||
/* OK for empty stdin */
|
/* OK for empty stdin */
|
||||||
|
|
||||||
if (file) {
|
if (file) {
|
||||||
if (!(fp = fopen(file, "r"))) {
|
if (!(fp = fopen(file, "r"))) {
|
||||||
err("Couldn't open '%s' for reading", file);
|
err("Couldn't open '%s' for reading", file);
|
||||||
@ -145,38 +185,13 @@ static int _parse_file(struct dm_task *dmt, const char *file)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (fgets(buffer, (int) buffer_size, fp)) {
|
while (fgets(buffer, (int) buffer_size, fp))
|
||||||
#else
|
#else
|
||||||
while (getline(&buffer, &buffer_size, fp) > 0) {
|
while (getline(&buffer, &buffer_size, fp) > 0)
|
||||||
#endif
|
#endif
|
||||||
line++;
|
if (!_parse_line(dmt, buffer, file ? : "on stdin", ++line))
|
||||||
|
|
||||||
/* trim trailing space */
|
|
||||||
for (ptr = buffer + strlen(buffer) - 1; ptr >= buffer; ptr--)
|
|
||||||
if (!isspace((int) *ptr))
|
|
||||||
break;
|
|
||||||
ptr++;
|
|
||||||
*ptr = '\0';
|
|
||||||
|
|
||||||
/* trim leading space */
|
|
||||||
for (ptr = buffer; *ptr && isspace((int) *ptr); ptr++) ;
|
|
||||||
|
|
||||||
if (!*ptr || *ptr == '#')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (sscanf(ptr, "%llu %llu %s %n",
|
|
||||||
&start, &size, ttype, &n) < 3) {
|
|
||||||
err("%s:%d Invalid format", file, line);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
|
||||||
|
|
||||||
ptr += n;
|
|
||||||
if ((comment = strchr(ptr, (int) '#')))
|
|
||||||
*comment = '\0';
|
|
||||||
|
|
||||||
if (!dm_task_add_target(dmt, start, size, ttype, ptr))
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
r = 1;
|
r = 1;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
@ -725,23 +740,23 @@ static int _error_device(int argc __attribute((unused)), char **argv __attribute
|
|||||||
|
|
||||||
size = _get_device_size(name);
|
size = _get_device_size(name);
|
||||||
|
|
||||||
if (!(dmt = dm_task_create(DM_DEVICE_RELOAD)))
|
if (!(dmt = dm_task_create(DM_DEVICE_RELOAD)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!_set_task_device(dmt, name, 0))
|
if (!_set_task_device(dmt, name, 0))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (!dm_task_add_target(dmt, 0, size, "error", ""))
|
if (!dm_task_add_target(dmt, 0, size, "error", ""))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (_switches[READ_ONLY] && !dm_task_set_ro(dmt))
|
if (_switches[READ_ONLY] && !dm_task_set_ro(dmt))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (_switches[NOOPENCOUNT_ARG] && !dm_task_no_open_count(dmt))
|
if (_switches[NOOPENCOUNT_ARG] && !dm_task_no_open_count(dmt))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (!dm_task_run(dmt))
|
if (!dm_task_run(dmt))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (!_simple(DM_DEVICE_RESUME, name, 0, 0)) {
|
if (!_simple(DM_DEVICE_RESUME, name, 0, 0)) {
|
||||||
_simple(DM_DEVICE_CLEAR, name, 0, 0);
|
_simple(DM_DEVICE_CLEAR, name, 0, 0);
|
||||||
@ -1472,7 +1487,8 @@ struct command {
|
|||||||
static struct command _commands[] = {
|
static struct command _commands[] = {
|
||||||
{"create", "<dev_name> [-j|--major <major> -m|--minor <minor>]\n"
|
{"create", "<dev_name> [-j|--major <major> -m|--minor <minor>]\n"
|
||||||
"\t [-U|--uid <uid>] [-G|--gid <gid>] [-M|--mode <octal_mode>]\n"
|
"\t [-U|--uid <uid>] [-G|--gid <gid>] [-M|--mode <octal_mode>]\n"
|
||||||
"\t [-u|uuid <uuid>] [--notable] [<table_file>]",
|
"\t [-u|uuid <uuid>]"
|
||||||
|
"\t [--notable | --table <table> | <table_file>]",
|
||||||
1, 2, _create},
|
1, 2, _create},
|
||||||
{"remove", "[-f|--force] <device>", 0, 1, _remove},
|
{"remove", "[-f|--force] <device>", 0, 1, _remove},
|
||||||
{"remove_all", "[-f|--force]", 0, 0, _remove_all},
|
{"remove_all", "[-f|--force]", 0, 0, _remove_all},
|
||||||
@ -1611,6 +1627,7 @@ static int _process_switches(int *argc, char ***argv)
|
|||||||
{"noopencount", 0, &ind, NOOPENCOUNT_ARG},
|
{"noopencount", 0, &ind, NOOPENCOUNT_ARG},
|
||||||
{"notable", 0, &ind, NOTABLE_ARG},
|
{"notable", 0, &ind, NOTABLE_ARG},
|
||||||
{"options", 1, &ind, OPTIONS_ARG},
|
{"options", 1, &ind, OPTIONS_ARG},
|
||||||
|
{"table", 1, &ind, TABLE_ARG},
|
||||||
{"target", 1, &ind, TARGET_ARG},
|
{"target", 1, &ind, TARGET_ARG},
|
||||||
{"tree", 0, &ind, TREE_ARG},
|
{"tree", 0, &ind, TREE_ARG},
|
||||||
{"uid", 1, &ind, UID_ARG},
|
{"uid", 1, &ind, UID_ARG},
|
||||||
@ -1667,6 +1684,8 @@ static int _process_switches(int *argc, char ***argv)
|
|||||||
optind = OPTIND_INIT;
|
optind = OPTIND_INIT;
|
||||||
while ((ind = -1, c = GETOPTLONG_FN(*argc, *argv, "cCfGj:m:Mno:ru:Uv",
|
while ((ind = -1, c = GETOPTLONG_FN(*argc, *argv, "cCfGj:m:Mno:ru:Uv",
|
||||||
long_options, NULL)) != -1) {
|
long_options, NULL)) != -1) {
|
||||||
|
if (ind == -1 || ind == ':' || ind == '?')
|
||||||
|
return 0;
|
||||||
if (c == 'c' || c == 'C' || ind == COLS_ARG)
|
if (c == 'c' || c == 'C' || ind == COLS_ARG)
|
||||||
_switches[COLS_ARG]++;
|
_switches[COLS_ARG]++;
|
||||||
if (c == 'f' || ind == FORCE_ARG)
|
if (c == 'f' || ind == FORCE_ARG)
|
||||||
@ -1720,6 +1739,10 @@ static int _process_switches(int *argc, char ***argv)
|
|||||||
_switches[NOLOCKFS_ARG]++;
|
_switches[NOLOCKFS_ARG]++;
|
||||||
if ((ind == NOOPENCOUNT_ARG))
|
if ((ind == NOOPENCOUNT_ARG))
|
||||||
_switches[NOOPENCOUNT_ARG]++;
|
_switches[NOOPENCOUNT_ARG]++;
|
||||||
|
if ((ind == TABLE_ARG)) {
|
||||||
|
_switches[TABLE_ARG]++;
|
||||||
|
_table = optarg;
|
||||||
|
}
|
||||||
if ((ind == TREE_ARG))
|
if ((ind == TREE_ARG))
|
||||||
_switches[TREE_ARG]++;
|
_switches[TREE_ARG]++;
|
||||||
if ((ind == VERSION_ARG))
|
if ((ind == VERSION_ARG))
|
||||||
@ -1745,6 +1768,11 @@ static int _process_switches(int *argc, char ***argv)
|
|||||||
if (_switches[TREE_ARG] && !_process_tree_options(_fields))
|
if (_switches[TREE_ARG] && !_process_tree_options(_fields))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (_switches[TABLE_ARG] && _switches[NOTABLE_ARG]) {
|
||||||
|
fprintf(stderr, "--table and --notable are incompatible.\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
*argv += optind;
|
*argv += optind;
|
||||||
*argc -= optind;
|
*argc -= optind;
|
||||||
return 1;
|
return 1;
|
||||||
@ -1755,7 +1783,7 @@ int main(int argc, char **argv)
|
|||||||
struct command *c;
|
struct command *c;
|
||||||
int r = 1;
|
int r = 1;
|
||||||
|
|
||||||
(void) setlocale(LC_ALL, "");
|
(void) setlocale(LC_ALL, "");
|
||||||
|
|
||||||
if (!_process_switches(&argc, &argv)) {
|
if (!_process_switches(&argc, &argv)) {
|
||||||
fprintf(stderr, "Couldn't process command line.\n");
|
fprintf(stderr, "Couldn't process command line.\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user