Hi,
It was possible, using the previous file(1) version, to determine the
file type of stdin stream. The current version don't permit that (or I
don't found how to do that).
I would propose a patch in order to support '-' argument to be trait as
STDIN_FILENO descriptor.
file(1) in 5.5:
---------------
$ echo foobar | file -
/dev/stdin: ASCII text
$ echo foobar | file -s /dev/stdin
/dev/stdin: ASCII text
file(1) in -current:
--------------------
$ echo foobar | file -
-: cannot stat '-' (No such file or directory)
$ echo foobar | file -s /dev/stdin
/dev/stdin: data
after patching:
---------------
$ echo foobar | file -
-: fifo (named pipe)
$ echo foobar | file -s -
-: ASCII text
$ file - < file.c
-: ASCII C program text
$ file ./- # process the file named '-'
./-: cannot stat './-' (No such file or directory)
$ echo foobar | file -s /dev/stdin # behaviour not changed
/dev/stdin: data
About the patch:
- my english wording is somehow hesitant: it isn't my native language,
but you should already have noted that :). So corrections in manpage
are expected.
- I am not sure about mdoc tags that I used (.Em for "stdin" for
example).
- I am not sure if catching fcntl(3) or fstat(3) errors would make sens
or not.
- Same for configure STDIN_FILENO for O_NONBLOCK.
Remaining interrogations:
- should '-' implies '-s' (as before) ?
- should I rename "-" to "/dev/stdin" in order to have similar output
than before ?
- why "file -s /dev/stdin" returns "data" instead of proper
determination ?
- should I trait "/dev/stdin" as STDIN_FILENO too ?
Thanks.
--
Sébastien Marie
Index: file.1
===================================================================
RCS file: /cvs/src/usr.bin/file/file.1,v
retrieving revision 1.39
diff -u -p -r1.39 file.1
--- file.1 24 Apr 2015 20:57:51 -0000 1.39
+++ file.1 28 May 2015 18:07:15 -0000
@@ -74,6 +74,16 @@ or
.Em data
meaning anything else.
.Pp
+If the argument is
+.Dq -
+, it is traited as
+.Em stdin
+stream. When
+.Em stdin
+is a pipe, consider use of
+.Fl s
+option in order to determine the type of the stream's content.
+.Pp
The options are as follows:
.Bl -tag -width indent
.It Fl b
Index: file.c
===================================================================
RCS file: /cvs/src/usr.bin/file/file.c,v
retrieving revision 1.32
diff -u -p -r1.32 file.c
--- file.c 24 Apr 2015 17:34:57 -0000 1.32
+++ file.c 28 May 2015 18:07:15 -0000
@@ -197,6 +197,13 @@ static void
open_file(struct input_file *inf)
{
int retval;
+
+ if (strcmp(inf->path, "-") == 0) {
+ inf->fd = STDIN_FILENO;
+ fcntl(STDIN_FILENO, O_NONBLOCK);
+ fstat(STDIN_FILENO, &inf->sb);
+ return;
+ }
retval = lstat(inf->path, &inf->sb);
if (retval == -1) {