コード例 #1
0
ファイル: chdir.c プロジェクト: gedare/rtems
int rtems_filesystem_chdir( rtems_filesystem_location_info_t *loc )
{
  int rv = 0;
  rtems_filesystem_global_location_t *global_loc =
    rtems_filesystem_location_transform_to_global( loc );
  mode_t type = rtems_filesystem_location_type( &global_loc->location );

  if ( S_ISDIR( type ) ) {
    rtems_filesystem_global_location_assign(
      &rtems_filesystem_current,
      global_loc
    );
  } else {
    rtems_filesystem_location_error( &global_loc->location, ENOTDIR );
    rtems_filesystem_global_location_release( global_loc, true );
    rv = -1;
  }

  return rv;
}
コード例 #2
0
ファイル: chdir.c プロジェクト: AndroidMarv/rtems
int rtems_filesystem_chdir( rtems_filesystem_location_info_t *loc )
{
  int rv = 0;
  rtems_filesystem_global_location_t *global_loc =
    rtems_filesystem_location_transform_to_global( loc );
  rtems_filesystem_node_types_t type =
    rtems_filesystem_node_type( &global_loc->location );

  if ( type == RTEMS_FILESYSTEM_DIRECTORY ) {
    rtems_filesystem_global_location_assign(
      &rtems_filesystem_current,
      global_loc
    );
  } else {
    rtems_filesystem_location_error( &global_loc->location, ENOTDIR );
    rtems_filesystem_global_location_release( global_loc );
    rv = -1;
  }

  return rv;
}
コード例 #3
0
ファイル: mount.c プロジェクト: chch1028/rtems
static int register_subordinate_file_system(
  rtems_filesystem_mount_table_entry_t *mt_entry,
  const char *target
)
{
  int rv = 0;
  rtems_filesystem_eval_path_context_t ctx;
  int eval_flags = RTEMS_FS_PERMS_RWX
    | RTEMS_FS_FOLLOW_LINK;
  rtems_filesystem_location_info_t *currentloc =
    rtems_filesystem_eval_path_start( &ctx, target, eval_flags );

  if ( !rtems_filesystem_location_is_instance_root( currentloc ) ) {
    rtems_filesystem_location_info_t targetloc;
    rtems_filesystem_global_location_t *mt_point_node;

    rtems_filesystem_eval_path_extract_currentloc( &ctx, &targetloc );
    mt_point_node = rtems_filesystem_location_transform_to_global( &targetloc );
    mt_entry->mt_point_node = mt_point_node;
    rv = (*mt_point_node->location.mt_entry->ops->mount_h)( mt_entry );
    if ( rv == 0 ) {
      rtems_filesystem_mt_lock();
      rtems_chain_append_unprotected(
        &rtems_filesystem_mount_table,
        &mt_entry->mt_node
      );
      rtems_filesystem_mt_unlock();
    } else {
      rtems_filesystem_global_location_release( mt_point_node );
    }
  } else {
    rtems_filesystem_eval_path_error( &ctx, EBUSY );
    rv = -1;
  }

  rtems_filesystem_eval_path_cleanup( &ctx );

  return rv;
}
コード例 #4
0
ファイル: chroot.c プロジェクト: 0871087123/rtems
int chroot( const char *path )
{
  int rv = 0;
  rtems_status_code sc = RTEMS_SUCCESSFUL;
  rtems_filesystem_eval_path_context_t ctx;
  int eval_flags = RTEMS_FS_PERMS_EXEC
    | RTEMS_FS_FOLLOW_LINK;
  rtems_filesystem_location_info_t loc;
  rtems_filesystem_global_location_t *new_current_loc;

  /*
   * We use the global environment for path evaluation.  This makes it possible
   * to escape from a chroot environment referencing an unmounted file system.
   */
  rtems_filesystem_eval_path_start_with_root_and_current(
    &ctx,
    path,
    eval_flags,
    &rtems_global_user_env.root_directory,
    &rtems_global_user_env.current_directory
  );

  rtems_filesystem_eval_path_extract_currentloc( &ctx, &loc );
  new_current_loc = rtems_filesystem_location_transform_to_global( &loc );
  if ( !rtems_filesystem_global_location_is_null( new_current_loc ) ) {
    rtems_filesystem_global_location_t *new_root_loc =
      rtems_filesystem_global_location_obtain( &new_current_loc );
    rtems_filesystem_node_types_t type =
      (*new_root_loc->location.mt_entry->ops->node_type_h)(
        &new_root_loc->location
      );

    if ( type == RTEMS_FILESYSTEM_DIRECTORY ) {
      sc = rtems_libio_set_private_env();
      if (sc == RTEMS_SUCCESSFUL) {
        rtems_filesystem_global_location_assign(
          &rtems_filesystem_root,
          new_root_loc
        );
        rtems_filesystem_global_location_assign(
          &rtems_filesystem_current,
          new_current_loc
        );
      } else {
        if (sc != RTEMS_UNSATISFIED) {
          errno = ENOMEM;
        }
        rv = -1;
      }
    } else {
      rtems_filesystem_location_error( &new_root_loc->location, ENOTDIR );
      rv = -1;
    }

    if ( rv != 0 ) {
      rtems_filesystem_global_location_release( new_root_loc );
    }
  } else {
    rv = -1;
  }

  rtems_filesystem_eval_path_cleanup( &ctx );

  if ( rv != 0 ) {
    rtems_filesystem_global_location_release( new_current_loc );
  }

  return rv;
}