]> git.sur5r.net Git - i3/i3/blobdiff - src/util.c
Add a safe wrapper for write and fix some warnings
[i3/i3] / src / util.c
index c40f6581b866b9862ae681b6b625087017a2205a..5760ae72588f52afc5cd6caf617a4b184e344ab9 100644 (file)
@@ -42,17 +42,17 @@ bool rect_contains(Rect rect, uint32_t x, uint32_t y) {
 }
 
 Rect rect_add(Rect a, Rect b) {
-    return (Rect) {a.x + b.x,
-                   a.y + b.y,
-                   a.width + b.width,
-                   a.height + b.height};
+    return (Rect){a.x + b.x,
+                  a.y + b.y,
+                  a.width + b.width,
+                  a.height + b.height};
 }
 
 Rect rect_sub(Rect a, Rect b) {
-    return (Rect) {a.x - b.x,
-                   a.y - b.y,
-                   a.width - b.width,
-                   a.height - b.height};
+    return (Rect){a.x - b.x,
+                  a.y - b.y,
+                  a.width - b.width,
+                  a.height - b.height};
 }
 
 /*
@@ -249,6 +249,15 @@ char *store_restart_layout(void) {
         filename = resolve_tilde(config.restart_state_path);
     }
 
+    /* create the directory, it could have been cleaned up before restarting or
+     * may not exist at all in case it was user-specified. */
+    char *filenamecopy = sstrdup(filename);
+    char *base = dirname(filenamecopy);
+    DLOG("Creating \"%s\" for storing the restart layout\n", base);
+    if (!mkdirp(base))
+        ELOG("Could not create \"%s\" for storing the restart layout, layout will be lost.\n", base);
+    free(filenamecopy);
+
     int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
     if (fd == -1) {
         perror("open()");
@@ -256,25 +265,13 @@ char *store_restart_layout(void) {
         return NULL;
     }
 
-    size_t written = 0;
-    while (written < length) {
-        int n = write(fd, payload + written, length - written);
-        /* TODO: correct error-handling */
-        if (n == -1) {
-            perror("write()");
-            free(filename);
-            close(fd);
-            return NULL;
-        }
-        if (n == 0) {
-            DLOG("write == 0?\n");
-            free(filename);
-            close(fd);
-            return NULL;
-        }
-        written += n;
-        DLOG("written: %zd of %zd\n", written, length);
+    if (writeall(fd, payload, length) == -1) {
+        ELOG("Could not write restart layout to \"%s\", layout will be lost: %s\n", filename, strerror(errno));
+        free(filename);
+        close(fd);
+        return NULL;
     }
+
     close(fd);
 
     if (length > 0) {