mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 09:34:43 +00:00
e5c0c7185e
svn path=/trunk/; revision=2456
110 lines
2.4 KiB
C
110 lines
2.4 KiB
C
#ifdef HAVE_CONFIG_H
|
|
#include <config.h>
|
|
#endif
|
|
|
|
#define INCL_DOSFILEMGR
|
|
#define INCL_DOSERRORS
|
|
#include <os2.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
#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;
|
|
}
|