]> Zhao Yanbai Git Server - minix.git/commitdiff
Joren l'Ami 's updates to stdio, minor modification by me too (skip
authorBen Gras <ben@minix3.org>
Mon, 5 Sep 2005 17:17:58 +0000 (17:17 +0000)
committerBen Gras <ben@minix3.org>
Mon, 5 Sep 2005 17:17:58 +0000 (17:17 +0000)
doing anything in fflush() if stream is a pipe).

lib/stdio/fflush.c
lib/stdio/fopen.c
lib/stdio/freopen.c

index e99b18416ad49474d93a89a4447c9954cb6bc134..ce058570d9ec5784bb4d774aa9892d337128b76b 100755 (executable)
@@ -29,6 +29,10 @@ fflush(FILE *stream)
        if (io_testflag(stream, _IOREADING)) {
                /* (void) fseek(stream, 0L, SEEK_CUR); */
                int adjust = 0;
+               if (io_testflag(stream, _IOFIFO)) {
+                       /* Can't seek in a pipe. */
+                       return 0;
+               }
                if (stream->_buf && !io_testflag(stream,_IONBF))
                        adjust = -stream->_count;
                stream->_count = 0;
index 915dcb2c6187917ab5933d40b590bfc1f9a03d79..82663f599089b979380200f197948c5f2f313582 100755 (executable)
@@ -9,6 +9,7 @@
 #include       <stdio.h>
 #include       <stdlib.h>
 #include       "loc_incl.h"
+#include       <sys/stat.h>
 
 #define        PMODE           0666
 
@@ -48,6 +49,7 @@ fopen(const char *name, const char *mode)
        register int i;
        int rwmode = 0, rwflags = 0;
        FILE *stream;
+       struct stat st;
        int fd, flags = 0;
 
        for (i = 0; __iotab[i] != 0 ; i++) 
@@ -103,6 +105,13 @@ fopen(const char *name, const char *mode)
 
        if (fd < 0) return (FILE *)NULL;
 
+       if ( fstat( fd, &st ) < 0 ) {
+               _close(fd);
+               return (FILE *)NULL;
+       }
+       
+       if ( st.st_mode & S_IFIFO ) flags |= _IOFIFO;
+       
        if (( stream = (FILE *) malloc(sizeof(FILE))) == NULL ) {
                _close(fd);
                return (FILE *)NULL;
index c237bfaf6cb4778e89b577df3e7ffd3f0d1278e5..a81137794ba9ca3faf1cd0c550df90376fab4fdb 100755 (executable)
@@ -9,6 +9,7 @@
 #include       <stdio.h>
 #include       <stdlib.h>
 #include       "loc_incl.h"
+#include       <sys/stat.h>
 
 #define        PMODE           0666
 
@@ -31,6 +32,7 @@ FILE *
 freopen(const char *name, const char *mode, FILE *stream)
 {
        register int i;
+       struct stat st;
        int rwmode = 0, rwflags = 0;
        int fd, flags = stream->_flags & (_IONBF | _IOFBF | _IOLBF | _IOMYBUF);
 
@@ -53,7 +55,7 @@ freopen(const char *name, const char *mode, FILE *stream)
                rwflags |= O_APPEND | O_CREAT;
                break;         
        default:
-               return (FILE *)NULL;
+               goto loser;
        }
 
        while (*mode) {
@@ -81,19 +83,28 @@ freopen(const char *name, const char *mode, FILE *stream)
        }
 
        if (fd < 0) {
-               for( i = 0; i < FOPEN_MAX; i++) {
-                       if (stream == __iotab[i]) {
-                               __iotab[i] = 0;
-                               break;
-                       }
-               }
-               if (stream != stdin && stream != stdout && stream != stderr)
-                       free((void *)stream);
-               return (FILE *)NULL;
+               goto loser;
        }
 
+       if ( fstat( fd, &st ) == 0 ) {
+               if ( st.st_mode & S_IFIFO ) flags |= _IOFIFO;
+       } else {
+               goto loser;
+       }
+       
        stream->_count = 0;
        stream->_fd = fd;
        stream->_flags = flags;
        return stream;
+
+loser:
+       for( i = 0; i < FOPEN_MAX; i++) {
+               if (stream == __iotab[i]) {
+                       __iotab[i] = 0;
+                       break;
+               }
+       }
+       if (stream != stdin && stream != stdout && stream != stderr)
+               free((void *)stream);
+       return (FILE *)NULL;    
 }