From 975bb1610d31b35ecc9af597292a51f0c5758df5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Gallou=C3=ABt?= Date: Wed, 17 Jan 2018 16:11:22 +0000 Subject: [PATCH] Simplify str.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Adrien Gallouët --- src/ctl.c | 45 +++++++++++++++++++----------------------- src/str.h | 59 ++++++++++++++++++++++++------------------------------- 2 files changed, 46 insertions(+), 58 deletions(-) diff --git a/src/ctl.c b/src/ctl.c index 555c56f..83dcbca 100644 --- a/src/ctl.c +++ b/src/ctl.c @@ -18,27 +18,23 @@ ctl_init(const char *dir, const char *file) if (mkdir(dir, 0700) == -1 && errno != EEXIST) return -1; - const char *strs[] = {dir, "/", file}; - char *path = str_cat(strs, 3); - - if (!path) - return -1; - - int fd = socket(AF_UNIX, SOCK_DGRAM, 0); - - if (fd == -1) { - int err = errno; - free(path); - errno = err; - return -1; - } - struct sockaddr_un sun = { .sun_family = AF_UNIX, }; - str_cpy(sun.sun_path, path, sizeof(sun.sun_path) - 1); - free(path); + const char *path[] = {dir, "/", file}; + const size_t len = sizeof(sun.sun_path) - 1; + + if (str_cat(sun.sun_path, path, COUNT(path), len) > len) { + errno = EINVAL; + return -1; + } + + int fd = socket(AF_UNIX, SOCK_DGRAM, 0); + + if (fd == -1) + return -1; + unlink(sun.sun_path); if (bind(fd, (struct sockaddr *)&sun, sizeof(sun)) == -1) { @@ -59,18 +55,17 @@ ctl_connect(int fd, const char *dir, const char *file) return -1; } - const char *strs[] = {dir, "/", file}; - char *path = str_cat(strs, 3); - - if (!path) - return -1; - struct sockaddr_un sun = { .sun_family = AF_UNIX, }; - str_cpy(sun.sun_path, path, sizeof(sun.sun_path) - 1); - free(path); + const char *path[] = {dir, "/", file}; + const size_t len = sizeof(sun.sun_path) - 1; + + if (str_cat(sun.sun_path, path, COUNT(path), len) > len) { + errno = EINVAL; + return -1; + } return connect(fd, (struct sockaddr *)&sun, sizeof(sun)); } diff --git a/src/str.h b/src/str.h index effd96b..b1197b0 100644 --- a/src/str.h +++ b/src/str.h @@ -2,22 +2,6 @@ #include "common.h" -static inline size_t -str_cpy(char *restrict dst, const char *restrict src, size_t len) -{ - if (!dst || !src) - return 0; - - size_t i; - - for (i = 0; i < len && src[i]; i++) - dst[i] = src[i]; - - dst[i] = 0; - - return i; -} - _pure_ static inline int str_empty(const char *restrict str) { @@ -48,28 +32,37 @@ str_len(const char *restrict str) return strlen(str); } -static inline char * -str_cat(const char **strs, size_t count) +static inline size_t +str_cat(char *dst, const char **src, size_t count, size_t dst_len) { - size_t size = 1; + if (count && !src) + return 0; - for (size_t i = 0; i < count; i++) - size += str_len(strs[i]); - - char *str = malloc(size); - - if (!str) - return NULL; - - char *p = str; + size_t len = 0; + size_t p = 0; for (size_t i = 0; i < count; i++) { - size_t len = str_len(strs[i]); - memcpy(p, strs[i], len); - p += len; + size_t n = str_len(src[i]); + + if (!n) + continue; + + if (dst && len + n <= dst_len) { + memmove(&dst[len], src[i], n); + p = len + n; + } + + len += n; } - p[0] = 0; + if (dst) + dst[p] = 0; - return str; + return len; +} + +static inline size_t +str_cpy(char *dst, const char *src, size_t dst_len) +{ + return str_cat(dst, &src, 1, dst_len); }