#include <stdio.h>\r
#include <dirent.h>\r
#include <errno.h>\r
+ \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}
+
\r
-\r
-DIR*\r
-opendir(const char* directory_name)\r
-{\r
- struct stat sb;\r
- DIR* dir;\r
-\r
- if(NULL == directory_name) \r
- {\r
- errno = EINVAL;\r
- return NULL;\r
- }\r
- \r
- if(0 != stat(directory_name, &sb)) \r
- {\r
- /* directory not found */\r
- errno = ENOENT;\r
- return NULL;\r
- }\r
- \r
- if(0 == S_ISDIR(sb.st_mode)) \r
- {\r
- /* it's not a directory */\r
- errno = ENOTDIR;\r
- return NULL;\r
- }\r
-\r
- \r
- dir = (DIR *)calloc(1,sizeof(DIR));\r
-\r
- if (NULL == dir)\r
- {\r
- errno = ENOMEM;\r
- return NULL;\r
- }\r
-\r
- if('\\' != dir->directory_name[strlen(directory_name) - 1])\r
- sprintf(dir->directory_name,"%s\\*",directory_name);\r
- else\r
- sprintf(dir->directory_name,"%s*",directory_name);\r
-\r
- dir->file_handle = INVALID_HANDLE_VALUE;\r
-\r
- return dir;\r
-}\r
-\r
-int\r
-closedir(DIR* dir)\r
-{\r
- if(NULL == dir) \r
- return EINVAL;\r
- \r
- if(INVALID_HANDLE_VALUE != dir->file_handle)\r
- FindClose(dir->file_handle);\r
- else\r
- return EBADF;\r
- \r
- free(dir);\r
-\r
- return 0;\r
-\r
-}\r
-\r
-struct dirent*\r
-readdir(DIR* dir)\r
-{\r
- WIN32_FIND_DATA wfd = {0};\r
-\r
- if(!dir) \r
- {\r
- errno = EINVAL;\r
- return NULL;\r
- }\r
-\r
- if(!dir->pos) \r
- dir->file_handle = FindFirstFile(dir->directory_name, &wfd);\r
- \r
- if(!FindNextFile(dir->file_handle, &wfd))\r
- return NULL;\r
- \r
- dir->pos++;\r
-\r
- strcpy(dir->entry.d_name, wfd.cFileName);\r
-\r
- return &(dir->entry);\r
-}\r
-\r
-void\r
-rewinddir(DIR* dir)\r
-{\r
- if(NULL == dir) \r
- {\r
- errno = EINVAL;\r
- return;\r
- }\r
-\r
- if(INVALID_HANDLE_VALUE != dir->file_handle)\r
- {\r
- FindClose(dir->file_handle);\r
- dir->file_handle = INVALID_HANDLE_VALUE;\r
- dir->pos = 0;\r
- }\r
-}\r
-\r
-off_t\r
-telldir(DIR* dir)\r
-{\r
- if(NULL == dir) \r
- {\r
- errno = EINVAL;\r
- return -1;\r
- }\r
- \r
- return dir->pos;\r
-}\r
-\r
-void\r
-seekdir(DIR* dir, off_t offset)\r
-{\r
- WIN32_FIND_DATA wfd = {0};\r
- \r
- if(NULL == dir)\r
- {\r
- errno = EINVAL;\r
- return;\r
- }\r
-\r
- if(INVALID_HANDLE_VALUE != dir->file_handle)\r
- {\r
- FindClose(dir->file_handle);\r
- dir->file_handle = INVALID_HANDLE_VALUE;\r
- dir->pos = 0;\r
- }\r
- \r
- dir->file_handle = FindFirstFile(dir->directory_name, &wfd);\r
- \r
- dir->pos += offset;\r
- \r
- while(--offset)\r
- {\r
- if(!FindNextFile(dir->file_handle, &wfd))\r
- errno = EINVAL;\r
- }\r
-}\r