]> git.sur5r.net Git - i3/i3/blobdiff - libi3/safewrappers.c
Merge pull request #3467 from orestisf1993/userguide
[i3/i3] / libi3 / safewrappers.c
index 82311fe3a2115bb96c956e514af3dd73415e37e6..1802b327ee4442802cc7acc96dfa67e262a114a6 100644 (file)
@@ -2,16 +2,18 @@
  * 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 "libi3.h"
+
 #include <string.h>
 #include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <stdio.h>
 #include <err.h>
-
+#include <errno.h>
 
 /*
  * The s* functions (safe) are wrappers around malloc, strdup, …, which exits if one of
@@ -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;
 }
 
@@ -45,3 +47,66 @@ char *sstrdup(const char *str) {
         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;
+
+    while (written < count) {
+        const ssize_t n = write(fd, ((char *)buf) + written, count - written);
+        if (n == -1) {
+            if (errno == EINTR || errno == EAGAIN)
+                continue;
+            return n;
+        }
+        written += (size_t)n;
+    }
+
+    return written;
+}
+
+ssize_t writeall_nonblock(int fd, const void *buf, size_t count) {
+    size_t written = 0;
+
+    while (written < count) {
+        const ssize_t n = write(fd, ((char *)buf) + written, count - written);
+        if (n == -1) {
+            if (errno == EAGAIN) {
+                return written;
+            } else if (errno == EINTR) {
+                continue;
+            } else {
+                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;
+}