forked from Imagelibrary/rtems
Added rtems_filesystem_freenode() macro and added calls at appropriate
places to make sure memory allocated for filesystem specifif nodes gets freed.
This commit is contained in:
@@ -160,6 +160,18 @@ extern mode_t rtems_filesystem_umask;
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rtems_filesystem_freenode
|
||||||
|
*
|
||||||
|
* Macro to free a node.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define rtems_filesystem_freenode( _node ) \
|
||||||
|
do { \
|
||||||
|
if ( (_node)->ops->freenod ) \
|
||||||
|
(*(_node)->ops->freenod)( (_node) ); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* rtems_filesystem_is_separator
|
* rtems_filesystem_is_separator
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -160,6 +160,18 @@ extern mode_t rtems_filesystem_umask;
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rtems_filesystem_freenode
|
||||||
|
*
|
||||||
|
* Macro to free a node.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define rtems_filesystem_freenode( _node ) \
|
||||||
|
do { \
|
||||||
|
if ( (_node)->ops->freenod ) \
|
||||||
|
(*(_node)->ops->freenod)( (_node) ); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* rtems_filesystem_is_separator
|
* rtems_filesystem_is_separator
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -39,19 +39,16 @@ int chdir(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( !loc.ops->node_type ) {
|
if ( !loc.ops->node_type ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
|
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTDIR );
|
set_errno_and_return_minus_one( ENOTDIR );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( rtems_filesystem_current.ops->freenod )
|
rtems_filesystem_freenode( &rtems_filesystem_current );
|
||||||
(*rtems_filesystem_current.ops->freenod)( &rtems_filesystem_current );
|
|
||||||
|
|
||||||
rtems_filesystem_current = loc;
|
rtems_filesystem_current = loc;
|
||||||
|
|
||||||
|
|||||||
@@ -35,15 +35,13 @@ int chmod(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !loc.handlers->fchmod ){
|
if ( !loc.handlers->fchmod ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*loc.handlers->fchmod)( &loc, mode );
|
result = (*loc.handlers->fchmod)( &loc, mode );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,15 +33,13 @@ int chown(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !loc.ops->chown ) {
|
if ( !loc.ops->chown ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*loc.ops->chown)( &loc, owner, group );
|
result = (*loc.ops->chown)( &loc, owner, group );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,8 +44,7 @@ int link(
|
|||||||
rtems_filesystem_get_start_loc( new, &i, &parent_loc );
|
rtems_filesystem_get_start_loc( new, &i, &parent_loc );
|
||||||
result = (*parent_loc.ops->evalformake)( &new[i], &parent_loc, &name_start );
|
result = (*parent_loc.ops->evalformake)( &new[i], &parent_loc, &name_start );
|
||||||
if ( result != 0 ) {
|
if ( result != 0 ) {
|
||||||
if ( existing_loc.ops->freenod )
|
rtems_filesystem_freenode( &parent_loc );
|
||||||
(*existing_loc.ops->freenod)( &parent_loc );
|
|
||||||
set_errno_and_return_minus_one( result );
|
set_errno_and_return_minus_one( result );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,33 +54,21 @@ int link(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( parent_loc.mt_entry != existing_loc.mt_entry ) {
|
if ( parent_loc.mt_entry != existing_loc.mt_entry ) {
|
||||||
if ( existing_loc.ops->freenod )
|
rtems_filesystem_freenode( &existing_loc );
|
||||||
(*existing_loc.ops->freenod)( &existing_loc );
|
rtems_filesystem_freenode( &parent_loc );
|
||||||
|
|
||||||
if ( parent_loc.ops->freenod )
|
|
||||||
(*parent_loc.ops->freenod)( &parent_loc );
|
|
||||||
|
|
||||||
set_errno_and_return_minus_one( EXDEV );
|
set_errno_and_return_minus_one( EXDEV );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !parent_loc.ops->link ) {
|
if ( !parent_loc.ops->link ) {
|
||||||
|
rtems_filesystem_freenode( &existing_loc );
|
||||||
if ( existing_loc.ops->freenod )
|
rtems_filesystem_freenode( &parent_loc );
|
||||||
(*existing_loc.ops->freenod)( &existing_loc );
|
|
||||||
|
|
||||||
if ( parent_loc.ops->freenod )
|
|
||||||
(*parent_loc.ops->freenod)( &parent_loc );
|
|
||||||
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*parent_loc.ops->link)( &existing_loc, &parent_loc, name_start );
|
result = (*parent_loc.ops->link)( &existing_loc, &parent_loc, name_start );
|
||||||
|
|
||||||
if ( existing_loc.ops->freenod )
|
rtems_filesystem_freenode( &existing_loc );
|
||||||
(*existing_loc.ops->freenod)( &existing_loc );
|
rtems_filesystem_freenode( &parent_loc );
|
||||||
|
|
||||||
if ( parent_loc.ops->freenod )
|
|
||||||
(*parent_loc.ops->freenod)( &parent_loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,14 +53,13 @@ int mknod(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !temp_loc.ops->mknod ) {
|
if ( !temp_loc.ops->mknod ) {
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*temp_loc.ops->mknod)( name_start, mode, dev, &temp_loc );
|
result = (*temp_loc.ops->mknod)( name_start, mode, dev, &temp_loc );
|
||||||
if ( temp_loc.ops->freenod )
|
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -224,8 +224,7 @@ int mount(
|
|||||||
|
|
||||||
*mt_entry = temp_mt_entry;
|
*mt_entry = temp_mt_entry;
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -233,8 +232,7 @@ cleanup_and_bail:
|
|||||||
|
|
||||||
free( temp_mt_entry );
|
free( temp_mt_entry );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -179,8 +179,7 @@ done:
|
|||||||
set_errno_and_return_minus_one( rc );
|
set_errno_and_return_minus_one( rc );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return iop - rtems_libio_iops;
|
return iop - rtems_libio_iops;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,27 +31,23 @@ int readlink(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !loc.ops->node_type ){
|
if ( !loc.ops->node_type ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
|
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( EINVAL );
|
set_errno_and_return_minus_one( EINVAL );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !loc.ops->readlink ){
|
if ( !loc.ops->readlink ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*loc.ops->readlink)( &loc, buf, bufsize );
|
result = (*loc.ops->readlink)( &loc, buf, bufsize );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,14 +40,12 @@ int rmdir(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( !loc.ops->node_type ){
|
if ( !loc.ops->node_type ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ){
|
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTDIR );
|
set_errno_and_return_minus_one( ENOTDIR );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,15 +54,13 @@ int rmdir(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( !loc.ops->rmnod ){
|
if ( !loc.ops->rmnod ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*loc.ops->rmnod)( &loc );
|
result = (*loc.ops->rmnod)( &loc );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,8 +59,7 @@ int _STAT_NAME(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !loc.handlers->fstat ){
|
if ( !loc.handlers->fstat ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,8 +72,7 @@ int _STAT_NAME(
|
|||||||
|
|
||||||
status = (*loc.handlers->fstat)( &loc, buf );
|
status = (*loc.handlers->fstat)( &loc, buf );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,7 @@ int symlink(
|
|||||||
|
|
||||||
result = (*loc.ops->symlink)( &loc, actualpath, name_start);
|
result = (*loc.ops->symlink)( &loc, actualpath, name_start);
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,27 +32,23 @@ int unlink(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !loc.ops->node_type ) {
|
if ( !loc.ops->node_type ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (*loc.ops->node_type)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
|
if ( (*loc.ops->node_type)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( EISDIR );
|
set_errno_and_return_minus_one( EISDIR );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !loc.ops->unlink ) {
|
if ( !loc.ops->unlink ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*loc.ops->unlink)( &loc );
|
result = (*loc.ops->unlink)( &loc );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,8 +84,7 @@ int unmount(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( rtems_filesystem_current.mt_entry == temp_loc.mt_entry ) {
|
if ( rtems_filesystem_current.mt_entry == temp_loc.mt_entry ) {
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
set_errno_and_return_minus_one( EBUSY );
|
set_errno_and_return_minus_one( EBUSY );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,8 +95,7 @@ int unmount(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( rtems_libio_is_open_files_in_fs( temp_loc.mt_entry ) == 1 ) {
|
if ( rtems_libio_is_open_files_in_fs( temp_loc.mt_entry ) == 1 ) {
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
set_errno_and_return_minus_one( EBUSY );
|
set_errno_and_return_minus_one( EBUSY );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,8 +108,7 @@ int unmount(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ((temp_mt_entry.mt_point_node.ops->unmount )( temp_loc.mt_entry ) != 0 ) {
|
if ((temp_mt_entry.mt_point_node.ops->unmount )( temp_loc.mt_entry ) != 0 ) {
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,8 +117,7 @@ int unmount(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ((temp_mt_entry.mt_fs_root.ops->fsunmount_me )( temp_loc.mt_entry ) != 0){
|
if ((temp_mt_entry.mt_fs_root.ops->fsunmount_me )( temp_loc.mt_entry ) != 0){
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,8 +138,7 @@ int unmount(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
free( temp_loc.mt_entry );
|
free( temp_loc.mt_entry );
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
|||||||
@@ -34,8 +34,7 @@ int utime(
|
|||||||
|
|
||||||
result = (*temp_loc.ops->utime)( &temp_loc, times->actime, times->modtime );
|
result = (*temp_loc.ops->utime)( &temp_loc, times->actime, times->modtime );
|
||||||
|
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,8 +85,7 @@ rtems_status_code rtems_io_lookup_name(
|
|||||||
|
|
||||||
if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
|
if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
|
||||||
*device_info = 0;
|
*device_info = 0;
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
return RTEMS_UNSATISFIED;
|
return RTEMS_UNSATISFIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,8 +95,7 @@ rtems_status_code rtems_io_lookup_name(
|
|||||||
device.minor = the_jnode->info.device.minor;
|
device.minor = the_jnode->info.device.minor;
|
||||||
*device_info = &device;
|
*device_info = &device;
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
return RTEMS_SUCCESSFUL;
|
return RTEMS_SUCCESSFUL;
|
||||||
|
|||||||
@@ -160,6 +160,18 @@ extern mode_t rtems_filesystem_umask;
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rtems_filesystem_freenode
|
||||||
|
*
|
||||||
|
* Macro to free a node.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define rtems_filesystem_freenode( _node ) \
|
||||||
|
do { \
|
||||||
|
if ( (_node)->ops->freenod ) \
|
||||||
|
(*(_node)->ops->freenod)( (_node) ); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* rtems_filesystem_is_separator
|
* rtems_filesystem_is_separator
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -39,19 +39,16 @@ int chdir(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( !loc.ops->node_type ) {
|
if ( !loc.ops->node_type ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
|
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTDIR );
|
set_errno_and_return_minus_one( ENOTDIR );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( rtems_filesystem_current.ops->freenod )
|
rtems_filesystem_freenode( &rtems_filesystem_current );
|
||||||
(*rtems_filesystem_current.ops->freenod)( &rtems_filesystem_current );
|
|
||||||
|
|
||||||
rtems_filesystem_current = loc;
|
rtems_filesystem_current = loc;
|
||||||
|
|
||||||
|
|||||||
@@ -35,15 +35,13 @@ int chmod(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !loc.handlers->fchmod ){
|
if ( !loc.handlers->fchmod ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*loc.handlers->fchmod)( &loc, mode );
|
result = (*loc.handlers->fchmod)( &loc, mode );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,15 +33,13 @@ int chown(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !loc.ops->chown ) {
|
if ( !loc.ops->chown ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*loc.ops->chown)( &loc, owner, group );
|
result = (*loc.ops->chown)( &loc, owner, group );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,8 +85,7 @@ rtems_status_code rtems_io_lookup_name(
|
|||||||
|
|
||||||
if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
|
if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
|
||||||
*device_info = 0;
|
*device_info = 0;
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
return RTEMS_UNSATISFIED;
|
return RTEMS_UNSATISFIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,8 +95,7 @@ rtems_status_code rtems_io_lookup_name(
|
|||||||
device.minor = the_jnode->info.device.minor;
|
device.minor = the_jnode->info.device.minor;
|
||||||
*device_info = &device;
|
*device_info = &device;
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
return RTEMS_SUCCESSFUL;
|
return RTEMS_SUCCESSFUL;
|
||||||
|
|||||||
@@ -160,6 +160,18 @@ extern mode_t rtems_filesystem_umask;
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rtems_filesystem_freenode
|
||||||
|
*
|
||||||
|
* Macro to free a node.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define rtems_filesystem_freenode( _node ) \
|
||||||
|
do { \
|
||||||
|
if ( (_node)->ops->freenod ) \
|
||||||
|
(*(_node)->ops->freenod)( (_node) ); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* rtems_filesystem_is_separator
|
* rtems_filesystem_is_separator
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -44,8 +44,7 @@ int link(
|
|||||||
rtems_filesystem_get_start_loc( new, &i, &parent_loc );
|
rtems_filesystem_get_start_loc( new, &i, &parent_loc );
|
||||||
result = (*parent_loc.ops->evalformake)( &new[i], &parent_loc, &name_start );
|
result = (*parent_loc.ops->evalformake)( &new[i], &parent_loc, &name_start );
|
||||||
if ( result != 0 ) {
|
if ( result != 0 ) {
|
||||||
if ( existing_loc.ops->freenod )
|
rtems_filesystem_freenode( &parent_loc );
|
||||||
(*existing_loc.ops->freenod)( &parent_loc );
|
|
||||||
set_errno_and_return_minus_one( result );
|
set_errno_and_return_minus_one( result );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,33 +54,21 @@ int link(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( parent_loc.mt_entry != existing_loc.mt_entry ) {
|
if ( parent_loc.mt_entry != existing_loc.mt_entry ) {
|
||||||
if ( existing_loc.ops->freenod )
|
rtems_filesystem_freenode( &existing_loc );
|
||||||
(*existing_loc.ops->freenod)( &existing_loc );
|
rtems_filesystem_freenode( &parent_loc );
|
||||||
|
|
||||||
if ( parent_loc.ops->freenod )
|
|
||||||
(*parent_loc.ops->freenod)( &parent_loc );
|
|
||||||
|
|
||||||
set_errno_and_return_minus_one( EXDEV );
|
set_errno_and_return_minus_one( EXDEV );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !parent_loc.ops->link ) {
|
if ( !parent_loc.ops->link ) {
|
||||||
|
rtems_filesystem_freenode( &existing_loc );
|
||||||
if ( existing_loc.ops->freenod )
|
rtems_filesystem_freenode( &parent_loc );
|
||||||
(*existing_loc.ops->freenod)( &existing_loc );
|
|
||||||
|
|
||||||
if ( parent_loc.ops->freenod )
|
|
||||||
(*parent_loc.ops->freenod)( &parent_loc );
|
|
||||||
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*parent_loc.ops->link)( &existing_loc, &parent_loc, name_start );
|
result = (*parent_loc.ops->link)( &existing_loc, &parent_loc, name_start );
|
||||||
|
|
||||||
if ( existing_loc.ops->freenod )
|
rtems_filesystem_freenode( &existing_loc );
|
||||||
(*existing_loc.ops->freenod)( &existing_loc );
|
rtems_filesystem_freenode( &parent_loc );
|
||||||
|
|
||||||
if ( parent_loc.ops->freenod )
|
|
||||||
(*parent_loc.ops->freenod)( &parent_loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,14 +53,13 @@ int mknod(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !temp_loc.ops->mknod ) {
|
if ( !temp_loc.ops->mknod ) {
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*temp_loc.ops->mknod)( name_start, mode, dev, &temp_loc );
|
result = (*temp_loc.ops->mknod)( name_start, mode, dev, &temp_loc );
|
||||||
if ( temp_loc.ops->freenod )
|
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -224,8 +224,7 @@ int mount(
|
|||||||
|
|
||||||
*mt_entry = temp_mt_entry;
|
*mt_entry = temp_mt_entry;
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -233,8 +232,7 @@ cleanup_and_bail:
|
|||||||
|
|
||||||
free( temp_mt_entry );
|
free( temp_mt_entry );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -179,8 +179,7 @@ done:
|
|||||||
set_errno_and_return_minus_one( rc );
|
set_errno_and_return_minus_one( rc );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return iop - rtems_libio_iops;
|
return iop - rtems_libio_iops;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,27 +31,23 @@ int readlink(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !loc.ops->node_type ){
|
if ( !loc.ops->node_type ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
|
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( EINVAL );
|
set_errno_and_return_minus_one( EINVAL );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !loc.ops->readlink ){
|
if ( !loc.ops->readlink ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*loc.ops->readlink)( &loc, buf, bufsize );
|
result = (*loc.ops->readlink)( &loc, buf, bufsize );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,14 +40,12 @@ int rmdir(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( !loc.ops->node_type ){
|
if ( !loc.ops->node_type ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ){
|
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTDIR );
|
set_errno_and_return_minus_one( ENOTDIR );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,15 +54,13 @@ int rmdir(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( !loc.ops->rmnod ){
|
if ( !loc.ops->rmnod ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*loc.ops->rmnod)( &loc );
|
result = (*loc.ops->rmnod)( &loc );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,8 +59,7 @@ int _STAT_NAME(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !loc.handlers->fstat ){
|
if ( !loc.handlers->fstat ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,8 +72,7 @@ int _STAT_NAME(
|
|||||||
|
|
||||||
status = (*loc.handlers->fstat)( &loc, buf );
|
status = (*loc.handlers->fstat)( &loc, buf );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,7 @@ int symlink(
|
|||||||
|
|
||||||
result = (*loc.ops->symlink)( &loc, actualpath, name_start);
|
result = (*loc.ops->symlink)( &loc, actualpath, name_start);
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,27 +32,23 @@ int unlink(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !loc.ops->node_type ) {
|
if ( !loc.ops->node_type ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (*loc.ops->node_type)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
|
if ( (*loc.ops->node_type)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( EISDIR );
|
set_errno_and_return_minus_one( EISDIR );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !loc.ops->unlink ) {
|
if ( !loc.ops->unlink ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*loc.ops->unlink)( &loc );
|
result = (*loc.ops->unlink)( &loc );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,8 +84,7 @@ int unmount(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( rtems_filesystem_current.mt_entry == temp_loc.mt_entry ) {
|
if ( rtems_filesystem_current.mt_entry == temp_loc.mt_entry ) {
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
set_errno_and_return_minus_one( EBUSY );
|
set_errno_and_return_minus_one( EBUSY );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,8 +95,7 @@ int unmount(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( rtems_libio_is_open_files_in_fs( temp_loc.mt_entry ) == 1 ) {
|
if ( rtems_libio_is_open_files_in_fs( temp_loc.mt_entry ) == 1 ) {
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
set_errno_and_return_minus_one( EBUSY );
|
set_errno_and_return_minus_one( EBUSY );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,8 +108,7 @@ int unmount(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ((temp_mt_entry.mt_point_node.ops->unmount )( temp_loc.mt_entry ) != 0 ) {
|
if ((temp_mt_entry.mt_point_node.ops->unmount )( temp_loc.mt_entry ) != 0 ) {
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,8 +117,7 @@ int unmount(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ((temp_mt_entry.mt_fs_root.ops->fsunmount_me )( temp_loc.mt_entry ) != 0){
|
if ((temp_mt_entry.mt_fs_root.ops->fsunmount_me )( temp_loc.mt_entry ) != 0){
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,8 +138,7 @@ int unmount(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
free( temp_loc.mt_entry );
|
free( temp_loc.mt_entry );
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
|||||||
@@ -34,8 +34,7 @@ int utime(
|
|||||||
|
|
||||||
result = (*temp_loc.ops->utime)( &temp_loc, times->actime, times->modtime );
|
result = (*temp_loc.ops->utime)( &temp_loc, times->actime, times->modtime );
|
||||||
|
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,8 +85,7 @@ rtems_status_code rtems_io_lookup_name(
|
|||||||
|
|
||||||
if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
|
if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
|
||||||
*device_info = 0;
|
*device_info = 0;
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
return RTEMS_UNSATISFIED;
|
return RTEMS_UNSATISFIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,8 +95,7 @@ rtems_status_code rtems_io_lookup_name(
|
|||||||
device.minor = the_jnode->info.device.minor;
|
device.minor = the_jnode->info.device.minor;
|
||||||
*device_info = &device;
|
*device_info = &device;
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
return RTEMS_SUCCESSFUL;
|
return RTEMS_SUCCESSFUL;
|
||||||
|
|||||||
@@ -160,6 +160,18 @@ extern mode_t rtems_filesystem_umask;
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rtems_filesystem_freenode
|
||||||
|
*
|
||||||
|
* Macro to free a node.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define rtems_filesystem_freenode( _node ) \
|
||||||
|
do { \
|
||||||
|
if ( (_node)->ops->freenod ) \
|
||||||
|
(*(_node)->ops->freenod)( (_node) ); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* rtems_filesystem_is_separator
|
* rtems_filesystem_is_separator
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -160,6 +160,18 @@ extern mode_t rtems_filesystem_umask;
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rtems_filesystem_freenode
|
||||||
|
*
|
||||||
|
* Macro to free a node.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define rtems_filesystem_freenode( _node ) \
|
||||||
|
do { \
|
||||||
|
if ( (_node)->ops->freenod ) \
|
||||||
|
(*(_node)->ops->freenod)( (_node) ); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* rtems_filesystem_is_separator
|
* rtems_filesystem_is_separator
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -39,19 +39,16 @@ int chdir(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( !loc.ops->node_type ) {
|
if ( !loc.ops->node_type ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
|
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTDIR );
|
set_errno_and_return_minus_one( ENOTDIR );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( rtems_filesystem_current.ops->freenod )
|
rtems_filesystem_freenode( &rtems_filesystem_current );
|
||||||
(*rtems_filesystem_current.ops->freenod)( &rtems_filesystem_current );
|
|
||||||
|
|
||||||
rtems_filesystem_current = loc;
|
rtems_filesystem_current = loc;
|
||||||
|
|
||||||
|
|||||||
@@ -35,15 +35,13 @@ int chmod(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !loc.handlers->fchmod ){
|
if ( !loc.handlers->fchmod ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*loc.handlers->fchmod)( &loc, mode );
|
result = (*loc.handlers->fchmod)( &loc, mode );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,15 +33,13 @@ int chown(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !loc.ops->chown ) {
|
if ( !loc.ops->chown ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*loc.ops->chown)( &loc, owner, group );
|
result = (*loc.ops->chown)( &loc, owner, group );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,8 +44,7 @@ int link(
|
|||||||
rtems_filesystem_get_start_loc( new, &i, &parent_loc );
|
rtems_filesystem_get_start_loc( new, &i, &parent_loc );
|
||||||
result = (*parent_loc.ops->evalformake)( &new[i], &parent_loc, &name_start );
|
result = (*parent_loc.ops->evalformake)( &new[i], &parent_loc, &name_start );
|
||||||
if ( result != 0 ) {
|
if ( result != 0 ) {
|
||||||
if ( existing_loc.ops->freenod )
|
rtems_filesystem_freenode( &parent_loc );
|
||||||
(*existing_loc.ops->freenod)( &parent_loc );
|
|
||||||
set_errno_and_return_minus_one( result );
|
set_errno_and_return_minus_one( result );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,33 +54,21 @@ int link(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( parent_loc.mt_entry != existing_loc.mt_entry ) {
|
if ( parent_loc.mt_entry != existing_loc.mt_entry ) {
|
||||||
if ( existing_loc.ops->freenod )
|
rtems_filesystem_freenode( &existing_loc );
|
||||||
(*existing_loc.ops->freenod)( &existing_loc );
|
rtems_filesystem_freenode( &parent_loc );
|
||||||
|
|
||||||
if ( parent_loc.ops->freenod )
|
|
||||||
(*parent_loc.ops->freenod)( &parent_loc );
|
|
||||||
|
|
||||||
set_errno_and_return_minus_one( EXDEV );
|
set_errno_and_return_minus_one( EXDEV );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !parent_loc.ops->link ) {
|
if ( !parent_loc.ops->link ) {
|
||||||
|
rtems_filesystem_freenode( &existing_loc );
|
||||||
if ( existing_loc.ops->freenod )
|
rtems_filesystem_freenode( &parent_loc );
|
||||||
(*existing_loc.ops->freenod)( &existing_loc );
|
|
||||||
|
|
||||||
if ( parent_loc.ops->freenod )
|
|
||||||
(*parent_loc.ops->freenod)( &parent_loc );
|
|
||||||
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*parent_loc.ops->link)( &existing_loc, &parent_loc, name_start );
|
result = (*parent_loc.ops->link)( &existing_loc, &parent_loc, name_start );
|
||||||
|
|
||||||
if ( existing_loc.ops->freenod )
|
rtems_filesystem_freenode( &existing_loc );
|
||||||
(*existing_loc.ops->freenod)( &existing_loc );
|
rtems_filesystem_freenode( &parent_loc );
|
||||||
|
|
||||||
if ( parent_loc.ops->freenod )
|
|
||||||
(*parent_loc.ops->freenod)( &parent_loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,14 +53,13 @@ int mknod(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !temp_loc.ops->mknod ) {
|
if ( !temp_loc.ops->mknod ) {
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*temp_loc.ops->mknod)( name_start, mode, dev, &temp_loc );
|
result = (*temp_loc.ops->mknod)( name_start, mode, dev, &temp_loc );
|
||||||
if ( temp_loc.ops->freenod )
|
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -224,8 +224,7 @@ int mount(
|
|||||||
|
|
||||||
*mt_entry = temp_mt_entry;
|
*mt_entry = temp_mt_entry;
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -233,8 +232,7 @@ cleanup_and_bail:
|
|||||||
|
|
||||||
free( temp_mt_entry );
|
free( temp_mt_entry );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -179,8 +179,7 @@ done:
|
|||||||
set_errno_and_return_minus_one( rc );
|
set_errno_and_return_minus_one( rc );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return iop - rtems_libio_iops;
|
return iop - rtems_libio_iops;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,27 +31,23 @@ int readlink(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !loc.ops->node_type ){
|
if ( !loc.ops->node_type ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
|
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( EINVAL );
|
set_errno_and_return_minus_one( EINVAL );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !loc.ops->readlink ){
|
if ( !loc.ops->readlink ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*loc.ops->readlink)( &loc, buf, bufsize );
|
result = (*loc.ops->readlink)( &loc, buf, bufsize );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,14 +40,12 @@ int rmdir(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( !loc.ops->node_type ){
|
if ( !loc.ops->node_type ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ){
|
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTDIR );
|
set_errno_and_return_minus_one( ENOTDIR );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,15 +54,13 @@ int rmdir(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( !loc.ops->rmnod ){
|
if ( !loc.ops->rmnod ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*loc.ops->rmnod)( &loc );
|
result = (*loc.ops->rmnod)( &loc );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,8 +59,7 @@ int _STAT_NAME(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !loc.handlers->fstat ){
|
if ( !loc.handlers->fstat ){
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,8 +72,7 @@ int _STAT_NAME(
|
|||||||
|
|
||||||
status = (*loc.handlers->fstat)( &loc, buf );
|
status = (*loc.handlers->fstat)( &loc, buf );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,7 @@ int symlink(
|
|||||||
|
|
||||||
result = (*loc.ops->symlink)( &loc, actualpath, name_start);
|
result = (*loc.ops->symlink)( &loc, actualpath, name_start);
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,27 +32,23 @@ int unlink(
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ( !loc.ops->node_type ) {
|
if ( !loc.ops->node_type ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (*loc.ops->node_type)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
|
if ( (*loc.ops->node_type)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( EISDIR );
|
set_errno_and_return_minus_one( EISDIR );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !loc.ops->unlink ) {
|
if ( !loc.ops->unlink ) {
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
set_errno_and_return_minus_one( ENOTSUP );
|
set_errno_and_return_minus_one( ENOTSUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (*loc.ops->unlink)( &loc );
|
result = (*loc.ops->unlink)( &loc );
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,8 +84,7 @@ int unmount(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( rtems_filesystem_current.mt_entry == temp_loc.mt_entry ) {
|
if ( rtems_filesystem_current.mt_entry == temp_loc.mt_entry ) {
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
set_errno_and_return_minus_one( EBUSY );
|
set_errno_and_return_minus_one( EBUSY );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,8 +95,7 @@ int unmount(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( rtems_libio_is_open_files_in_fs( temp_loc.mt_entry ) == 1 ) {
|
if ( rtems_libio_is_open_files_in_fs( temp_loc.mt_entry ) == 1 ) {
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
set_errno_and_return_minus_one( EBUSY );
|
set_errno_and_return_minus_one( EBUSY );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,8 +108,7 @@ int unmount(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ((temp_mt_entry.mt_point_node.ops->unmount )( temp_loc.mt_entry ) != 0 ) {
|
if ((temp_mt_entry.mt_point_node.ops->unmount )( temp_loc.mt_entry ) != 0 ) {
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,8 +117,7 @@ int unmount(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ((temp_mt_entry.mt_fs_root.ops->fsunmount_me )( temp_loc.mt_entry ) != 0){
|
if ((temp_mt_entry.mt_fs_root.ops->fsunmount_me )( temp_loc.mt_entry ) != 0){
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,8 +138,7 @@ int unmount(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
free( temp_loc.mt_entry );
|
free( temp_loc.mt_entry );
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
|||||||
@@ -34,8 +34,7 @@ int utime(
|
|||||||
|
|
||||||
result = (*temp_loc.ops->utime)( &temp_loc, times->actime, times->modtime );
|
result = (*temp_loc.ops->utime)( &temp_loc, times->actime, times->modtime );
|
||||||
|
|
||||||
if ( temp_loc.ops->freenod )
|
rtems_filesystem_freenode( &temp_loc );
|
||||||
(*temp_loc.ops->freenod)( &temp_loc );
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,8 +85,7 @@ rtems_status_code rtems_io_lookup_name(
|
|||||||
|
|
||||||
if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
|
if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
|
||||||
*device_info = 0;
|
*device_info = 0;
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
return RTEMS_UNSATISFIED;
|
return RTEMS_UNSATISFIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,8 +95,7 @@ rtems_status_code rtems_io_lookup_name(
|
|||||||
device.minor = the_jnode->info.device.minor;
|
device.minor = the_jnode->info.device.minor;
|
||||||
*device_info = &device;
|
*device_info = &device;
|
||||||
|
|
||||||
if ( loc.ops->freenod )
|
rtems_filesystem_freenode( &loc );
|
||||||
(*loc.ops->freenod)( &loc );
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
return RTEMS_SUCCESSFUL;
|
return RTEMS_SUCCESSFUL;
|
||||||
|
|||||||
Reference in New Issue
Block a user