unplugged-system/external/ltp/testcases/lib/tst_cgctl.c

88 lines
1.7 KiB
C

// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) 2022 Canonical Ltd.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#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;
}