linux/tools/perf/util/tracepoint.c

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