#ifdef HAVE_CONFIG_H #include #endif #define INCL_DOSFILEMGR #define INCL_DOSERRORS #include #include #include #include #include #include "dirent.h" DIR *opendir (const char * a_dir) { APIRET rc; FILEFINDBUF3 FindBuffer = {0}; ULONG FileCount = 1; DIR *dd_dir = (DIR*) malloc (sizeof(DIR)); char *c_dir = (char*) malloc (strlen(a_dir) + 5); strcpy (c_dir, a_dir); strcat (c_dir, "\\*.*"); dd_dir->d_handle = (unsigned long*) HDIR_CREATE; rc = DosFindFirst(c_dir, (PHDIR) &dd_dir->d_handle, FILE_SYSTEM | FILE_HIDDEN | FILE_DIRECTORY, (PVOID) &FindBuffer, sizeof(FILEFINDBUF3), &FileCount, FIL_STANDARD); if (rc) { switch (rc) { case ERROR_NO_MORE_FILES: case ERROR_FILE_NOT_FOUND: case ERROR_PATH_NOT_FOUND: errno = ENOENT; break; case ERROR_BUFFER_OVERFLOW: errno = ENOMEM; break; default: errno = EINVAL; break; } free(dd_dir); return NULL; } dd_dir->d_attr = FindBuffer.attrFile; dd_dir->d_time = dd_dir->d_date = 10; dd_dir->d_size = FindBuffer.cbFile; strcpy (dd_dir->d_name, FindBuffer.achName); dd_dir->d_first = 1; free (c_dir); return dd_dir; } DIR *readdir( DIR * dd_dir) { APIRET rc; FILEFINDBUF3 FindBuffer = {0}; ULONG FileCount = 1; DIR *ret_dir = (DIR*) malloc (sizeof(DIR)); if (dd_dir->d_first) { dd_dir->d_first = 0; return dd_dir; } rc = DosFindNext((HDIR) dd_dir->d_handle, (PVOID) &FindBuffer, sizeof(FILEFINDBUF3), &FileCount); if (rc) { switch (rc) { case ERROR_NO_MORE_FILES: case ERROR_FILE_NOT_FOUND: case ERROR_PATH_NOT_FOUND: errno = ENOENT; break; case ERROR_BUFFER_OVERFLOW: errno = ENOMEM; break; default: errno = EINVAL; break; } return NULL; } ret_dir->d_attr = FindBuffer.attrFile; ret_dir->d_time = ret_dir->d_date = 10; ret_dir->d_size = FindBuffer.cbFile; strcpy (ret_dir->d_name, FindBuffer.achName); return ret_dir; } int closedir (DIR *dd_dir) { if (dd_dir->d_handle != (unsigned long*) HDIR_CREATE) { DosFindClose((HDIR) dd_dir->d_handle); } free (dd_dir); return 1; }