diff options
| author | Jeff Olson <olson.jeffery@gmail.com> | 2013-08-22 16:31:23 -0700 |
|---|---|---|
| committer | Jeff Olson <olson.jeffery@gmail.com> | 2013-08-22 16:31:58 -0700 |
| commit | 8d997fba1a035b20d208c588cb267385dea74f6c (patch) | |
| tree | 6e0defb476a6fd716ab0f28ba51a95beb402c515 /src/libstd/rt/io | |
| parent | 6311856bf42828e3c502a28b414586badb1192c8 (diff) | |
| download | rust-8d997fba1a035b20d208c588cb267385dea74f6c.tar.gz rust-8d997fba1a035b20d208c588cb267385dea74f6c.zip | |
std: put FileMode/Access->whence-mask in uvio, open/unlink as fns in file::
Diffstat (limited to 'src/libstd/rt/io')
| -rw-r--r-- | src/libstd/rt/io/file.rs | 140 | ||||
| -rw-r--r-- | src/libstd/rt/io/mod.rs | 24 |
2 files changed, 75 insertions, 89 deletions
diff --git a/src/libstd/rt/io/file.rs b/src/libstd/rt/io/file.rs index 816f7e08eab..65db76d5ef7 100644 --- a/src/libstd/rt/io/file.rs +++ b/src/libstd/rt/io/file.rs @@ -13,34 +13,45 @@ use super::support::PathLike; use super::{Reader, Writer, Seek}; use super::{SeekSet, SeekCur, SeekEnd, SeekStyle}; use rt::rtio::{RtioFileStream, IoFactory, IoFactoryObject}; -use rt::io::{io_error, read_error, EndOfFile}; +use rt::io::{io_error, read_error, EndOfFile, + FileMode, FileAccess, Open, Read, Create, ReadWrite}; use rt::local::Local; use rt::test::*; -use libc::{O_RDWR, O_RDONLY, O_WRONLY, S_IWUSR, S_IRUSR, - O_CREAT, O_TRUNC, O_APPEND}; -/// Instructions on how to open a file and return a `FileStream`. -enum FileMode { - /// Opens an existing file. IoError if file does not exist. - Open, - /// Creates a file. IoError if file exists. - Create, - /// Opens an existing file or creates a new one. - OpenOrCreate, - /// Opens an existing file or creates a new one, positioned at EOF. - Append, - /// Opens an existing file, truncating it to 0 bytes. - Truncate, - /// Opens an existing file or creates a new one, truncating it to 0 bytes. - CreateOrTruncate, +/// Open a file for reading/writing, as indicated by `path`. +pub fn open<P: PathLike>(path: &P, + mode: FileMode, + access: FileAccess + ) -> Option<FileStream> { + let open_result = unsafe { + let io = Local::unsafe_borrow::<IoFactoryObject>(); + (*io).fs_open(path, mode, access) + }; + match open_result { + Ok(fd) => Some(FileStream { + fd: fd, + last_nread: -1 + }), + Err(ioerr) => { + io_error::cond.raise(ioerr); + None + } + } } -/// How should the file be opened? `FileStream`s opened with `Read` will -/// raise an `io_error` condition if written to. -enum FileAccess { - Read, - Write, - ReadWrite +/// Unlink (remove) a file from the filesystem, as indicated +/// by `path`. +pub fn unlink<P: PathLike>(path: &P) { + let unlink_result = unsafe { + let io = Local::unsafe_borrow::<IoFactoryObject>(); + (*io).fs_unlink(path) + }; + match unlink_result { + Ok(_) => (), + Err(ioerr) => { + io_error::cond.raise(ioerr); + } + } } /// Abstraction representing *positional* access to a file. In this case, @@ -61,55 +72,6 @@ pub struct FileStream { } impl FileStream { - pub fn open<P: PathLike>(path: &P, - mode: FileMode, - access: FileAccess - ) -> Option<FileStream> { - let open_result = unsafe { - let io = Local::unsafe_borrow::<IoFactoryObject>(); - let mut flags = match mode { - Open => 0, - Create => O_CREAT, - OpenOrCreate => O_CREAT, - Append => O_APPEND, - Truncate => O_TRUNC, - CreateOrTruncate => O_TRUNC | O_CREAT - }; - flags = match access { - Read => flags | O_RDONLY, - Write => flags | O_WRONLY, - ReadWrite => flags | O_RDWR - }; - let create_mode = match mode { - Create|OpenOrCreate|CreateOrTruncate => - S_IRUSR | S_IWUSR, - _ => 0 - }; - (*io).fs_open(path, flags as int, create_mode as int) - }; - match open_result { - Ok(fd) => Some(FileStream { - fd: fd, - last_nread: -1 - }), - Err(ioerr) => { - io_error::cond.raise(ioerr); - None - } - } - } - fn unlink<P: PathLike>(path: &P) { - let unlink_result = unsafe { - let io = Local::unsafe_borrow::<IoFactoryObject>(); - (*io).fs_unlink(path) - }; - match unlink_result { - Ok(_) => (), - Err(ioerr) => { - io_error::cond.raise(ioerr); - } - } - } } impl Reader for FileStream { @@ -188,12 +150,12 @@ fn file_test_smoke_test_impl() { let message = "it's alright. have a good time"; let filename = &Path("./tmp/file_rt_io_file_test.txt"); { - let mut write_stream = FileStream::open(filename, Create, ReadWrite).unwrap(); + let mut write_stream = open(filename, Create, ReadWrite).unwrap(); write_stream.write(message.as_bytes()); } { use str; - let mut read_stream = FileStream::open(filename, Open, Read).unwrap(); + let mut read_stream = open(filename, Open, Read).unwrap(); let mut read_buf = [0, .. 1028]; let read_str = match read_stream.read(read_buf).unwrap() { -1|0 => fail!("shouldn't happen"), @@ -201,7 +163,7 @@ fn file_test_smoke_test_impl() { }; assert!(read_str == message.to_owned()); } - FileStream::unlink(filename); + unlink(filename); } } @@ -217,7 +179,7 @@ fn file_test_invalid_path_opened_without_create_should_raise_condition_impl() { do io_error::cond.trap(|_| { called = true; }).inside { - let result = FileStream::open(filename, Open, Read); + let result = open(filename, Open, Read); assert!(result.is_none()); } assert!(called); @@ -235,7 +197,7 @@ fn file_test_unlinking_invalid_path_should_raise_condition_impl() { do io_error::cond.trap(|_| { called = true; }).inside { - FileStream::unlink(filename); + unlink(filename); } assert!(called); } @@ -252,11 +214,11 @@ fn file_test_io_non_positional_read_impl() { let mut read_mem = [0, .. 8]; let filename = &Path("./tmp/file_rt_io_file_test_positional.txt"); { - let mut rw_stream = FileStream::open(filename, Create, ReadWrite).unwrap(); + let mut rw_stream = open(filename, Create, ReadWrite).unwrap(); rw_stream.write(message.as_bytes()); } { - let mut read_stream = FileStream::open(filename, Open, Read).unwrap(); + let mut read_stream = open(filename, Open, Read).unwrap(); { let read_buf = read_mem.mut_slice(0, 4); read_stream.read(read_buf); @@ -266,7 +228,7 @@ fn file_test_io_non_positional_read_impl() { read_stream.read(read_buf); } } - FileStream::unlink(filename); + unlink(filename); let read_str = str::from_bytes(read_mem); assert!(read_str == message.to_owned()); } @@ -287,17 +249,17 @@ fn file_test_io_seeking_impl() { let mut tell_pos_post_read; let filename = &Path("./tmp/file_rt_io_file_test_seeking.txt"); { - let mut rw_stream = FileStream::open(filename, Create, ReadWrite).unwrap(); + let mut rw_stream = open(filename, Create, ReadWrite).unwrap(); rw_stream.write(message.as_bytes()); } { - let mut read_stream = FileStream::open(filename, Open, Read).unwrap(); + let mut read_stream = open(filename, Open, Read).unwrap(); read_stream.seek(set_cursor as i64, SeekSet); tell_pos_pre_read = read_stream.tell(); read_stream.read(read_mem); tell_pos_post_read = read_stream.tell(); } - FileStream::unlink(filename); + unlink(filename); let read_str = str::from_bytes(read_mem); assert!(read_str == message.slice(4, 8).to_owned()); assert!(tell_pos_pre_read == set_cursor); @@ -320,16 +282,16 @@ fn file_test_io_seek_and_write_impl() { let mut read_mem = [0, .. 13]; let filename = &Path("./tmp/file_rt_io_file_test_seek_and_write.txt"); { - let mut rw_stream = FileStream::open(filename, Create, ReadWrite).unwrap(); + let mut rw_stream = open(filename, Create, ReadWrite).unwrap(); rw_stream.write(initial_msg.as_bytes()); rw_stream.seek(seek_idx as i64, SeekSet); rw_stream.write(overwrite_msg.as_bytes()); } { - let mut read_stream = FileStream::open(filename, Open, Read).unwrap(); + let mut read_stream = open(filename, Open, Read).unwrap(); read_stream.read(read_mem); } - FileStream::unlink(filename); + unlink(filename); let read_str = str::from_bytes(read_mem); io::println(fmt!("read_str: '%?' final_msg: '%?'", read_str, final_msg)); assert!(read_str == final_msg.to_owned()); @@ -350,11 +312,11 @@ fn file_test_io_seek_shakedown_impl() { let mut read_mem = [0, .. 4]; let filename = &Path("./tmp/file_rt_io_file_test_seek_shakedown.txt"); { - let mut rw_stream = FileStream::open(filename, Create, ReadWrite).unwrap(); + let mut rw_stream = open(filename, Create, ReadWrite).unwrap(); rw_stream.write(initial_msg.as_bytes()); } { - let mut read_stream = FileStream::open(filename, Open, Read).unwrap(); + let mut read_stream = open(filename, Open, Read).unwrap(); read_stream.seek(-4, SeekEnd); read_stream.read(read_mem); @@ -371,7 +333,7 @@ fn file_test_io_seek_shakedown_impl() { let read_str = str::from_bytes(read_mem); assert!(read_str == chunk_one.to_owned()); } - FileStream::unlink(filename); + unlink(filename); } } #[test] diff --git a/src/libstd/rt/io/mod.rs b/src/libstd/rt/io/mod.rs index 23b8017bc51..116d240308a 100644 --- a/src/libstd/rt/io/mod.rs +++ b/src/libstd/rt/io/mod.rs @@ -540,3 +540,27 @@ pub fn placeholder_error() -> IoError { detail: None } } + +/// Instructions on how to open a file and return a `FileStream`. +pub enum FileMode { + /// Opens an existing file. IoError if file does not exist. + Open, + /// Creates a file. IoError if file exists. + Create, + /// Opens an existing file or creates a new one. + OpenOrCreate, + /// Opens an existing file or creates a new one, positioned at EOF. + Append, + /// Opens an existing file, truncating it to 0 bytes. + Truncate, + /// Opens an existing file or creates a new one, truncating it to 0 bytes. + CreateOrTruncate, +} + +/// Access permissions with which the file should be opened. +/// `FileStream`s opened with `Read` will raise an `io_error` condition if written to. +pub enum FileAccess { + Read, + Write, + ReadWrite +} |
