| lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | /* Test program for synchronization of stdio state with file after EOF.  */ | 
 | 2 |  | 
 | 3 | #include <stdio.h> | 
 | 4 | #include <error.h> | 
 | 5 | #include <errno.h> | 
 | 6 |  | 
 | 7 | static void do_prepare (void); | 
 | 8 | #define PREPARE(argc, argv) do_prepare () | 
 | 9 | static int do_test (void); | 
 | 10 | #define TEST_FUNCTION do_test () | 
 | 11 | #include <test-skeleton.c> | 
 | 12 |  | 
 | 13 | static char *temp_file; | 
 | 14 | static int temp_fd; | 
 | 15 |  | 
 | 16 | static char text1[] = "Line the first\n"; | 
 | 17 | static char text2[] = "Line the second\n"; | 
 | 18 |  | 
 | 19 | static void | 
 | 20 | do_prepare (void) | 
 | 21 | { | 
 | 22 |   temp_fd = create_temp_file ("tst-mmap-eofsync.", &temp_file); | 
 | 23 |   if (temp_fd == -1) | 
 | 24 |     error (1, errno, "cannot create temporary file"); | 
 | 25 |   else | 
 | 26 |     { | 
 | 27 |       ssize_t cc = write (temp_fd, text1, sizeof text1 - 1); | 
 | 28 |       if (cc != sizeof text1 - 1) | 
 | 29 | 	error (1, errno, "cannot write to temporary file"); | 
 | 30 |     } | 
 | 31 | } | 
 | 32 |  | 
 | 33 | static int | 
 | 34 | do_test (void) | 
 | 35 | { | 
 | 36 |   FILE *f; | 
 | 37 |   char buf[128]; | 
 | 38 |   int result = 0; | 
 | 39 |   int c; | 
 | 40 |  | 
 | 41 |   f = fopen (temp_file, "rm"); | 
 | 42 |   if (f == NULL) | 
 | 43 |     { | 
 | 44 |       perror (temp_file); | 
 | 45 |       return 1; | 
 | 46 |     } | 
 | 47 |  | 
 | 48 |   if (fgets (buf, sizeof buf, f) == NULL) | 
 | 49 |     { | 
 | 50 |       perror ("fgets"); | 
 | 51 |       return 1; | 
 | 52 |     } | 
 | 53 |  | 
 | 54 |   if (strcmp (buf, text1)) | 
 | 55 |     { | 
 | 56 |       printf ("read \"%s\", expected \"%s\"\n", buf, text1); | 
 | 57 |       result = 1; | 
 | 58 |     } | 
 | 59 |  | 
 | 60 |   printf ("feof = %d, ferror = %d immediately after fgets\n", | 
 | 61 | 	  feof (f), ferror (f)); | 
 | 62 |  | 
 | 63 | #if 1 | 
 | 64 |   c = fgetc (f); | 
 | 65 |   if (c == EOF) | 
 | 66 |     printf ("fgetc -> EOF (feof = %d, ferror = %d)\n", | 
 | 67 | 	    feof (f), ferror (f)); | 
 | 68 |   else | 
 | 69 |     { | 
 | 70 |       printf ("fgetc returned %o (feof = %d, ferror = %d)\n", | 
 | 71 | 	      c, feof (f), ferror (f)); | 
 | 72 |       result = 1; | 
 | 73 |     } | 
 | 74 | #endif | 
 | 75 |  | 
 | 76 |   c = write (temp_fd, text2, sizeof text2 - 1); | 
 | 77 |   if (c == sizeof text2 - 1) | 
 | 78 |     printf ("wrote more to file\n"); | 
 | 79 |   else | 
 | 80 |     { | 
 | 81 |       printf ("wrote %d != %zd (%m)\n", c, sizeof text2 - 1); | 
 | 82 |       result = 1; | 
 | 83 |     } | 
 | 84 |  | 
 | 85 |   if (fgets (buf, sizeof buf, f) == NULL) | 
 | 86 |     { | 
 | 87 |       printf ("second fgets fails: feof = %d, ferror = %d (%m)\n", | 
 | 88 | 	      feof (f), ferror (f)); | 
 | 89 |       clearerr (f); | 
 | 90 |       if (fgets (buf, sizeof buf, f) == NULL) | 
 | 91 | 	{ | 
 | 92 | 	  printf ("retry fgets fails: feof = %d, ferror = %d (%m)\n", | 
 | 93 | 		  feof (f), ferror (f)); | 
 | 94 | 	  result = 1; | 
 | 95 | 	} | 
 | 96 |     } | 
 | 97 |   if (result == 0 && strcmp (buf, text2)) | 
 | 98 |     { | 
 | 99 |       printf ("second time read \"%s\", expected \"%s\"\n", buf, text2); | 
 | 100 |       result = 1; | 
 | 101 |     } | 
 | 102 |  | 
 | 103 |   fclose (f); | 
 | 104 |  | 
 | 105 |   return result; | 
 | 106 | } |