From e3abb2001b9bb9faa2b7217d615daf60c94f42a7 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 22 Jul 2016 18:03:30 +0100 Subject: lib/sysfs: Provide scanf/printf wrappers In order to avoid having to build and parse whole strings, use the FILE stream interface. Signed-off-by: Chris Wilson --- lib/igt_sysfs.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 9 deletions(-) (limited to 'lib/igt_sysfs.c') diff --git a/lib/igt_sysfs.c b/lib/igt_sysfs.c index 633aeab0..f20a7540 100644 --- a/lib/igt_sysfs.c +++ b/lib/igt_sysfs.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -219,22 +220,67 @@ out: return buf; } +int igt_sysfs_scanf(int dir, const char *attr, const char *fmt, ...) +{ + FILE *file; + int fd; + int ret = -1; + + fd = openat(dir, attr, O_RDONLY); + if (fd < 0) + return -1; + + file = fdopen(fd, "r"); + if (file) { + va_list ap; + + va_start(ap, fmt); + ret = vfscanf(file, fmt, ap); + va_end(ap); + + fclose(file); + } + close(fd); + + return ret; +} + +int igt_sysfs_printf(int dir, const char *attr, const char *fmt, ...) +{ + FILE *file; + int fd; + int ret = -1; + + fd = openat(dir, attr, O_WRONLY); + if (fd < 0) + return -1; + + file = fdopen(fd, "w"); + if (file) { + va_list ap; + + va_start(ap, fmt); + ret = vfprintf(file, fmt, ap); + va_end(ap); + + fclose(file); + } + close(fd); + + return ret; +} + bool igt_sysfs_get_boolean(int dir, const char *attr) { - char *str; - bool result; + int result; - str = igt_sysfs_get(dir, attr); - result = str && atoi(str) > 0; - free(str); + if (igt_sysfs_scanf(dir, attr, "%d", &result) != 1) + return false; return result; } bool igt_sysfs_set_boolean(int dir, const char *attr, bool value) { - char buf[8]; - - sprintf(buf, "%d", value); - return igt_sysfs_set(dir, attr, buf); + return igt_sysfs_printf(dir, attr, "%d", value) == 1; } -- cgit v1.2.3