162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include "tracepoint.h"
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <errno.h>
562306a36Sopenharmony_ci#include <fcntl.h>
662306a36Sopenharmony_ci#include <stdio.h>
762306a36Sopenharmony_ci#include <sys/param.h>
862306a36Sopenharmony_ci#include <unistd.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <api/fs/tracing_path.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciint tp_event_has_id(const char *dir_path, struct dirent *evt_dir)
1362306a36Sopenharmony_ci{
1462306a36Sopenharmony_ci	char evt_path[MAXPATHLEN];
1562306a36Sopenharmony_ci	int fd;
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	snprintf(evt_path, MAXPATHLEN, "%s/%s/id", dir_path, evt_dir->d_name);
1862306a36Sopenharmony_ci	fd = open(evt_path, O_RDONLY);
1962306a36Sopenharmony_ci	if (fd < 0)
2062306a36Sopenharmony_ci		return -EINVAL;
2162306a36Sopenharmony_ci	close(fd);
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	return 0;
2462306a36Sopenharmony_ci}
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci/*
2762306a36Sopenharmony_ci * Check whether event is in <debugfs_mount_point>/tracing/events
2862306a36Sopenharmony_ci */
2962306a36Sopenharmony_ciint is_valid_tracepoint(const char *event_string)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	DIR *sys_dir, *evt_dir;
3262306a36Sopenharmony_ci	struct dirent *sys_dirent, *evt_dirent;
3362306a36Sopenharmony_ci	char evt_path[MAXPATHLEN];
3462306a36Sopenharmony_ci	char *dir_path;
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	sys_dir = tracing_events__opendir();
3762306a36Sopenharmony_ci	if (!sys_dir)
3862306a36Sopenharmony_ci		return 0;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	for_each_subsystem(sys_dir, sys_dirent) {
4162306a36Sopenharmony_ci		dir_path = get_events_file(sys_dirent->d_name);
4262306a36Sopenharmony_ci		if (!dir_path)
4362306a36Sopenharmony_ci			continue;
4462306a36Sopenharmony_ci		evt_dir = opendir(dir_path);
4562306a36Sopenharmony_ci		if (!evt_dir)
4662306a36Sopenharmony_ci			goto next;
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci		for_each_event(dir_path, evt_dir, evt_dirent) {
4962306a36Sopenharmony_ci			snprintf(evt_path, MAXPATHLEN, "%s:%s",
5062306a36Sopenharmony_ci				 sys_dirent->d_name, evt_dirent->d_name);
5162306a36Sopenharmony_ci			if (!strcmp(evt_path, event_string)) {
5262306a36Sopenharmony_ci				closedir(evt_dir);
5362306a36Sopenharmony_ci				put_events_file(dir_path);
5462306a36Sopenharmony_ci				closedir(sys_dir);
5562306a36Sopenharmony_ci				return 1;
5662306a36Sopenharmony_ci			}
5762306a36Sopenharmony_ci		}
5862306a36Sopenharmony_ci		closedir(evt_dir);
5962306a36Sopenharmony_cinext:
6062306a36Sopenharmony_ci		put_events_file(dir_path);
6162306a36Sopenharmony_ci	}
6262306a36Sopenharmony_ci	closedir(sys_dir);
6362306a36Sopenharmony_ci	return 0;
6462306a36Sopenharmony_ci}
65