int lvm2_run(void *handle, const char *cmdline)
{
    int argc, ret, oneoff = 0;
    char *args[MAX_ARGS], **argv, *cmdcopy = NULL;
    struct cmd_context *cmd;

    argv = args;

    if (!handle) {
        oneoff = 1;
        if (!(handle = lvm2_init())) {
            log_error("Handle initialisation failed.");
            return ECMD_FAILED;
        }
    }

    cmd = (struct cmd_context *) handle;

    cmd->argv = argv;

    if (!(cmdcopy = dm_strdup(cmdline))) {
        log_error("Cmdline copy failed.");
        ret = ECMD_FAILED;
        goto out;
    }

    if (lvm_split(cmdcopy, &argc, argv, MAX_ARGS) == MAX_ARGS) {
        log_error("Too many arguments.  Limit is %d.", MAX_ARGS);
        ret = EINVALID_CMD_LINE;
        goto out;
    }

    if (!argc) {
        log_error("No command supplied");
        ret = EINVALID_CMD_LINE;
        goto out;
    }

    /* FIXME Temporary - move to libdevmapper */
    ret = ECMD_PROCESSED;
    if (!strcmp(cmdline, "_memlock_inc"))
        memlock_inc_daemon(cmd);
    else if (!strcmp(cmdline, "_memlock_dec"))
        memlock_dec_daemon(cmd);
    else
        ret = lvm_run_command(cmd, argc, argv);

out:
    dm_free(cmdcopy);

    if (oneoff)
        lvm2_exit(handle);

    return ret;
}
Exemple #2
0
int lvm_shell(struct cmd_context *cmd, struct cmdline_context *cmdline)
{
	int argc, ret;
	char *input = NULL, *args[MAX_ARGS], **argv;

	rl_readline_name = "lvm";
	rl_attempted_completion_function = (CPPFunction *) _completion;

	_read_history(cmd);

	_cmdline = cmdline;

	_cmdline->interactive = 1;
	while (1) {
		free(input);
		input = readline("lvm> ");

		/* EOF */
		if (!input) {
			printf("\n");
			break;
		}

		/* empty line */
		if (!*input)
			continue;

		add_history(input);

		argv = args;

		if (lvm_split(input, &argc, argv, MAX_ARGS) == MAX_ARGS) {
			log_error("Too many arguments, sorry.");
			continue;
		}

		if (!argc)
			continue;

		if (!strcmp(argv[0], "lvm")) {
			argv++;
			argc--;
		}

		if (!argc)
			continue;

		if (!strcmp(argv[0], "quit") || !strcmp(argv[0], "exit")) {
			remove_history(history_length - 1);
			log_error("Exiting.");
			break;
		}

		ret = lvm_run_command(cmd, argc, argv);
		if (ret == ENO_SUCH_CMD)
			log_error("No such command '%s'.  Try 'help'.",
				  argv[0]);

                if ((ret != ECMD_PROCESSED) && !error_message_produced()) {
			log_debug(INTERNAL_ERROR "Failed command did not use log_error");
			log_error("Command failed with status code %d.", ret);
		}
		_write_history();
	}

	free(input);
	return 0;
}