Hi Alasdair, On Fri, Jul 20, 2007 at 05:46:35PM +0100, Alasdair G Kergon wrote: > On Thu, Jul 19, 2007 at 08:16:22AM +0200, Hannes Reinecke wrote: > > As already said, it totally makes sense when you hack up dmsetup and then forget > > about the patch. Sorry about this. > > Alasdair, care to incorporate it? > > Kay mentioned this patch to me at OLS. > > My answer was that I want to see a generic implementation within the reporting > code. In other words a new command line flag would instruct the reporting code > to produce its output in this sort of format. The output needs to be useful > when reporting on multiple objects at once, so to guarantee unique output > lines, you might want to include fields acting as a unique key inside the > variable names, which can be all-caps versions of the existing reporting field > names. Does the attached version look better? Cheers, -- Guido
diff --git a/dmsetup/dmsetup.c b/dmsetup/dmsetup.c index a86fed2..0226e77 100644 --- a/dmsetup/dmsetup.c +++ b/dmsetup/dmsetup.c @@ -108,6 +108,7 @@ enum { READ_ONLY = 0, COLS_ARG, EXEC_ARG, + EXPORT_ARG, FORCE_ARG, GID_ARG, MAJOR_ARG, @@ -322,6 +323,33 @@ static int _display_info_cols(struct dm_task *dmt, struct dm_info *info) static void _display_info_long(struct dm_task *dmt, struct dm_info *info) { + enum { name = 0, state, tablestate, opencount, + eventnumber, devno, numtargets, uuidname }; + + const char* info_formatstrings[] = { + [name] = "Name: %s\n", + [state] = "State: %s%s\n", + [tablestate] = "Tables present: %s%s%s\n", + [opencount] = "Open count: %d\n", + [eventnumber] = "Event number: %" PRIu32 "\n", + [devno] = "Major, minor: %d, %d\n", + [numtargets] = "Number of targets: %d\n", + [uuidname] = "UUID: %s\n", + }; + + const char* export_formatstrings[] = { + [name] = "DM_NAME=%s\n", + [state] = "DM_STATE=\"%s%s\"\n", + [tablestate] = "DM_TABLE_STATE=\"%s%s%s\"\n", + [opencount] = "DM_OPENCOUNT=%d\n", + [eventnumber] = "DM_LAST_EVENT_NR=%" PRIu32 "\n", + [devno] = "DM_MAJOR=%d\nDM_MINOR=%d\n", + [numtargets] = "DM_TARGET_COUNT=%d\n", + [uuidname] = "DM_UUID=%s\n", + }; + + const char** format = _switches[EXPORT_ARG] ? export_formatstrings + : info_formatstrings; const char *uuid; if (!info->exists) { @@ -329,31 +357,31 @@ static void _display_info_long(struct dm_task *dmt, struct dm_info *info) return; } - printf("Name: %s\n", dm_task_get_name(dmt)); + printf(format[name], dm_task_get_name(dmt)); - printf("State: %s%s\n", + printf(format[state], info->suspended ? "SUSPENDED" : "ACTIVE", info->read_only ? " (READ-ONLY)" : ""); if (!info->live_table && !info->inactive_table) - printf("Tables present: None\n"); + printf(format[tablestate], "", "", "None\n"); else - printf("Tables present: %s%s%s\n", + printf(format[tablestate], info->live_table ? "LIVE" : "", info->live_table && info->inactive_table ? " & " : "", info->inactive_table ? "INACTIVE" : ""); if (info->open_count != -1) - printf("Open count: %d\n", info->open_count); + printf(format[opencount], info->open_count); - printf("Event number: %" PRIu32 "\n", info->event_nr); - printf("Major, minor: %d, %d\n", info->major, info->minor); + printf(format[eventnumber], info->event_nr); + printf(format[devno], info->major, info->minor); if (info->target_count != -1) - printf("Number of targets: %d\n", info->target_count); + printf(format[numtargets], info->target_count); if ((uuid = dm_task_get_uuid(dmt)) && *uuid) - printf("UUID: %s\n", uuid); + printf(format[uuidname], uuid); printf("\n"); } @@ -2355,6 +2383,7 @@ static int _process_switches(int *argc, char ***argv) {"readonly", 0, &ind, READ_ONLY}, {"columns", 0, &ind, COLS_ARG}, {"exec", 1, &ind, EXEC_ARG}, + {"export", 0, &ind, EXPORT_ARG}, {"force", 0, &ind, FORCE_ARG}, {"gid", 1, &ind, GID_ARG}, {"major", 1, &ind, MAJOR_ARG}, @@ -2431,12 +2460,14 @@ static int _process_switches(int *argc, char ***argv) optarg = 0; optind = OPTIND_INIT; - while ((ind = -1, c = GETOPTLONG_FN(*argc, *argv, "cCfG:j:m:M:no:O:ru:U:v", + while ((ind = -1, c = GETOPTLONG_FN(*argc, *argv, "cCefG:j:m:M:no:O:ru:U:v", long_options, NULL)) != -1) { if (c == ':' || c == '?') return 0; if (c == 'c' || c == 'C' || ind == COLS_ARG) _switches[COLS_ARG]++; + if (c == 'e' || ind == EXPORT_ARG) + _switches[EXPORT_ARG]++; if (c == 'f' || ind == FORCE_ARG) _switches[FORCE_ARG]++; if (c == 'r' || ind == READ_ONLY)
-- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel