#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include "dirent.h"
DIR*
opendir(const char* pDirName)
{
struct stat sb;
DIR* pDir;
char* pEndDirName;
int nBufferLen;
if (!pDirName) {
errno = EINVAL;
return NULL;
}
if (stat(pDirName, &sb) != 0) {
errno = ENOENT;
return NULL;
}
if ((sb.st_mode & S_IFMT) != S_IFDIR) {
errno = ENOTDIR;
return NULL;
}
pDir = (DIR *) malloc(sizeof (DIR));
if (!pDir)
return NULL;
nBufferLen = strlen(pDirName);
strcpy(pDir->dir_pDirectoryName, pDirName);
pEndDirName = &pDir->dir_pDirectoryName[nBufferLen - 1];
if ((*pEndDirName != '/') && (*pEndDirName != '\\')) {
pEndDirName++;
*pEndDirName = '/';
}
pEndDirName++;
*pEndDirName = '*';
pEndDirName++;
*pEndDirName = '\0';
pDir->dir_nNumFiles = 0;
pDir->dir_hDirHandle = INVALID_HANDLE_VALUE;
pDir->dir_ulCookie = __DIRENT_COOKIE;
return pDir;
}
void
closedir(DIR *pDir)
{
if (!pDir) {
errno = EINVAL;
return;
}
if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
errno = EINVAL;
return;
}
if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE)
FindClose(pDir->dir_hDirHandle);
free(pDir);
return;
}
struct dirent *
readdir(DIR* pDir)
{
WIN32_FIND_DATA wfdFindData;
if (!pDir) {
errno = EINVAL;
return NULL;
}
if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
errno = EINVAL;
return NULL;
}
if (pDir->dir_nNumFiles == 0) {
pDir->dir_hDirHandle = FindFirstFile(pDir->dir_pDirectoryName, &wfdFindData);
if (pDir->dir_hDirHandle == INVALID_HANDLE_VALUE)
return NULL;
} else if (!FindNextFile(pDir->dir_hDirHandle, &wfdFindData))
return NULL;
pDir->dir_nNumFiles++;
pDir->dir_sdReturn.d_ino = -1;
strcpy(pDir->dir_sdReturn.d_name, wfdFindData.cFileName);
return &pDir->dir_sdReturn;
}
void
rewinddir(DIR* pDir)
{
if (!pDir) {
errno = EINVAL;
return;
}
if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
errno = EINVAL;
return;
}
if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE)
if (!FindClose(pDir->dir_hDirHandle))
errno = EBADF;
pDir->dir_hDirHandle = INVALID_HANDLE_VALUE;
pDir->dir_nNumFiles = 0;
return;
}
int
telldir(DIR* pDir)
{
if (!pDir) {
errno = EINVAL;
return -1;
}
if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
errno = EINVAL;
return -1;
}
return pDir->dir_nNumFiles;
}
void
seekdir(DIR* pDir, long nPosition)
{
if (!pDir)
return;
if (pDir->dir_ulCookie != __DIRENT_COOKIE)
return;
rewinddir(pDir);
for (--nPosition; nPosition && readdir(pDir); nPosition--);
if (nPosition)
errno = EINVAL;
return;
}