Here is a slightly tweaked version of your diff.

I don't think we need to set O_NONBLOCK, we don't set it for anything
else.


Index: file.1
===================================================================
RCS file: /cvs/src/usr.bin/file/file.1,v
retrieving revision 1.41
diff -u -p -r1.41 file.1
--- file.1      27 Apr 2015 11:12:49 -0000      1.41
+++ file.1      29 May 2015 11:21:52 -0000
@@ -74,6 +74,14 @@ or
 .Em data
 meaning anything else.
 .Pp
+If
+.Ar file
+is a single dash
+.Pq Sq -
+,
+.Nm
+reads from the standard input.
+.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.41
diff -u -p -r1.41 file.c
--- file.c      29 May 2015 11:03:37 -0000      1.41
+++ file.c      29 May 2015 11:21:52 -0000
@@ -206,7 +206,13 @@ main(int argc, char **argv)
                memset(&msg, 0, sizeof msg);
                msg.idx = idx;
 
-               if (lstat(argv[idx], &msg.sb) == -1) {
+               if (strcmp(argv[idx], "-") == 0) {
+                       if (fstat(STDIN_FILENO, &msg.sb) == -1) {
+                               fd = -1;
+                               msg.error = errno;
+                       } else
+                               fd = STDIN_FILENO;
+               } else if (lstat(argv[idx], &msg.sb) == -1) {
                        fd = -1;
                        msg.error = errno;
                } else {
@@ -433,7 +439,7 @@ try_stat(struct input_file *inf)
                    strerror(inf->msg->error));
                return (1);
        }
-       if (sflag) {
+       if (sflag || strcmp(inf->path, "-") == 0) {
                switch (inf->msg->sb.st_mode & S_IFMT) {
                case S_IFBLK:
                case S_IFCHR:
@@ -609,7 +615,10 @@ test_file(struct input_file *inf, size_t
        if (bflag)
                printf("%s\n", inf->result);
        else {
-               xasprintf(&label, "%s:", inf->path);
+               if (strcmp(inf->path, "-") == 0)
+                       xasprintf(&label, "/dev/stdin:");
+               else
+                       xasprintf(&label, "%s:", inf->path);
                printf("%-*s %s\n", (int)width, label, inf->result);
                free(label);
        }



On Fri, May 29, 2015 at 12:00:36PM +0100, Nicholas Marriott wrote:
> Hi
> 
> Why do you want to set O_NONBLOCK at all?
> 
> 
> On Fri, May 29, 2015 at 12:32:06PM +0200, S??bastien Marie wrote:
> > On Thu, May 28, 2015 at 11:52:22PM +0100, Nicholas Marriott wrote:
> > > Hi
> > > 
> > > Can you make a patch against -current? Your source tree seems pretty out
> > > of date.
> > 
> > arg, my bads.
> > 
> > > Yes please check the return values from fcntl and fstat.
> > 
> > I added check for fstat, but not for fcntl.
> > 
> > The problem with fcntl is when '-' is "/dev/zero" (for example), fcntl
> > return error "Operation not supported by device".
> > 
> > $ file - < /dev/zero
> > -: cannot stat '-' (Operation not supported by device)
> > 
> > There are two problems:
> >   - inconsistency with "file /dev/zero" as it works well
> >   - invalid error message (cannot stat), whereas it is "cannot fcntl"
> > 
> > What do you think ? Should I trait fcntl(O_NONBLOCK) as error ?
> > 
> > 
> > 
> > I have also integrated the comment from sthen@ in order to have file
> > working like before:
> >   - mention "/dev/stdin" instead of "-" in report
> >   - don't need to pass -s when "-" is used
> > 
> > 
> > I have changed the file.1 patch too.
> > 
> > 
> > > > 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 -
> > /dev/stdin: ASCII text
> > 
> > $ file - < file.c
> > /dev/stdin: ASCII C program text
> > 
> > $ file ./-                          # process the file named '-'
> > ./-: cannot stat './-' (No such file or directory)
> > 
> > Thanks.
> > -- 
> > S??bastien Marie
> > 
> > 
> > Index: file.1
> > ===================================================================
> > RCS file: /cvs/src/usr.bin/file/file.1,v
> > retrieving revision 1.41
> > diff -u -p -r1.41 file.1
> > --- file.1  27 Apr 2015 11:12:49 -0000      1.41
> > +++ file.1  29 May 2015 10:30:53 -0000
> > @@ -74,6 +74,14 @@ or
> >  .Em data
> >  meaning anything else.
> >  .Pp
> > +If 
> > +.Ar file
> > +is a single dash
> > +.Pq Sq -
> > +,
> > +.Nm
> > +reads from the standard input.
> > +.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.39
> > diff -u -p -r1.39 file.c
> > --- file.c  28 May 2015 19:26:37 -0000      1.39
> > +++ file.c  29 May 2015 10:30:53 -0000
> > @@ -208,9 +208,20 @@ main(int argc, char **argv)
> >             memset(&msg, 0, sizeof msg);
> >             msg.idx = idx;
> >  
> > -           if (lstat(argv[idx], &msg.sb) == -1) {
> > +           if (strcmp(argv[idx], "-") == 0) {
> > +                   if (fstat(STDIN_FILENO, &msg.sb) == -1) {
> > +                           fd = -1;
> > +                           msg.error = errno;
> > +
> > +                   } else {
> > +                           fd = STDIN_FILENO;
> > +                           (void)fcntl(fd, O_NONBLOCK);
> > +                   }
> > +                   
> > +           } else if (lstat(argv[idx], &msg.sb) == -1) {
> >                     fd = -1;
> >                     msg.error = errno;
> > +
> >             } else {
> >                     fd = open(argv[idx], O_RDONLY|O_NONBLOCK);
> >                     if (fd == -1 && (errno == ENFILE || errno == EMFILE))
> > @@ -435,6 +447,10 @@ try_stat(struct input_file *inf)
> >                 strerror(inf->msg->error));
> >             return (1);
> >     }
> > +
> > +   if (strcmp(inf->path, "-") == 0)
> > +           return (0);
> > +
> >     if (sflag) {
> >             switch (inf->msg->sb.st_mode & S_IFMT) {
> >             case S_IFBLK:
> > @@ -611,7 +627,10 @@ test_file(struct input_file *inf, size_t
> >     if (bflag)
> >             printf("%s\n", inf->result);
> >     else {
> > -           xasprintf(&label, "%s:", inf->path);
> > +           if (strcmp(inf->path, "-") == 0)
> > +                   xasprintf(&label, "/dev/stdin:");
> > +           else
> > +                   xasprintf(&label, "%s:", inf->path);
> >             printf("%-*s %s\n", (int)width, label, inf->result);
> >             free(label);
> >     }

Reply via email to