Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
glibc/libio/tst-mmap-eofsync.c
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
106 lines (91 sloc)
2.19 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Test program for synchronization of stdio state with file after EOF. */ | |
#include <stdio.h> | |
#include <error.h> | |
#include <errno.h> | |
static void do_prepare (void); | |
#define PREPARE(argc, argv) do_prepare () | |
static int do_test (void); | |
#define TEST_FUNCTION do_test () | |
#include <test-skeleton.c> | |
static char *temp_file; | |
static int temp_fd; | |
static char text1[] = "Line the first\n"; | |
static char text2[] = "Line the second\n"; | |
static void | |
do_prepare (void) | |
{ | |
temp_fd = create_temp_file ("tst-mmap-eofsync.", &temp_file); | |
if (temp_fd == -1) | |
error (1, errno, "cannot create temporary file"); | |
else | |
{ | |
ssize_t cc = write (temp_fd, text1, sizeof text1 - 1); | |
if (cc != sizeof text1 - 1) | |
error (1, errno, "cannot write to temporary file"); | |
} | |
} | |
static int | |
do_test (void) | |
{ | |
FILE *f; | |
char buf[128]; | |
int result = 0; | |
int c; | |
f = fopen (temp_file, "rm"); | |
if (f == NULL) | |
{ | |
perror (temp_file); | |
return 1; | |
} | |
if (fgets (buf, sizeof buf, f) == NULL) | |
{ | |
perror ("fgets"); | |
return 1; | |
} | |
if (strcmp (buf, text1)) | |
{ | |
printf ("read \"%s\", expected \"%s\"\n", buf, text1); | |
result = 1; | |
} | |
printf ("feof = %d, ferror = %d immediately after fgets\n", | |
feof (f), ferror (f)); | |
#if 1 | |
c = fgetc (f); | |
if (c == EOF) | |
printf ("fgetc -> EOF (feof = %d, ferror = %d)\n", | |
feof (f), ferror (f)); | |
else | |
{ | |
printf ("fgetc returned %o (feof = %d, ferror = %d)\n", | |
c, feof (f), ferror (f)); | |
result = 1; | |
} | |
#endif | |
c = write (temp_fd, text2, sizeof text2 - 1); | |
if (c == sizeof text2 - 1) | |
printf ("wrote more to file\n"); | |
else | |
{ | |
printf ("wrote %d != %zd (%m)\n", c, sizeof text2 - 1); | |
result = 1; | |
} | |
if (fgets (buf, sizeof buf, f) == NULL) | |
{ | |
printf ("second fgets fails: feof = %d, ferror = %d (%m)\n", | |
feof (f), ferror (f)); | |
clearerr (f); | |
if (fgets (buf, sizeof buf, f) == NULL) | |
{ | |
printf ("retry fgets fails: feof = %d, ferror = %d (%m)\n", | |
feof (f), ferror (f)); | |
result = 1; | |
} | |
} | |
if (result == 0 && strcmp (buf, text2)) | |
{ | |
printf ("second time read \"%s\", expected \"%s\"\n", buf, text2); | |
result = 1; | |
} | |
fclose (f); | |
return result; | |
} |