|
@@ -6,6 +6,8 @@
|
|
|
#endif
|
|
|
#include <stdio.h>
|
|
|
#include <stdlib.h>
|
|
|
+#include <string.h>
|
|
|
+#include <errno.h>
|
|
|
#include <linux/kernel.h>
|
|
|
|
|
|
/*
|
|
@@ -433,3 +435,50 @@ int filename__read_int(const char *filename, int *value)
|
|
|
close(fd);
|
|
|
return err;
|
|
|
}
|
|
|
+
|
|
|
+int filename__read_str(const char *filename, char **buf, size_t *sizep)
|
|
|
+{
|
|
|
+ size_t size = 0, alloc_size = 0;
|
|
|
+ void *bf = NULL, *nbf;
|
|
|
+ int fd, n, err = 0;
|
|
|
+
|
|
|
+ fd = open(filename, O_RDONLY);
|
|
|
+ if (fd < 0)
|
|
|
+ return -errno;
|
|
|
+
|
|
|
+ do {
|
|
|
+ if (size == alloc_size) {
|
|
|
+ alloc_size += BUFSIZ;
|
|
|
+ nbf = realloc(bf, alloc_size);
|
|
|
+ if (!nbf) {
|
|
|
+ err = -ENOMEM;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ bf = nbf;
|
|
|
+ }
|
|
|
+
|
|
|
+ n = read(fd, bf + size, alloc_size - size);
|
|
|
+ if (n < 0) {
|
|
|
+ if (size) {
|
|
|
+ pr_warning("read failed %d: %s\n",
|
|
|
+ errno, strerror(errno));
|
|
|
+ err = 0;
|
|
|
+ } else
|
|
|
+ err = -errno;
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ size += n;
|
|
|
+ } while (n > 0);
|
|
|
+
|
|
|
+ if (!err) {
|
|
|
+ *sizep = size;
|
|
|
+ *buf = bf;
|
|
|
+ } else
|
|
|
+ free(bf);
|
|
|
+
|
|
|
+ close(fd);
|
|
|
+ return err;
|
|
|
+}
|