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