From dd19c0bb061af5595a970ed3c4f4af3824b65593 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 11 Aug 2000 20:04:27 +0000 Subject: 2000-08-11 Chris Johns * libc/chmod.c: Return ENOTSUP if filesystem does not have handler. * libc/eval.c: Ditto. * libc/fcntl.c: Ditto. * libc/fsync.c: Ditto. * libc/ioctl.c: Ditto. * libc/ioman.c: Ditto. * libc/link.c: Ditto. * libc/memfile.c: Ditto. * libc/mknod.c: Ditto. * libc/symlink.c: Ditto. * libc/libio.h(rtems_filesystem_dev_major_t): New macro. * libc/libio.h(rtems_filesystem_dev_minor_t): New macro. --- c/src/exec/libcsupport/include/rtems/libio.h | 10 ++++++++-- c/src/exec/libcsupport/src/chmod.c | 5 +++++ c/src/exec/libcsupport/src/eval.c | 3 +++ c/src/exec/libcsupport/src/fcntl.c | 14 ++++++++++---- c/src/exec/libcsupport/src/fsync.c | 3 +++ c/src/exec/libcsupport/src/ioctl.c | 3 +++ c/src/exec/libcsupport/src/link.c | 8 ++++++++ c/src/exec/libcsupport/src/mknod.c | 5 +++++ c/src/exec/libcsupport/src/symlink.c | 5 +++++ c/src/exec/libfs/src/imfs/ioman.c | 5 +++++ c/src/exec/libfs/src/imfs/memfile.c | 4 +++- c/src/lib/ChangeLog | 15 +++++++++++++++ c/src/lib/include/rtems/libio.h | 10 ++++++++-- c/src/lib/libc/chmod.c | 5 +++++ c/src/lib/libc/eval.c | 3 +++ c/src/lib/libc/fcntl.c | 14 ++++++++++---- c/src/lib/libc/fsync.c | 3 +++ c/src/lib/libc/ioctl.c | 3 +++ c/src/lib/libc/ioman.c | 5 +++++ c/src/lib/libc/libio.h | 10 ++++++++-- c/src/lib/libc/link.c | 8 ++++++++ c/src/lib/libc/memfile.c | 4 +++- c/src/lib/libc/mknod.c | 5 +++++ c/src/lib/libc/symlink.c | 5 +++++ c/src/libfs/src/imfs/ioman.c | 5 +++++ c/src/libfs/src/imfs/memfile.c | 4 +++- 26 files changed, 147 insertions(+), 17 deletions(-) (limited to 'c') diff --git a/c/src/exec/libcsupport/include/rtems/libio.h b/c/src/exec/libcsupport/include/rtems/libio.h index 5df9cccc24..7d832258ca 100644 --- a/c/src/exec/libcsupport/include/rtems/libio.h +++ b/c/src/exec/libcsupport/include/rtems/libio.h @@ -466,10 +466,16 @@ typedef int (*rtems_libio_lseek_t)( #define rtems_filesystem_make_dev_t( _major, _minor ) \ ((((dev_t)(_major)) << 32) | (dev_t)(_minor)) +#define rtems_filesystem_dev_major_t( _dev ) \ + (rtems_device_major_number) ((_dev) >> 32) + +#define rtems_filesystem_dev_minor_t( _dev ) \ + (rtems_device_minor_number) ((_dev) & 0xFFFFFFFF) + #define rtems_filesystem_split_dev_t( _dev, _major, _minor ) \ do { \ - (_major) = (rtems_device_major_number) ((_dev) >> 32); \ - (_minor) = (rtems_device_minor_number) ((_dev) & 0xFFFFFFFF); \ + (_major) = rtems_filesystem_dev_major_t ( _dev ); \ + (_minor) = rtems_filesystem_dev_minor_t( _dev ); \ } while(0) /* diff --git a/c/src/exec/libcsupport/src/chmod.c b/c/src/exec/libcsupport/src/chmod.c index d88e80eeb7..f1042806b9 100644 --- a/c/src/exec/libcsupport/src/chmod.c +++ b/c/src/exec/libcsupport/src/chmod.c @@ -33,6 +33,11 @@ int chmod( if ( status != 0 ) return -1; + if ( !loc.handlers ){ + rtems_filesystem_freenode( &loc ); + set_errno_and_return_minus_one( EBADF ); + } + if ( !loc.handlers->fchmod ){ rtems_filesystem_freenode( &loc ); set_errno_and_return_minus_one( ENOTSUP ); diff --git a/c/src/exec/libcsupport/src/eval.c b/c/src/exec/libcsupport/src/eval.c index 8fc27ca19c..8d839918a5 100644 --- a/c/src/exec/libcsupport/src/eval.c +++ b/c/src/exec/libcsupport/src/eval.c @@ -43,6 +43,9 @@ int rtems_filesystem_evaluate_path( rtems_filesystem_get_start_loc( pathname, &i, pathloc ); + if ( !pathloc->ops->evalpath ) + set_errno_and_return_minus_one( ENOTSUP ); + result = (*pathloc->ops->evalpath)( &pathname[i], flags, pathloc ); /* diff --git a/c/src/exec/libcsupport/src/fcntl.c b/c/src/exec/libcsupport/src/fcntl.c index 05410eaff6..587726f885 100644 --- a/c/src/exec/libcsupport/src/fcntl.c +++ b/c/src/exec/libcsupport/src/fcntl.c @@ -131,10 +131,16 @@ int fcntl( ret = -1; break; } - if ((ret >= 0) && iop->handlers->fcntl) { - int err = (*iop->handlers->fcntl)( cmd, iop ); - if (err) { - errno = err; + if (ret >= 0) { + if (iop->handlers->fcntl) { + int err = (*iop->handlers->fcntl)( cmd, iop ); + if (err) { + errno = err; + ret = -1; + } + } + else { + errno = ENOTSUP; ret = -1; } } diff --git a/c/src/exec/libcsupport/src/fsync.c b/c/src/exec/libcsupport/src/fsync.c index 64f05f341a..3dc9835d31 100644 --- a/c/src/exec/libcsupport/src/fsync.c +++ b/c/src/exec/libcsupport/src/fsync.c @@ -30,6 +30,9 @@ int fsync( * Now process the fsync(). */ + if ( !iop->handlers ) + set_errno_and_return_minus_one( EBADF ); + if ( !iop->handlers->fsync ) set_errno_and_return_minus_one( ENOTSUP ); diff --git a/c/src/exec/libcsupport/src/ioctl.c b/c/src/exec/libcsupport/src/ioctl.c index 8d84a26a15..ce74ba7cf4 100644 --- a/c/src/exec/libcsupport/src/ioctl.c +++ b/c/src/exec/libcsupport/src/ioctl.c @@ -41,6 +41,9 @@ int ioctl( * Now process the ioctl(). */ + if ( !iop->handlers ) + set_errno_and_return_minus_one( EBADF ); + if ( !iop->handlers->ioctl ) set_errno_and_return_minus_one( ENOTSUP ); diff --git a/c/src/exec/libcsupport/src/link.c b/c/src/exec/libcsupport/src/link.c index 5bf8f90353..03bdaee343 100644 --- a/c/src/exec/libcsupport/src/link.c +++ b/c/src/exec/libcsupport/src/link.c @@ -41,8 +41,16 @@ int link( */ rtems_filesystem_get_start_loc( new, &i, &parent_loc ); + + if ( !parent_loc.ops->evalformake ) { + rtems_filesystem_freenode( &existing_loc ); + rtems_filesystem_freenode( &parent_loc ); + set_errno_and_return_minus_one( ENOTSUP ); + } + result = (*parent_loc.ops->evalformake)( &new[i], &parent_loc, &name_start ); if ( result != 0 ) { + rtems_filesystem_freenode( &existing_loc ); rtems_filesystem_freenode( &parent_loc ); set_errno_and_return_minus_one( result ); } diff --git a/c/src/exec/libcsupport/src/mknod.c b/c/src/exec/libcsupport/src/mknod.c index 0a3a108f9a..30a3f548a2 100644 --- a/c/src/exec/libcsupport/src/mknod.c +++ b/c/src/exec/libcsupport/src/mknod.c @@ -43,6 +43,11 @@ int mknod( rtems_filesystem_get_start_loc( pathname, &i, &temp_loc ); + if ( !temp_loc.ops->evalformake ) { + rtems_filesystem_freenode( &temp_loc ); + set_errno_and_return_minus_one( ENOTSUP ); + } + result = (*temp_loc.ops->evalformake)( &pathname[i], &temp_loc, diff --git a/c/src/exec/libcsupport/src/symlink.c b/c/src/exec/libcsupport/src/symlink.c index 6a31a25bad..c63abf0a25 100644 --- a/c/src/exec/libcsupport/src/symlink.c +++ b/c/src/exec/libcsupport/src/symlink.c @@ -28,6 +28,11 @@ int symlink( if ( result != 0 ) return -1; + if ( !loc.ops->symlink ) { + rtems_filesystem_freenode( &loc ); + set_errno_and_return_minus_one( ENOTSUP ); + } + result = (*loc.ops->symlink)( &loc, actualpath, name_start); rtems_filesystem_freenode( &loc ); diff --git a/c/src/exec/libfs/src/imfs/ioman.c b/c/src/exec/libfs/src/imfs/ioman.c index ee22791657..4f592a6094 100644 --- a/c/src/exec/libfs/src/imfs/ioman.c +++ b/c/src/exec/libfs/src/imfs/ioman.c @@ -80,6 +80,11 @@ rtems_status_code rtems_io_lookup_name( result = rtems_filesystem_evaluate_path( name, 0x00, &loc, TRUE ); the_jnode = loc.node_access; + if ( !loc.ops->node_type ) { + rtems_filesystem_freenode( &loc ); + set_errno_and_return_minus_one( ENOTSUP ); + } + node_type = (*loc.ops->node_type)( &loc ); if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) { diff --git a/c/src/exec/libfs/src/imfs/memfile.c b/c/src/exec/libfs/src/imfs/memfile.c index a2dc695044..9974a3d2d5 100644 --- a/c/src/exec/libfs/src/imfs/memfile.c +++ b/c/src/exec/libfs/src/imfs/memfile.c @@ -112,6 +112,9 @@ int memfile_close( the_jnode = iop->file_info; + if (iop->flags & LIBIO_FLAGS_APPEND) + iop->offset = the_jnode->info.file.size; + return 0; } @@ -340,7 +343,6 @@ MEMFILE_STATIC int IMFS_memfile_addblock( #endif memory = memfile_alloc_block(); - assert( memory ); if ( !memory ) return 1; *block_entry_ptr = memory; diff --git a/c/src/lib/ChangeLog b/c/src/lib/ChangeLog index c00bec1627..9f4954f9ad 100644 --- a/c/src/lib/ChangeLog +++ b/c/src/lib/ChangeLog @@ -1,4 +1,19 @@ +2000-08-11 Chris Johns + + * libc/chmod.c: Return ENOTSUP if filesystem does not have handler. + * libc/eval.c: Ditto. + * libc/fcntl.c: Ditto. + * libc/fsync.c: Ditto. + * libc/ioctl.c: Ditto. + * libc/ioman.c: Ditto. + * libc/memfile.c: Ditto. + * libc/link.c: Ditto. + * libc/mknod.c: Ditto. + * libc/symlink.c: Ditto. + * libc/libio.h(rtems_filesystem_dev_major_t): New macro. + appending to a file. + 2000-08-10 Joel Sherrill * ChangeLog: New file. diff --git a/c/src/lib/include/rtems/libio.h b/c/src/lib/include/rtems/libio.h index 5df9cccc24..7d832258ca 100644 --- a/c/src/lib/include/rtems/libio.h +++ b/c/src/lib/include/rtems/libio.h @@ -466,10 +466,16 @@ typedef int (*rtems_libio_lseek_t)( #define rtems_filesystem_make_dev_t( _major, _minor ) \ ((((dev_t)(_major)) << 32) | (dev_t)(_minor)) +#define rtems_filesystem_dev_major_t( _dev ) \ + (rtems_device_major_number) ((_dev) >> 32) + +#define rtems_filesystem_dev_minor_t( _dev ) \ + (rtems_device_minor_number) ((_dev) & 0xFFFFFFFF) + #define rtems_filesystem_split_dev_t( _dev, _major, _minor ) \ do { \ - (_major) = (rtems_device_major_number) ((_dev) >> 32); \ - (_minor) = (rtems_device_minor_number) ((_dev) & 0xFFFFFFFF); \ + (_major) = rtems_filesystem_dev_major_t ( _dev ); \ + (_minor) = rtems_filesystem_dev_minor_t( _dev ); \ } while(0) /* diff --git a/c/src/lib/libc/chmod.c b/c/src/lib/libc/chmod.c index d88e80eeb7..f1042806b9 100644 --- a/c/src/lib/libc/chmod.c +++ b/c/src/lib/libc/chmod.c @@ -33,6 +33,11 @@ int chmod( if ( status != 0 ) return -1; + if ( !loc.handlers ){ + rtems_filesystem_freenode( &loc ); + set_errno_and_return_minus_one( EBADF ); + } + if ( !loc.handlers->fchmod ){ rtems_filesystem_freenode( &loc ); set_errno_and_return_minus_one( ENOTSUP ); diff --git a/c/src/lib/libc/eval.c b/c/src/lib/libc/eval.c index 8fc27ca19c..8d839918a5 100644 --- a/c/src/lib/libc/eval.c +++ b/c/src/lib/libc/eval.c @@ -43,6 +43,9 @@ int rtems_filesystem_evaluate_path( rtems_filesystem_get_start_loc( pathname, &i, pathloc ); + if ( !pathloc->ops->evalpath ) + set_errno_and_return_minus_one( ENOTSUP ); + result = (*pathloc->ops->evalpath)( &pathname[i], flags, pathloc ); /* diff --git a/c/src/lib/libc/fcntl.c b/c/src/lib/libc/fcntl.c index 05410eaff6..587726f885 100644 --- a/c/src/lib/libc/fcntl.c +++ b/c/src/lib/libc/fcntl.c @@ -131,10 +131,16 @@ int fcntl( ret = -1; break; } - if ((ret >= 0) && iop->handlers->fcntl) { - int err = (*iop->handlers->fcntl)( cmd, iop ); - if (err) { - errno = err; + if (ret >= 0) { + if (iop->handlers->fcntl) { + int err = (*iop->handlers->fcntl)( cmd, iop ); + if (err) { + errno = err; + ret = -1; + } + } + else { + errno = ENOTSUP; ret = -1; } } diff --git a/c/src/lib/libc/fsync.c b/c/src/lib/libc/fsync.c index 64f05f341a..3dc9835d31 100644 --- a/c/src/lib/libc/fsync.c +++ b/c/src/lib/libc/fsync.c @@ -30,6 +30,9 @@ int fsync( * Now process the fsync(). */ + if ( !iop->handlers ) + set_errno_and_return_minus_one( EBADF ); + if ( !iop->handlers->fsync ) set_errno_and_return_minus_one( ENOTSUP ); diff --git a/c/src/lib/libc/ioctl.c b/c/src/lib/libc/ioctl.c index 8d84a26a15..ce74ba7cf4 100644 --- a/c/src/lib/libc/ioctl.c +++ b/c/src/lib/libc/ioctl.c @@ -41,6 +41,9 @@ int ioctl( * Now process the ioctl(). */ + if ( !iop->handlers ) + set_errno_and_return_minus_one( EBADF ); + if ( !iop->handlers->ioctl ) set_errno_and_return_minus_one( ENOTSUP ); diff --git a/c/src/lib/libc/ioman.c b/c/src/lib/libc/ioman.c index ee22791657..4f592a6094 100644 --- a/c/src/lib/libc/ioman.c +++ b/c/src/lib/libc/ioman.c @@ -80,6 +80,11 @@ rtems_status_code rtems_io_lookup_name( result = rtems_filesystem_evaluate_path( name, 0x00, &loc, TRUE ); the_jnode = loc.node_access; + if ( !loc.ops->node_type ) { + rtems_filesystem_freenode( &loc ); + set_errno_and_return_minus_one( ENOTSUP ); + } + node_type = (*loc.ops->node_type)( &loc ); if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) { diff --git a/c/src/lib/libc/libio.h b/c/src/lib/libc/libio.h index 5df9cccc24..7d832258ca 100644 --- a/c/src/lib/libc/libio.h +++ b/c/src/lib/libc/libio.h @@ -466,10 +466,16 @@ typedef int (*rtems_libio_lseek_t)( #define rtems_filesystem_make_dev_t( _major, _minor ) \ ((((dev_t)(_major)) << 32) | (dev_t)(_minor)) +#define rtems_filesystem_dev_major_t( _dev ) \ + (rtems_device_major_number) ((_dev) >> 32) + +#define rtems_filesystem_dev_minor_t( _dev ) \ + (rtems_device_minor_number) ((_dev) & 0xFFFFFFFF) + #define rtems_filesystem_split_dev_t( _dev, _major, _minor ) \ do { \ - (_major) = (rtems_device_major_number) ((_dev) >> 32); \ - (_minor) = (rtems_device_minor_number) ((_dev) & 0xFFFFFFFF); \ + (_major) = rtems_filesystem_dev_major_t ( _dev ); \ + (_minor) = rtems_filesystem_dev_minor_t( _dev ); \ } while(0) /* diff --git a/c/src/lib/libc/link.c b/c/src/lib/libc/link.c index 5bf8f90353..03bdaee343 100644 --- a/c/src/lib/libc/link.c +++ b/c/src/lib/libc/link.c @@ -41,8 +41,16 @@ int link( */ rtems_filesystem_get_start_loc( new, &i, &parent_loc ); + + if ( !parent_loc.ops->evalformake ) { + rtems_filesystem_freenode( &existing_loc ); + rtems_filesystem_freenode( &parent_loc ); + set_errno_and_return_minus_one( ENOTSUP ); + } + result = (*parent_loc.ops->evalformake)( &new[i], &parent_loc, &name_start ); if ( result != 0 ) { + rtems_filesystem_freenode( &existing_loc ); rtems_filesystem_freenode( &parent_loc ); set_errno_and_return_minus_one( result ); } diff --git a/c/src/lib/libc/memfile.c b/c/src/lib/libc/memfile.c index a2dc695044..9974a3d2d5 100644 --- a/c/src/lib/libc/memfile.c +++ b/c/src/lib/libc/memfile.c @@ -112,6 +112,9 @@ int memfile_close( the_jnode = iop->file_info; + if (iop->flags & LIBIO_FLAGS_APPEND) + iop->offset = the_jnode->info.file.size; + return 0; } @@ -340,7 +343,6 @@ MEMFILE_STATIC int IMFS_memfile_addblock( #endif memory = memfile_alloc_block(); - assert( memory ); if ( !memory ) return 1; *block_entry_ptr = memory; diff --git a/c/src/lib/libc/mknod.c b/c/src/lib/libc/mknod.c index 0a3a108f9a..30a3f548a2 100644 --- a/c/src/lib/libc/mknod.c +++ b/c/src/lib/libc/mknod.c @@ -43,6 +43,11 @@ int mknod( rtems_filesystem_get_start_loc( pathname, &i, &temp_loc ); + if ( !temp_loc.ops->evalformake ) { + rtems_filesystem_freenode( &temp_loc ); + set_errno_and_return_minus_one( ENOTSUP ); + } + result = (*temp_loc.ops->evalformake)( &pathname[i], &temp_loc, diff --git a/c/src/lib/libc/symlink.c b/c/src/lib/libc/symlink.c index 6a31a25bad..c63abf0a25 100644 --- a/c/src/lib/libc/symlink.c +++ b/c/src/lib/libc/symlink.c @@ -28,6 +28,11 @@ int symlink( if ( result != 0 ) return -1; + if ( !loc.ops->symlink ) { + rtems_filesystem_freenode( &loc ); + set_errno_and_return_minus_one( ENOTSUP ); + } + result = (*loc.ops->symlink)( &loc, actualpath, name_start); rtems_filesystem_freenode( &loc ); diff --git a/c/src/libfs/src/imfs/ioman.c b/c/src/libfs/src/imfs/ioman.c index ee22791657..4f592a6094 100644 --- a/c/src/libfs/src/imfs/ioman.c +++ b/c/src/libfs/src/imfs/ioman.c @@ -80,6 +80,11 @@ rtems_status_code rtems_io_lookup_name( result = rtems_filesystem_evaluate_path( name, 0x00, &loc, TRUE ); the_jnode = loc.node_access; + if ( !loc.ops->node_type ) { + rtems_filesystem_freenode( &loc ); + set_errno_and_return_minus_one( ENOTSUP ); + } + node_type = (*loc.ops->node_type)( &loc ); if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) { diff --git a/c/src/libfs/src/imfs/memfile.c b/c/src/libfs/src/imfs/memfile.c index a2dc695044..9974a3d2d5 100644 --- a/c/src/libfs/src/imfs/memfile.c +++ b/c/src/libfs/src/imfs/memfile.c @@ -112,6 +112,9 @@ int memfile_close( the_jnode = iop->file_info; + if (iop->flags & LIBIO_FLAGS_APPEND) + iop->offset = the_jnode->info.file.size; + return 0; } @@ -340,7 +343,6 @@ MEMFILE_STATIC int IMFS_memfile_addblock( #endif memory = memfile_alloc_block(); - assert( memory ); if ( !memory ) return 1; *block_entry_ptr = memory; -- cgit v1.2.3