aboutsummaryrefslogtreecommitdiffstats
path: root/tools/lib/api/fs/fs.c
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@kernel.org>2016-02-14 11:03:43 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2016-02-16 15:12:56 -0500
commit607bfbd7ffc60156ae0831c917497dc91a57dd8d (patch)
treeaa97aa79ad0d1b0cc2e488b15b96402417b0155e /tools/lib/api/fs/fs.c
parent975f14fa8f2996604f248552eee4403def34bf5e (diff)
tools lib api fs: Adopt filename__read_str from perf
We already moved similar functions in here, also it'll be useful for sysfs__read_str addition in following patch. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Cc: David Ahern <dsahern@gmail.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1455465826-8426-3-git-send-email-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/lib/api/fs/fs.c')
-rw-r--r--tools/lib/api/fs/fs.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/tools/lib/api/fs/fs.c b/tools/lib/api/fs/fs.c
index 459599d1b6c4..2cbf6773ca5d 100644
--- a/tools/lib/api/fs/fs.c
+++ b/tools/lib/api/fs/fs.c
@@ -13,6 +13,7 @@
13#include <sys/mount.h> 13#include <sys/mount.h>
14 14
15#include "fs.h" 15#include "fs.h"
16#include "debug-internal.h"
16 17
17#define _STR(x) #x 18#define _STR(x) #x
18#define STR(x) _STR(x) 19#define STR(x) _STR(x)
@@ -300,6 +301,56 @@ int filename__read_ull(const char *filename, unsigned long long *value)
300 return err; 301 return err;
301} 302}
302 303
304#define STRERR_BUFSIZE 128 /* For the buffer size of strerror_r */
305
306int filename__read_str(const char *filename, char **buf, size_t *sizep)
307{
308 size_t size = 0, alloc_size = 0;
309 void *bf = NULL, *nbf;
310 int fd, n, err = 0;
311 char sbuf[STRERR_BUFSIZE];
312
313 fd = open(filename, O_RDONLY);
314 if (fd < 0)
315 return -errno;
316
317 do {
318 if (size == alloc_size) {
319 alloc_size += BUFSIZ;
320 nbf = realloc(bf, alloc_size);
321 if (!nbf) {
322 err = -ENOMEM;
323 break;
324 }
325
326 bf = nbf;
327 }
328
329 n = read(fd, bf + size, alloc_size - size);
330 if (n < 0) {
331 if (size) {
332 pr_warning("read failed %d: %s\n", errno,
333 strerror_r(errno, sbuf, sizeof(sbuf)));
334 err = 0;
335 } else
336 err = -errno;
337
338 break;
339 }
340
341 size += n;
342 } while (n > 0);
343
344 if (!err) {
345 *sizep = size;
346 *buf = bf;
347 } else
348 free(bf);
349
350 close(fd);
351 return err;
352}
353
303int sysfs__read_ull(const char *entry, unsigned long long *value) 354int sysfs__read_ull(const char *entry, unsigned long long *value)
304{ 355{
305 char path[PATH_MAX]; 356 char path[PATH_MAX];