diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2018-12-12 18:05:58 +0100 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2018-12-12 12:05:58 -0500 |
commit | c2b91a3ef6305bb0597ec65e887bbab2d9f512a2 (patch) | |
tree | 378bce42abd179fd32e6c48580d2818f36253235 /src | |
parent | e31866a60da6edd4ed9b604caf5a9dfa6b1631ae (diff) |
Flesh out open() modes (#1282)
Diffstat (limited to 'src')
-rw-r--r-- | src/msg.fbs | 1 | ||||
-rw-r--r-- | src/ops.rs | 42 |
2 files changed, 41 insertions, 2 deletions
diff --git a/src/msg.fbs b/src/msg.fbs index dcec126dd..9cdb628a1 100644 --- a/src/msg.fbs +++ b/src/msg.fbs @@ -348,6 +348,7 @@ table Truncate { table Open { filename: string; perm: uint; + mode: string; } table OpenRes { diff --git a/src/ops.rs b/src/ops.rs index 6d41fbe63..3cf466d0d 100644 --- a/src/ops.rs +++ b/src/ops.rs @@ -584,9 +584,47 @@ fn op_open( let cmd_id = base.cmd_id(); let inner = base.inner_as_open().unwrap(); let filename = PathBuf::from(inner.filename().unwrap()); - // TODO let perm = inner.perm(); + // let perm = inner.perm(); + let mode = inner.mode().unwrap(); - let op = tokio::fs::File::open(filename) + let mut open_options = tokio::fs::OpenOptions::new(); + + match mode { + "r" => { + open_options.read(true); + } + "r+" => { + open_options.read(true).write(true); + } + "w" => { + open_options.create(true).write(true).truncate(true); + } + "w+" => { + open_options + .read(true) + .create(true) + .write(true) + .truncate(true); + } + "a" => { + open_options.create(true).append(true); + } + "a+" => { + open_options.read(true).create(true).append(true); + } + "x" => { + open_options.create_new(true).write(true); + } + "x+" => { + open_options.create_new(true).read(true).write(true); + } + &_ => { + panic!("Unknown file open mode."); + } + } + + let op = open_options + .open(filename) .map_err(DenoError::from) .and_then(move |fs_file| -> OpResult { let resource = resources::add_fs_file(fs_file); |