tst-seekdir.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <stdio.h>
  2. #include <dirent.h>
  3. #include <stdlib.h>
  4. static int
  5. do_test (void)
  6. {
  7. DIR * dirp;
  8. long int save3 = 0;
  9. long int cur;
  10. int i = 0;
  11. int result = 0;
  12. struct dirent *dp;
  13. long int save0;
  14. long int rewind;
  15. dirp = opendir (".");
  16. if (dirp == NULL)
  17. {
  18. printf ("opendir failed: %m\n");
  19. return 1;
  20. }
  21. save0 = telldir (dirp);
  22. if (save0 == -1)
  23. {
  24. printf ("telldir failed: %m\n");
  25. result = 1;
  26. }
  27. for (dp = readdir (dirp); dp != NULL; dp = readdir (dirp))
  28. {
  29. /* save position 3 (after fourth entry) */
  30. if (i++ == 3)
  31. save3 = telldir (dirp);
  32. printf ("%s\n", dp->d_name);
  33. /* stop at 400 (just to make sure dirp->__offset and dirp->__size are
  34. scrambled */
  35. if (i == 400)
  36. break;
  37. }
  38. printf ("going back past 4-th entry...\n");
  39. /* go back to saved entry */
  40. seekdir (dirp, save3);
  41. /* Check whether telldir equals to save3 now. */
  42. cur = telldir (dirp);
  43. if (cur != save3)
  44. {
  45. printf ("seekdir (d, %ld); telldir (d) == %ld\n", save3, cur);
  46. result = 1;
  47. }
  48. /* print remaining files (3-last) */
  49. for (dp = readdir (dirp); dp != NULL; dp = readdir (dirp))
  50. printf ("%s\n", dp->d_name);
  51. /* Check rewinddir */
  52. rewinddir (dirp);
  53. rewind = telldir (dirp);
  54. if (rewind == -1)
  55. {
  56. printf ("telldir failed: %m\n");
  57. result = 1;
  58. }
  59. else if (save0 != rewind)
  60. {
  61. printf ("rewinddir didn't reset directory stream\n");
  62. result = 1;
  63. }
  64. closedir (dirp);
  65. return result;
  66. }
  67. #define TEST_FUNCTION do_test ()
  68. #include "../test-skeleton.c"