diff options
-rw-r--r-- | tools/include/linux/string.h | 4 | ||||
-rw-r--r-- | tools/lib/string.c | 27 | ||||
-rw-r--r-- | tools/perf/util/cache.h | 7 | ||||
-rw-r--r-- | tools/perf/util/path.c | 18 |
4 files changed, 33 insertions, 23 deletions
diff --git a/tools/include/linux/string.h b/tools/include/linux/string.h index 2e2f736..e26223f 100644 --- a/tools/include/linux/string.h +++ b/tools/include/linux/string.h @@ -8,4 +8,8 @@ void *memdup(const void *src, size_t len); int strtobool(const char *s, bool *res); +#ifndef __UCLIBC__ +extern size_t strlcpy(char *dest, const char *src, size_t size); +#endif + #endif /* _LINUX_STRING_H_ */ diff --git a/tools/lib/string.c b/tools/lib/string.c index 065e54f..bd239bc 100644 --- a/tools/lib/string.c +++ b/tools/lib/string.c @@ -16,6 +16,7 @@ #include <string.h> #include <errno.h> #include <linux/string.h> +#include <linux/compiler.h> /** * memdup - duplicate region of memory @@ -60,3 +61,29 @@ int strtobool(const char *s, bool *res) } return 0; } + +/** + * strlcpy - Copy a C-string into a sized buffer + * @dest: Where to copy the string to + * @src: Where to copy the string from + * @size: size of destination buffer + * + * Compatible with *BSD: the result is always a valid + * NUL-terminated string that fits in the buffer (unless, + * of course, the buffer size is zero). It does not pad + * out the result like strncpy() does. + * + * If libc has strlcpy() then that version will override this + * implementation: + */ +size_t __weak strlcpy(char *dest, const char *src, size_t size) +{ + size_t ret = strlen(src); + + if (size) { + size_t len = (ret >= size) ? size - 1 : ret; + memcpy(dest, src, len); + dest[len] = '\0'; + } + return ret; +} diff --git a/tools/perf/util/cache.h b/tools/perf/util/cache.h index 9ca4a58..d723ecb 100644 --- a/tools/perf/util/cache.h +++ b/tools/perf/util/cache.h @@ -8,6 +8,8 @@ #include "../perf.h" #include "../ui/ui.h" +#include <linux/string.h> + #define CMD_EXEC_PATH "--exec-path" #define CMD_PERF_DIR "--perf-dir=" #define CMD_WORK_TREE "--work-tree=" @@ -67,9 +69,4 @@ extern char *perf_path(const char *fmt, ...) __attribute__((format (printf, 1, 2 extern char *perf_pathdup(const char *fmt, ...) __attribute__((format (printf, 1, 2))); -#ifndef __UCLIBC__ -/* Matches the libc/libbsd function attribute so we declare this unconditionally: */ -extern size_t strlcpy(char *dest, const char *src, size_t size); -#endif - #endif /* __PERF_CACHE_H */ diff --git a/tools/perf/util/path.c b/tools/perf/util/path.c index 5d13cb4..3654d96 100644 --- a/tools/perf/util/path.c +++ b/tools/perf/util/path.c @@ -22,24 +22,6 @@ static const char *get_perf_dir(void) return "."; } -/* - * If libc has strlcpy() then that version will override this - * implementation: - */ -size_t __weak strlcpy(char *dest, const char *src, size_t size) -{ - size_t ret = strlen(src); - - if (size) { - size_t len = (ret >= size) ? size - 1 : ret; - - memcpy(dest, src, len); - dest[len] = '\0'; - } - - return ret; -} - static char *get_pathname(void) { static char pathname_array[4][PATH_MAX]; |