| // SPDX-License-Identifier: GPL-2.0 | |
| #include "tracepoint.h" | |
| #include <errno.h> | |
| #include <fcntl.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <sys/param.h> | |
| #include <unistd.h> | |
| #include <api/fs/tracing_path.h> | |
| #include "fncache.h" | |
| int tp_event_has_id(const char *dir_path, struct dirent *evt_dir) | |
| { | |
| char evt_path[MAXPATHLEN]; | |
| int fd; | |
| snprintf(evt_path, MAXPATHLEN, "%s/%s/id", dir_path, evt_dir->d_name); | |
| fd = open(evt_path, O_RDONLY); | |
| if (fd < 0) | |
| return -EINVAL; | |
| close(fd); | |
| return 0; | |
| } | |
| /* | |
| * Check whether event is in <debugfs_mount_point>/tracing/events | |
| */ | |
| bool is_valid_tracepoint(const char *event_string) | |
| { | |
| char *dst, *path = malloc(strlen(event_string) + 4); /* Space for "/id\0". */ | |
| bool have_file = false; /* Conservatively return false if memory allocation failed. */ | |
| const char *src; | |
| if (!path) | |
| return false; | |
| /* Copy event_string replacing the ':' with '/'. */ | |
| for (src = event_string, dst = path; *src; src++, dst++) | |
| *dst = (*src == ':') ? '/' : *src; | |
| /* Add "/id\0". */ | |
| memcpy(dst, "/id", 4); | |
| dst = get_events_file(path); | |
| if (dst) | |
| have_file = file_available(dst); | |
| free(dst); | |
| free(path); | |
| return have_file; | |
| } |