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 | |