| // SPDX-License-Identifier: GPL-2.0 |
| #include "tracepoint.h" |
| |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <stdio.h> |
| #include <sys/param.h> |
| #include <unistd.h> |
| |
| #include <api/fs/tracing_path.h> |
| |
| int tp_event_has_id(const char *dir_path, struct dirent *evt_dir) |
| { |
| char evt_path[MAXPATHLEN]; |
| int fd; |
| |
| snprintf(evt_path, MAXPATHLEN, "%s/%s/id", dir_path, evt_dir->d_name); |
| fd = open(evt_path, O_RDONLY); |
| if (fd < 0) |
| return -EINVAL; |
| close(fd); |
| |
| return 0; |
| } |
| |
| /* |
| * Check whether event is in <debugfs_mount_point>/tracing/events |
| */ |
| int is_valid_tracepoint(const char *event_string) |
| { |
| DIR *sys_dir, *evt_dir; |
| struct dirent *sys_dirent, *evt_dirent; |
| char evt_path[MAXPATHLEN]; |
| char *dir_path; |
| |
| sys_dir = tracing_events__opendir(); |
| if (!sys_dir) |
| return 0; |
| |
| for_each_subsystem(sys_dir, sys_dirent) { |
| dir_path = get_events_file(sys_dirent->d_name); |
| if (!dir_path) |
| continue; |
| evt_dir = opendir(dir_path); |
| if (!evt_dir) |
| goto next; |
| |
| for_each_event(dir_path, evt_dir, evt_dirent) { |
| snprintf(evt_path, MAXPATHLEN, "%s:%s", |
| sys_dirent->d_name, evt_dirent->d_name); |
| if (!strcmp(evt_path, event_string)) { |
| closedir(evt_dir); |
| put_events_file(dir_path); |
| closedir(sys_dir); |
| return 1; |
| } |
| } |
| closedir(evt_dir); |
| next: |
| put_events_file(dir_path); |
| } |
| closedir(sys_dir); |
| return 0; |
| } |