Patch from Chris Johns <cjohns@cybertec.com.au> to add fchdir()

functionality to libc and update TODO.
This commit is contained in:
Joel Sherrill
2000-06-30 12:31:28 +00:00
parent 5532553209
commit 195ae7bada
8 changed files with 218 additions and 2 deletions

View File

@@ -29,7 +29,7 @@ TERMIOS_C_FILES = cfgetispeed.c cfgetospeed.c cfsetispeed.c cfsetospeed.c \
termiosreserveresources.c
SYSTEM_CALL_C_FILES = open.c close.c read.c write.c lseek.c ioctl.c mkdir.c \
mknod.c mkfifo.c rmdir.c chdir.c chmod.c fchmod.c chown.c link.c \
mknod.c mkfifo.c rmdir.c chdir.c chmod.c fchdir.c fchmod.c chown.c link.c \
unlink.c umask.c ftruncate.c utime.c fstat.c fcntl.c fpathconf.c \
getdents.c fsync.c fdatasync.c pipe.c dup.c dup2.c symlink.c readlink.c \
creat.c

View File

@@ -9,3 +9,6 @@
See device_lseek() for an example of where this would be nice.
+ Fix strerror() so it prints all error numbers.
+ Check the node allocation coment in the fchdir call.
+ Add an interface somewhere for this call.

View File

@@ -0,0 +1,69 @@
/*
* fchdir() - compatible with SVr4, 4.4BSD and X/OPEN - Change Directory
*
* COPYRIGHT (c) 1989-2000.
* On-Line Applications Research Corporation (OAR).
*
* 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 <unistd.h>
#include <sys/stat.h>
#include <errno.h>
#include <rtems.h>
#include <rtems/libio.h>
#include "libio_.h"
int fchdir(
int fd
)
{
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open(iop);
/*
* Now process the fchmod().
*/
rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ );
/*
* Verify you can change directory into this node.
*/
if ( !iop->pathinfo.ops ) {
set_errno_and_return_minus_one( ENOTSUP );
}
if ( !iop->pathinfo.ops->node_type ) {
set_errno_and_return_minus_one( ENOTSUP );
}
if ( (*iop->pathinfo.ops->node_type)( &iop->pathinfo ) !=
RTEMS_FILESYSTEM_DIRECTORY ) {
set_errno_and_return_minus_one( ENOTDIR );
}
rtems_filesystem_freenode( &rtems_filesystem_current );
/*
* FIXME : I feel there should be another call to
* actually take into account the extra reference to
* this node which we are making here. I can
* see the freenode interface but do not see
* allocnode node interface. It maybe node_type.
*/
rtems_filesystem_current = iop->pathinfo;
return 0;
}

View File

@@ -29,7 +29,7 @@ TERMIOS_C_FILES = cfgetispeed.c cfgetospeed.c cfsetispeed.c cfsetospeed.c \
termiosreserveresources.c
SYSTEM_CALL_C_FILES = open.c close.c read.c write.c lseek.c ioctl.c mkdir.c \
mknod.c mkfifo.c rmdir.c chdir.c chmod.c fchmod.c chown.c link.c \
mknod.c mkfifo.c rmdir.c chdir.c chmod.c fchdir.c fchmod.c chown.c link.c \
unlink.c umask.c ftruncate.c utime.c fstat.c fcntl.c fpathconf.c \
getdents.c fsync.c fdatasync.c pipe.c dup.c dup2.c symlink.c readlink.c \
creat.c

View File

@@ -9,3 +9,6 @@
See device_lseek() for an example of where this would be nice.
+ Fix strerror() so it prints all error numbers.
+ Check the node allocation coment in the fchdir call.
+ Add an interface somewhere for this call.

69
c/src/lib/libc/fchdir.c Normal file
View File

@@ -0,0 +1,69 @@
/*
* fchdir() - compatible with SVr4, 4.4BSD and X/OPEN - Change Directory
*
* COPYRIGHT (c) 1989-2000.
* On-Line Applications Research Corporation (OAR).
*
* 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 <unistd.h>
#include <sys/stat.h>
#include <errno.h>
#include <rtems.h>
#include <rtems/libio.h>
#include "libio_.h"
int fchdir(
int fd
)
{
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open(iop);
/*
* Now process the fchmod().
*/
rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ );
/*
* Verify you can change directory into this node.
*/
if ( !iop->pathinfo.ops ) {
set_errno_and_return_minus_one( ENOTSUP );
}
if ( !iop->pathinfo.ops->node_type ) {
set_errno_and_return_minus_one( ENOTSUP );
}
if ( (*iop->pathinfo.ops->node_type)( &iop->pathinfo ) !=
RTEMS_FILESYSTEM_DIRECTORY ) {
set_errno_and_return_minus_one( ENOTDIR );
}
rtems_filesystem_freenode( &rtems_filesystem_current );
/*
* FIXME : I feel there should be another call to
* actually take into account the extra reference to
* this node which we are making here. I can
* see the freenode interface but do not see
* allocnode node interface. It maybe node_type.
*/
rtems_filesystem_current = iop->pathinfo;
return 0;
}