Message ID | 20210107083250.16295-2-tz.stoyanov@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | New libtracefs APIs | expand |
On Thu, 7 Jan 2021 10:32:45 +0200 "Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com> 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@gmail.com> > --- > 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) > {
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) {
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@gmail.com> --- include/tracefs.h | 6 ++++- src/tracefs-instance.c | 59 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 3 deletions(-)