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
tp_event_has_id(const char * dir_path,struct dirent * evt_dir)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 */
is_valid_tracepoint(const char * event_string)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