]> git.sur5r.net Git - i3/i3/commitdiff
add proper error handling for in-place restarts (Thanks Markus)
authorMichael Stapelberg <michael@stapelberg.de>
Fri, 21 Sep 2012 14:47:43 +0000 (16:47 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Fri, 21 Sep 2012 14:47:43 +0000 (16:47 +0200)
fixes #806

src/ipc.c
src/load_layout.c

index 7dfbc8713c19c9e44295441f880bf21350f7f504..169c659fd6293389b44edab4e8fe3178355653bc 100644 (file)
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -52,7 +52,7 @@ static bool mkdirp(const char *path) {
         ELOG("mkdir(%s) failed: %s\n", path, strerror(errno));
         return false;
     }
-    char *copy = strdup(path);
+    char *copy = sstrdup(path);
     /* strip trailing slashes, if any */
     while (copy[strlen(copy)-1] == '/')
         copy[strlen(copy)-1] = '\0';
index cce1a7127da9f660d4282e52cb8d521e743d6fa3..fc513f51f4533e87fd08595a558a2e5596be20c4 100644 (file)
@@ -350,11 +350,22 @@ void tree_append_json(const char *filename) {
     /* TODO: percent of other windows are not correctly fixed at the moment */
     FILE *f;
     if ((f = fopen(filename, "r")) == NULL) {
-        LOG("Cannot open file\n");
+        LOG("Cannot open file \"%s\"\n", filename);
+        return;
+    }
+    struct stat stbuf;
+    if (fstat(fileno(f), &stbuf) != 0) {
+        LOG("Cannot fstat() the file\n");
+        fclose(f);
+        return;
+    }
+    char *buf = smalloc(stbuf.st_size);
+    int n = fread(buf, 1, stbuf.st_size, f);
+    if (n != stbuf.st_size) {
+        LOG("File \"%s\" could not be read entirely, not loading.\n", filename);
+        fclose(f);
         return;
     }
-    char *buf = malloc(65535); /* TODO */
-    int n = fread(buf, 1, 65535, f);
     LOG("read %d bytes\n", n);
     yajl_gen g;
     yajl_handle hand;