Merge tag 'nfsd-6.0-1' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux
[linux-2.6-microblaze.git] / tools / perf / util / tracepoint.c
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                                 closedir(sys_dir);
54                                 return 1;
55                         }
56                 }
57                 closedir(evt_dir);
58 next:
59                 put_events_file(dir_path);
60         }
61         closedir(sys_dir);
62         return 0;
63 }