xref: /linux/tools/perf/util/tracepoint.c (revision 36ec807b627b4c0a0a382f0ae48eac7187d14b2b)
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 <stdlib.h>
8 #include <sys/param.h>
9 #include <unistd.h>
10 
11 #include <api/fs/tracing_path.h>
12 #include "fncache.h"
13 
14 int tp_event_has_id(const char *dir_path, struct dirent *evt_dir)
15 {
16 	char evt_path[MAXPATHLEN];
17 	int fd;
18 
19 	snprintf(evt_path, MAXPATHLEN, "%s/%s/id", dir_path, evt_dir->d_name);
20 	fd = open(evt_path, O_RDONLY);
21 	if (fd < 0)
22 		return -EINVAL;
23 	close(fd);
24 
25 	return 0;
26 }
27 
28 /*
29  * Check whether event is in <debugfs_mount_point>/tracing/events
30  */
31 bool is_valid_tracepoint(const char *event_string)
32 {
33 	char *dst, *path = malloc(strlen(event_string) + 4); /* Space for "/id\0". */
34 	bool have_file = false; /* Conservatively return false if memory allocation failed. */
35 	const char *src;
36 
37 	if (!path)
38 		return false;
39 
40 	/* Copy event_string replacing the ':' with '/'. */
41 	for (src = event_string, dst = path; *src; src++, dst++)
42 		*dst = (*src == ':') ? '/' : *src;
43 	/* Add "/id\0". */
44 	memcpy(dst, "/id", 4);
45 
46 	dst = get_events_file(path);
47 	if (dst)
48 		have_file = file_available(dst);
49 	free(dst);
50 	free(path);
51 	return have_file;
52 }
53