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); > }