forked from Imagelibrary/rtems
Patch from Chris Johns <cjohns@cybertec.com.au> to add fchdir()
functionality to libc and update TODO.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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/exec/libcsupport/src/fchdir.c
Normal file
69
c/src/exec/libcsupport/src/fchdir.c
Normal 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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
69
c/src/lib/libc/fchdir.c
Normal 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user