diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-10-26 20:17:13 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-10-26 20:17:13 +0000 |
commit | 657e1bf66b9406cd4c18af1265443e9ebf006f39 (patch) | |
tree | c56bea6d27d9a6a19ac1f139839545db8b63347c /c/src/exec/libfs/src/imfs/imfs_fsunmount.c | |
parent | Patch from Gerwin Pfab <pb@schenk.isar.de> to leave dispatching (diff) | |
download | rtems-657e1bf66b9406cd4c18af1265443e9ebf006f39.tar.bz2 |
Added initial cut at miniIMFS which leaves out memfile and directory
readdir support. The next step is to add a mount table and configure
either the miniIMFS or the full IMFS at the application level.
Diffstat (limited to 'c/src/exec/libfs/src/imfs/imfs_fsunmount.c')
-rw-r--r-- | c/src/exec/libfs/src/imfs/imfs_fsunmount.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/c/src/exec/libfs/src/imfs/imfs_fsunmount.c b/c/src/exec/libfs/src/imfs/imfs_fsunmount.c new file mode 100644 index 0000000000..aa41b6c454 --- /dev/null +++ b/c/src/exec/libfs/src/imfs/imfs_fsunmount.c @@ -0,0 +1,90 @@ +/* + * IMFS Initialization + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * 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 <sys/types.h> /* for mkdir */ +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> + +#include <assert.h> + +#include "imfs.h" +#include "libio_.h" + +#if defined(IMFS_DEBUG) +#include <stdio.h> +#endif + +/* + * IMFS_fsunmount + */ + +#define jnode_get_control( jnode ) \ + (&jnode->info.directory.Entries) + +#define jnode_has_no_children( jnode ) \ + Chain_Is_empty( jnode_get_control( jnode ) ) + +#define jnode_has_children( jnode ) \ + ( ! jnode_has_no_children( jnode ) ) + +#define jnode_get_first_child( jnode ) \ + ((IMFS_jnode_t *)( Chain_Head( jnode_get_control( jnode ) )->next)) + + +int IMFS_fsunmount( + rtems_filesystem_mount_table_entry_t *temp_mt_entry +) +{ + IMFS_jnode_t *jnode; + IMFS_jnode_t *next; + rtems_filesystem_location_info_t loc; + int result = 0; + + /* + * Traverse tree that starts at the mt_fs_root and deallocate memory + * associated memory space + */ + + jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access; + + do { + next = jnode->Parent; + loc.node_access = (void *)jnode; + + if ( jnode->type != IMFS_DIRECTORY ) { + result = IMFS_unlink( &loc ); + if (result != 0) + return -1; + jnode = next; + } else if ( jnode_has_no_children( jnode ) ) { + result = IMFS_unlink( &loc ); + if (result != 0) + return -1; + jnode = next; + } + if ( jnode != NULL ) { + if ( jnode->type == IMFS_DIRECTORY ) { + if ( jnode_has_children( jnode ) ) + jnode = jnode_get_first_child( jnode ); + } + } + } while (jnode != NULL); + + return 0; +} + + + + |