/* * pocli_process -- process input commands */ int pocli_process(struct pocli *pcli) { while (1) { pocli_prompt(pcli); if (!fgets(pcli->inbuf, (int)pcli->inbuf_len, pcli->in)) return 0; char *nl = strchr(pcli->inbuf, '\n'); if (!nl) return 1; *nl = '\0'; char *hash = strchr(pcli->inbuf, '#'); if (hash) { if (pcli->opts.enable_comments) *hash = '\0'; else return 1; } if (pcli->inbuf[0] == 0 || pcli->inbuf[0] == '\n') { if (pcli->opts.enable_empty_cmds) continue; else return 1; } if (pcli->opts.echo_mode) pocli_printf(&pcli->ctx, "%s\n", pcli->inbuf); char *argstr = strchr(pcli->inbuf, ' '); if (argstr) { *argstr = '\0'; argstr++; } char *cmds = pcli->inbuf; const struct pocli_cmd *cmd = pocli_get_cmd(pcli, cmds); if (!cmd) { pocli_err(&pcli->ctx, 0, "unknown command -- '%s'\n", cmds); if (pcli->opts.exit_on_error) return 1; else continue; } if (!argstr) argstr = cmds + strlen(pcli->inbuf) + 1; struct pocli_args *args = pocli_args_alloc(pcli->inbuf, argstr, POCLI_CMD_DELIM); if (!args) return 1; enum pocli_ret ret = cmd->func(&pcli->ctx, args); free(args); if (ret != POCLI_RET_OK) return ret; } }
/* * pocli_args_obj_root -- parse object's descriptor from root object */ static enum pocli_ret pocli_args_obj_root(struct pocli_ctx *ctx, char *in, PMEMoid **oidp) { char *input = strdup(in); if (!input) return POCLI_ERR_MALLOC; if (!oidp) return POCLI_ERR_PARS; struct pocli_args *args = pocli_args_alloc(NULL, input, "."); if (!args) return POCLI_ERR_PARS; enum pocli_ret ret = POCLI_RET_OK; if (strcmp(args->argv[0], "r") != 0) { ret = POCLI_ERR_PARS; goto out; } PMEMoid *oid = &ctx->root; size_t size = pmemobj_root_size(ctx->pop); for (int i = 1; i < args->argc; i++) { unsigned ind; char c; int n = sscanf(args->argv[i], "%u%c", &ind, &c); if (n != 1) { ret = POCLI_ERR_PARS; goto out; } size_t max_ind = size / sizeof (PMEMoid); if (!max_ind || ind >= max_ind) { ret = POCLI_ERR_PARS; goto out; } PMEMoid *oids = pmemobj_direct(*oid); oid = &oids[ind]; size = pmemobj_alloc_usable_size(*oid); } *oidp = oid; out: free(input); free(args); return ret; }