162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2021 Red Hat Inc, Daniel Bristot de Oliveira <bristot@kernel.org>
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#include <sys/types.h>
662306a36Sopenharmony_ci#include <sys/stat.h>
762306a36Sopenharmony_ci#include <pthread.h>
862306a36Sopenharmony_ci#include <stdlib.h>
962306a36Sopenharmony_ci#include <string.h>
1062306a36Sopenharmony_ci#include <unistd.h>
1162306a36Sopenharmony_ci#include <errno.h>
1262306a36Sopenharmony_ci#include <fcntl.h>
1362306a36Sopenharmony_ci#include <stdio.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include "timerlat.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistatic void timerlat_usage(int err)
1862306a36Sopenharmony_ci{
1962306a36Sopenharmony_ci	int i;
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	static const char * const msg[] = {
2262306a36Sopenharmony_ci		"",
2362306a36Sopenharmony_ci		"timerlat version " VERSION,
2462306a36Sopenharmony_ci		"",
2562306a36Sopenharmony_ci		"  usage: [rtla] timerlat [MODE] ...",
2662306a36Sopenharmony_ci		"",
2762306a36Sopenharmony_ci		"  modes:",
2862306a36Sopenharmony_ci		"     top   - prints the summary from timerlat tracer",
2962306a36Sopenharmony_ci		"     hist  - prints a histogram of timer latencies",
3062306a36Sopenharmony_ci		"",
3162306a36Sopenharmony_ci		"if no MODE is given, the top mode is called, passing the arguments",
3262306a36Sopenharmony_ci		NULL,
3362306a36Sopenharmony_ci	};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	for (i = 0; msg[i]; i++)
3662306a36Sopenharmony_ci		fprintf(stderr, "%s\n", msg[i]);
3762306a36Sopenharmony_ci	exit(err);
3862306a36Sopenharmony_ci}
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ciint timerlat_main(int argc, char *argv[])
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci	if (argc == 0)
4362306a36Sopenharmony_ci		goto usage;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	/*
4662306a36Sopenharmony_ci	 * if timerlat was called without any argument, run the
4762306a36Sopenharmony_ci	 * default cmdline.
4862306a36Sopenharmony_ci	 */
4962306a36Sopenharmony_ci	if (argc == 1) {
5062306a36Sopenharmony_ci		timerlat_top_main(argc, argv);
5162306a36Sopenharmony_ci		exit(0);
5262306a36Sopenharmony_ci	}
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	if ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0)) {
5562306a36Sopenharmony_ci		timerlat_usage(0);
5662306a36Sopenharmony_ci	} else if (strncmp(argv[1], "-", 1) == 0) {
5762306a36Sopenharmony_ci		/* the user skipped the tool, call the default one */
5862306a36Sopenharmony_ci		timerlat_top_main(argc, argv);
5962306a36Sopenharmony_ci		exit(0);
6062306a36Sopenharmony_ci	} else if (strcmp(argv[1], "top") == 0) {
6162306a36Sopenharmony_ci		timerlat_top_main(argc-1, &argv[1]);
6262306a36Sopenharmony_ci		exit(0);
6362306a36Sopenharmony_ci	} else if (strcmp(argv[1], "hist") == 0) {
6462306a36Sopenharmony_ci		timerlat_hist_main(argc-1, &argv[1]);
6562306a36Sopenharmony_ci		exit(0);
6662306a36Sopenharmony_ci	}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciusage:
6962306a36Sopenharmony_ci	timerlat_usage(1);
7062306a36Sopenharmony_ci	exit(1);
7162306a36Sopenharmony_ci}
72