On Thu, 7 Jan 2021 10:32:45 +0200 "Tzvetomir Stoyanov (VMware)" <tz.stoyanov@xxxxxxxxx> wrote: > 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) The above is more of a clean up and should be a separate patch. > { > 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) Let's call this "tracefs_instance_file_number()" as "int" may be confusing as it really returns "long long". > +{ > + 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; As it is possible that the file could read LLONG_MIN or LLONG_MAX, we should follow the man page and use errno to detect an error: if (!size || !str) return -1; errno = 0; ret = strtoll(str, NULL, 0); if (errno) return -1; -- Steve > + *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) > {