summaryrefslogtreecommitdiffstats
path: root/c/src/lib
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1999-10-12 19:10:46 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1999-10-12 19:10:46 +0000
commitdd0f32614ceb0dd72f406d8434acdecc5ccff616 (patch)
tree3620ac014837a178fc91eac4b54b7b2e5ceb5c41 /c/src/lib
parentFixed spacing. (diff)
downloadrtems-dd0f32614ceb0dd72f406d8434acdecc5ccff616.tar.bz2
Added rtems_filesystem_freenode() macro and added calls at appropriate
places to make sure memory allocated for filesystem specifif nodes gets freed.
Diffstat (limited to 'c/src/lib')
-rw-r--r--c/src/lib/include/rtems/libio_.h12
-rw-r--r--c/src/lib/libc/chdir.c9
-rw-r--r--c/src/lib/libc/chmod.c6
-rw-r--r--c/src/lib/libc/chown.c6
-rw-r--r--c/src/lib/libc/ioman.c6
-rw-r--r--c/src/lib/libc/libio_.h12
-rw-r--r--c/src/lib/libc/link.c27
-rw-r--r--c/src/lib/libc/mknod.c7
-rw-r--r--c/src/lib/libc/mount.c6
-rw-r--r--c/src/lib/libc/open.c5
-rw-r--r--c/src/lib/libc/readlink.c12
-rw-r--r--c/src/lib/libc/rmdir.c12
-rw-r--r--c/src/lib/libc/stat.c6
-rw-r--r--c/src/lib/libc/symlink.c3
-rw-r--r--c/src/lib/libc/unlink.c12
-rw-r--r--c/src/lib/libc/unmount.c17
-rw-r--r--c/src/lib/libc/utime.c3
17 files changed, 69 insertions, 92 deletions
diff --git a/c/src/lib/include/rtems/libio_.h b/c/src/lib/include/rtems/libio_.h
index 029bb437dd..8c186278fa 100644
--- a/c/src/lib/include/rtems/libio_.h
+++ b/c/src/lib/include/rtems/libio_.h
@@ -161,6 +161,18 @@ extern mode_t rtems_filesystem_umask;
} 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
*
* Macro to determine if a character is a path name separator.
diff --git a/c/src/lib/libc/chdir.c b/c/src/lib/libc/chdir.c
index 4b3c313f7b..38f64d8c56 100644
--- a/c/src/lib/libc/chdir.c
+++ b/c/src/lib/libc/chdir.c
@@ -39,19 +39,16 @@ int chdir(
*/
if ( !loc.ops->node_type ) {
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
set_errno_and_return_minus_one( ENOTSUP );
}
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
set_errno_and_return_minus_one( ENOTDIR );
}
- if ( rtems_filesystem_current.ops->freenod )
- (*rtems_filesystem_current.ops->freenod)( &rtems_filesystem_current );
+ rtems_filesystem_freenode( &rtems_filesystem_current );
rtems_filesystem_current = loc;
diff --git a/c/src/lib/libc/chmod.c b/c/src/lib/libc/chmod.c
index acfc142ad0..70ef5a3dff 100644
--- a/c/src/lib/libc/chmod.c
+++ b/c/src/lib/libc/chmod.c
@@ -35,15 +35,13 @@ int chmod(
return -1;
if ( !loc.handlers->fchmod ){
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
set_errno_and_return_minus_one( ENOTSUP );
}
result = (*loc.handlers->fchmod)( &loc, mode );
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
return result;
}
diff --git a/c/src/lib/libc/chown.c b/c/src/lib/libc/chown.c
index cc579b40a5..8496cc684b 100644
--- a/c/src/lib/libc/chown.c
+++ b/c/src/lib/libc/chown.c
@@ -33,15 +33,13 @@ int chown(
return -1;
if ( !loc.ops->chown ) {
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
set_errno_and_return_minus_one( ENOTSUP );
}
result = (*loc.ops->chown)( &loc, owner, group );
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
return result;
}
diff --git a/c/src/lib/libc/ioman.c b/c/src/lib/libc/ioman.c
index ca8734913c..41106fa1c7 100644
--- a/c/src/lib/libc/ioman.c
+++ b/c/src/lib/libc/ioman.c
@@ -85,8 +85,7 @@ rtems_status_code rtems_io_lookup_name(
if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
*device_info = 0;
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
return RTEMS_UNSATISFIED;
}
@@ -96,8 +95,7 @@ rtems_status_code rtems_io_lookup_name(
device.minor = the_jnode->info.device.minor;
*device_info = &device;
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
#endif
return RTEMS_SUCCESSFUL;
diff --git a/c/src/lib/libc/libio_.h b/c/src/lib/libc/libio_.h
index 029bb437dd..8c186278fa 100644
--- a/c/src/lib/libc/libio_.h
+++ b/c/src/lib/libc/libio_.h
@@ -161,6 +161,18 @@ extern mode_t rtems_filesystem_umask;
} 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
*
* Macro to determine if a character is a path name separator.
diff --git a/c/src/lib/libc/link.c b/c/src/lib/libc/link.c
index 38ce78d87a..c12398746d 100644
--- a/c/src/lib/libc/link.c
+++ b/c/src/lib/libc/link.c
@@ -44,8 +44,7 @@ int link(
rtems_filesystem_get_start_loc( new, &i, &parent_loc );
result = (*parent_loc.ops->evalformake)( &new[i], &parent_loc, &name_start );
if ( result != 0 ) {
- if ( existing_loc.ops->freenod )
- (*existing_loc.ops->freenod)( &parent_loc );
+ rtems_filesystem_freenode( &parent_loc );
set_errno_and_return_minus_one( result );
}
@@ -55,33 +54,21 @@ int link(
*/
if ( parent_loc.mt_entry != existing_loc.mt_entry ) {
- if ( existing_loc.ops->freenod )
- (*existing_loc.ops->freenod)( &existing_loc );
-
- if ( parent_loc.ops->freenod )
- (*parent_loc.ops->freenod)( &parent_loc );
-
+ rtems_filesystem_freenode( &existing_loc );
+ rtems_filesystem_freenode( &parent_loc );
set_errno_and_return_minus_one( EXDEV );
}
if ( !parent_loc.ops->link ) {
-
- if ( existing_loc.ops->freenod )
- (*existing_loc.ops->freenod)( &existing_loc );
-
- if ( parent_loc.ops->freenod )
- (*parent_loc.ops->freenod)( &parent_loc );
-
+ rtems_filesystem_freenode( &existing_loc );
+ rtems_filesystem_freenode( &parent_loc );
set_errno_and_return_minus_one( ENOTSUP );
}
result = (*parent_loc.ops->link)( &existing_loc, &parent_loc, name_start );
- if ( existing_loc.ops->freenod )
- (*existing_loc.ops->freenod)( &existing_loc );
-
- if ( parent_loc.ops->freenod )
- (*parent_loc.ops->freenod)( &parent_loc );
+ rtems_filesystem_freenode( &existing_loc );
+ rtems_filesystem_freenode( &parent_loc );
return result;
}
diff --git a/c/src/lib/libc/mknod.c b/c/src/lib/libc/mknod.c
index 48444f8549..bd434e4efa 100644
--- a/c/src/lib/libc/mknod.c
+++ b/c/src/lib/libc/mknod.c
@@ -53,14 +53,13 @@ int mknod(
return -1;
if ( !temp_loc.ops->mknod ) {
- if ( temp_loc.ops->freenod )
- (*temp_loc.ops->freenod)( &temp_loc );
+ rtems_filesystem_freenode( &temp_loc );
set_errno_and_return_minus_one( ENOTSUP );
}
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;
}
diff --git a/c/src/lib/libc/mount.c b/c/src/lib/libc/mount.c
index 7feca2e468..f7e4b4b783 100644
--- a/c/src/lib/libc/mount.c
+++ b/c/src/lib/libc/mount.c
@@ -224,8 +224,7 @@ int mount(
*mt_entry = temp_mt_entry;
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
return 0;
@@ -233,8 +232,7 @@ cleanup_and_bail:
free( temp_mt_entry );
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
return -1;
}
diff --git a/c/src/lib/libc/open.c b/c/src/lib/libc/open.c
index 1bd6ea5ec6..7f220d1ce7 100644
--- a/c/src/lib/libc/open.c
+++ b/c/src/lib/libc/open.c
@@ -179,9 +179,8 @@ done:
set_errno_and_return_minus_one( rc );
}
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
-
+ rtems_filesystem_freenode( &loc );
+
return iop - rtems_libio_iops;
}
diff --git a/c/src/lib/libc/readlink.c b/c/src/lib/libc/readlink.c
index 2f7423f69e..6ca7488543 100644
--- a/c/src/lib/libc/readlink.c
+++ b/c/src/lib/libc/readlink.c
@@ -31,27 +31,23 @@ int readlink(
return -1;
if ( !loc.ops->node_type ){
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
set_errno_and_return_minus_one( ENOTSUP );
}
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
set_errno_and_return_minus_one( EINVAL );
}
if ( !loc.ops->readlink ){
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
set_errno_and_return_minus_one( ENOTSUP );
}
result = (*loc.ops->readlink)( &loc, buf, bufsize );
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
return result;
}
diff --git a/c/src/lib/libc/rmdir.c b/c/src/lib/libc/rmdir.c
index 9e951adb18..806176beaf 100644
--- a/c/src/lib/libc/rmdir.c
+++ b/c/src/lib/libc/rmdir.c
@@ -40,14 +40,12 @@ int rmdir(
*/
if ( !loc.ops->node_type ){
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
set_errno_and_return_minus_one( ENOTSUP );
}
if ( (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ){
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
set_errno_and_return_minus_one( ENOTDIR );
}
@@ -56,15 +54,13 @@ int rmdir(
*/
if ( !loc.ops->rmnod ){
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
set_errno_and_return_minus_one( ENOTSUP );
}
result = (*loc.ops->rmnod)( &loc );
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
return result;
}
diff --git a/c/src/lib/libc/stat.c b/c/src/lib/libc/stat.c
index ff1d0db618..8872b779d7 100644
--- a/c/src/lib/libc/stat.c
+++ b/c/src/lib/libc/stat.c
@@ -59,8 +59,7 @@ int _STAT_NAME(
return -1;
if ( !loc.handlers->fstat ){
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
set_errno_and_return_minus_one( ENOTSUP );
}
@@ -73,8 +72,7 @@ int _STAT_NAME(
status = (*loc.handlers->fstat)( &loc, buf );
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
return status;
}
diff --git a/c/src/lib/libc/symlink.c b/c/src/lib/libc/symlink.c
index b5c6013b07..ceb1025239 100644
--- a/c/src/lib/libc/symlink.c
+++ b/c/src/lib/libc/symlink.c
@@ -31,8 +31,7 @@ int symlink(
result = (*loc.ops->symlink)( &loc, actualpath, name_start);
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
return result;
}
diff --git a/c/src/lib/libc/unlink.c b/c/src/lib/libc/unlink.c
index b4374e53c9..9e9f2c0e08 100644
--- a/c/src/lib/libc/unlink.c
+++ b/c/src/lib/libc/unlink.c
@@ -32,27 +32,23 @@ int unlink(
return -1;
if ( !loc.ops->node_type ) {
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
set_errno_and_return_minus_one( ENOTSUP );
}
if ( (*loc.ops->node_type)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
set_errno_and_return_minus_one( EISDIR );
}
if ( !loc.ops->unlink ) {
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
set_errno_and_return_minus_one( ENOTSUP );
}
result = (*loc.ops->unlink)( &loc );
- if ( loc.ops->freenod )
- (*loc.ops->freenod)( &loc );
+ rtems_filesystem_freenode( &loc );
return result;
}
diff --git a/c/src/lib/libc/unmount.c b/c/src/lib/libc/unmount.c
index b32d9b0caa..50827fc804 100644
--- a/c/src/lib/libc/unmount.c
+++ b/c/src/lib/libc/unmount.c
@@ -84,8 +84,7 @@ int unmount(
*/
if ( rtems_filesystem_current.mt_entry == temp_loc.mt_entry ) {
- if ( temp_loc.ops->freenod )
- (*temp_loc.ops->freenod)( &temp_loc );
+ rtems_filesystem_freenode( &temp_loc );
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 ( temp_loc.ops->freenod )
- (*temp_loc.ops->freenod)( &temp_loc );
+ rtems_filesystem_freenode( &temp_loc );
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_loc.ops->freenod )
- (*temp_loc.ops->freenod)( &temp_loc );
+ rtems_filesystem_freenode( &temp_loc );
return -1;
}
@@ -120,9 +117,8 @@ int unmount(
*/
if ((temp_mt_entry.mt_fs_root.ops->fsunmount_me )( temp_loc.mt_entry ) != 0){
- if ( temp_loc.ops->freenod )
- (*temp_loc.ops->freenod)( &temp_loc );
- return -1;
+ rtems_filesystem_freenode( &temp_loc );
+ return -1;
}
/*
@@ -142,8 +138,7 @@ int unmount(
*/
free( temp_loc.mt_entry );
- if ( temp_loc.ops->freenod )
- (*temp_loc.ops->freenod)( &temp_loc );
+ rtems_filesystem_freenode( &temp_loc );
return result;
diff --git a/c/src/lib/libc/utime.c b/c/src/lib/libc/utime.c
index ccc92d044e..b7987c87b4 100644
--- a/c/src/lib/libc/utime.c
+++ b/c/src/lib/libc/utime.c
@@ -34,8 +34,7 @@ int utime(
result = (*temp_loc.ops->utime)( &temp_loc, times->actime, times->modtime );
- if ( temp_loc.ops->freenod )
- (*temp_loc.ops->freenod)( &temp_loc );
+ rtems_filesystem_freenode( &temp_loc );
return result;
}