/* * pocli_pmemobj_tx_add_range -- pmemobj_tx_add_range() command */ static enum pocli_ret pocli_pmemobj_tx_add_range(struct pocli_ctx *ctx, struct pocli_args *args) { if (args->argc != 4) return POCLI_ERR_ARGS; PMEMoid *oidp; size_t offset = 0; size_t size = 0; enum pocli_ret ret; ret = pocli_args_obj(ctx, args, 1, &oidp); if (ret) return ret; if (oidp == NULL) return pocli_err(ctx, POCLI_ERR_ARGS, "cannot add NULL pointer\n"); ret = pocli_args_size(args, 2, &offset); if (ret) return ret; ret = pocli_args_size(args, 3, &size); if (ret) return ret; int r = pmemobj_tx_add_range(*oidp, offset, size); if (r != POCLI_RET_OK) return pocli_err(ctx, POCLI_ERR_ARGS, "pmemobj_tx_add_range() failed"); pocli_printf(ctx, "%s(%s, %zu, %zu): %d\n", args->argv[0], args->argv[1], offset, size, ret, r); return ret; }
/* * pocli_pmemobj_zalloc -- pmemobj_zalloc() command */ static enum pocli_ret pocli_pmemobj_zalloc(struct pocli_ctx *ctx, struct pocli_args *args) { if (args->argc != 4) return POCLI_ERR_ARGS; PMEMoid *oidp = NULL; unsigned type_num = 0; size_t size = 0; enum pocli_ret ret; ret = pocli_args_obj(ctx, args, 1, &oidp); if (ret) return ret; if (oidp == &ctx->root) return pocli_err(ctx, POCLI_ERR_ARGS, "cannot allocate to root object\n"); ret = pocli_args_type_num(args, 2, &type_num); if (ret) return ret; ret = pocli_args_size(args, 3, &size); if (ret) return ret; int r = pmemobj_zalloc(ctx->pop, oidp, size, type_num); pocli_printf(ctx, "%s(%s, %llu, %u): %d\n", args->argv[0], args->argv[1], size, type_num, r); return ret; }
/* * pocli_pmemobj_root -- pmemobj_root() command */ static enum pocli_ret pocli_pmemobj_root(struct pocli_ctx *ctx, struct pocli_args *args) { if (args->argc != 2) return POCLI_ERR_ARGS; size_t size = 0; enum pocli_ret ret; ret = pocli_args_size(args, 1, &size); if (ret) return ret; PMEMoid root = pmemobj_root(ctx->pop, size); if (OID_IS_NULL(root)) return pocli_err(ctx, POCLI_ERR_CMD, "pmemobj_root failed\n"); ctx->root = root; pocli_printf(ctx, "%s(%llu): off = 0x%jx uuid = 0x%jx\n", args->argv[0], size, ctx->root.off, ctx->root.pool_uuid_lo); return POCLI_RET_OK; }
/* * pocli_str_root_print -- print a string stored in the root object data */ static enum pocli_ret pocli_str_root_print(struct pocli_ctx *ctx, struct pocli_args *args) { if (args->argc != 3) return POCLI_ERR_ARGS; size_t offset = 0; enum pocli_ret ret = pocli_args_size(args, 1, &offset); if (ret) return ret; size_t len = 0; ret = pocli_args_number(args, 2, &len); if (ret) return ret; size_t root_size = pmemobj_root_size(ctx->pop); if (offset + len > root_size) return POCLI_ERR_ARGS; PMEMoid root = pmemobj_root(ctx->pop, root_size); assert(!OID_IS_NULL(root)); char *root_data = pmemobj_direct(root); char *buff = malloc(len + 1); memcpy(buff, root_data + offset, len); buff[len] = '\0'; printf("%s\n", buff); return ret; }
/* * pocli_str_root_copy -- copy a string into a root object data */ static enum pocli_ret pocli_str_root_copy(struct pocli_ctx *ctx, struct pocli_args *args) { if (args->argc != 3) return POCLI_ERR_ARGS; size_t offset = 0; enum pocli_ret ret = pocli_args_size(args, 1, &offset); if (ret) return ret; const char *str = args->argv[2]; if (str == NULL) return POCLI_ERR_ARGS; size_t len = strlen(str); size_t root_size = pmemobj_root_size(ctx->pop); if (offset + len > root_size) return POCLI_ERR_ARGS; PMEMoid root = pmemobj_root(ctx->pop, root_size); assert(!OID_IS_NULL(root)); char *root_data = pmemobj_direct(root); pmemobj_memcpy_persist(ctx->pop, root_data + offset, str, len); return ret; }
/* * pocli_pmemobj_do_tx_alloc -- pmemobj_tx_zalloc() and pmemobj_tx_zalloc() * commands common part */ static enum pocli_ret pocli_pmemobj_do_tx_alloc(struct pocli_ctx *ctx, struct pocli_args *args, PMEMoid (*fn_alloc)(size_t size, uint64_t type_num)) { if (args->argc != 4) return POCLI_ERR_ARGS; if (pmemobj_tx_stage() != TX_STAGE_WORK) return pocli_err(ctx, POCLI_ERR_ARGS, "cannot use in stage different than TX_STAGE_WORK\n"); PMEMoid *oidp = NULL; uint64_t type_num = 0; size_t size = 0; enum pocli_ret ret; ret = pocli_args_obj(ctx, args, 1, &oidp); if (ret) return ret; if (oidp == &ctx->root) return pocli_err(ctx, POCLI_ERR_ARGS, "cannot allocate to root object\n"); ret = pocli_args_size(args, 2, &size); if (ret) return ret; ret = pocli_args_number(args, 3, &type_num); if (ret) return ret; *oidp = fn_alloc(size, type_num); pocli_printf(ctx, "%s(%zu, %llu): off = 0x%llx uuid = 0x%llx\n", args->argv[0], size, type_num, oidp->off, oidp->pool_uuid_lo); return ret; }
/* * pocli_pmemobj_tx_add_range_direct -- pmemobj_tx_add_range_direct() command */ static enum pocli_ret pocli_pmemobj_tx_add_range_direct(struct pocli_ctx *ctx, struct pocli_args *args) { if (args->argc != 4) return POCLI_ERR_ARGS; PMEMoid *oidp; size_t off = 0; size_t size = 0; enum pocli_ret ret; ret = pocli_args_obj(ctx, args, 1, &oidp); if (ret) return ret; if (oidp == NULL) return pocli_err(ctx, POCLI_ERR_ARGS, "cannot add NULL pointer\n"); char *ptr = (char *)pmemobj_direct(*oidp); ret = pocli_args_size(args, 2, &off); if (ret) return ret; ret = pocli_args_size(args, 3, &size); if (ret) return ret; int r = pmemobj_tx_add_range_direct((void *)(ptr + off), size); if (r != POCLI_RET_OK) return pocli_err(ctx, POCLI_ERR_ARGS, "pmemobj_tx_add_range_direct() failed"); pocli_printf(ctx, "%s(%p, %zu, %zu): %d\n", args->argv[0], ptr, off, size, r); return ret; }
/* * pocli_pmemobj_do_realloc -- pmemobj_realloc and pmemobj_zrealloc() commands * common part */ static enum pocli_ret pocli_pmemobj_do_realloc(struct pocli_ctx *ctx, struct pocli_args *args, int (*fn_realloc)(PMEMobjpool *pop, PMEMoid *oid, size_t size, uint64_t type_num)) { if (args->argc != 4) return POCLI_ERR_ARGS; PMEMoid *oidp = NULL; uint64_t type_num = 0; size_t size = 0; enum pocli_ret ret; ret = pocli_args_obj(ctx, args, 1, &oidp); if (ret) return ret; if (oidp == NULL) return pocli_err(ctx, POCLI_ERR_ARGS, "cannot realloc with NULL oid pointer\n"); if (oidp == &ctx->root) return pocli_err(ctx, POCLI_ERR_ARGS, "cannot reallocate to root object\n"); ret = pocli_args_number(args, 2, &type_num); if (ret) return ret; ret = pocli_args_size(args, 3, &size); if (ret) return ret; int r = fn_realloc(ctx->pop, oidp, size, type_num); pocli_printf(ctx, "%s(%s, %zu, %llu): %d off = 0x%llx uuid = 0x%llx\n", args->argv[0], args->argv[1], size, type_num, r, oidp->off, oidp->pool_uuid_lo); return ret; }