Hi, I've cooked up this patch (submitted upstream). It's even less intrusive. Please apply. Cheers, -- Guido
diff --git a/dmsetup/Makefile.in b/dmsetup/Makefile.in diff --git a/dmsetup/dmsetup.c b/dmsetup/dmsetup.c index a86fed2..5116d7e 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, @@ -320,8 +321,34 @@ static int _display_info_cols(struct dm_task *dmt, struct dm_info *info) return r; } + static void _display_info_long(struct dm_task *dmt, struct dm_info *info) { + const char* info_names[] = { + "Name: %s\n", + "State: %s%s\n", + "Tables present: %s%s%s\n", + "Open count: %d\n", + "Event number: %" PRIu32 "\n", + "Major, minor: %d, %d\n", + "Number of targets: %d\n", + "UUID: %s\n", + "DM_NAME=%s\n", + "DM_STATE=\"%s%s\"\n", + "DM_TABLE_STATE=\"%s%s%s\"\n", + "DM_OPENCOUNT=%d\n", + "DM_LAST_EVENT_NR=%" PRIu32 "\n", + "DM_MAJOR=%d\nDM_MINOR=%d\n", + "DM_TARGET_COUNT=%d\n", + "DM_UUID=%s\n", + }; + const int info_elems = sizeof(info_names)/sizeof(info_names[0])/2; +#define FORMAT(x) (info_names[info_elems*mode+x]) +#define MODE_LONG 0 +#define MODE_EXPORT 1 + int mode = _switches[EXPORT_ARG] ? MODE_EXPORT : MODE_LONG; + enum info_fields { name = 0, state, tablestate, opencount, + eventnumber, devno, numtargets, uuidname }; const char *uuid; if (!info->exists) { @@ -329,31 +356,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 +2382,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 +2459,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)