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
|
termiosreserveresources.c
|
||||||
|
|
||||||
SYSTEM_CALL_C_FILES = open.c close.c read.c write.c lseek.c ioctl.c mkdir.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 \
|
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 \
|
getdents.c fsync.c fdatasync.c pipe.c dup.c dup2.c symlink.c readlink.c \
|
||||||
creat.c
|
creat.c
|
||||||
|
|||||||
@@ -9,3 +9,6 @@
|
|||||||
See device_lseek() for an example of where this would be nice.
|
See device_lseek() for an example of where this would be nice.
|
||||||
|
|
||||||
+ Fix strerror() so it prints all error numbers.
|
+ 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
|
termiosreserveresources.c
|
||||||
|
|
||||||
SYSTEM_CALL_C_FILES = open.c close.c read.c write.c lseek.c ioctl.c mkdir.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 \
|
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 \
|
getdents.c fsync.c fdatasync.c pipe.c dup.c dup2.c symlink.c readlink.c \
|
||||||
creat.c
|
creat.c
|
||||||
|
|||||||
@@ -9,3 +9,6 @@
|
|||||||
See device_lseek() for an example of where this would be nice.
|
See device_lseek() for an example of where this would be nice.
|
||||||
|
|
||||||
+ Fix strerror() so it prints all error numbers.
|
+ 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;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -9,3 +9,6 @@
|
|||||||
See device_lseek() for an example of where this would be nice.
|
See device_lseek() for an example of where this would be nice.
|
||||||
|
|
||||||
+ Fix strerror() so it prints all error numbers.
|
+ 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
cpukit/libcsupport/src/fchdir.c
Normal file
69
cpukit/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;
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user