aboutsummaryrefslogtreecommitdiff
path: root/src/lib/_io.rs
blob: 1f01c3b3a0179205ea141772790fda384f9cf542 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
type buf_reader = obj {
  fn read(vec[u8] buf) -> uint;
};

type buf_writer = obj {
  fn write(vec[u8] buf) -> uint;
};

fn mk_buf_reader(str s) -> buf_reader {

  obj fd_reader(int fd) {
    fn read(vec[u8] v) -> uint {
      auto len = _vec.len[u8](v);
      auto buf = _vec.buf[u8](v);
      auto count = os.libc.read(fd, buf, len);
      if (count < 0) {
        log "error filling buffer";
        log sys.rustrt.last_os_error();
        fail;
      } else {
        ret uint(count);
      }
    }
    drop {
      os.libc.close(fd);
    }
  }

  auto fd = os.libc.open(_str.buf(s), 0);
  if (fd < 0) {
    log "error opening file";
    log sys.rustrt.last_os_error();
    fail;
  }
  ret fd_reader(fd);
}