diff options
Diffstat (limited to 'tools/perf/util/util.c')
-rw-r--r-- | tools/perf/util/util.c | 66 |
1 files changed, 59 insertions, 7 deletions
diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c index 6d17b18e915d..28a0a89c1f73 100644 --- a/tools/perf/util/util.c +++ b/tools/perf/util/util.c | |||
@@ -1,7 +1,7 @@ | |||
1 | #include "../perf.h" | 1 | #include "../perf.h" |
2 | #include "util.h" | 2 | #include "util.h" |
3 | #include <sys/mman.h> | 3 | #include <sys/mman.h> |
4 | #ifdef BACKTRACE_SUPPORT | 4 | #ifdef HAVE_BACKTRACE_SUPPORT |
5 | #include <execinfo.h> | 5 | #include <execinfo.h> |
6 | #endif | 6 | #endif |
7 | #include <stdio.h> | 7 | #include <stdio.h> |
@@ -55,17 +55,20 @@ int mkdir_p(char *path, mode_t mode) | |||
55 | return (stat(path, &st) && mkdir(path, mode)) ? -1 : 0; | 55 | return (stat(path, &st) && mkdir(path, mode)) ? -1 : 0; |
56 | } | 56 | } |
57 | 57 | ||
58 | static int slow_copyfile(const char *from, const char *to) | 58 | static int slow_copyfile(const char *from, const char *to, mode_t mode) |
59 | { | 59 | { |
60 | int err = 0; | 60 | int err = -1; |
61 | char *line = NULL; | 61 | char *line = NULL; |
62 | size_t n; | 62 | size_t n; |
63 | FILE *from_fp = fopen(from, "r"), *to_fp; | 63 | FILE *from_fp = fopen(from, "r"), *to_fp; |
64 | mode_t old_umask; | ||
64 | 65 | ||
65 | if (from_fp == NULL) | 66 | if (from_fp == NULL) |
66 | goto out; | 67 | goto out; |
67 | 68 | ||
69 | old_umask = umask(mode ^ 0777); | ||
68 | to_fp = fopen(to, "w"); | 70 | to_fp = fopen(to, "w"); |
71 | umask(old_umask); | ||
69 | if (to_fp == NULL) | 72 | if (to_fp == NULL) |
70 | goto out_fclose_from; | 73 | goto out_fclose_from; |
71 | 74 | ||
@@ -82,7 +85,7 @@ out: | |||
82 | return err; | 85 | return err; |
83 | } | 86 | } |
84 | 87 | ||
85 | int copyfile(const char *from, const char *to) | 88 | int copyfile_mode(const char *from, const char *to, mode_t mode) |
86 | { | 89 | { |
87 | int fromfd, tofd; | 90 | int fromfd, tofd; |
88 | struct stat st; | 91 | struct stat st; |
@@ -93,13 +96,13 @@ int copyfile(const char *from, const char *to) | |||
93 | goto out; | 96 | goto out; |
94 | 97 | ||
95 | if (st.st_size == 0) /* /proc? do it slowly... */ | 98 | if (st.st_size == 0) /* /proc? do it slowly... */ |
96 | return slow_copyfile(from, to); | 99 | return slow_copyfile(from, to, mode); |
97 | 100 | ||
98 | fromfd = open(from, O_RDONLY); | 101 | fromfd = open(from, O_RDONLY); |
99 | if (fromfd < 0) | 102 | if (fromfd < 0) |
100 | goto out; | 103 | goto out; |
101 | 104 | ||
102 | tofd = creat(to, 0755); | 105 | tofd = creat(to, mode); |
103 | if (tofd < 0) | 106 | if (tofd < 0) |
104 | goto out_close_from; | 107 | goto out_close_from; |
105 | 108 | ||
@@ -121,6 +124,11 @@ out: | |||
121 | return err; | 124 | return err; |
122 | } | 125 | } |
123 | 126 | ||
127 | int copyfile(const char *from, const char *to) | ||
128 | { | ||
129 | return copyfile_mode(from, to, 0755); | ||
130 | } | ||
131 | |||
124 | unsigned long convert_unit(unsigned long value, char *unit) | 132 | unsigned long convert_unit(unsigned long value, char *unit) |
125 | { | 133 | { |
126 | *unit = ' '; | 134 | *unit = ' '; |
@@ -204,7 +212,7 @@ int hex2u64(const char *ptr, u64 *long_val) | |||
204 | } | 212 | } |
205 | 213 | ||
206 | /* Obtain a backtrace and print it to stdout. */ | 214 | /* Obtain a backtrace and print it to stdout. */ |
207 | #ifdef BACKTRACE_SUPPORT | 215 | #ifdef HAVE_BACKTRACE_SUPPORT |
208 | void dump_stack(void) | 216 | void dump_stack(void) |
209 | { | 217 | { |
210 | void *array[16]; | 218 | void *array[16]; |
@@ -361,3 +369,47 @@ int parse_nsec_time(const char *str, u64 *ptime) | |||
361 | *ptime = time_sec * NSEC_PER_SEC + time_nsec; | 369 | *ptime = time_sec * NSEC_PER_SEC + time_nsec; |
362 | return 0; | 370 | return 0; |
363 | } | 371 | } |
372 | |||
373 | unsigned long parse_tag_value(const char *str, struct parse_tag *tags) | ||
374 | { | ||
375 | struct parse_tag *i = tags; | ||
376 | |||
377 | while (i->tag) { | ||
378 | char *s; | ||
379 | |||
380 | s = strchr(str, i->tag); | ||
381 | if (s) { | ||
382 | unsigned long int value; | ||
383 | char *endptr; | ||
384 | |||
385 | value = strtoul(str, &endptr, 10); | ||
386 | if (s != endptr) | ||
387 | break; | ||
388 | |||
389 | if (value > ULONG_MAX / i->mult) | ||
390 | break; | ||
391 | value *= i->mult; | ||
392 | return value; | ||
393 | } | ||
394 | i++; | ||
395 | } | ||
396 | |||
397 | return (unsigned long) -1; | ||
398 | } | ||
399 | |||
400 | int filename__read_int(const char *filename, int *value) | ||
401 | { | ||
402 | char line[64]; | ||
403 | int fd = open(filename, O_RDONLY), err = -1; | ||
404 | |||
405 | if (fd < 0) | ||
406 | return -1; | ||
407 | |||
408 | if (read(fd, line, sizeof(line)) > 0) { | ||
409 | *value = atoi(line); | ||
410 | err = 0; | ||
411 | } | ||
412 | |||
413 | close(fd); | ||
414 | return err; | ||
415 | } | ||