diff options
Diffstat (limited to '')
-rw-r--r-- | c/src/exec/libcsupport/src/getdents.c | 55 |
1 files changed, 50 insertions, 5 deletions
diff --git a/c/src/exec/libcsupport/src/getdents.c b/c/src/exec/libcsupport/src/getdents.c index 9b16d82409..91631843b7 100644 --- a/c/src/exec/libcsupport/src/getdents.c +++ b/c/src/exec/libcsupport/src/getdents.c @@ -1,14 +1,59 @@ /* - * Just enough to make newlib return an error. + * getdents() - Get Directory Entries + * + * SVR4 and SVID extension required by Newlib readdir() family. + * + * This routine will dd_len / (sizeof dirent) directory entries relative to + * the current directory position index. These entries will be placed in + * character array pointed to by -dd_buf- + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. * * $Id$ */ +#include <errno.h> + +#include "libio_.h" + int getdents( - int fd, - void *buf, - int len + int dd_fd, + char *dd_buf, + int dd_len ) { - return -1; + rtems_libio_t *iop; + rtems_filesystem_location_info_t loc; + + /* + * Get the file control block structure associated with the file descriptor + */ + + iop = rtems_libio_iop( dd_fd ); + + /* + * Make sure we are working on a directory + */ + loc = iop->pathinfo; + if ( !loc.ops->node_type ) + set_errno_and_return_minus_one( ENOTSUP ); + + if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) + set_errno_and_return_minus_one( ENOTDIR ); + + /* + * Return the number of bytes that were actually transfered as a result + * of the read attempt. + */ + + if ( !iop->handlers->read ) + set_errno_and_return_minus_one( ENOTSUP ); + + return (*iop->handlers->read)( iop, dd_buf, dd_len ); } |