[PATCH i-g-t] lib/sysfs: Avoid using FILE* temporary for igt_sysfs_[v]printf

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Currently we wrap our fd inside a FILE* stream to make use of vfprintf,
but the man page leaves the question of errno and signal handling in
doubt. It is documented as returning a negative value and setting
ferror(), but we have been interpreting errno to handle signal
restarting. As that is in doubt, reduce it to a sprintf and reuse our
common interrupt handling write() that already returns -errno.

Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>
Cc: Katarzyna Dec <katarzyna.dec@xxxxxxxxx>
---
 lib/igt_sysfs.c | 37 ++++++++++++++++++++++++++-----------
 1 file changed, 26 insertions(+), 11 deletions(-)

diff --git a/lib/igt_sysfs.c b/lib/igt_sysfs.c
index 8efe889be..b39da4c2a 100644
--- a/lib/igt_sysfs.c
+++ b/lib/igt_sysfs.c
@@ -387,22 +387,37 @@ int igt_sysfs_scanf(int dir, const char *attr, const char *fmt, ...)
 
 int igt_sysfs_vprintf(int dir, const char *attr, const char *fmt, va_list ap)
 {
-	FILE *file;
-	int fd;
-	int ret = -1;
+	char stack[128], *buf = stack;
+	va_list tmp;
+	int ret, fd;
 
 	fd = openat(dir, attr, O_WRONLY);
 	if (fd < 0)
-		return -1;
+		return -errno;
 
-	file = fdopen(fd, "w");
-	if (file) {
-		do {
-			ret = vfprintf(file, fmt, ap);
-		} while (ret == -1 && errno == EINTR);
-		fclose(file);
+	va_copy(tmp, ap);
+	ret = vsnprintf(buf, sizeof(stack), fmt, tmp);
+	va_end(tmp);
+	if (ret < 0)
+		return -EINVAL;
+
+	if (ret > sizeof(stack)) {
+		int len = ret + 1;
+
+		buf = malloc(len);
+		if (!buf)
+			return -ENOMEM;
+
+		ret = vsnprintf(buf, ret, fmt, ap);
+		if (ret > len) {
+			free(buf);
+			return -EINVAL;
+		}
 	}
-	close(fd);
+
+	ret = writeN(fd, buf, ret);
+	if (buf != stack)
+		free(buf);
 
 	return ret;
 }
-- 
2.19.0.rc1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux