IMFS_jnode_t *IMFS_create_node_with_control( const rtems_filesystem_location_info_t *parentloc, const IMFS_node_control *node_control, const char *name, size_t namelen, mode_t mode, const IMFS_types_union *info ) { IMFS_fs_info_t *fs_info = parentloc->mt_entry->fs_info; IMFS_jnode_t *node = IMFS_allocate_node( fs_info, node_control, name, namelen, mode, info ); if ( node != NULL ) { IMFS_jnode_t *parent = parentloc->node_access; /* * This node MUST have a parent, so put it in that directory list. */ IMFS_assert( parent != NULL ); IMFS_add_to_directory( parent, node ); } return node; }
int IMFS_rename( const rtems_filesystem_location_info_t *oldparentloc, const rtems_filesystem_location_info_t *oldloc, const rtems_filesystem_location_info_t *newparentloc, const char *name, size_t namelen ) { int rv = 0; IMFS_jnode_t *node = oldloc->node_access; IMFS_jnode_t *new_parent = newparentloc->node_access; /* * FIXME: Due to insufficient checks we can create inaccessible nodes with * this operation. */ if ( node->Parent != NULL ) { if ( namelen < IMFS_NAME_MAX ) { memcpy( node->name, name, namelen ); node->name [namelen] = '\0'; IMFS_remove_from_directory( node ); IMFS_add_to_directory( new_parent, node ); IMFS_update_ctime( node ); } else { errno = ENAMETOOLONG; rv = -1; } } else { errno = EINVAL; rv = -1; } return rv; }