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