Add more fields for 'dmsetup info -o XXX'
PATCH 1/1 Add more fields for 'dmsetup info -o XXX'
Hi Alasdair,
this patch adds more fields to the '-o' option for 'dmsetup info'.
I always found it slightly annoying that only the 'name' field was supported; by supporting more fields it'll make parsing easier. Supported fields are now 'name', 'major', 'minor', and 'uuid'.
Please apply.
Cheers,
Hannes
Signature · 4 lines
Dr. Hannes Reinecke [email protected] SuSE Linux Products GmbH S390 & zSeries Maxfeldstraße 5 +49 911 74053 688 90409 Nürnberg http://www.suse.de
dmsetup/dmsetup.c +126 -13
@@ -108,6 +108,14 @@ enum { NUM_SWITCHES }; +enum { +NAME_FIELD =1 , +MAJOR_FIELD =2 , +MINOR_FIELD =3 , +UUID_FIELD =4 , +INVALID_FIELD =5 , +}; +static int _switches[NUM_SWITCHES ];static int _values[NUM_SWITCHES ];static int _num_devices;
@@ -211,9 +219,35 @@ static void _display_info_cols_noheading uuid =dm_task_get_uuid (dmt); -if (_switches[OPTIONS_ARG ]) -printf ("%s\n" ,dm_task_get_name (dmt)); -else +if (_switches[OPTIONS_ARG ]) { +int v = _values[OPTIONS_ARG ]; +int shift =0 ; + +while (v) { +if (v &0x1 ) { +switch (shift) { +case NAME_FIELD : +printf ("%s" , +dm_task_get_name (dmt)); +break ; +case MAJOR_FIELD : +printf ("%d" , info->major); +break ; +case MINOR_FIELD : +printf ("%d" , info->minor); +break ; +case UUID_FIELD : +printf ("%s" , uuid); +break ; + } + } + v >>=1 ; + shift++; +if (v) +printf (":" ); + } +printf ("\n" ); + }else printf("%s:%d:%d:%s%s%s%s:%d:%d:%" PRIu32 ":%s\n", dm_task_get_name(dmt), info->major, info->minor,
@@ -236,17 +270,65 @@ static void _display_info_cols(struct dm }if (!_headings) { -if (_switches[OPTIONS_ARG ]) -printf ("Name\n" ); -else +if (_switches[OPTIONS_ARG ]) { +int v = _values[OPTIONS_ARG ]; +int shift =0 ; + +while (v) { +if (v &0x1 ) { +switch (shift) { +case NAME_FIELD : +printf ("Name " ); +break ; +case MAJOR_FIELD : +printf ("Maj " ); +break ; +case MINOR_FIELD : +printf ("Min " ); +break ; +case UUID_FIELD : +printf ("UUID" ); +break ; + } + } + v >>=1 ; + shift++; + } +printf ("\n" ); + }else printf ("Name Maj Min Stat Open Targ " "Event UUID\n" ); _headings =1 ; } -if (_switches[OPTIONS_ARG ]) -printf ("%s\n" ,dm_task_get_name (dmt)); -else { + uuid =dm_task_get_uuid (dmt); + +if (_switches[OPTIONS_ARG ]) { +int v = _values[OPTIONS_ARG ]; +int shift =0 ; + +while (v) { +if (v &0x1 ) { +switch (shift) { +case NAME_FIELD : +printf ("%-16s " ,dm_task_get_name (dmt)); +break ; +case MAJOR_FIELD : +printf ("%3d " , info->major); +break ; +case MINOR_FIELD : +printf ("%3d " , info->minor); +break ; +case UUID_FIELD : +printf ("%s" , uuid); +break ; + } + } + v >>=1 ; + shift++; + } +printf ("\n" ); + }else { printf("%-16s %3d %3d %s%s%s%s %4d %4d %6" PRIu32 " ", dm_task_get_name(dmt), info->major, info->minor,
@@ -256,7 +338,7 @@ static void _display_info_cols(struct dm info->read_only ?"r" :"w" , info->open_count, info->target_count, info->event_nr); -if ((uuid =dm_task_get_uuid (dmt)) && *uuid) +if (uuid && *uuid)printf ("%s" , uuid);printf ("\n" );
@@ -1606,6 +1688,35 @@ static int _process_tree_options(const creturn 1 ; } +static int _process_fields (char *optarg) +{ +int flags =0 ; +char *f, *e; + + f = optarg; + +while (f && *f) { +if (!strncmp ("name" , f,4 )) + flags |=1 <<NAME_FIELD ; +else if (!strncmp ("major" , f,5 )) + flags |=1 <<MAJOR_FIELD ; +else if (!strncmp ("minor" , f,5 )) + flags |=1 <<MINOR_FIELD ; +else if (!strncmp ("uuid" , f,4 )) + flags |=1 <<UUID_FIELD ; +else + flags |=1 <<INVALID_FIELD ; + + e =strchr (f,',' ); +if (e) + f = e +1 ; +else + f =NULL ; + } + +return flags; +} +static int _process_switches (int *argc,char ***argv) {char *base, *namebase;
@@ -1656,7 +1767,7 @@ static int _process_switches(int *argc, _switches[OPTIONS_ARG ]++; _switches[MAJOR_ARG ]++; _switches[MINOR_ARG ]++; - _fields = (char *)"name" ; + _values[OPTIONS_ARG ] =NAME_FIELD ;if (*argc ==3 ) { _values[MAJOR_ARG ] =atoi ((*argv)[1 ]);
@@ -1705,6 +1816,7 @@ static int _process_switches(int *argc,if (c =='o' || ind ==OPTIONS_ARG ) { _switches[OPTIONS_ARG ]++; _fields = optarg; + _values[OPTIONS_ARG ] =_process_fields (optarg); }if (c =='v' || ind ==VERBOSE_ARG ) _switches[VERBOSE_ARG ]++;
@@ -1760,8 +1872,9 @@ static int _process_switches(int *argc, }if (_switches[COLS_ARG ] && _switches[OPTIONS_ARG ] && -strcmp (_fields,"name" )) { -fprintf (stderr,"Only -o name is supported so far.\n" ); + (_values[OPTIONS_ARG ] & (1 <<INVALID_FIELD ))) { +fprintf (stderr,"Only 'name', 'major', 'minor', and" +" 'uuid' are supported so far.\n" );return 0 ; }
Nur in device-mapper.1.02.09/dmsetup: dmsetup.c~.
man/dmsetup.8 +3 -2
@@ -35,7 +35,7 @@ dmsetup \- low level logical volume mana .B dmsetup info .I [device_name] .br -.B dmsetup info -c|-C|--columns [--noheadings] [-o name] +.B dmsetup info -c|-C|--columns [--noheadings] [-o fields] .I [device_name] .br .B dmsetup deps
@@ -97,7 +97,8 @@ Tell the kernel not to supply the open r When creating a device, don't load any table. .IP \fB-o|--options .br -Specify which fields to display. Only \fB-o\ name\fP is supported. +Specify which fields to display. Only \fBname\fP, \fBmajor\fP, +\fBminor\fP, and \fBuuid\fP are supported. .IP \fB-r|--readonly .br Set the table being loaded read-only.
Nur in device-mapper.1.02.09/man: dmsetup.8~.