static bool rtems_rfs_rtems_eval_perms (rtems_filesystem_eval_path_context_t *ctx, int eval_flags, rtems_rfs_inode_handle* inode) { return rtems_filesystem_eval_path_check_access( ctx, eval_flags, rtems_rfs_inode_get_mode (inode), rtems_rfs_inode_get_uid (inode), rtems_rfs_inode_get_gid (inode) ); }
static rtems_filesystem_eval_path_generic_status rtems_jffs2_eval_token( rtems_filesystem_eval_path_context_t *ctx, void *arg, const char *token, size_t tokenlen ) { rtems_filesystem_eval_path_generic_status status = RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_DONE; rtems_filesystem_location_info_t *currentloc = rtems_filesystem_eval_path_get_currentloc(ctx); struct _inode *dir_i = rtems_jffs2_get_inode_by_location(currentloc); bool access_ok = rtems_filesystem_eval_path_check_access( ctx, RTEMS_FS_PERMS_EXEC, dir_i->i_mode, dir_i->i_uid, dir_i->i_gid ); if (access_ok) { struct _inode *entry_i; if (rtems_filesystem_is_current_directory(token, tokenlen)) { entry_i = dir_i; ++entry_i->i_count; } else if (rtems_filesystem_is_parent_directory(token, tokenlen)) { entry_i = dir_i->i_parent; ++entry_i->i_count; } else { entry_i = jffs2_lookup(dir_i, token, (int) tokenlen); } if (IS_ERR(entry_i)) { rtems_filesystem_eval_path_error(ctx, PTR_ERR(entry_i)); } else if (entry_i != NULL) { bool terminal = !rtems_filesystem_eval_path_has_path(ctx); int eval_flags = rtems_filesystem_eval_path_get_flags(ctx); bool follow_sym_link = (eval_flags & RTEMS_FS_FOLLOW_SYM_LINK) != 0; rtems_filesystem_eval_path_clear_token(ctx); if (S_ISLNK(entry_i->i_mode) && (follow_sym_link || !terminal)) { struct jffs2_inode_info *f = JFFS2_INODE_INFO(entry_i); const char *target = f->target; rtems_filesystem_eval_path_recursive(ctx, target, strlen(target)); jffs2_iput(entry_i); } else { if (S_ISDIR(entry_i->i_mode) && entry_i->i_parent == NULL) { entry_i->i_parent = dir_i; ++dir_i->i_count; } jffs2_iput(dir_i); rtems_jffs2_set_location(currentloc, entry_i); if (rtems_filesystem_eval_path_has_path(ctx)) { status = RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_CONTINUE; } } } else { status = RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_NO_ENTRY; } } return status; }
static rtems_filesystem_eval_path_generic_status IMFS_eval_token( rtems_filesystem_eval_path_context_t *ctx, void *arg, const char *token, size_t tokenlen ) { rtems_filesystem_eval_path_generic_status status = RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_DONE; rtems_filesystem_location_info_t *currentloc = rtems_filesystem_eval_path_get_currentloc( ctx ); IMFS_jnode_t *dir = currentloc->node_access; bool access_ok = rtems_filesystem_eval_path_check_access( ctx, RTEMS_FS_PERMS_EXEC, dir->st_mode, dir->st_uid, dir->st_gid ); if ( access_ok ) { IMFS_jnode_t *entry = IMFS_search_in_directory( dir, token, tokenlen ); if ( entry != NULL ) { bool terminal = !rtems_filesystem_eval_path_has_path( ctx ); int eval_flags = rtems_filesystem_eval_path_get_flags( ctx ); bool follow_hard_link = (eval_flags & RTEMS_FS_FOLLOW_HARD_LINK) != 0; bool follow_sym_link = (eval_flags & RTEMS_FS_FOLLOW_SYM_LINK) != 0; IMFS_jnode_types_t type = IMFS_type( entry ); rtems_filesystem_eval_path_clear_token( ctx ); if ( type == IMFS_HARD_LINK && (follow_hard_link || !terminal)) { entry = entry->info.hard_link.link_node; } if ( type == IMFS_SYM_LINK && (follow_sym_link || !terminal)) { const char *target = entry->info.sym_link.name; rtems_filesystem_eval_path_recursive( ctx, target, strlen( target ) ); } else { rtems_filesystem_global_location_t **fs_root_ptr = IMFS_is_mount_point( entry, type ); if ( fs_root_ptr == NULL ) { --dir->reference_count; ++entry->reference_count; currentloc->node_access = entry; currentloc->node_access_2 = IMFS_generic_get_context_by_node( entry ); IMFS_Set_handlers( currentloc ); if ( !terminal ) { status = RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_CONTINUE; } } else { access_ok = rtems_filesystem_eval_path_check_access( ctx, RTEMS_FS_PERMS_EXEC, entry->st_mode, entry->st_uid, entry->st_gid ); if ( access_ok ) { rtems_filesystem_eval_path_restart( ctx, fs_root_ptr ); } } } } else { status = RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_NO_ENTRY; } } return status; }