* vim:ts=4:sw=4:expandtab
*
* i3 - an improved dynamic tiling window manager
- *
- * © 2009-2011 Michael Stapelberg and contributors
- *
- * See file LICENSE for license information.
+ * © 2009 Michael Stapelberg and contributors (see also: LICENSE)
*
*/
#include <string.h>
#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <stdio.h>
#include <err.h>
+#include <errno.h>
+#include "libi3.h"
/*
* The s* functions (safe) are wrappers around malloc, strdup, …, which exits if one of
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;
}
err(EXIT_FAILURE, "strdup()");
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;
+
+ va_start(args, fmt);
+ if ((result = vasprintf(strp, fmt, args)) == -1)
+ err(EXIT_FAILURE, "asprintf(%s)", 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;
+}