These new APIs can be used to read integer from frtace file and to open ftrace file: tracefs_instance_file_read_int(); tracefs_instance_file_open(); Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@xxxxxxxxx> --- include/tracefs.h | 6 ++++- src/tracefs-instance.c | 59 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/include/tracefs.h b/include/tracefs.h index 3d70aca..460fa4c 100644 --- a/include/tracefs.h +++ b/include/tracefs.h @@ -29,7 +29,11 @@ char *tracefs_instance_get_dir(struct tracefs_instance *instance); int tracefs_instance_file_write(struct tracefs_instance *instance, const char *file, const char *str); char *tracefs_instance_file_read(struct tracefs_instance *instance, - char *file, int *psize); + const char *file, int *psize); +int tracefs_instance_file_read_int(struct tracefs_instance *instance, + const char *file, long long *res); +int tracefs_instance_file_open(struct tracefs_instance *instance, + const char *file, int mode); int tracefs_instances_walk(int (*callback)(const char *, void *), void *context); bool tracefs_instance_exists(const char *name); diff --git a/src/tracefs-instance.c b/src/tracefs-instance.c index bf3de7c..27b9e99 100644 --- a/src/tracefs-instance.c +++ b/src/tracefs-instance.c @@ -14,7 +14,7 @@ #include <sys/stat.h> #include <fcntl.h> #include <dirent.h> -#include <linux/limits.h> +#include <limits.h> #include "tracefs.h" #include "tracefs-local.h" @@ -282,7 +282,7 @@ int tracefs_instance_file_write(struct tracefs_instance *instance, * The return string must be freed by free() */ char *tracefs_instance_file_read(struct tracefs_instance *instance, - char *file, int *psize) + const char *file, int *psize) { char *buf = NULL; int size = 0; @@ -301,6 +301,61 @@ char *tracefs_instance_file_read(struct tracefs_instance *instance, return buf; } +/** + * tracefs_instance_file_read_int - Read an integer from a trace file. + * @instance: ftrace instance, can be NULL for the top instance + * @file: name of the file + * @res: The integer from the file. + * + * Returns 0 if the reading is successful and the result is stored in res, -1 + * in case of an error. + */ +int tracefs_instance_file_read_int(struct tracefs_instance *instance, + const char *file, long long *res) +{ + long long ret = LLONG_MAX; + int size = 0; + char *str; + + str = tracefs_instance_file_read(instance, file, &size); + if (size && str) + ret = strtoll(str, NULL, 0); + free(str); + + if (LLONG_MIN == ret || LLONG_MAX == ret) + return -1; + *res = ret; + return 0; +} + +/** + * tracefs_instance_file_open - Open a trace file for reading and writing + * @instance: ftrace instance, can be NULL for the top instance + * @file: name of the file + * @mode: file open flags, -1 for default O_RDWR + * + * Returns -1 in case of an error, or a valid file descriptor otherwise. + * The returned FD must be closed with close() + */ +int tracefs_instance_file_open(struct tracefs_instance *instance, + const char *file, int mode) +{ + int flags = O_RDWR; + int fd = -1; + char *path; + + path = tracefs_instance_get_file(instance, file); + if (!path) + return -1; + + if (mode >= 0) + flags = mode; + fd = open(path, flags); + tracefs_put_tracing_file(path); + + return fd; +} + static bool check_file_exists(struct tracefs_instance *instance, char *name, bool dir) { -- 2.29.2