#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>
#define READDIR_FINISHED 1
#define READDIR64_FINISHED 2
#define BOTH_READDIR_FINISHED 3

int main() {
    int i=0, count, status=0;
    char name[255];
    DIR *dir;

    dir=opendir(".");

    do {
        sprintf(name, "%d", i);
        close(creat(name, O_CREAT));

        if (!(status & READDIR64_FINISHED)) {
            count=0;
            rewinddir(dir);
            while (readdir64(dir)) count++;

            if (i + 1 != count - 2) {
                printf ("expected %d files, but readdir64 reports %d\n", i + 1, count - 2);
                status = status + READDIR64_FINISHED;
            }
        }

        if (!(status & READDIR_FINISHED)) {
            count=0;
            rewinddir(dir);
            while (readdir(dir)) count++;

            if (i + 1 != count - 2) {
                printf ("expected %d files, but readdir reports %d\n", i + 1, count - 2);
                status = status + READDIR_FINISHED;
            }
        }

        i++;

        if ( i == 300000) status = BOTH_READDIR_FINISHED;
    } while (!(status == BOTH_READDIR_FINISHED));

    closedir(dir);

    return 0;
}
