tst-mmap2-eofsync.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /* Test program for synchronization of stdio state with file after EOF. */
  2. #include <stdio.h>
  3. #include <error.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <unistd.h>
  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. static char *temp_file;
  13. static int temp_fd;
  14. static char *pages;
  15. static void
  16. do_prepare (void)
  17. {
  18. pages = xmalloc (getpagesize () * 2);
  19. memset (pages, 'a', getpagesize ());
  20. memset (pages + getpagesize (), 'b', getpagesize ());
  21. temp_fd = create_temp_file ("tst-mmap2-eofsync.", &temp_file);
  22. if (temp_fd == -1)
  23. error (1, errno, "cannot create temporary file");
  24. else
  25. {
  26. ssize_t cc = write (temp_fd, pages, getpagesize ());
  27. if (cc != getpagesize ())
  28. error (1, errno, "cannot write to temporary file");
  29. }
  30. }
  31. static int
  32. do_test (void)
  33. {
  34. const size_t pagesize = getpagesize ();
  35. FILE *f;
  36. char buf[pagesize];
  37. int result = 0;
  38. int c;
  39. f = fopen (temp_file, "rm");
  40. if (f == NULL)
  41. {
  42. perror (temp_file);
  43. return 1;
  44. }
  45. if (fread (buf, pagesize, 1, f) != 1)
  46. {
  47. perror ("fread");
  48. return 1;
  49. }
  50. if (memcmp (buf, pages, pagesize))
  51. {
  52. puts ("data mismatch in page 1");
  53. result = 1;
  54. }
  55. printf ("feof = %d, ferror = %d immediately after fread\n",
  56. feof (f), ferror (f));
  57. c = fgetc (f);
  58. if (c == EOF)
  59. printf ("fgetc -> EOF (feof = %d, ferror = %d)\n",
  60. feof (f), ferror (f));
  61. else
  62. {
  63. printf ("fgetc returned %o (feof = %d, ferror = %d)\n",
  64. c, feof (f), ferror (f));
  65. result = 1;
  66. }
  67. c = write (temp_fd, pages + pagesize, pagesize);
  68. if (c == (ssize_t) pagesize)
  69. printf ("wrote more to file\n");
  70. else
  71. {
  72. printf ("wrote %d != %zd (%m)\n", c, pagesize);
  73. result = 1;
  74. }
  75. if (fread (buf, pagesize, 1, f) != 1)
  76. {
  77. printf ("second fread fails: feof = %d, ferror = %d (%m)\n",
  78. feof (f), ferror (f));
  79. clearerr (f);
  80. if (fread (buf, pagesize, 1, f) != 1)
  81. {
  82. printf ("retry fread fails: feof = %d, ferror = %d (%m)\n",
  83. feof (f), ferror (f));
  84. result = 1;
  85. }
  86. }
  87. if (result == 0 && memcmp (buf, pages + pagesize, pagesize))
  88. {
  89. puts ("data mismatch in page 2");
  90. result = 1;
  91. }
  92. fseek (f, pagesize - 1, SEEK_SET);
  93. c = fgetc (f);
  94. if (c != 'a')
  95. {
  96. printf ("fgetc at end of page 1 read '%c' (%m)\n", c);
  97. result = 1;
  98. }
  99. if (ftruncate (temp_fd, pagesize) < 0)
  100. {
  101. printf ("ftruncate failed: %m\n");
  102. result = 1;
  103. }
  104. fflush (f);
  105. c = fgetc (f);
  106. if (c == EOF)
  107. printf ("after truncate fgetc -> EOF (feof = %d, ferror = %d)\n",
  108. feof (f), ferror (f));
  109. else
  110. {
  111. printf ("after truncate fgetc returned '%c' (feof = %d, ferror = %d)\n",
  112. c, feof (f), ferror (f));
  113. result = 1;
  114. }
  115. fclose (f);
  116. return result;
  117. }