1 // SPDX-License-Identifier: GPL-2.0 2 #include "tracepoint.h" 3 4 #include <errno.h> 5 #include <fcntl.h> 6 #include <stdio.h> 7 #include <sys/param.h> 8 #include <unistd.h> 9 10 #include <api/fs/tracing_path.h> 11 12 int tp_event_has_id(const char *dir_path, struct dirent *evt_dir) 13 { 14 char evt_path[MAXPATHLEN]; 15 int fd; 16 17 snprintf(evt_path, MAXPATHLEN, "%s/%s/id", dir_path, evt_dir->d_name); 18 fd = open(evt_path, O_RDONLY); 19 if (fd < 0) 20 return -EINVAL; 21 close(fd); 22 23 return 0; 24 } 25 26 /* 27 * Check whether event is in <debugfs_mount_point>/tracing/events 28 */ 29 int is_valid_tracepoint(const char *event_string) 30 { 31 DIR *sys_dir, *evt_dir; 32 struct dirent *sys_dirent, *evt_dirent; 33 char evt_path[MAXPATHLEN]; 34 char *dir_path; 35 36 sys_dir = tracing_events__opendir(); 37 if (!sys_dir) 38 return 0; 39 40 for_each_subsystem(sys_dir, sys_dirent) { 41 dir_path = get_events_file(sys_dirent->d_name); 42 if (!dir_path) 43 continue; 44 evt_dir = opendir(dir_path); 45 if (!evt_dir) 46 goto next; 47 48 for_each_event(dir_path, evt_dir, evt_dirent) { 49 snprintf(evt_path, MAXPATHLEN, "%s:%s", 50 sys_dirent->d_name, evt_dirent->d_name); 51 if (!strcmp(evt_path, event_string)) { 52 closedir(evt_dir); 53 put_events_file(dir_path); 54 closedir(sys_dir); 55 return 1; 56 } 57 } 58 closedir(evt_dir); 59 next: 60 put_events_file(dir_path); 61 } 62 closedir(sys_dir); 63 return 0; 64 } 65