1*49cdfc7eSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0-or-later
2*49cdfc7eSAndroid Build Coastguard Worker /*
3*49cdfc7eSAndroid Build Coastguard Worker * Copyright (c) 2022 Canonical Ltd.
4*49cdfc7eSAndroid Build Coastguard Worker */
5*49cdfc7eSAndroid Build Coastguard Worker
6*49cdfc7eSAndroid Build Coastguard Worker #include <stdio.h>
7*49cdfc7eSAndroid Build Coastguard Worker #include <string.h>
8*49cdfc7eSAndroid Build Coastguard Worker #include <stdlib.h>
9*49cdfc7eSAndroid Build Coastguard Worker #include <stdint.h>
10*49cdfc7eSAndroid Build Coastguard Worker #include <unistd.h>
11*49cdfc7eSAndroid Build Coastguard Worker #include "tst_cgroup.h"
12*49cdfc7eSAndroid Build Coastguard Worker
cgctl_usage(void)13*49cdfc7eSAndroid Build Coastguard Worker static void cgctl_usage(void)
14*49cdfc7eSAndroid Build Coastguard Worker {
15*49cdfc7eSAndroid Build Coastguard Worker fprintf(stderr, "Usage: tst_cgctl require [controller] [test_pid]\n\tcleanup [config (output of tst_cg_print_config)]\n\tprint\n\thelp\n");
16*49cdfc7eSAndroid Build Coastguard Worker }
17*49cdfc7eSAndroid Build Coastguard Worker
cgctl_require(const char * ctrl,int test_pid)18*49cdfc7eSAndroid Build Coastguard Worker static int cgctl_require(const char *ctrl, int test_pid)
19*49cdfc7eSAndroid Build Coastguard Worker {
20*49cdfc7eSAndroid Build Coastguard Worker struct tst_cg_opts opts;
21*49cdfc7eSAndroid Build Coastguard Worker
22*49cdfc7eSAndroid Build Coastguard Worker memset(&opts, 0, sizeof(opts));
23*49cdfc7eSAndroid Build Coastguard Worker opts.test_pid = test_pid;
24*49cdfc7eSAndroid Build Coastguard Worker
25*49cdfc7eSAndroid Build Coastguard Worker tst_cg_require(ctrl, &opts);
26*49cdfc7eSAndroid Build Coastguard Worker tst_cg_print_config();
27*49cdfc7eSAndroid Build Coastguard Worker
28*49cdfc7eSAndroid Build Coastguard Worker return 0;
29*49cdfc7eSAndroid Build Coastguard Worker }
30*49cdfc7eSAndroid Build Coastguard Worker
cgctl_cleanup(const char * const config)31*49cdfc7eSAndroid Build Coastguard Worker static int cgctl_cleanup(const char *const config)
32*49cdfc7eSAndroid Build Coastguard Worker {
33*49cdfc7eSAndroid Build Coastguard Worker tst_cg_scan();
34*49cdfc7eSAndroid Build Coastguard Worker tst_cg_load_config(config);
35*49cdfc7eSAndroid Build Coastguard Worker tst_cg_cleanup();
36*49cdfc7eSAndroid Build Coastguard Worker
37*49cdfc7eSAndroid Build Coastguard Worker return 0;
38*49cdfc7eSAndroid Build Coastguard Worker }
39*49cdfc7eSAndroid Build Coastguard Worker
cgctl_print(void)40*49cdfc7eSAndroid Build Coastguard Worker static int cgctl_print(void)
41*49cdfc7eSAndroid Build Coastguard Worker {
42*49cdfc7eSAndroid Build Coastguard Worker tst_cg_scan();
43*49cdfc7eSAndroid Build Coastguard Worker tst_cg_print_config();
44*49cdfc7eSAndroid Build Coastguard Worker
45*49cdfc7eSAndroid Build Coastguard Worker return 0;
46*49cdfc7eSAndroid Build Coastguard Worker }
47*49cdfc7eSAndroid Build Coastguard Worker
main(int argc,char * argv[])48*49cdfc7eSAndroid Build Coastguard Worker int main(int argc, char *argv[])
49*49cdfc7eSAndroid Build Coastguard Worker {
50*49cdfc7eSAndroid Build Coastguard Worker int test_pid;
51*49cdfc7eSAndroid Build Coastguard Worker const char *cmd_name = argv[1];
52*49cdfc7eSAndroid Build Coastguard Worker
53*49cdfc7eSAndroid Build Coastguard Worker if (argc < 2)
54*49cdfc7eSAndroid Build Coastguard Worker goto error;
55*49cdfc7eSAndroid Build Coastguard Worker
56*49cdfc7eSAndroid Build Coastguard Worker if (!strcmp(cmd_name, "require")) {
57*49cdfc7eSAndroid Build Coastguard Worker if (argc != 4)
58*49cdfc7eSAndroid Build Coastguard Worker goto arg_num_error;
59*49cdfc7eSAndroid Build Coastguard Worker test_pid = atoi(argv[3]);
60*49cdfc7eSAndroid Build Coastguard Worker if (!test_pid) {
61*49cdfc7eSAndroid Build Coastguard Worker fprintf(stderr, "tst_cgctl: Invalid test_pid '%s' given\n",
62*49cdfc7eSAndroid Build Coastguard Worker argv[3]);
63*49cdfc7eSAndroid Build Coastguard Worker goto error;
64*49cdfc7eSAndroid Build Coastguard Worker }
65*49cdfc7eSAndroid Build Coastguard Worker return cgctl_require(argv[2], test_pid);
66*49cdfc7eSAndroid Build Coastguard Worker } else if (!strcmp(cmd_name, "cleanup")) {
67*49cdfc7eSAndroid Build Coastguard Worker if (argc != 3)
68*49cdfc7eSAndroid Build Coastguard Worker goto arg_num_error;
69*49cdfc7eSAndroid Build Coastguard Worker return cgctl_cleanup(argv[2]);
70*49cdfc7eSAndroid Build Coastguard Worker } else if (!strcmp(cmd_name, "print")) {
71*49cdfc7eSAndroid Build Coastguard Worker return cgctl_print();
72*49cdfc7eSAndroid Build Coastguard Worker } else if (!strcmp(cmd_name, "help")) {
73*49cdfc7eSAndroid Build Coastguard Worker cgctl_usage();
74*49cdfc7eSAndroid Build Coastguard Worker return 0;
75*49cdfc7eSAndroid Build Coastguard Worker }
76*49cdfc7eSAndroid Build Coastguard Worker
77*49cdfc7eSAndroid Build Coastguard Worker fprintf(stderr, "tst_cgctl: Unknown command '%s' given\n", cmd_name);
78*49cdfc7eSAndroid Build Coastguard Worker goto error;
79*49cdfc7eSAndroid Build Coastguard Worker
80*49cdfc7eSAndroid Build Coastguard Worker arg_num_error:
81*49cdfc7eSAndroid Build Coastguard Worker fprintf(stderr,
82*49cdfc7eSAndroid Build Coastguard Worker "tst_cgctl: Invalid number of arguments given for command '%s'\n",
83*49cdfc7eSAndroid Build Coastguard Worker cmd_name);
84*49cdfc7eSAndroid Build Coastguard Worker error:
85*49cdfc7eSAndroid Build Coastguard Worker cgctl_usage();
86*49cdfc7eSAndroid Build Coastguard Worker return 1;
87*49cdfc7eSAndroid Build Coastguard Worker }
88