X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libi3%2Fsafewrappers.c;h=0a233a1271f996272a50751c964e5ecf94b17015;hb=35a4e22f4a94d06d54a2cfca0932bb3906d897f5;hp=cf634ad43b8d0f9248f60f351f506908b3507d59;hpb=0adbffb38621192c416ac52aa6b82ac57fb6394d;p=i3%2Fi3 diff --git a/libi3/safewrappers.c b/libi3/safewrappers.c index cf634ad4..0a233a12 100644 --- a/libi3/safewrappers.c +++ b/libi3/safewrappers.c @@ -2,14 +2,16 @@ * vim:ts=4:sw=4:expandtab * * i3 - an improved dynamic tiling window manager - * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE) + * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * */ #include #include #include +#include #include #include +#include #include "libi3.h" @@ -25,10 +27,10 @@ void *smalloc(size_t size) { return result; } -void *scalloc(size_t size) { - void *result = calloc(size, 1); +void *scalloc(size_t num, size_t size) { + void *result = calloc(num, size); if (result == NULL) - err(EXIT_FAILURE, "calloc(%zd)", size); + err(EXIT_FAILURE, "calloc(%zd, %zd)", num, size); return result; } @@ -46,6 +48,13 @@ char *sstrdup(const char *str) { return result; } +char *sstrndup(const char *str, size_t size) { + char *result = strndup(str, size); + if (result == NULL) + err(EXIT_FAILURE, "strndup()"); + return result; +} + int sasprintf(char **strp, const char *fmt, ...) { va_list args; int result; @@ -56,3 +65,30 @@ int sasprintf(char **strp, const char *fmt, ...) { va_end(args); return result; } + +ssize_t writeall(int fd, const void *buf, size_t count) { + size_t written = 0; + ssize_t n = 0; + + while (written < count) { + n = write(fd, buf + written, count - written); + if (n == -1) { + if (errno == EINTR || errno == EAGAIN) + continue; + return n; + } + written += (size_t)n; + } + + return written; +} + +ssize_t swrite(int fd, const void *buf, size_t count) { + ssize_t n; + + n = writeall(fd, buf, count); + if (n == -1) + err(EXIT_FAILURE, "Failed to write %d", fd); + else + return n; +}