Пример #1
0
static IMFS_jnode_t *i2c_dev_node_destroy(IMFS_jnode_t *node)
{
  i2c_dev *dev;

  dev = IMFS_generic_get_context_by_node(node);
  (*dev->destroy)(dev);

  return node;
}
Пример #2
0
static IMFS_jnode_t *node_destroy(IMFS_jnode_t *node)
{
  test_state *state = IMFS_generic_get_context_by_node(node);

  rtems_test_assert(*state == TEST_REMOVED);
  *state = TEST_DESTROYED;

  return node;
}
Пример #3
0
static IMFS_jnode_t *node_remove(
  IMFS_jnode_t *node,
  const IMFS_jnode_t *root_node
)
{
  test_state *state = IMFS_generic_get_context_by_node(node);

  rtems_test_assert(*state == TEST_FSTAT_UNLINK);
  *state = TEST_REMOVED;

  return node;
}
Пример #4
0
static IMFS_jnode_t *node_initialize(
  IMFS_jnode_t *node,
  const IMFS_types_union *info
)
{
  test_state *state = NULL;

  node = IMFS_node_initialize_generic(node, info);
  state = IMFS_generic_get_context_by_node(node);

  rtems_test_assert(*state == TEST_NEW);
  *state = TEST_INITIALIZED;

  return node;
}
Пример #5
0
static IMFS_jnode_t *rtems_blkdev_imfs_initialize(
  IMFS_jnode_t *node,
  const IMFS_types_union *info
)
{
  rtems_blkdev_imfs_context *ctx;
  rtems_disk_device *dd;

  node = IMFS_node_initialize_generic(node, info);

  ctx = IMFS_generic_get_context_by_node(node);
  dd = &ctx->dd;
  dd->dev = IMFS_generic_get_device_identifier_by_node(node);

  return node;
}
Пример #6
0
static IMFS_jnode_t *rtems_blkdev_imfs_destroy(IMFS_jnode_t *node)
{
  rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_node(node);
  rtems_disk_device *dd = &ctx->dd;

  rtems_bdbuf_syncdev(dd);
  rtems_bdbuf_purge_dev(dd);

  if (ctx->fd >= 0) {
    close(ctx->fd);
  } else {
    (*dd->ioctl)(dd, RTEMS_BLKIO_DELETED, NULL);
  }

  free(ctx);

  return node;
}
Пример #7
0
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;
}