Commit 139e5ca08f

Andrew Kelley <superjoe30@gmail.com>
2015-12-04 22:33:40
fix reading source from stdin
1 parent cd6283e
Changed files (1)
src
src/os.cpp
@@ -38,22 +38,24 @@ void os_spawn_process(const char *exe, ZigList<const char *> &args, bool detache
     zig_panic("execvp failed: %s", strerror(errno));
 }
 
-static void read_all_fd_stream(int fd, Buf *out_buf) {
+static int read_all_fd_stream(int fd, Buf *out_buf) {
     static const ssize_t buf_size = 0x2000;
     buf_resize(out_buf, buf_size);
     ssize_t actual_buf_len = 0;
     for (;;) {
         ssize_t amt_read = read(fd, buf_ptr(out_buf), buf_len(out_buf));
-        if (amt_read < 0)
-            zig_panic("fd read error");
+        if (amt_read < 0) {
+            return ErrorFileSystem;
+        }
         actual_buf_len += amt_read;
         if (amt_read == 0) {
             buf_resize(out_buf, actual_buf_len);
-            return;
+            return 0;
         }
 
         buf_resize(out_buf, actual_buf_len + buf_size);
     }
+    zig_unreachable();
 }
 
 void os_path_split(Buf *full_path, Buf *out_dirname, Buf *out_basename) {
@@ -142,46 +144,7 @@ void os_write_file(Buf *full_path, Buf *contents) {
 }
 
 int os_fetch_file(FILE *f, Buf *out_contents) {
-    int fd = fileno(f);
-    struct stat st;
-    if (fstat(fd, &st)) {
-        switch (errno) {
-            case EACCES:
-                return ErrorAccess;
-            case ENOENT:
-                return ErrorFileNotFound;
-            case ENOMEM:
-                return ErrorSystemResources;
-            case EINTR:
-                return ErrorInterrupted;
-            case EINVAL:
-                zig_unreachable();
-            default:
-                return ErrorFileSystem;
-        }
-    }
-    off_t big_size = st.st_size;
-    if (big_size > INT_MAX) {
-        return ErrorFileTooBig;
-    }
-    int size = (int)big_size;
-
-    buf_resize(out_contents, size);
-    ssize_t ret = read(fd, buf_ptr(out_contents), size);
-
-    if (ret != size) {
-        switch (errno) {
-            case EINTR:
-                return ErrorInterrupted;
-            case EINVAL:
-            case EISDIR:
-                zig_unreachable();
-            default:
-                return ErrorFileSystem;
-        }
-    }
-
-    return 0;
+    return read_all_fd_stream(fileno(f), out_contents);
 }
 
 int os_fetch_file_path(Buf *full_path, Buf *out_contents) {