root/tools/tracing/rtla/src/rtla.c
// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (C) 2021 Red Hat Inc, Daniel Bristot de Oliveira <bristot@kernel.org>
 */

#include <getopt.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#include "osnoise.h"
#include "timerlat.h"

/*
 * rtla_usage - print rtla usage
 */
static void rtla_usage(int err)
{
        int i;

        static const char *msg[] = {
                "",
                "rtla version " VERSION,
                "",
                "  usage: rtla COMMAND ...",
                "",
                "  commands:",
                "     osnoise  - gives information about the operating system noise (osnoise)",
                "     hwnoise  - gives information about hardware-related noise",
                "     timerlat - measures the timer irq and thread latency",
                "",
                NULL,
        };

        for (i = 0; msg[i]; i++)
                fprintf(stderr, "%s\n", msg[i]);
        exit(err);
}

/*
 * run_command - try to run a rtla tool command
 *
 * It returns 0 if it fails. The tool's main will generally not
 * return as they should call exit().
 */
int run_command(int argc, char **argv, int start_position)
{
        if (strcmp(argv[start_position], "osnoise") == 0) {
                osnoise_main(argc-start_position, &argv[start_position]);
                goto ran;
        } else if (strcmp(argv[start_position], "hwnoise") == 0) {
                hwnoise_main(argc-start_position, &argv[start_position]);
                goto ran;
        } else if (strcmp(argv[start_position], "timerlat") == 0) {
                timerlat_main(argc-start_position, &argv[start_position]);
                goto ran;
        }

        return 0;
ran:
        return 1;
}

int main(int argc, char *argv[])
{
        int retval;

        /* is it an alias? */
        retval = run_command(argc, argv, 0);
        if (retval)
                exit(0);

        if (argc < 2)
                goto usage;

        if (strcmp(argv[1], "-h") == 0) {
                rtla_usage(0);
        } else if (strcmp(argv[1], "--help") == 0) {
                rtla_usage(0);
        }

        retval = run_command(argc, argv, 1);
        if (retval)
                exit(0);

usage:
        rtla_usage(1);
        exit(1);
}