#include #include #include int main (void) { FILE *fp; const char teststring[] = "hello world"; char buf[3072]; int result = 0; char readbuf[256]; /* Open a file. */ fp = tmpfile (); /* Set a buffer. */ if (setvbuf (fp, buf, _IOFBF, sizeof buf) == EOF) { printf ("setvbuf failed: %m\n"); exit (1); } /* Get the buffer size. */ if (__fbufsize (fp) != sizeof buf) { printf ("__fbusize() reported a buffer size of %Zd bytes;" " we installed a buffer with %Zd bytes\n", __fbufsize (fp), sizeof buf); result = 1; } /* Write something and read it back. */ if (fputs (teststring, fp) == EOF) { printf ("writing to new stream failed: %m\n"); exit (1); } rewind (fp); if (fgets (readbuf, sizeof readbuf, fp) == NULL) { printf ("reading from new stream failed: %m\n"); exit (1); } if (strcmp (readbuf, teststring) != 0) { puts ("not the correct string read"); exit (1); } /* The file must be opened for reading and writing. */ if (__freading (fp) == 0) { puts ("__freading() reported stream is not last read from"); result = 1; } if (__fwriting (fp) != 0) { puts ("__fwriting() reported stream is write-only or last written to"); result = 1; } rewind (fp); if (fputs (teststring, fp) == EOF) { printf ("writing(2) to new stream failed: %m\n"); exit (1); } if (__fwriting (fp) == 0) { puts ("__fwriting() doe snot reported stream is last written to"); result = 1; } if (__freading (fp) != 0) { puts ("__freading() reported stream is last read from"); result = 1; } if (__freadable (fp) == 0) { puts ("__freading() reported stream is last readable"); result = 1; } if (__fwritable (fp) == 0) { puts ("__freading() reported stream is last writable"); result = 1; } /* The string we wrote above should still be in the buffer. */ if (__fpending (fp) != strlen (teststring)) { printf ("__fpending() returned %Zd; expected %Zd\n", __fpending (fp), strlen (teststring)); result = 1; } /* Discard all the output. */ __fpurge (fp); /* And check again. */ if (__fpending (fp) != 0) { printf ("__fpending() returned %Zd; expected 0\n", __fpending (fp)); result = 1; } /* Find out whether buffer is line buffered. */ if (__flbf (fp) != 0) { puts ("__flbf() reports line buffered but it is fully buffered"); result = 1; } if (setvbuf (fp, buf, _IOLBF, sizeof buf) == EOF) { printf ("setvbuf(2) failed: %m\n"); exit (1); } if (__flbf (fp) == 0) { puts ("__flbf() reports file is not line buffered"); result = 1; } if (setvbuf (fp, NULL, _IONBF, 0) == EOF) { printf ("setvbuf(3) failed: %m\n"); exit (1); } if (__flbf (fp) != 0) { puts ("__flbf() reports line buffered but it is not buffered"); result = 1; } fclose (fp); return result; }