|  | // 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; | 
|  | } |