Skip to content

Simplify "cpuinfo" subcommand check #2633

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: criu-dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion criu/cr-service.c
Original file line number Diff line number Diff line change
Expand Up @@ -1261,7 +1261,7 @@ static int handle_cpuinfo(int sk, CriuReq *msg)
if (pid == 0) {
int ret = 1;

opts.mode = CR_CPUINFO;
opts.mode = (msg->type == CRIU_REQ_TYPE__CPUINFO_DUMP) ? CR_CPUINFO_DUMP : CR_CPUINFO_CHECK;
if (setup_opts_from_req(sk, msg->opts))
goto cout;

Expand Down
57 changes: 29 additions & 28 deletions criu/crtools.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,19 +54,17 @@ void flush_early_log_to_stderr(void)
flush_early_log_buffer(STDERR_FILENO);
}

static int image_dir_mode(char *argv[], int optind)
static int image_dir_mode(void)
{
switch (opts.mode) {
case CR_DUMP:
/* fallthrough */
case CR_CPUINFO_DUMP:
/* fallthrough */
case CR_PRE_DUMP:
return O_DUMP;
case CR_RESTORE:
return O_RSTR;
case CR_CPUINFO:
if (!strcmp(argv[optind + 1], "dump"))
return O_DUMP;
/* fallthrough */
default:
return -1;
}
Expand All @@ -76,7 +74,7 @@ static int image_dir_mode(char *argv[], int optind)
return -1;
}

static int parse_criu_mode(char *mode)
static int parse_criu_mode(char *mode, char *subcommand)
{
if (!strcmp(mode, "dump"))
opts.mode = CR_DUMP;
Expand All @@ -96,8 +94,12 @@ static int parse_criu_mode(char *mode)
opts.mode = CR_SWRK;
else if (!strcmp(mode, "dedup"))
opts.mode = CR_DEDUP;
else if (!strcmp(mode, "cpuinfo"))
opts.mode = CR_CPUINFO;
else if (!strcmp(mode, "cpuinfo") && subcommand == NULL)
return -2;
else if (!strcmp(mode, "cpuinfo") && !strcmp(subcommand, "dump"))
opts.mode = CR_CPUINFO_DUMP;
else if (!strcmp(mode, "cpuinfo") && !strcmp(subcommand, "check"))
opts.mode = CR_CPUINFO_CHECK;
else if (!strcmp(mode, "exec"))
opts.mode = CR_EXEC_DEPRECATED;
else if (!strcmp(mode, "show"))
Expand All @@ -115,6 +117,7 @@ int main(int argc, char *argv[], char *envp[])
bool has_exec_cmd = false;
bool has_sub_command;
int state = PARSING_GLOBAL_CONF;
char *subcommand;

BUILD_BUG_ON(CTL_32 != SYSCTL_TYPE__CTL_32);
BUILD_BUG_ON(__CTL_STR != SYSCTL_TYPE__CTL_STR);
Expand Down Expand Up @@ -165,9 +168,15 @@ int main(int argc, char *argv[], char *envp[])
return 1;
}

if (parse_criu_mode(argv[optind])) {
has_sub_command = (argc - optind) > 1;
subcommand = has_sub_command ? argv[optind + 1] : NULL;
ret = parse_criu_mode(argv[optind], subcommand);
if (ret == -1) {
pr_err("unknown command: %s\n", argv[optind]);
goto usage;
} else if (ret == -2) {
pr_err("cpuinfo requires an action: dump or check\n");
goto usage;
}
/*
* util_init initializes criu_run_id and compel_run_id so that sockets
Expand Down Expand Up @@ -223,25 +232,20 @@ int main(int argc, char *argv[], char *envp[])
return 1;
memcpy(opts.exec_cmd, &argv[optind + 1], (argc - optind - 1) * sizeof(char *));
opts.exec_cmd[argc - optind - 1] = NULL;
} else {
} else if (opts.mode != CR_CPUINFO_DUMP && opts.mode != CR_CPUINFO_CHECK && has_sub_command) {
/* No subcommands except for cpuinfo and restore --exec-cmd */
if (opts.mode != CR_CPUINFO && has_sub_command) {
pr_err("excessive parameter%s for command %s\n", (argc - optind) > 2 ? "s" : "", argv[optind]);
goto usage;
} else if (opts.mode == CR_CPUINFO && !has_sub_command) {
pr_err("cpuinfo requires an action: dump or check\n");
goto usage;
}
pr_err("excessive parameter%s for command %s\n", (argc - optind) > 2 ? "s" : "", argv[optind]);
goto usage;
}

if (opts.stream && image_dir_mode(argv, optind) == -1) {
if (opts.stream && image_dir_mode() == -1) {
pr_err("--stream cannot be used with the %s command\n", argv[optind]);
goto usage;
}

/* We must not open imgs dir, if service is called */
if (opts.mode != CR_SERVICE) {
ret = open_image_dir(opts.imgs_dir, image_dir_mode(argv, optind));
ret = open_image_dir(opts.imgs_dir, image_dir_mode());
if (ret < 0) {
pr_err("Couldn't open image dir %s\n", opts.imgs_dir);
return 1;
Expand Down Expand Up @@ -335,15 +339,12 @@ int main(int argc, char *argv[], char *envp[])
if (opts.mode == CR_DEDUP)
return cr_dedup() != 0;

if (opts.mode == CR_CPUINFO) {
if (!argv[optind + 1]) {
pr_err("cpuinfo requires an action: dump or check\n");
goto usage;
}
if (!strcmp(argv[optind + 1], "dump"))
return cpuinfo_dump();
else if (!strcmp(argv[optind + 1], "check"))
return cpuinfo_check();
if (opts.mode == CR_CPUINFO_DUMP) {
return cpuinfo_dump();
}

if (opts.mode == CR_CPUINFO_CHECK) {
return cpuinfo_check();
}

if (opts.mode == CR_EXEC_DEPRECATED) {
Expand Down
3 changes: 2 additions & 1 deletion criu/include/cr_options.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,8 @@ enum criu_mode {
CR_SERVICE,
CR_SWRK,
CR_DEDUP,
CR_CPUINFO,
CR_CPUINFO_DUMP,
CR_CPUINFO_CHECK,
CR_EXEC_DEPRECATED,
CR_SHOW_DEPRECATED,
};
Expand Down
Loading