Moved dirent.h functions from unistd/directory.c to new dirent.c file.
Added dirfd() call for BeOS compatibility. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8951 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -5,6 +5,7 @@ UsePrivateHeaders [ FDirName syslog_daemon ] ;
|
|||||||
KernelMergeObject posix_main.o :
|
KernelMergeObject posix_main.o :
|
||||||
assert.c
|
assert.c
|
||||||
dlfcn.c
|
dlfcn.c
|
||||||
|
dirent.c
|
||||||
errno.c
|
errno.c
|
||||||
fnmatch.c
|
fnmatch.c
|
||||||
glob.c
|
glob.c
|
||||||
|
|||||||
@@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
** Copyright 2004, Axel Dörfler, [email protected]. All rights reserved.
|
||||||
|
** Distributed under the terms of the Haiku License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <syscalls.h>
|
||||||
|
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define BUFFER_SIZE 4096
|
||||||
|
|
||||||
|
|
||||||
|
#define RETURN_AND_SET_ERRNO(err) \
|
||||||
|
if (err < 0) { \
|
||||||
|
errno = err; \
|
||||||
|
return -1; \
|
||||||
|
} \
|
||||||
|
return err;
|
||||||
|
|
||||||
|
|
||||||
|
DIR *
|
||||||
|
opendir(const char *path)
|
||||||
|
{
|
||||||
|
DIR *dir;
|
||||||
|
|
||||||
|
int fd = _kern_open_dir(-1, path);
|
||||||
|
if (fd < 0) {
|
||||||
|
errno = fd;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* allocate the memory for the DIR structure */
|
||||||
|
if ((dir = (DIR *)malloc(sizeof(DIR) + BUFFER_SIZE)) == NULL) {
|
||||||
|
errno = B_NO_MEMORY;
|
||||||
|
_kern_close(fd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
dir->fd = fd;
|
||||||
|
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
closedir(DIR *dir)
|
||||||
|
{
|
||||||
|
int status = _kern_close(dir->fd);
|
||||||
|
|
||||||
|
free(dir);
|
||||||
|
|
||||||
|
RETURN_AND_SET_ERRNO(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct dirent *
|
||||||
|
readdir(DIR *dir)
|
||||||
|
{
|
||||||
|
/* get the next entry and return a pointer to a dirent structure
|
||||||
|
* containing the data
|
||||||
|
*/
|
||||||
|
|
||||||
|
ssize_t count = _kern_read_dir(dir->fd, &dir->ent, BUFFER_SIZE, 1);
|
||||||
|
if (count <= 0) {
|
||||||
|
if (count < 0)
|
||||||
|
errno = count;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &dir->ent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
rewinddir(DIR *dir)
|
||||||
|
{
|
||||||
|
status_t status = _kern_rewind_dir(dir->fd);
|
||||||
|
if (status < 0)
|
||||||
|
errno = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** This is no POSIX compatible call; it's not exported in the headers
|
||||||
|
* but here for BeOS compatiblity.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
int dirfd(DIR *dir);
|
||||||
|
|
||||||
|
int
|
||||||
|
dirfd(DIR *dir)
|
||||||
|
{
|
||||||
|
return dir->fd;
|
||||||
|
}
|
||||||
@@ -1,19 +1,13 @@
|
|||||||
/*
|
/*
|
||||||
** Copyright 2002, Axel Dörfler, [email protected]. All rights reserved.
|
** Copyright 2002-2004, Axel Dörfler, [email protected]. All rights reserved.
|
||||||
** Distributed under the terms of the OpenBeOS License.
|
** Distributed under the terms of the Haiku License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <syscalls.h>
|
#include <syscalls.h>
|
||||||
#include <fcntl.h>
|
|
||||||
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <dirent.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define BUFFER_SIZE 4096
|
|
||||||
|
|
||||||
|
|
||||||
#define RETURN_AND_SET_ERRNO(err) \
|
#define RETURN_AND_SET_ERRNO(err) \
|
||||||
@@ -24,69 +18,6 @@
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
|
||||||
DIR *
|
|
||||||
opendir(const char *path)
|
|
||||||
{
|
|
||||||
DIR *dir;
|
|
||||||
|
|
||||||
int fd = _kern_open_dir(-1, path);
|
|
||||||
if (fd < 0) {
|
|
||||||
errno = fd;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* allocate the memory for the DIR structure */
|
|
||||||
if ((dir = (DIR *)malloc(sizeof(DIR) + BUFFER_SIZE)) == NULL) {
|
|
||||||
errno = B_NO_MEMORY;
|
|
||||||
_kern_close(fd);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
dir->fd = fd;
|
|
||||||
|
|
||||||
return dir;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
closedir(DIR *dir)
|
|
||||||
{
|
|
||||||
int status = _kern_close(dir->fd);
|
|
||||||
|
|
||||||
free(dir);
|
|
||||||
|
|
||||||
RETURN_AND_SET_ERRNO(status);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
struct dirent *
|
|
||||||
readdir(DIR *dir)
|
|
||||||
{
|
|
||||||
/* get the next entry and return a pointer to a dirent structure
|
|
||||||
* containing the data
|
|
||||||
*/
|
|
||||||
|
|
||||||
ssize_t count = _kern_read_dir(dir->fd, &dir->ent, BUFFER_SIZE, 1);
|
|
||||||
if (count <= 0) {
|
|
||||||
if (count < 0)
|
|
||||||
errno = count;
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return &dir->ent;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
rewinddir(DIR *dirp)
|
|
||||||
{
|
|
||||||
status_t status = _kern_rewind_dir(dirp->fd);
|
|
||||||
if (status < 0)
|
|
||||||
errno = status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
chdir(const char *path)
|
chdir(const char *path)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user