// SPDX-License-Identifier: GPL-2.0 /* * rv tool, the interface for the Linux kernel RV subsystem and home of * user-space controlled monitors. * * Copyright (C) 2022 Red Hat Inc, Daniel Bristot de Oliveira <bristot@kernel.org>
*/
/** * should_stop - check if the monitor should stop. * * Returns 1 if the monitor should stop, 0 otherwise.
*/ int should_stop(void)
{ return stop_session;
}
/* * rv_list - list all available monitors
*/ staticvoid rv_list(int argc, char **argv)
{ staticconstchar *const usage[] = { "", " usage: rv list [-h] [container]", "", " list all available monitors", "", " -h/--help: print this menu", "", " [container]: list only monitors in this container",
NULL,
}; int i, print_help = 0, retval = 0; char *container = NULL;
if (argc == 2) { if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) {
print_help = 1;
retval = 0;
} elseif (argv[1][0] == '-') { /* assume invalid option */
print_help = 1;
retval = 1;
} else
container = argv[1];
} elseif (argc > 2) { /* more than 2 is always usage */
print_help = 1;
retval = 1;
} if (print_help) {
fprintf(stderr, "rv version %s\n", VERSION); for (i = 0; usage[i]; i++)
fprintf(stderr, "%s\n", usage[i]); exit(retval);
}
ikm_list_monitors(container);
exit(0);
}
/* * rv_mon - try to run a monitor passed as argument
*/ staticvoid rv_mon(int argc, char **argv)
{ char *monitor_name; int i, run = 0;
staticconstchar *const usage[] = { "", " usage: rv mon [-h] monitor [monitor options]", "", " run a monitor", "", " -h/--help: print this menu", "", " monitor [monitor options]: the monitor, passing", " the arguments to the [monitor options]",
NULL,
};
/* requires at least one argument */ if (argc == 1) {
fprintf(stderr, "rv version %s\n", VERSION);
for (i = 0; usage[i]; i++)
fprintf(stderr, "%s\n", usage[i]); exit(1);
} elseif (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) {
fprintf(stderr, "rv version %s\n", VERSION);
for (i = 0; usage[i]; i++)
fprintf(stderr, "%s\n", usage[i]); exit(0);
}
monitor_name = argv[1]; /* * Call all possible monitor implementations, looking * for the [monitor].
*/
run += ikm_run_monitor(monitor_name, argc-1, &argv[1]);
if (!run)
err_msg("rv: monitor %s does not exist\n", monitor_name); exit(!run);
}
staticconstchar *const usage[] = { "", " usage: rv command [-h] [command_options]", "", " -h/--help: print this menu", "", " command: run one of the following command:", " list: list all available monitors", " mon: run a monitor", "", " [command options]: each command has its own set of options", " run rv command -h for further information",
NULL,
};
fprintf(stderr, "rv version %s: %s\n", VERSION, message);
for (i = 0; usage[i]; i++)
fprintf(stderr, "%s\n", usage[i]);
exit(exit_val);
}
/* * main - select which main sending the command * * main itself redirects the arguments to the sub-commands * to handle the options. * * subcommands should exit.
*/ int main(int argc, char **argv)
{ if (geteuid())
usage(1, "%s needs root permission", argv[0]);
if (argc <= 1)
usage(1, "%s requires a command", argv[0]);
if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))
usage(0, "help");
if (!strcmp(argv[1], "list"))
rv_list(--argc, &argv[1]);
if (!strcmp(argv[1], "mon")) { /* * monitor's main should monitor should_stop() function. * and exit.
*/
signal(SIGINT, stop_rv);
signal(SIGTERM, stop_rv);
rv_mon(argc - 1, &argv[1]);
}
/* invalid sub-command */
usage(1, "%s does not know the %s command, old version?", argv[0], argv[1]);
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.