perf tools: Add filename__read_str util function
Adding filename__read_str util function to read text file and return it in the char array. The interface is: int filename__read_str(const char *filename, char **buf, size_t *sizep) Returns 0/-1 if the read suceeded/fail respectively. buf - place to store the data pointer size - place to store data size v2 change: - better error handling suggested by Namhyung Kim. Signed-off-by: Jiri Olsa <jolsa@redhat.com> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Steven Rostedt <rostedt@goodmis.org> Link: http://lkml.kernel.org/r/1386076182-14484-9-git-send-email-jolsa@redhat.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
3d7c014449
commit
cef82c9f5a
2 changed files with 50 additions and 0 deletions
|
@ -6,6 +6,8 @@
|
||||||
#endif
|
#endif
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -433,3 +435,50 @@ int filename__read_int(const char *filename, int *value)
|
||||||
close(fd);
|
close(fd);
|
||||||
return err;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -308,4 +308,5 @@ char *get_srcline(struct dso *dso, unsigned long addr);
|
||||||
void free_srcline(char *srcline);
|
void free_srcline(char *srcline);
|
||||||
|
|
||||||
int filename__read_int(const char *filename, int *value);
|
int filename__read_int(const char *filename, int *value);
|
||||||
|
int filename__read_str(const char *filename, char **buf, size_t *sizep);
|
||||||
#endif /* GIT_COMPAT_UTIL_H */
|
#endif /* GIT_COMPAT_UTIL_H */
|
||||||
|
|
Loading…
Reference in a new issue