summaryrefslogtreecommitdiff
path: root/src/extract-magic
diff options
context:
space:
mode:
Diffstat (limited to 'src/extract-magic')
-rw-r--r--src/extract-magic48
1 files changed, 38 insertions, 10 deletions
diff --git a/src/extract-magic b/src/extract-magic
index 6bc054f50..57d3681ae 100644
--- a/src/extract-magic
+++ b/src/extract-magic
@@ -65,10 +65,15 @@ FIXME: describe
OPTIONS:
- Derive #define directives from specially formatted `case ...:' statements.
+ There are two modes of operation, the default, which is to emit
+ #define directives derived from specially formatted `case' statements,
+ and that with --local, which is to emit a static inline function
+ mapping S_MAGIC_* values to 1, 0, -1, corresponding to known-local,
+ known-remote/distributed/network and unknown, respectively.
- --help display this help and exit
- --version output version information and exit
+ --local emit an is_local_fs_type function
+ --help display this help and exit
+ --version output version information and exit
EOF
}
@@ -76,8 +81,12 @@ EOF
}
{
+ # The default is to print S_MAGIC_* definitions.
+ my $emit_magic = 1;
+
GetOptions
(
+ local => sub { $emit_magic = 0 },
help => sub { usage 0 },
version => sub { print "$ME version $VERSION\n"; exit },
) or usage 1;
@@ -103,31 +112,50 @@ EOF
# Fail if there is a `case S_MAGIC_.*' line without
# a properly formed comment.
- print <<EOF;
+ my $map_comment = <<EOF;
+/* Map each S_MAGIC_* value to 1, 0 or -1.
+ 1 if it is known to be a remote file system type,
+ 0 if it is known to be a local file system type, or -1 otherwise. */
+EOF
+ my $magic_comment = <<EOF;
/* Define the magic numbers as given by statfs(2).
Please send additions to bug-coreutils\@gnu.org and meskes\@debian.org.
This file is generated automatically from $file. */
-
-#if defined __linux__
EOF
+ print $emit_magic ? $magic_comment : $map_comment;
+
+ $emit_magic
+ and print "\n#if defined __linux__\n";
+ $emit_magic
+ or print "static inline int\n"
+ . "is_local_fs_type (unsigned long int magic)\n"
+ . "{\n switch (magic)\n {\n";
while (defined (my $line = <FH>))
{
$line =~ /^[ \t]+case S_MAGIC_/
or next;
- $line =~ m!^[ \t]+case (S_MAGIC_\w+): /\* (0x[0-9A-Fa-f]+) \*/$!
+ $line =~
+ m!^[ \t]+case (S_MAGIC_\w+): /\* (0x[0-9A-Fa-f]+) (local|remote) \*/!
or (warn "$ME:$file:$.: malformed case S_MAGIC_... line"),
$fail = 1, next;
my $name = $1;
- my $value = $2;
- print "# define $name $value\n";
+ my $magic = $2;
+ my $local = $3 eq 'local' ? 1 : 0;
+ print $emit_magic
+ ? "# define $name $magic\n"
+ : " case $name: return $local;\n";
}
- print <<\EOF;
+ $emit_magic
+ and print <<\EOF;
#elif defined __GNU__
# include <hurd/hurd_types.h>
#endif
EOF
+ $emit_magic
+ or printf " default: return -1;\n }\n}\n";
+
close FH;
exit $fail;