From 195ae7bada581d028acf9747d3fc448d1d5d34be Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 30 Jun 2000 12:31:28 +0000 Subject: Patch from Chris Johns to add fchdir() functionality to libc and update TODO. --- c/src/lib/libc/Makefile.am | 2 +- c/src/lib/libc/TODO | 3 ++ c/src/lib/libc/fchdir.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 c/src/lib/libc/fchdir.c (limited to 'c/src/lib/libc') diff --git a/c/src/lib/libc/Makefile.am b/c/src/lib/libc/Makefile.am index 0f4a4cef2e..32ad79ab4f 100644 --- a/c/src/lib/libc/Makefile.am +++ b/c/src/lib/libc/Makefile.am @@ -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 diff --git a/c/src/lib/libc/TODO b/c/src/lib/libc/TODO index 9d894688d9..38cb012326 100644 --- a/c/src/lib/libc/TODO +++ b/c/src/lib/libc/TODO @@ -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. \ No newline at end of file diff --git a/c/src/lib/libc/fchdir.c b/c/src/lib/libc/fchdir.c new file mode 100644 index 0000000000..99380514df --- /dev/null +++ b/c/src/lib/libc/fchdir.c @@ -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 +#include +#include + +#include +#include +#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; +} + -- cgit v1.2.3