1.0.24.45: handle IO errors in LDB and when saving the core
authorNikodemus Siivola <nikodemus@random-state.net>
Sat, 17 Jan 2009 10:43:57 +0000 (10:43 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Sat, 17 Jan 2009 10:43:57 +0000 (10:43 +0000)
 * In LDB, if users response cannot be read, assume y.

 * Check fwrite() called when saving the core, and report the error.

 * Patch by Daniel Lowe.

src/runtime/monitor.c
src/runtime/print.c
src/runtime/save.c
version.lisp-expr

index ce0ef79..9d17508 100644 (file)
@@ -302,9 +302,13 @@ quit_cmd(char **ptr)
 
     printf("Really quit? [y] ");
     fflush(stdout);
-    fgets(buf, sizeof(buf), ldb_in);
-    if (buf[0] == 'y' || buf[0] == 'Y' || buf[0] == '\n')
+    if (fgets(buf, sizeof(buf), ldb_in)) {
+        if (buf[0] == 'y' || buf[0] == 'Y' || buf[0] == '\n')
+            exit(1);
+    } else {
+        printf("\nUnable to read response, assuming y.\n");
         exit(1);
+    }
 }
 
 static void
index 73ec03b..833ec91 100644 (file)
@@ -195,12 +195,15 @@ static boolean continue_p(boolean newline)
             printf("More? [y] ");
             fflush(stdout);
 
-            fgets(buffer, sizeof(buffer), stdin);
-
-            if (buffer[0] == 'n' || buffer[0] == 'N')
-                throw_to_monitor();
-            else
+            if (fgets(buffer, sizeof(buffer), stdin)) {
+                if (buffer[0] == 'n' || buffer[0] == 'N')
+                    throw_to_monitor();
+                else
+                    cur_lines = 0;
+            } else {
+                printf("\nUnable to read response, assuming y.\n");
                 cur_lines = 0;
+            }
         }
     }
 
index 20d72d7..635bf49 100644 (file)
@@ -56,13 +56,18 @@ write_runtime_options(FILE *file, struct runtime_options *options)
         optarray[3] = options->thread_control_stack_size;
     }
 
-    fwrite(optarray, sizeof(size_t), RUNTIME_OPTIONS_WORDS, file);
+    if (RUNTIME_OPTIONS_WORDS !=
+        fwrite(optarray, sizeof(size_t), RUNTIME_OPTIONS_WORDS, file)) {
+        perror("Error writing runtime options to file");
+    }
 }
 
 static void
 write_lispobj(lispobj obj, FILE *file)
 {
-    fwrite(&obj, sizeof(lispobj), 1, file);
+    if (1 != fwrite(&obj, sizeof(lispobj), 1, file)) {
+        perror("Error writing to file");
+    }
 }
 
 static long
@@ -354,9 +359,13 @@ save_to_filehandle(FILE *file, char *filename, lispobj init_function,
     write_runtime_options(file,
                           (save_runtime_options ? runtime_options : NULL));
 
-    fwrite(&core_start_pos, sizeof(os_vm_offset_t), 1, file);
-    write_lispobj(CORE_MAGIC, file);
-    fclose(file);
+    if (1 != fwrite(&core_start_pos, sizeof(os_vm_offset_t), 1, file)) {
+        perror("Error writing core starting position to file");
+        fclose(file);
+    } else {
+        write_lispobj(CORE_MAGIC, file);
+        fclose(file);
+    }
 
 #ifndef LISP_FEATURE_WIN32
     if (make_executable)
@@ -416,13 +425,20 @@ save_runtime_to_filehandle(FILE *output, void *runtime, size_t runtime_size)
     size_t padding;
     void *padbytes;
 
-    fwrite(runtime, 1, runtime_size, output);
+    if (runtime_size != fwrite(runtime, 1, runtime_size, output)) {
+        perror("Error saving runtime");
+        return 0;
+    }
 
     padding = (os_vm_page_size - (runtime_size % os_vm_page_size)) & ~os_vm_page_size;
     if (padding > 0) {
         padbytes = successful_malloc(padding);
         memset(padbytes, 0, padding);
-        fwrite(padbytes, 1, padding, output);
+        if (padding != fwrite(padbytes, 1, padding, output)) {
+            perror("Error saving runtime");
+            free(padbytes);
+            return 0;
+        }
         free(padbytes);
     }
 
index ca2be36..b43f299 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"1.0.24.44"
+"1.0.24.45"