Skip to content

Commit 607bfbd

Browse files
olsajiriacmel
authored andcommitted
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>
1 parent 975f14f commit 607bfbd

5 files changed

Lines changed: 54 additions & 49 deletions

File tree

tools/lib/api/fs/fs.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <sys/mount.h>
1414

1515
#include "fs.h"
16+
#include "debug-internal.h"
1617

1718
#define _STR(x) #x
1819
#define STR(x) _STR(x)
@@ -300,6 +301,56 @@ int filename__read_ull(const char *filename, unsigned long long *value)
300301
return err;
301302
}
302303

304+
#define STRERR_BUFSIZE 128 /* For the buffer size of strerror_r */
305+
306+
int 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+
303354
int sysfs__read_ull(const char *entry, unsigned long long *value)
304355
{
305356
char path[PATH_MAX];

tools/lib/api/fs/fs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define __API_FS__
33

44
#include <stdbool.h>
5+
#include <unistd.h>
56

67
/*
78
* On most systems <limits.h> would have given us this, but not on some systems
@@ -26,6 +27,7 @@ FS(tracefs)
2627

2728
int filename__read_int(const char *filename, int *value);
2829
int filename__read_ull(const char *filename, unsigned long long *value);
30+
int filename__read_str(const char *filename, char **buf, size_t *sizep);
2931

3032
int sysctl__read_int(const char *sysctl, int *value);
3133
int sysfs__read_int(const char *entry, int *value);

tools/perf/util/trace-event.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <linux/err.h>
1111
#include <traceevent/event-parse.h>
1212
#include <api/fs/tracing_path.h>
13+
#include <api/fs/fs.h>
1314
#include "trace-event.h"
1415
#include "machine.h"
1516
#include "util.h"

tools/perf/util/util.c

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -507,54 +507,6 @@ int parse_callchain_record(const char *arg, struct callchain_param *param)
507507
return ret;
508508
}
509509

510-
int filename__read_str(const char *filename, char **buf, size_t *sizep)
511-
{
512-
size_t size = 0, alloc_size = 0;
513-
void *bf = NULL, *nbf;
514-
int fd, n, err = 0;
515-
char sbuf[STRERR_BUFSIZE];
516-
517-
fd = open(filename, O_RDONLY);
518-
if (fd < 0)
519-
return -errno;
520-
521-
do {
522-
if (size == alloc_size) {
523-
alloc_size += BUFSIZ;
524-
nbf = realloc(bf, alloc_size);
525-
if (!nbf) {
526-
err = -ENOMEM;
527-
break;
528-
}
529-
530-
bf = nbf;
531-
}
532-
533-
n = read(fd, bf + size, alloc_size - size);
534-
if (n < 0) {
535-
if (size) {
536-
pr_warning("read failed %d: %s\n", errno,
537-
strerror_r(errno, sbuf, sizeof(sbuf)));
538-
err = 0;
539-
} else
540-
err = -errno;
541-
542-
break;
543-
}
544-
545-
size += n;
546-
} while (n > 0);
547-
548-
if (!err) {
549-
*sizep = size;
550-
*buf = bf;
551-
} else
552-
free(bf);
553-
554-
close(fd);
555-
return err;
556-
}
557-
558510
const char *get_filename_for_perf_kvm(void)
559511
{
560512
const char *filename;

tools/perf/util/util.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,6 @@ char *__get_srcline(struct dso *dso, u64 addr, struct symbol *sym,
303303
bool show_sym, bool unwind_inlines);
304304
void free_srcline(char *srcline);
305305

306-
int filename__read_str(const char *filename, char **buf, size_t *sizep);
307306
int perf_event_paranoid(void);
308307

309308
void mem_bswap_64(void *src, int byte_size);

0 commit comments

Comments
 (0)