Hi *, WDYT about a new option for stat(1) to list all known file system types?
The output looks like the following: $ src/stat --list-fstypes | head -n4 FsType Magic Treated by tail(1): local/remote? ADFS 0xADF5 local AFFS 0xADFF local AFS 0x5346414F remote ... I didn't include a test yet but would add one if someone thinks it would be worthwhile. Have a nice day, Berny >From 537b402bdffdbac07f85b3ef251cee812c7e489e Mon Sep 17 00:00:00 2001 From: Bernhard Voelker <[email protected]> Date: Wed, 7 Aug 2013 22:08:52 +0200 Subject: [PATCH] stat: add --list-fstypes option for listing known file system types * src/extract-magic: Generate the function list_known_fstypes() into the file "fs.h", i.e., in the $emit_magic case. While at it, add a recurse-inclusion guard for that file. * src/stat.c (LIST_FSTYPES_OPTION): Add new enum, used ... (long_options): ... here to identify the new --list-fstypes option. (usage): Add the new option. (main): Handle the new option. * doc/coreutils.texi (stat invocation): Document the new option. * NEWS: Mention the new option. --- NEWS | 3 +++ doc/coreutils.texi | 7 +++++++ src/extract-magic | 21 ++++++++++++++++++++- src/stat.c | 11 ++++++++++- 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 4a78617..dffef23 100644 --- a/NEWS +++ b/NEWS @@ -53,6 +53,9 @@ GNU coreutils NEWS -*- outline -*- csplit accepts a new option: --suppressed-matched, to elide the lines used to identify the split points. + stat accepts a new option: --list-fstypes to list all file system types + known by stat(1) and tail(1). + shuf accepts a new option: --repetitions (-r), to allow repetitions of input items in the permuted output. diff --git a/doc/coreutils.texi b/doc/coreutils.texi index aef5cc9..d451ed7 100644 --- a/doc/coreutils.texi +++ b/doc/coreutils.texi @@ -11671,6 +11671,13 @@ also give information about the files the links point to. @table @samp +@itemx --list-fstypes +@opindex --list-fstypes +@cindex file systems +List all file system types known by @command{stat} and exit immediately. +The list includes the names of the file system, the magic numbers and +whether @command{tail} treats them as a local or a remote file system. + @item -L @itemx --dereference @opindex -L diff --git a/src/extract-magic b/src/extract-magic index 98e9d87..f984c1a 100644 --- a/src/extract-magic +++ b/src/extract-magic @@ -125,7 +125,18 @@ EOF print $emit_magic ? $magic_comment : $map_comment; $emit_magic - and print "\n#if defined __linux__\n"; + and print "\n#ifndef FS_H\n" + . "# define FS_H\n\n" + . "static inline void\n" + . "list_known_fstypes (void)\n" + . "{\n" + . " const char *fmt = \"%-20s\\t%-10s\\t\%s\\n\";\n" + . " const char *strLocal = _(\"local\");\n" + . " const char *strRemote = _(\"remote\");\n" + . " printf(fmt, \n" + . " _(\"FsType\"), _(\"Magic\"), \n" + . " _(\"Treated by tail(1): local/remote?\"));\n" + . "#if defined __linux__\n"; $emit_magic or print "static inline int\n" . "is_local_fs_type (unsigned long int magic)\n" @@ -144,14 +155,22 @@ EOF my $local = $3 eq 'local' ? 1 : 0; print $emit_magic ? "# define $name $magic\n" + . " printf(fmt, " + . "\"" . substr ($name, 8) . "\", " # strip off "S_MAGIC_" + . "\"$magic\"," + . ($local ? "strLocal" : "strRemote") + . ");\n" : " case $name: return $local;\n"; } $emit_magic and print <<\EOF; #elif defined __GNU__ + printf("%s\n", _("Sorry, not implemented on GNU/Hurd")); # include <hurd/hurd_types.h> #endif +} +#endif EOF $emit_magic or printf " default: return -1;\n }\n}\n"; diff --git a/src/stat.c b/src/stat.c index ce0aec8..b4255af 100644 --- a/src/stat.c +++ b/src/stat.c @@ -174,7 +174,8 @@ static char const printf_flags[] = "'-+ #0I"; enum { - PRINTF_OPTION = CHAR_MAX + 1 + PRINTF_OPTION = CHAR_MAX + 1, + LIST_FSTYPES_OPTION }; static struct option const long_options[] = @@ -182,6 +183,7 @@ static struct option const long_options[] = {"dereference", no_argument, NULL, 'L'}, {"file-system", no_argument, NULL, 'f'}, {"format", required_argument, NULL, 'c'}, + {"list-fstypes", no_argument, NULL, LIST_FSTYPES_OPTION}, {"printf", required_argument, NULL, PRINTF_OPTION}, {"terse", no_argument, NULL, 't'}, {GETOPT_HELP_OPTION_DECL}, @@ -1361,6 +1363,9 @@ Display file or file system status.\n\ emit_mandatory_arg_note (); fputs (_("\ + --list-fstypes list known file system types (and exit)\n\ +"), stdout); + fputs (_("\ -L, --dereference follow links\n\ -f, --file-system display file system status instead of file status\n\ "), stdout); @@ -1492,6 +1497,10 @@ main (int argc, char *argv[]) terse = true; break; + case LIST_FSTYPES_OPTION: + list_known_fstypes (); + exit (EXIT_SUCCESS); + case_GETOPT_HELP_CHAR; case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS); -- 1.8.3.1
