TEST(stdio_ext, __flbf) { FILE* fp = fopen("/proc/version", "r"); ASSERT_FALSE(__flbf(fp)); char buf[128]; ASSERT_EQ(0, setvbuf(fp, buf, _IOLBF, sizeof(buf))); ASSERT_TRUE(__flbf(fp)); fclose(fp); }
int main(void) { if (isatty(0)) { fprintf(stderr,"Hit Ctrl-d to initialise stdin\n"); } else { fprintf(stderr,"Initialising stdin\n"); } char data[4096]; fread(data,sizeof(data),1,stdin); if (isatty(1)) { fprintf(stdout,"Initialising stdout\n"); } else { fprintf(stdout,"Initialising stdout\n"); fprintf(stderr,"Initialising stdout\n"); } fprintf(stderr,"Initialising stderr\n"); //redundant int i; for (i=0; i<3; i++) { fprintf(stderr,"%6s: tty=%d, lb=%d, size=%d\n", fileno2name(i), isatty(i), __flbf(fileno2FILE(i))?1:0, __fbufsize(fileno2FILE(i))); } return EXIT_SUCCESS; }
int fbufmode (FILE *fp) { /* Most systems provide FILE as a struct and the necessary bitmask in <stdio.h>, because they need it for implementing getc() and putc() as fast macros. */ #if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */ # if HAVE___FLBF /* glibc >= 2.2 */ if (__flbf (fp)) return _IOLBF; # else if (fp->_flags & _IO_LINE_BUF) return _IOLBF; # endif if (fp->_flags & _IO_UNBUFFERED) return _IONBF; return _IOFBF; #elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Android */ if (fp_->_flags & __SLBF) return _IOLBF; if (fp_->_flags & __SNBF) return _IONBF; return _IOFBF; #elif defined __EMX__ /* emx+gcc */ return fp->_flags & (_IOLBF | _IONBF | _IOFBF); #elif defined __minix /* Minix */ return fp->_flags & (_IOLBF | _IONBF | _IOFBF); #elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */ # if HAVE___FLBF /* Solaris >= 7 */ if (__flbf (fp)) return _IOLBF; # else if (fp->_flag & _IOLBF) return _IOLBF; # endif if (fp_->_flag & _IONBF) return _IONBF; return _IOFBF; #elif defined __UCLIBC__ /* uClibc */ if (fp->__modeflags & __FLAG_LBF) return _IOLBF; if (fp->__modeflags & __FLAG_NBF) return _IONBF; return _IOFBF; #elif defined __QNX__ /* QNX */ if (fp->_Mode & 0x400 /* _MLBF */) return _IOLBF; if (fp->_Mode & 0x800 /* _MNBF */) return _IONBF; return _IOFBF; #elif defined __MINT__ /* Atari FreeMiNT */ if (fp->__linebuf) return _IOLBF; return (fp->__bufsize > 0 ? _IOFBF : _IONBF); #elif HAVE___FLBF && HAVE___FBUFSIZE /* musl libc */ if (__flbf (fp)) return _IOLBF; return (__fbufsize (fp) > 0 ? _IOFBF : _IONBF); #elif defined EPLAN9 /* Plan9 */ if (fp->flags & 2 /* LINEBUF */) return _IOLBF; if (fp->bufl) return _IOFBF; return _IONBF; #else # error "Please port gnulib fbufmode.c to your platform! Look at the setvbuf implementation." #endif }