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