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
}