// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) 2022 Canonical Ltd. */ #include #include #include #include #include #include "tst_cgroup.h" static void cgctl_usage(void) { fprintf(stderr, "Usage: tst_cgctl require [controller] [test_pid]\n\tcleanup [config (output of tst_cg_print_config)]\n\tprint\n\thelp\n"); } static int cgctl_require(const char *ctrl, int test_pid) { struct tst_cg_opts opts; memset(&opts, 0, sizeof(opts)); opts.test_pid = test_pid; tst_cg_require(ctrl, &opts); tst_cg_print_config(); return 0; } static int cgctl_cleanup(const char *const config) { tst_cg_scan(); tst_cg_load_config(config); tst_cg_cleanup(); return 0; } static int cgctl_print(void) { tst_cg_scan(); tst_cg_print_config(); return 0; } int main(int argc, char *argv[]) { int test_pid; const char *cmd_name = argv[1]; if (argc < 2) goto error; if (!strcmp(cmd_name, "require")) { if (argc != 4) goto arg_num_error; test_pid = atoi(argv[3]); if (!test_pid) { fprintf(stderr, "tst_cgctl: Invalid test_pid '%s' given\n", argv[3]); goto error; } return cgctl_require(argv[2], test_pid); } else if (!strcmp(cmd_name, "cleanup")) { if (argc != 3) goto arg_num_error; return cgctl_cleanup(argv[2]); } else if (!strcmp(cmd_name, "print")) { return cgctl_print(); } else if (!strcmp(cmd_name, "help")) { cgctl_usage(); return 0; } fprintf(stderr, "tst_cgctl: Unknown command '%s' given\n", cmd_name); goto error; arg_num_error: fprintf(stderr, "tst_cgctl: Invalid number of arguments given for command '%s'\n", cmd_name); error: cgctl_usage(); return 1; }