+ \r\rDIR * \ropendir(const char *directory_name) \r
+{
+ \rstruct stat sb;
+ \rDIR * dir;
+ \r\rif (NULL == directory_name)
+ \r {
+ \rerrno = EINVAL;
+ \rreturn NULL;
+ \r}
+ \r\rif (0 != stat(directory_name, &sb))
+ \r {
+ \r
+ /* directory not found */ \r
+ errno = ENOENT;
+ \rreturn NULL;
+ \r}
+ \r\rif (0 == S_ISDIR(sb.st_mode))
+ \r {
+ \r
+ /* it's not a directory */ \r
+ errno = ENOTDIR;
+ \rreturn NULL;
+ \r}
+ \r\r\rdir = (DIR *) calloc(1, sizeof(DIR));
+ \r\rif (NULL == dir)
+ \r {
+ \rerrno = ENOMEM;
+ \rreturn NULL;
+ \r}
+ \r\rif ('\\' != dir->directory_name[strlen(directory_name) - 1])
+ \rsprintf(dir->directory_name, "%s\\*", directory_name);
+ \r
+ else
+ \rsprintf(dir->directory_name, "%s*", directory_name);
+ \r\rdir->file_handle = INVALID_HANDLE_VALUE;
+ \r\rreturn dir;
+\r}
+
+\r\rint \r closedir(DIR * dir) \r
+{
+ \rif (NULL == dir)
+ \rreturn EINVAL;
+ \r\rif (INVALID_HANDLE_VALUE != dir->file_handle)
+ \rFindClose(dir->file_handle);
+ \r
+ else
+ \rreturn EBADF;
+ \r\rfree(dir);
+ \r\rreturn 0;
+\r\r}
+
+\r\rstruct dirent *\rreaddir(DIR * dir) \r
+{
+ \rWIN32_FIND_DATA wfd = {
+ 0};
+ \r\rif (!dir)
+ \r {
+ \rerrno = EINVAL;
+ \rreturn NULL;
+ \r}
+ \r\rif (!dir->pos)
+ \rdir->file_handle = FindFirstFile(dir->directory_name, &wfd);
+ \r\rif (!FindNextFile(dir->file_handle, &wfd))
+ \rreturn NULL;
+ \r\rdir->pos++;
+ \r\rstrcpy(dir->entry.d_name, wfd.cFileName);
+ \r\rreturn &(dir->entry);
+\r}
+
+\r\rvoid \r rewinddir(DIR * dir) \r
+{
+ \rif (NULL == dir)
+ \r {
+ \rerrno = EINVAL;
+ \rreturn;
+ \r}
+ \r\rif (INVALID_HANDLE_VALUE != dir->file_handle)
+ \r {
+ \rFindClose(dir->file_handle);
+ \rdir->file_handle = INVALID_HANDLE_VALUE;
+ \rdir->pos = 0;
+ \r}
+\r}
+
+\r\roff_t \r telldir(DIR * dir) \r
+{
+ \rif (NULL == dir)
+ \r {
+ \rerrno = EINVAL;
+ \rreturn -1;
+ \r}
+ \r\rreturn dir->pos;
+\r}
+
+\r\rvoid \r seekdir(DIR * dir, off_t offset) \r
+{
+ \rWIN32_FIND_DATA wfd = {
+ 0};
+ \r\rif (NULL == dir)
+ \r {
+ \rerrno = EINVAL;
+ \rreturn;
+ \r}
+ \r\rif (INVALID_HANDLE_VALUE != dir->file_handle)
+ \r {
+ \rFindClose(dir->file_handle);
+ \rdir->file_handle = INVALID_HANDLE_VALUE;
+ \rdir->pos = 0;
+ \r}
+ \r\rdir->file_handle = FindFirstFile(dir->directory_name, &wfd);
+ \r\rdir->pos += offset;
+ \r\rwhile (--offset)
+ \r {
+ \rif (!FindNextFile(dir->file_handle, &wfd))
+ \rerrno = EINVAL;
+ \r}
+\r}
+