]> git.lizzy.rs Git - rust.git/blob - src/libstd/io/mod.rs
Improve error messages for io::fs
[rust.git] / src / libstd / io / mod.rs
1 // Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 // FIXME: cover these topics:
12 //        path, reader, writer, stream, raii (close not needed),
13 //        stdio, print!, println!, file access, process spawning,
14 //        error handling
15
16
17 /*! I/O, including files, networking, timers, and processes
18
19 `std::io` provides Rust's basic I/O types,
20 for reading and writing to files, TCP, UDP,
21 and other types of sockets and pipes,
22 manipulating the file system, spawning processes and signal handling.
23
24 # Examples
25
26 Some examples of obvious things you might want to do
27
28 * Read lines from stdin
29
30     ```rust
31     use std::io;
32
33     for line in io::stdin().lines() {
34         print!("{}", line.unwrap());
35     }
36     ```
37
38 * Read a complete file
39
40     ```rust
41     use std::io::File;
42
43     let contents = File::open(&Path::new("message.txt")).read_to_end();
44     ```
45
46 * Write a line to a file
47
48     ```rust
49     # #![allow(unused_must_use)]
50     use std::io::File;
51
52     let mut file = File::create(&Path::new("message.txt"));
53     file.write(bytes!("hello, file!\n"));
54     # drop(file);
55     # ::std::io::fs::unlink(&Path::new("message.txt"));
56     ```
57
58 * Iterate over the lines of a file
59
60     ```rust,no_run
61     use std::io::BufferedReader;
62     use std::io::File;
63
64     let path = Path::new("message.txt");
65     let mut file = BufferedReader::new(File::open(&path));
66     for line in file.lines() {
67         print!("{}", line.unwrap());
68     }
69     ```
70
71 * Pull the lines of a file into a vector of strings
72
73     ```rust,no_run
74     use std::io::BufferedReader;
75     use std::io::File;
76
77     let path = Path::new("message.txt");
78     let mut file = BufferedReader::new(File::open(&path));
79     let lines: Vec<String> = file.lines().map(|x| x.unwrap()).collect();
80     ```
81
82 * Make a simple TCP client connection and request
83
84     ```rust
85     # #![allow(unused_must_use)]
86     use std::io::net::tcp::TcpStream;
87
88     # // connection doesn't fail if a server is running on 8080
89     # // locally, we still want to be type checking this code, so lets
90     # // just stop it running (#11576)
91     # if false {
92     let mut socket = TcpStream::connect("127.0.0.1", 8080).unwrap();
93     socket.write(bytes!("GET / HTTP/1.0\n\n"));
94     let response = socket.read_to_end();
95     # }
96     ```
97
98 * Make a simple TCP server
99
100     ```rust
101     # fn main() { }
102     # fn foo() {
103     # #![allow(dead_code)]
104     use std::io::{TcpListener, TcpStream};
105     use std::io::{Acceptor, Listener};
106
107     let listener = TcpListener::bind("127.0.0.1", 80);
108
109     // bind the listener to the specified address
110     let mut acceptor = listener.listen();
111
112     fn handle_client(mut stream: TcpStream) {
113         // ...
114     # &mut stream; // silence unused mutability/variable warning
115     }
116     // accept connections and process them, spawning a new tasks for each one
117     for stream in acceptor.incoming() {
118         match stream {
119             Err(e) => { /* connection failed */ }
120             Ok(stream) => spawn(proc() {
121                 // connection succeeded
122                 handle_client(stream)
123             })
124         }
125     }
126
127     // close the socket server
128     drop(acceptor);
129     # }
130     ```
131
132
133 # Error Handling
134
135 I/O is an area where nearly every operation can result in unexpected
136 errors. Errors should be painfully visible when they happen, and handling them
137 should be easy to work with. It should be convenient to handle specific I/O
138 errors, and it should also be convenient to not deal with I/O errors.
139
140 Rust's I/O employs a combination of techniques to reduce boilerplate
141 while still providing feedback about errors. The basic strategy:
142
143 * All I/O operations return `IoResult<T>` which is equivalent to
144   `Result<T, IoError>`. The `Result` type is defined in the `std::result`
145   module.
146 * If the `Result` type goes unused, then the compiler will by default emit a
147   warning about the unused result. This is because `Result` has the
148   `#[must_use]` attribute.
149 * Common traits are implemented for `IoResult`, e.g.
150   `impl<R: Reader> Reader for IoResult<R>`, so that error values do not have
151   to be 'unwrapped' before use.
152
153 These features combine in the API to allow for expressions like
154 `File::create(&Path::new("diary.txt")).write(bytes!("Met a girl.\n"))`
155 without having to worry about whether "diary.txt" exists or whether
156 the write succeeds. As written, if either `new` or `write_line`
157 encounters an error then the result of the entire expression will
158 be an error.
159
160 If you wanted to handle the error though you might write:
161
162 ```rust
163 # #![allow(unused_must_use)]
164 use std::io::File;
165
166 match File::create(&Path::new("diary.txt")).write(bytes!("Met a girl.\n")) {
167     Ok(()) => (), // succeeded
168     Err(e) => println!("failed to write to my diary: {}", e),
169 }
170
171 # ::std::io::fs::unlink(&Path::new("diary.txt"));
172 ```
173
174 So what actually happens if `create` encounters an error?
175 It's important to know that what `new` returns is not a `File`
176 but an `IoResult<File>`.  If the file does not open, then `new` will simply
177 return `Err(..)`. Because there is an implementation of `Writer` (the trait
178 required ultimately required for types to implement `write_line`) there is no
179 need to inspect or unwrap the `IoResult<File>` and we simply call `write_line`
180 on it. If `new` returned an `Err(..)` then the followup call to `write_line`
181 will also return an error.
182
183 ## `try!`
184
185 Explicit pattern matching on `IoResult`s can get quite verbose, especially
186 when performing many I/O operations. Some examples (like those above) are
187 alleviated with extra methods implemented on `IoResult`, but others have more
188 complex interdependencies among each I/O operation.
189
190 The `try!` macro from `std::macros` is provided as a method of early-return
191 inside `Result`-returning functions. It expands to an early-return on `Err`
192 and otherwise unwraps the contained `Ok` value.
193
194 If you wanted to read several `u32`s from a file and return their product:
195
196 ```rust
197 use std::io::{File, IoResult};
198
199 fn file_product(p: &Path) -> IoResult<u32> {
200     let mut f = File::open(p);
201     let x1 = try!(f.read_le_u32());
202     let x2 = try!(f.read_le_u32());
203
204     Ok(x1 * x2)
205 }
206
207 match file_product(&Path::new("numbers.bin")) {
208     Ok(x) => println!("{}", x),
209     Err(e) => println!("Failed to read numbers!")
210 }
211 ```
212
213 With `try!` in `file_product`, each `read_le_u32` need not be directly
214 concerned with error handling; instead its caller is responsible for
215 responding to errors that may occur while attempting to read the numbers.
216
217 */
218
219 #![deny(unused_must_use)]
220
221 use char::Char;
222 use collections::Collection;
223 use fmt;
224 use int;
225 use iter::Iterator;
226 use libc;
227 use mem::transmute;
228 use ops::{BitOr, BitAnd, Sub, Not};
229 use option::{Option, Some, None};
230 use os;
231 use owned::Box;
232 use result::{Ok, Err, Result};
233 use rt::rtio;
234 use slice::{Vector, MutableVector, ImmutableVector};
235 use str::{Str, StrSlice, StrAllocating};
236 use str;
237 use string::String;
238 use uint;
239 use vec::Vec;
240
241 // Reexports
242 pub use self::stdio::stdin;
243 pub use self::stdio::stdout;
244 pub use self::stdio::stderr;
245 pub use self::stdio::print;
246 pub use self::stdio::println;
247
248 pub use self::fs::File;
249 pub use self::timer::Timer;
250 pub use self::net::ip::IpAddr;
251 pub use self::net::tcp::TcpListener;
252 pub use self::net::tcp::TcpStream;
253 pub use self::net::udp::UdpStream;
254 pub use self::pipe::PipeStream;
255 pub use self::process::{Process, Command};
256 pub use self::tempfile::TempDir;
257
258 pub use self::mem::{MemReader, BufReader, MemWriter, BufWriter};
259 pub use self::buffered::{BufferedReader, BufferedWriter, BufferedStream,
260                          LineBufferedWriter};
261 pub use self::comm_adapters::{ChanReader, ChanWriter};
262
263 // this comes first to get the iotest! macro
264 pub mod test;
265
266 mod buffered;
267 mod comm_adapters;
268 mod mem;
269 mod result;
270 mod tempfile;
271 pub mod extensions;
272 pub mod fs;
273 pub mod net;
274 pub mod pipe;
275 pub mod process;
276 pub mod signal;
277 pub mod stdio;
278 pub mod timer;
279 pub mod util;
280
281 /// The default buffer size for various I/O operations
282 // libuv recommends 64k buffers to maximize throughput
283 // https://groups.google.com/forum/#!topic/libuv/oQO1HJAIDdA
284 static DEFAULT_BUF_SIZE: uint = 1024 * 64;
285
286 /// A convenient typedef of the return value of any I/O action.
287 pub type IoResult<T> = Result<T, IoError>;
288
289 /// The type passed to I/O condition handlers to indicate error
290 ///
291 /// # FIXME
292 ///
293 /// Is something like this sufficient? It's kind of archaic
294 #[deriving(PartialEq, Clone)]
295 pub struct IoError {
296     /// An enumeration which can be matched against for determining the flavor
297     /// of error.
298     pub kind: IoErrorKind,
299     /// A human-readable description about the error
300     pub desc: &'static str,
301     /// Detailed information about this error, not always available
302     pub detail: Option<String>
303 }
304
305 impl IoError {
306     /// Convert an `errno` value into an `IoError`.
307     ///
308     /// If `detail` is `true`, the `detail` field of the `IoError`
309     /// struct is filled with an allocated string describing the error
310     /// in more detail, retrieved from the operating system.
311     pub fn from_errno(errno: uint, detail: bool) -> IoError {
312
313         #[cfg(windows)]
314         fn get_err(errno: i32) -> (IoErrorKind, &'static str) {
315             match errno {
316                 libc::EOF => (EndOfFile, "end of file"),
317                 libc::ERROR_NO_DATA => (BrokenPipe, "the pipe is being closed"),
318                 libc::ERROR_FILE_NOT_FOUND => (FileNotFound, "file not found"),
319                 libc::ERROR_INVALID_NAME => (InvalidInput, "invalid file name"),
320                 libc::WSAECONNREFUSED => (ConnectionRefused, "connection refused"),
321                 libc::WSAECONNRESET => (ConnectionReset, "connection reset"),
322                 libc::ERROR_ACCESS_DENIED | libc::WSAEACCES =>
323                     (PermissionDenied, "permission denied"),
324                 libc::WSAEWOULDBLOCK => {
325                     (ResourceUnavailable, "resource temporarily unavailable")
326                 }
327                 libc::WSAENOTCONN => (NotConnected, "not connected"),
328                 libc::WSAECONNABORTED => (ConnectionAborted, "connection aborted"),
329                 libc::WSAEADDRNOTAVAIL => (ConnectionRefused, "address not available"),
330                 libc::WSAEADDRINUSE => (ConnectionRefused, "address in use"),
331                 libc::ERROR_BROKEN_PIPE => (EndOfFile, "the pipe has ended"),
332                 libc::ERROR_OPERATION_ABORTED =>
333                     (TimedOut, "operation timed out"),
334                 libc::WSAEINVAL => (InvalidInput, "invalid argument"),
335                 libc::ERROR_CALL_NOT_IMPLEMENTED =>
336                     (IoUnavailable, "function not implemented"),
337                 libc::ERROR_INVALID_HANDLE =>
338                     (MismatchedFileTypeForOperation,
339                      "invalid handle provided to function"),
340                 libc::ERROR_NOTHING_TO_TERMINATE =>
341                     (InvalidInput, "no process to kill"),
342
343                 // libuv maps this error code to EISDIR. we do too. if it is found
344                 // to be incorrect, we can add in some more machinery to only
345                 // return this message when ERROR_INVALID_FUNCTION after certain
346                 // win32 calls.
347                 libc::ERROR_INVALID_FUNCTION => (InvalidInput,
348                                                  "illegal operation on a directory"),
349
350                 _ => (OtherIoError, "unknown error")
351             }
352         }
353
354         #[cfg(not(windows))]
355         fn get_err(errno: i32) -> (IoErrorKind, &'static str) {
356             // FIXME: this should probably be a bit more descriptive...
357             match errno {
358                 libc::EOF => (EndOfFile, "end of file"),
359                 libc::ECONNREFUSED => (ConnectionRefused, "connection refused"),
360                 libc::ECONNRESET => (ConnectionReset, "connection reset"),
361                 libc::EPERM | libc::EACCES =>
362                     (PermissionDenied, "permission denied"),
363                 libc::EPIPE => (BrokenPipe, "broken pipe"),
364                 libc::ENOTCONN => (NotConnected, "not connected"),
365                 libc::ECONNABORTED => (ConnectionAborted, "connection aborted"),
366                 libc::EADDRNOTAVAIL => (ConnectionRefused, "address not available"),
367                 libc::EADDRINUSE => (ConnectionRefused, "address in use"),
368                 libc::ENOENT => (FileNotFound, "no such file or directory"),
369                 libc::EISDIR => (InvalidInput, "illegal operation on a directory"),
370                 libc::ENOSYS => (IoUnavailable, "function not implemented"),
371                 libc::EINVAL => (InvalidInput, "invalid argument"),
372                 libc::ENOTTY =>
373                     (MismatchedFileTypeForOperation,
374                      "file descriptor is not a TTY"),
375                 libc::ETIMEDOUT => (TimedOut, "operation timed out"),
376                 libc::ECANCELED => (TimedOut, "operation aborted"),
377
378                 // These two constants can have the same value on some systems,
379                 // but different values on others, so we can't use a match
380                 // clause
381                 x if x == libc::EAGAIN || x == libc::EWOULDBLOCK =>
382                     (ResourceUnavailable, "resource temporarily unavailable"),
383
384                 _ => (OtherIoError, "unknown error")
385             }
386         }
387
388         let (kind, desc) = get_err(errno as i32);
389         IoError {
390             kind: kind,
391             desc: desc,
392             detail: if detail && kind == OtherIoError {
393                 Some(os::error_string(errno).as_slice().chars().map(|c| c.to_lowercase()).collect())
394             } else {
395                 None
396             },
397         }
398     }
399
400     /// Retrieve the last error to occur as a (detailed) IoError.
401     ///
402     /// This uses the OS `errno`, and so there should not be any task
403     /// descheduling or migration (other than that performed by the
404     /// operating system) between the call(s) for which errors are
405     /// being checked and the call of this function.
406     pub fn last_error() -> IoError {
407         IoError::from_errno(os::errno() as uint, true)
408     }
409
410     fn from_rtio_error(err: rtio::IoError) -> IoError {
411         let rtio::IoError { code, extra, detail } = err;
412         let mut ioerr = IoError::from_errno(code, false);
413         ioerr.detail = detail;
414         ioerr.kind = match ioerr.kind {
415             TimedOut if extra > 0 => ShortWrite(extra),
416             k => k,
417         };
418         return ioerr;
419     }
420 }
421
422 impl fmt::Show for IoError {
423     fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
424         match *self {
425             IoError { kind: OtherIoError, desc: "unknown error", detail: Some(ref detail) } =>
426                 write!(fmt, "{}", detail),
427             IoError { detail: None, desc, .. } =>
428                 write!(fmt, "{}", desc),
429             IoError { detail: Some(ref detail), desc, .. } =>
430                 write!(fmt, "{} ({})", desc, detail)
431         }
432     }
433 }
434
435 /// A list specifying general categories of I/O error.
436 #[deriving(PartialEq, Clone, Show)]
437 pub enum IoErrorKind {
438     /// Any I/O error not part of this list.
439     OtherIoError,
440     /// The operation could not complete because end of file was reached.
441     EndOfFile,
442     /// The file was not found.
443     FileNotFound,
444     /// The file permissions disallowed access to this file.
445     PermissionDenied,
446     /// A network connection failed for some reason not specified in this list.
447     ConnectionFailed,
448     /// The network operation failed because the network connection was closed.
449     Closed,
450     /// The connection was refused by the remote server.
451     ConnectionRefused,
452     /// The connection was reset by the remote server.
453     ConnectionReset,
454     /// The connection was aborted (terminated) by the remote server.
455     ConnectionAborted,
456     /// The network operation failed because it was not connected yet.
457     NotConnected,
458     /// The operation failed because a pipe was closed.
459     BrokenPipe,
460     /// A file already existed with that name.
461     PathAlreadyExists,
462     /// No file exists at that location.
463     PathDoesntExist,
464     /// The path did not specify the type of file that this operation required. For example,
465     /// attempting to copy a directory with the `fs::copy()` operation will fail with this error.
466     MismatchedFileTypeForOperation,
467     /// The operation temporarily failed (for example, because a signal was received), and retrying
468     /// may succeed.
469     ResourceUnavailable,
470     /// No I/O functionality is available for this task.
471     IoUnavailable,
472     /// A parameter was incorrect in a way that caused an I/O error not part of this list.
473     InvalidInput,
474     /// The I/O operation's timeout expired, causing it to be canceled.
475     TimedOut,
476     /// This write operation failed to write all of its data.
477     ///
478     /// Normally the write() method on a Writer guarantees that all of its data
479     /// has been written, but some operations may be terminated after only
480     /// partially writing some data. An example of this is a timed out write
481     /// which successfully wrote a known number of bytes, but bailed out after
482     /// doing so.
483     ///
484     /// The payload contained as part of this variant is the number of bytes
485     /// which are known to have been successfully written.
486     ShortWrite(uint),
487     /// The Reader returned 0 bytes from `read()` too many times.
488     NoProgress,
489 }
490
491 /// A trait that lets you add a `detail` to an IoError easily
492 trait UpdateIoError<T> {
493     /// Returns an IoError with updated description and detail
494     fn update_err(self, desc: &'static str, detail: |&IoError| -> String) -> Self;
495
496     /// Returns an IoError with updated detail
497     fn update_detail(self, detail: |&IoError| -> String) -> Self;
498
499     /// Returns an IoError with update description
500     fn update_desc(self, desc: &'static str) -> Self;
501 }
502
503 impl<T> UpdateIoError<T> for IoResult<T> {
504     fn update_err(self, desc: &'static str, detail: |&IoError| -> String) -> IoResult<T> {
505         self.map_err(|mut e| {
506             let detail = detail(&e);
507             e.desc = desc;
508             e.detail = Some(detail);
509             e
510         })
511     }
512
513     fn update_detail(self, detail: |&IoError| -> String) -> IoResult<T> {
514         self.map_err(|mut e| { e.detail = Some(detail(&e)); e })
515     }
516
517     fn update_desc(self, desc: &'static str) -> IoResult<T> {
518         self.map_err(|mut e| { e.desc = desc; e })
519     }
520 }
521
522 static NO_PROGRESS_LIMIT: uint = 1000;
523
524 /// A trait for objects which are byte-oriented streams. Readers are defined by
525 /// one method, `read`. This function will block until data is available,
526 /// filling in the provided buffer with any data read.
527 ///
528 /// Readers are intended to be composable with one another. Many objects
529 /// throughout the I/O and related libraries take and provide types which
530 /// implement the `Reader` trait.
531 pub trait Reader {
532
533     // Only method which need to get implemented for this trait
534
535     /// Read bytes, up to the length of `buf` and place them in `buf`.
536     /// Returns the number of bytes read. The number of bytes read may
537     /// be less than the number requested, even 0. Returns `Err` on EOF.
538     ///
539     /// # Error
540     ///
541     /// If an error occurs during this I/O operation, then it is returned as
542     /// `Err(IoError)`. Note that end-of-file is considered an error, and can be
543     /// inspected for in the error's `kind` field. Also note that reading 0
544     /// bytes is not considered an error in all circumstances
545     ///
546     /// # Implementation Note
547     ///
548     /// When implementing this method on a new Reader, you are strongly encouraged
549     /// not to return 0 if you can avoid it.
550     fn read(&mut self, buf: &mut [u8]) -> IoResult<uint>;
551
552     // Convenient helper methods based on the above methods
553
554     /// Reads at least `min` bytes and places them in `buf`.
555     /// Returns the number of bytes read.
556     ///
557     /// This will continue to call `read` until at least `min` bytes have been
558     /// read. If `read` returns 0 too many times, `NoProgress` will be
559     /// returned.
560     ///
561     /// # Error
562     ///
563     /// If an error occurs at any point, that error is returned, and no further
564     /// bytes are read.
565     fn read_at_least(&mut self, min: uint, buf: &mut [u8]) -> IoResult<uint> {
566         if min > buf.len() {
567             return Err(IoError {
568                 detail: Some("the buffer is too short".to_string()),
569                 ..standard_error(InvalidInput)
570             });
571         }
572         let mut read = 0;
573         while read < min {
574             let mut zeroes = 0;
575             loop {
576                 match self.read(buf.mut_slice_from(read)) {
577                     Ok(0) => {
578                         zeroes += 1;
579                         if zeroes >= NO_PROGRESS_LIMIT {
580                             return Err(standard_error(NoProgress));
581                         }
582                     }
583                     Ok(n) => {
584                         read += n;
585                         break;
586                     }
587                     err@Err(_) => return err
588                 }
589             }
590         }
591         Ok(read)
592     }
593
594     /// Reads a single byte. Returns `Err` on EOF.
595     fn read_byte(&mut self) -> IoResult<u8> {
596         let mut buf = [0];
597         try!(self.read_at_least(1, buf));
598         Ok(buf[0])
599     }
600
601     /// Reads up to `len` bytes and appends them to a vector.
602     /// Returns the number of bytes read. The number of bytes read may be
603     /// less than the number requested, even 0. Returns Err on EOF.
604     ///
605     /// # Error
606     ///
607     /// If an error occurs during this I/O operation, then it is returned
608     /// as `Err(IoError)`. See `read()` for more details.
609     fn push(&mut self, len: uint, buf: &mut Vec<u8>) -> IoResult<uint> {
610         let start_len = buf.len();
611         buf.reserve_additional(len);
612
613         let n = {
614             let s = unsafe { slice_vec_capacity(buf, start_len, start_len + len) };
615             try!(self.read(s))
616         };
617         unsafe { buf.set_len(start_len + n) };
618         Ok(n)
619     }
620
621     /// Reads at least `min` bytes, but no more than `len`, and appends them to
622     /// a vector.
623     /// Returns the number of bytes read.
624     ///
625     /// This will continue to call `read` until at least `min` bytes have been
626     /// read. If `read` returns 0 too many times, `NoProgress` will be
627     /// returned.
628     ///
629     /// # Error
630     ///
631     /// If an error occurs at any point, that error is returned, and no further
632     /// bytes are read.
633     fn push_at_least(&mut self, min: uint, len: uint, buf: &mut Vec<u8>) -> IoResult<uint> {
634         if min > len {
635             return Err(IoError {
636                 detail: Some("the buffer is too short".to_string()),
637                 ..standard_error(InvalidInput)
638             });
639         }
640
641         let start_len = buf.len();
642         buf.reserve_additional(len);
643
644         // we can't just use self.read_at_least(min, slice) because we need to push
645         // successful reads onto the vector before any returned errors.
646
647         let mut read = 0;
648         while read < min {
649             read += {
650                 let s = unsafe { slice_vec_capacity(buf, start_len + read, start_len + len) };
651                 try!(self.read_at_least(1, s))
652             };
653             unsafe { buf.set_len(start_len + read) };
654         }
655         Ok(read)
656     }
657
658     /// Reads exactly `len` bytes and gives you back a new vector of length
659     /// `len`
660     ///
661     /// # Error
662     ///
663     /// Fails with the same conditions as `read`. Additionally returns error
664     /// on EOF. Note that if an error is returned, then some number of bytes may
665     /// have already been consumed from the underlying reader, and they are lost
666     /// (not returned as part of the error). If this is unacceptable, then it is
667     /// recommended to use the `push_at_least` or `read` methods.
668     fn read_exact(&mut self, len: uint) -> IoResult<Vec<u8>> {
669         let mut buf = Vec::with_capacity(len);
670         match self.push_at_least(len, len, &mut buf) {
671             Ok(_) => Ok(buf),
672             Err(e) => Err(e),
673         }
674     }
675
676     /// Reads all remaining bytes from the stream.
677     ///
678     /// # Error
679     ///
680     /// Returns any non-EOF error immediately. Previously read bytes are
681     /// discarded when an error is returned.
682     ///
683     /// When EOF is encountered, all bytes read up to that point are returned.
684     fn read_to_end(&mut self) -> IoResult<Vec<u8>> {
685         let mut buf = Vec::with_capacity(DEFAULT_BUF_SIZE);
686         loop {
687             match self.push_at_least(1, DEFAULT_BUF_SIZE, &mut buf) {
688                 Ok(_) => {}
689                 Err(ref e) if e.kind == EndOfFile => break,
690                 Err(e) => return Err(e)
691             }
692         }
693         return Ok(buf);
694     }
695
696     /// Reads all of the remaining bytes of this stream, interpreting them as a
697     /// UTF-8 encoded stream. The corresponding string is returned.
698     ///
699     /// # Error
700     ///
701     /// This function returns all of the same errors as `read_to_end` with an
702     /// additional error if the reader's contents are not a valid sequence of
703     /// UTF-8 bytes.
704     fn read_to_str(&mut self) -> IoResult<String> {
705         self.read_to_end().and_then(|s| {
706             match str::from_utf8(s.as_slice()) {
707                 Some(s) => Ok(s.to_string()),
708                 None => Err(standard_error(InvalidInput)),
709             }
710         })
711     }
712
713     /// Create an iterator that reads a single byte on
714     /// each iteration, until EOF.
715     ///
716     /// # Error
717     ///
718     /// Any error other than `EndOfFile` that is produced by the underlying Reader
719     /// is returned by the iterator and should be handled by the caller.
720     fn bytes<'r>(&'r mut self) -> extensions::Bytes<'r, Self> {
721         extensions::Bytes::new(self)
722     }
723
724     // Byte conversion helpers
725
726     /// Reads `n` little-endian unsigned integer bytes.
727     ///
728     /// `n` must be between 1 and 8, inclusive.
729     fn read_le_uint_n(&mut self, nbytes: uint) -> IoResult<u64> {
730         assert!(nbytes > 0 && nbytes <= 8);
731
732         let mut val = 0u64;
733         let mut pos = 0;
734         let mut i = nbytes;
735         while i > 0 {
736             val += (try!(self.read_u8()) as u64) << pos;
737             pos += 8;
738             i -= 1;
739         }
740         Ok(val)
741     }
742
743     /// Reads `n` little-endian signed integer bytes.
744     ///
745     /// `n` must be between 1 and 8, inclusive.
746     fn read_le_int_n(&mut self, nbytes: uint) -> IoResult<i64> {
747         self.read_le_uint_n(nbytes).map(|i| extend_sign(i, nbytes))
748     }
749
750     /// Reads `n` big-endian unsigned integer bytes.
751     ///
752     /// `n` must be between 1 and 8, inclusive.
753     fn read_be_uint_n(&mut self, nbytes: uint) -> IoResult<u64> {
754         assert!(nbytes > 0 && nbytes <= 8);
755
756         let mut val = 0u64;
757         let mut i = nbytes;
758         while i > 0 {
759             i -= 1;
760             val += (try!(self.read_u8()) as u64) << i * 8;
761         }
762         Ok(val)
763     }
764
765     /// Reads `n` big-endian signed integer bytes.
766     ///
767     /// `n` must be between 1 and 8, inclusive.
768     fn read_be_int_n(&mut self, nbytes: uint) -> IoResult<i64> {
769         self.read_be_uint_n(nbytes).map(|i| extend_sign(i, nbytes))
770     }
771
772     /// Reads a little-endian unsigned integer.
773     ///
774     /// The number of bytes returned is system-dependent.
775     fn read_le_uint(&mut self) -> IoResult<uint> {
776         self.read_le_uint_n(uint::BYTES).map(|i| i as uint)
777     }
778
779     /// Reads a little-endian integer.
780     ///
781     /// The number of bytes returned is system-dependent.
782     fn read_le_int(&mut self) -> IoResult<int> {
783         self.read_le_int_n(int::BYTES).map(|i| i as int)
784     }
785
786     /// Reads a big-endian unsigned integer.
787     ///
788     /// The number of bytes returned is system-dependent.
789     fn read_be_uint(&mut self) -> IoResult<uint> {
790         self.read_be_uint_n(uint::BYTES).map(|i| i as uint)
791     }
792
793     /// Reads a big-endian integer.
794     ///
795     /// The number of bytes returned is system-dependent.
796     fn read_be_int(&mut self) -> IoResult<int> {
797         self.read_be_int_n(int::BYTES).map(|i| i as int)
798     }
799
800     /// Reads a big-endian `u64`.
801     ///
802     /// `u64`s are 8 bytes long.
803     fn read_be_u64(&mut self) -> IoResult<u64> {
804         self.read_be_uint_n(8)
805     }
806
807     /// Reads a big-endian `u32`.
808     ///
809     /// `u32`s are 4 bytes long.
810     fn read_be_u32(&mut self) -> IoResult<u32> {
811         self.read_be_uint_n(4).map(|i| i as u32)
812     }
813
814     /// Reads a big-endian `u16`.
815     ///
816     /// `u16`s are 2 bytes long.
817     fn read_be_u16(&mut self) -> IoResult<u16> {
818         self.read_be_uint_n(2).map(|i| i as u16)
819     }
820
821     /// Reads a big-endian `i64`.
822     ///
823     /// `i64`s are 8 bytes long.
824     fn read_be_i64(&mut self) -> IoResult<i64> {
825         self.read_be_int_n(8)
826     }
827
828     /// Reads a big-endian `i32`.
829     ///
830     /// `i32`s are 4 bytes long.
831     fn read_be_i32(&mut self) -> IoResult<i32> {
832         self.read_be_int_n(4).map(|i| i as i32)
833     }
834
835     /// Reads a big-endian `i16`.
836     ///
837     /// `i16`s are 2 bytes long.
838     fn read_be_i16(&mut self) -> IoResult<i16> {
839         self.read_be_int_n(2).map(|i| i as i16)
840     }
841
842     /// Reads a big-endian `f64`.
843     ///
844     /// `f64`s are 8 byte, IEEE754 double-precision floating point numbers.
845     fn read_be_f64(&mut self) -> IoResult<f64> {
846         self.read_be_u64().map(|i| unsafe {
847             transmute::<u64, f64>(i)
848         })
849     }
850
851     /// Reads a big-endian `f32`.
852     ///
853     /// `f32`s are 4 byte, IEEE754 single-precision floating point numbers.
854     fn read_be_f32(&mut self) -> IoResult<f32> {
855         self.read_be_u32().map(|i| unsafe {
856             transmute::<u32, f32>(i)
857         })
858     }
859
860     /// Reads a little-endian `u64`.
861     ///
862     /// `u64`s are 8 bytes long.
863     fn read_le_u64(&mut self) -> IoResult<u64> {
864         self.read_le_uint_n(8)
865     }
866
867     /// Reads a little-endian `u32`.
868     ///
869     /// `u32`s are 4 bytes long.
870     fn read_le_u32(&mut self) -> IoResult<u32> {
871         self.read_le_uint_n(4).map(|i| i as u32)
872     }
873
874     /// Reads a little-endian `u16`.
875     ///
876     /// `u16`s are 2 bytes long.
877     fn read_le_u16(&mut self) -> IoResult<u16> {
878         self.read_le_uint_n(2).map(|i| i as u16)
879     }
880
881     /// Reads a little-endian `i64`.
882     ///
883     /// `i64`s are 8 bytes long.
884     fn read_le_i64(&mut self) -> IoResult<i64> {
885         self.read_le_int_n(8)
886     }
887
888     /// Reads a little-endian `i32`.
889     ///
890     /// `i32`s are 4 bytes long.
891     fn read_le_i32(&mut self) -> IoResult<i32> {
892         self.read_le_int_n(4).map(|i| i as i32)
893     }
894
895     /// Reads a little-endian `i16`.
896     ///
897     /// `i16`s are 2 bytes long.
898     fn read_le_i16(&mut self) -> IoResult<i16> {
899         self.read_le_int_n(2).map(|i| i as i16)
900     }
901
902     /// Reads a little-endian `f64`.
903     ///
904     /// `f64`s are 8 byte, IEEE754 double-precision floating point numbers.
905     fn read_le_f64(&mut self) -> IoResult<f64> {
906         self.read_le_u64().map(|i| unsafe {
907             transmute::<u64, f64>(i)
908         })
909     }
910
911     /// Reads a little-endian `f32`.
912     ///
913     /// `f32`s are 4 byte, IEEE754 single-precision floating point numbers.
914     fn read_le_f32(&mut self) -> IoResult<f32> {
915         self.read_le_u32().map(|i| unsafe {
916             transmute::<u32, f32>(i)
917         })
918     }
919
920     /// Read a u8.
921     ///
922     /// `u8`s are 1 byte.
923     fn read_u8(&mut self) -> IoResult<u8> {
924         self.read_byte()
925     }
926
927     /// Read an i8.
928     ///
929     /// `i8`s are 1 byte.
930     fn read_i8(&mut self) -> IoResult<i8> {
931         self.read_byte().map(|i| i as i8)
932     }
933
934     /// Creates a wrapper around a mutable reference to the reader.
935     ///
936     /// This is useful to allow applying adaptors while still
937     /// retaining ownership of the original value.
938     fn by_ref<'a>(&'a mut self) -> RefReader<'a, Self> {
939         RefReader { inner: self }
940     }
941 }
942
943 impl Reader for Box<Reader> {
944     fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> { self.read(buf) }
945 }
946
947 impl<'a> Reader for &'a mut Reader {
948     fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> { self.read(buf) }
949 }
950
951 /// Returns a slice of `v` between `start` and `end`.
952 ///
953 /// Similar to `slice()` except this function only bounds the slice on the
954 /// capacity of `v`, not the length.
955 ///
956 /// # Failure
957 ///
958 /// Fails when `start` or `end` point outside the capacity of `v`, or when
959 /// `start` > `end`.
960 // Private function here because we aren't sure if we want to expose this as
961 // API yet. If so, it should be a method on Vec.
962 unsafe fn slice_vec_capacity<'a, T>(v: &'a mut Vec<T>, start: uint, end: uint) -> &'a mut [T] {
963     use raw::Slice;
964     use ptr::RawPtr;
965
966     assert!(start <= end);
967     assert!(end <= v.capacity());
968     transmute(Slice {
969         data: v.as_ptr().offset(start as int),
970         len: end - start
971     })
972 }
973
974 /// A `RefReader` is a struct implementing `Reader` which contains a reference
975 /// to another reader. This is often useful when composing streams.
976 ///
977 /// # Example
978 ///
979 /// ```
980 /// # fn main() {}
981 /// # fn process_input<R: Reader>(r: R) {}
982 /// # fn foo() {
983 /// use std::io;
984 /// use std::io::util::LimitReader;
985 ///
986 /// let mut stream = io::stdin();
987 ///
988 /// // Only allow the function to process at most one kilobyte of input
989 /// {
990 ///     let stream = LimitReader::new(stream.by_ref(), 1024);
991 ///     process_input(stream);
992 /// }
993 ///
994 /// // 'stream' is still available for use here
995 ///
996 /// # }
997 /// ```
998 pub struct RefReader<'a, R> {
999     /// The underlying reader which this is referencing
1000     inner: &'a mut R
1001 }
1002
1003 impl<'a, R: Reader> Reader for RefReader<'a, R> {
1004     fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> { self.inner.read(buf) }
1005 }
1006
1007 impl<'a, R: Buffer> Buffer for RefReader<'a, R> {
1008     fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> { self.inner.fill_buf() }
1009     fn consume(&mut self, amt: uint) { self.inner.consume(amt) }
1010 }
1011
1012 fn extend_sign(val: u64, nbytes: uint) -> i64 {
1013     let shift = (8 - nbytes) * 8;
1014     (val << shift) as i64 >> shift
1015 }
1016
1017 /// A trait for objects which are byte-oriented streams. Writers are defined by
1018 /// one method, `write`. This function will block until the provided buffer of
1019 /// bytes has been entirely written, and it will return any failures which occur.
1020 ///
1021 /// Another commonly overridden method is the `flush` method for writers such as
1022 /// buffered writers.
1023 ///
1024 /// Writers are intended to be composable with one another. Many objects
1025 /// throughout the I/O and related libraries take and provide types which
1026 /// implement the `Writer` trait.
1027 pub trait Writer {
1028     /// Write the entirety of a given buffer
1029     ///
1030     /// # Errors
1031     ///
1032     /// If an error happens during the I/O operation, the error is returned as
1033     /// `Err`. Note that it is considered an error if the entire buffer could
1034     /// not be written, and if an error is returned then it is unknown how much
1035     /// data (if any) was actually written.
1036     fn write(&mut self, buf: &[u8]) -> IoResult<()>;
1037
1038     /// Flush this output stream, ensuring that all intermediately buffered
1039     /// contents reach their destination.
1040     ///
1041     /// This is by default a no-op and implementers of the `Writer` trait should
1042     /// decide whether their stream needs to be buffered or not.
1043     fn flush(&mut self) -> IoResult<()> { Ok(()) }
1044
1045     /// Writes a formatted string into this writer, returning any error
1046     /// encountered.
1047     ///
1048     /// This method is primarily used to interface with the `format_args!`
1049     /// macro, but it is rare that this should explicitly be called. The
1050     /// `write!` macro should be favored to invoke this method instead.
1051     ///
1052     /// # Errors
1053     ///
1054     /// This function will return any I/O error reported while formatting.
1055     fn write_fmt(&mut self, fmt: &fmt::Arguments) -> IoResult<()> {
1056         // Create a shim which translates a Writer to a FormatWriter and saves
1057         // off I/O errors. instead of discarding them
1058         struct Adaptor<'a, T> {
1059             inner: &'a mut T,
1060             error: IoResult<()>,
1061         }
1062         impl<'a, T: Writer> fmt::FormatWriter for Adaptor<'a, T> {
1063             fn write(&mut self, bytes: &[u8]) -> fmt::Result {
1064                 match self.inner.write(bytes) {
1065                     Ok(()) => Ok(()),
1066                     Err(e) => {
1067                         self.error = Err(e);
1068                         Err(fmt::WriteError)
1069                     }
1070                 }
1071             }
1072         }
1073
1074         let mut output = Adaptor { inner: self, error: Ok(()) };
1075         match fmt::write(&mut output, fmt) {
1076             Ok(()) => Ok(()),
1077             Err(..) => output.error
1078         }
1079     }
1080
1081     /// Write a rust string into this sink.
1082     ///
1083     /// The bytes written will be the UTF-8 encoded version of the input string.
1084     /// If other encodings are desired, it is recommended to compose this stream
1085     /// with another performing the conversion, or to use `write` with a
1086     /// converted byte-array instead.
1087     fn write_str(&mut self, s: &str) -> IoResult<()> {
1088         self.write(s.as_bytes())
1089     }
1090
1091     /// Writes a string into this sink, and then writes a literal newline (`\n`)
1092     /// byte afterwards. Note that the writing of the newline is *not* atomic in
1093     /// the sense that the call to `write` is invoked twice (once with the
1094     /// string and once with a newline character).
1095     ///
1096     /// If other encodings or line ending flavors are desired, it is recommended
1097     /// that the `write` method is used specifically instead.
1098     fn write_line(&mut self, s: &str) -> IoResult<()> {
1099         self.write_str(s).and_then(|()| self.write(['\n' as u8]))
1100     }
1101
1102     /// Write a single char, encoded as UTF-8.
1103     fn write_char(&mut self, c: char) -> IoResult<()> {
1104         let mut buf = [0u8, ..4];
1105         let n = c.encode_utf8(buf.as_mut_slice());
1106         self.write(buf.slice_to(n))
1107     }
1108
1109     /// Write the result of passing n through `int::to_str_bytes`.
1110     fn write_int(&mut self, n: int) -> IoResult<()> {
1111         write!(self, "{:d}", n)
1112     }
1113
1114     /// Write the result of passing n through `uint::to_str_bytes`.
1115     fn write_uint(&mut self, n: uint) -> IoResult<()> {
1116         write!(self, "{:u}", n)
1117     }
1118
1119     /// Write a little-endian uint (number of bytes depends on system).
1120     fn write_le_uint(&mut self, n: uint) -> IoResult<()> {
1121         extensions::u64_to_le_bytes(n as u64, uint::BYTES, |v| self.write(v))
1122     }
1123
1124     /// Write a little-endian int (number of bytes depends on system).
1125     fn write_le_int(&mut self, n: int) -> IoResult<()> {
1126         extensions::u64_to_le_bytes(n as u64, int::BYTES, |v| self.write(v))
1127     }
1128
1129     /// Write a big-endian uint (number of bytes depends on system).
1130     fn write_be_uint(&mut self, n: uint) -> IoResult<()> {
1131         extensions::u64_to_be_bytes(n as u64, uint::BYTES, |v| self.write(v))
1132     }
1133
1134     /// Write a big-endian int (number of bytes depends on system).
1135     fn write_be_int(&mut self, n: int) -> IoResult<()> {
1136         extensions::u64_to_be_bytes(n as u64, int::BYTES, |v| self.write(v))
1137     }
1138
1139     /// Write a big-endian u64 (8 bytes).
1140     fn write_be_u64(&mut self, n: u64) -> IoResult<()> {
1141         extensions::u64_to_be_bytes(n, 8u, |v| self.write(v))
1142     }
1143
1144     /// Write a big-endian u32 (4 bytes).
1145     fn write_be_u32(&mut self, n: u32) -> IoResult<()> {
1146         extensions::u64_to_be_bytes(n as u64, 4u, |v| self.write(v))
1147     }
1148
1149     /// Write a big-endian u16 (2 bytes).
1150     fn write_be_u16(&mut self, n: u16) -> IoResult<()> {
1151         extensions::u64_to_be_bytes(n as u64, 2u, |v| self.write(v))
1152     }
1153
1154     /// Write a big-endian i64 (8 bytes).
1155     fn write_be_i64(&mut self, n: i64) -> IoResult<()> {
1156         extensions::u64_to_be_bytes(n as u64, 8u, |v| self.write(v))
1157     }
1158
1159     /// Write a big-endian i32 (4 bytes).
1160     fn write_be_i32(&mut self, n: i32) -> IoResult<()> {
1161         extensions::u64_to_be_bytes(n as u64, 4u, |v| self.write(v))
1162     }
1163
1164     /// Write a big-endian i16 (2 bytes).
1165     fn write_be_i16(&mut self, n: i16) -> IoResult<()> {
1166         extensions::u64_to_be_bytes(n as u64, 2u, |v| self.write(v))
1167     }
1168
1169     /// Write a big-endian IEEE754 double-precision floating-point (8 bytes).
1170     fn write_be_f64(&mut self, f: f64) -> IoResult<()> {
1171         unsafe {
1172             self.write_be_u64(transmute(f))
1173         }
1174     }
1175
1176     /// Write a big-endian IEEE754 single-precision floating-point (4 bytes).
1177     fn write_be_f32(&mut self, f: f32) -> IoResult<()> {
1178         unsafe {
1179             self.write_be_u32(transmute(f))
1180         }
1181     }
1182
1183     /// Write a little-endian u64 (8 bytes).
1184     fn write_le_u64(&mut self, n: u64) -> IoResult<()> {
1185         extensions::u64_to_le_bytes(n, 8u, |v| self.write(v))
1186     }
1187
1188     /// Write a little-endian u32 (4 bytes).
1189     fn write_le_u32(&mut self, n: u32) -> IoResult<()> {
1190         extensions::u64_to_le_bytes(n as u64, 4u, |v| self.write(v))
1191     }
1192
1193     /// Write a little-endian u16 (2 bytes).
1194     fn write_le_u16(&mut self, n: u16) -> IoResult<()> {
1195         extensions::u64_to_le_bytes(n as u64, 2u, |v| self.write(v))
1196     }
1197
1198     /// Write a little-endian i64 (8 bytes).
1199     fn write_le_i64(&mut self, n: i64) -> IoResult<()> {
1200         extensions::u64_to_le_bytes(n as u64, 8u, |v| self.write(v))
1201     }
1202
1203     /// Write a little-endian i32 (4 bytes).
1204     fn write_le_i32(&mut self, n: i32) -> IoResult<()> {
1205         extensions::u64_to_le_bytes(n as u64, 4u, |v| self.write(v))
1206     }
1207
1208     /// Write a little-endian i16 (2 bytes).
1209     fn write_le_i16(&mut self, n: i16) -> IoResult<()> {
1210         extensions::u64_to_le_bytes(n as u64, 2u, |v| self.write(v))
1211     }
1212
1213     /// Write a little-endian IEEE754 double-precision floating-point
1214     /// (8 bytes).
1215     fn write_le_f64(&mut self, f: f64) -> IoResult<()> {
1216         unsafe {
1217             self.write_le_u64(transmute(f))
1218         }
1219     }
1220
1221     /// Write a little-endian IEEE754 single-precision floating-point
1222     /// (4 bytes).
1223     fn write_le_f32(&mut self, f: f32) -> IoResult<()> {
1224         unsafe {
1225             self.write_le_u32(transmute(f))
1226         }
1227     }
1228
1229     /// Write a u8 (1 byte).
1230     fn write_u8(&mut self, n: u8) -> IoResult<()> {
1231         self.write([n])
1232     }
1233
1234     /// Write an i8 (1 byte).
1235     fn write_i8(&mut self, n: i8) -> IoResult<()> {
1236         self.write([n as u8])
1237     }
1238
1239     /// Creates a wrapper around a mutable reference to the writer.
1240     ///
1241     /// This is useful to allow applying wrappers while still
1242     /// retaining ownership of the original value.
1243     fn by_ref<'a>(&'a mut self) -> RefWriter<'a, Self> {
1244         RefWriter { inner: self }
1245     }
1246 }
1247
1248 impl Writer for Box<Writer> {
1249     fn write(&mut self, buf: &[u8]) -> IoResult<()> { self.write(buf) }
1250     fn flush(&mut self) -> IoResult<()> { self.flush() }
1251 }
1252
1253 impl<'a> Writer for &'a mut Writer {
1254     fn write(&mut self, buf: &[u8]) -> IoResult<()> { self.write(buf) }
1255     fn flush(&mut self) -> IoResult<()> { self.flush() }
1256 }
1257
1258 /// A `RefWriter` is a struct implementing `Writer` which contains a reference
1259 /// to another writer. This is often useful when composing streams.
1260 ///
1261 /// # Example
1262 ///
1263 /// ```
1264 /// # fn main() {}
1265 /// # fn process_input<R: Reader>(r: R) {}
1266 /// # fn foo () {
1267 /// use std::io::util::TeeReader;
1268 /// use std::io::{stdin, MemWriter};
1269 ///
1270 /// let mut output = MemWriter::new();
1271 ///
1272 /// {
1273 ///     // Don't give ownership of 'output' to the 'tee'. Instead we keep a
1274 ///     // handle to it in the outer scope
1275 ///     let mut tee = TeeReader::new(stdin(), output.by_ref());
1276 ///     process_input(tee);
1277 /// }
1278 ///
1279 /// println!("input processed: {}", output.unwrap());
1280 /// # }
1281 /// ```
1282 pub struct RefWriter<'a, W> {
1283     /// The underlying writer which this is referencing
1284     inner: &'a mut W
1285 }
1286
1287 impl<'a, W: Writer> Writer for RefWriter<'a, W> {
1288     fn write(&mut self, buf: &[u8]) -> IoResult<()> { self.inner.write(buf) }
1289     fn flush(&mut self) -> IoResult<()> { self.inner.flush() }
1290 }
1291
1292
1293 /// A Stream is a readable and a writable object. Data written is typically
1294 /// received by the object which reads receive data from.
1295 pub trait Stream: Reader + Writer { }
1296
1297 impl<T: Reader + Writer> Stream for T {}
1298
1299 /// An iterator that reads a line on each iteration,
1300 /// until `.read_line()` encounters `EndOfFile`.
1301 ///
1302 /// # Notes about the Iteration Protocol
1303 ///
1304 /// The `Lines` may yield `None` and thus terminate
1305 /// an iteration, but continue to yield elements if iteration
1306 /// is attempted again.
1307 ///
1308 /// # Error
1309 ///
1310 /// Any error other than `EndOfFile` that is produced by the underlying Reader
1311 /// is returned by the iterator and should be handled by the caller.
1312 pub struct Lines<'r, T> {
1313     buffer: &'r mut T,
1314 }
1315
1316 impl<'r, T: Buffer> Iterator<IoResult<String>> for Lines<'r, T> {
1317     fn next(&mut self) -> Option<IoResult<String>> {
1318         match self.buffer.read_line() {
1319             Ok(x) => Some(Ok(x)),
1320             Err(IoError { kind: EndOfFile, ..}) => None,
1321             Err(y) => Some(Err(y))
1322         }
1323     }
1324 }
1325
1326 /// An iterator that reads a utf8-encoded character on each iteration,
1327 /// until `.read_char()` encounters `EndOfFile`.
1328 ///
1329 /// # Notes about the Iteration Protocol
1330 ///
1331 /// The `Chars` may yield `None` and thus terminate
1332 /// an iteration, but continue to yield elements if iteration
1333 /// is attempted again.
1334 ///
1335 /// # Error
1336 ///
1337 /// Any error other than `EndOfFile` that is produced by the underlying Reader
1338 /// is returned by the iterator and should be handled by the caller.
1339 pub struct Chars<'r, T> {
1340     buffer: &'r mut T
1341 }
1342
1343 impl<'r, T: Buffer> Iterator<IoResult<char>> for Chars<'r, T> {
1344     fn next(&mut self) -> Option<IoResult<char>> {
1345         match self.buffer.read_char() {
1346             Ok(x) => Some(Ok(x)),
1347             Err(IoError { kind: EndOfFile, ..}) => None,
1348             Err(y) => Some(Err(y))
1349         }
1350     }
1351 }
1352
1353 /// A Buffer is a type of reader which has some form of internal buffering to
1354 /// allow certain kinds of reading operations to be more optimized than others.
1355 /// This type extends the `Reader` trait with a few methods that are not
1356 /// possible to reasonably implement with purely a read interface.
1357 pub trait Buffer: Reader {
1358     /// Fills the internal buffer of this object, returning the buffer contents.
1359     /// Note that none of the contents will be "read" in the sense that later
1360     /// calling `read` may return the same contents.
1361     ///
1362     /// The `consume` function must be called with the number of bytes that are
1363     /// consumed from this buffer returned to ensure that the bytes are never
1364     /// returned twice.
1365     ///
1366     /// # Error
1367     ///
1368     /// This function will return an I/O error if the underlying reader was
1369     /// read, but returned an error. Note that it is not an error to return a
1370     /// 0-length buffer.
1371     fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]>;
1372
1373     /// Tells this buffer that `amt` bytes have been consumed from the buffer,
1374     /// so they should no longer be returned in calls to `read`.
1375     fn consume(&mut self, amt: uint);
1376
1377     /// Reads the next line of input, interpreted as a sequence of UTF-8
1378     /// encoded unicode codepoints. If a newline is encountered, then the
1379     /// newline is contained in the returned string.
1380     ///
1381     /// # Example
1382     ///
1383     /// ```rust
1384     /// use std::io;
1385     ///
1386     /// let mut reader = io::stdin();
1387     /// let input = reader.read_line().ok().unwrap_or("nothing".to_string());
1388     /// ```
1389     ///
1390     /// # Error
1391     ///
1392     /// This function has the same error semantics as `read_until`:
1393     ///
1394     /// * All non-EOF errors will be returned immediately
1395     /// * If an error is returned previously consumed bytes are lost
1396     /// * EOF is only returned if no bytes have been read
1397     /// * Reach EOF may mean that the delimiter is not present in the return
1398     ///   value
1399     ///
1400     /// Additionally, this function can fail if the line of input read is not a
1401     /// valid UTF-8 sequence of bytes.
1402     fn read_line(&mut self) -> IoResult<String> {
1403         self.read_until('\n' as u8).and_then(|line|
1404             match str::from_utf8(line.as_slice()) {
1405                 Some(s) => Ok(s.to_string()),
1406                 None => Err(standard_error(InvalidInput)),
1407             }
1408         )
1409     }
1410
1411     /// Create an iterator that reads a line on each iteration until EOF.
1412     ///
1413     /// # Error
1414     ///
1415     /// Any error other than `EndOfFile` that is produced by the underlying Reader
1416     /// is returned by the iterator and should be handled by the caller.
1417     fn lines<'r>(&'r mut self) -> Lines<'r, Self> {
1418         Lines { buffer: self }
1419     }
1420
1421     /// Reads a sequence of bytes leading up to a specified delimiter. Once the
1422     /// specified byte is encountered, reading ceases and the bytes up to and
1423     /// including the delimiter are returned.
1424     ///
1425     /// # Error
1426     ///
1427     /// If any I/O error is encountered other than EOF, the error is immediately
1428     /// returned. Note that this may discard bytes which have already been read,
1429     /// and those bytes will *not* be returned. It is recommended to use other
1430     /// methods if this case is worrying.
1431     ///
1432     /// If EOF is encountered, then this function will return EOF if 0 bytes
1433     /// have been read, otherwise the pending byte buffer is returned. This
1434     /// is the reason that the byte buffer returned may not always contain the
1435     /// delimiter.
1436     fn read_until(&mut self, byte: u8) -> IoResult<Vec<u8>> {
1437         let mut res = Vec::new();
1438
1439         let mut used;
1440         loop {
1441             {
1442                 let available = match self.fill_buf() {
1443                     Ok(n) => n,
1444                     Err(ref e) if res.len() > 0 && e.kind == EndOfFile => {
1445                         used = 0;
1446                         break
1447                     }
1448                     Err(e) => return Err(e)
1449                 };
1450                 match available.iter().position(|&b| b == byte) {
1451                     Some(i) => {
1452                         res.push_all(available.slice_to(i + 1));
1453                         used = i + 1;
1454                         break
1455                     }
1456                     None => {
1457                         res.push_all(available);
1458                         used = available.len();
1459                     }
1460                 }
1461             }
1462             self.consume(used);
1463         }
1464         self.consume(used);
1465         Ok(res)
1466     }
1467
1468     /// Reads the next utf8-encoded character from the underlying stream.
1469     ///
1470     /// # Error
1471     ///
1472     /// If an I/O error occurs, or EOF, then this function will return `Err`.
1473     /// This function will also return error if the stream does not contain a
1474     /// valid utf-8 encoded codepoint as the next few bytes in the stream.
1475     fn read_char(&mut self) -> IoResult<char> {
1476         let first_byte = try!(self.read_byte());
1477         let width = str::utf8_char_width(first_byte);
1478         if width == 1 { return Ok(first_byte as char) }
1479         if width == 0 { return Err(standard_error(InvalidInput)) } // not utf8
1480         let mut buf = [first_byte, 0, 0, 0];
1481         {
1482             let mut start = 1;
1483             while start < width {
1484                 match try!(self.read(buf.mut_slice(start, width))) {
1485                     n if n == width - start => break,
1486                     n if n < width - start => { start += n; }
1487                     _ => return Err(standard_error(InvalidInput)),
1488                 }
1489             }
1490         }
1491         match str::from_utf8(buf.slice_to(width)) {
1492             Some(s) => Ok(s.char_at(0)),
1493             None => Err(standard_error(InvalidInput))
1494         }
1495     }
1496
1497     /// Create an iterator that reads a utf8-encoded character on each iteration
1498     /// until EOF.
1499     ///
1500     /// # Error
1501     ///
1502     /// Any error other than `EndOfFile` that is produced by the underlying Reader
1503     /// is returned by the iterator and should be handled by the caller.
1504     fn chars<'r>(&'r mut self) -> Chars<'r, Self> {
1505         Chars { buffer: self }
1506     }
1507 }
1508
1509 /// When seeking, the resulting cursor is offset from a base by the offset given
1510 /// to the `seek` function. The base used is specified by this enumeration.
1511 pub enum SeekStyle {
1512     /// Seek from the beginning of the stream
1513     SeekSet,
1514     /// Seek from the end of the stream
1515     SeekEnd,
1516     /// Seek from the current position
1517     SeekCur,
1518 }
1519
1520 /// An object implementing `Seek` internally has some form of cursor which can
1521 /// be moved within a stream of bytes. The stream typically has a fixed size,
1522 /// allowing seeking relative to either end.
1523 pub trait Seek {
1524     /// Return position of file cursor in the stream
1525     fn tell(&self) -> IoResult<u64>;
1526
1527     /// Seek to an offset in a stream
1528     ///
1529     /// A successful seek clears the EOF indicator. Seeking beyond EOF is
1530     /// allowed, but seeking before position 0 is not allowed.
1531     ///
1532     /// # Errors
1533     ///
1534     /// * Seeking to a negative offset is considered an error
1535     /// * Seeking past the end of the stream does not modify the underlying
1536     ///   stream, but the next write may cause the previous data to be filled in
1537     ///   with a bit pattern.
1538     fn seek(&mut self, pos: i64, style: SeekStyle) -> IoResult<()>;
1539 }
1540
1541 /// A listener is a value that can consume itself to start listening for
1542 /// connections.
1543 ///
1544 /// Doing so produces some sort of Acceptor.
1545 pub trait Listener<T, A: Acceptor<T>> {
1546     /// Spin up the listener and start queuing incoming connections
1547     ///
1548     /// # Error
1549     ///
1550     /// Returns `Err` if this listener could not be bound to listen for
1551     /// connections. In all cases, this listener is consumed.
1552     fn listen(self) -> IoResult<A>;
1553 }
1554
1555 /// An acceptor is a value that presents incoming connections
1556 pub trait Acceptor<T> {
1557     /// Wait for and accept an incoming connection
1558     ///
1559     /// # Error
1560     ///
1561     /// Returns `Err` if an I/O error is encountered.
1562     fn accept(&mut self) -> IoResult<T>;
1563
1564     /// Create an iterator over incoming connection attempts.
1565     ///
1566     /// Note that I/O errors will be yielded by the iterator itself.
1567     fn incoming<'r>(&'r mut self) -> IncomingConnections<'r, Self> {
1568         IncomingConnections { inc: self }
1569     }
1570 }
1571
1572 /// An infinite iterator over incoming connection attempts.
1573 /// Calling `next` will block the task until a connection is attempted.
1574 ///
1575 /// Since connection attempts can continue forever, this iterator always returns
1576 /// `Some`. The `Some` contains the `IoResult` representing whether the
1577 /// connection attempt was successful.  A successful connection will be wrapped
1578 /// in `Ok`. A failed connection is represented as an `Err`.
1579 pub struct IncomingConnections<'a, A> {
1580     inc: &'a mut A,
1581 }
1582
1583 impl<'a, T, A: Acceptor<T>> Iterator<IoResult<T>> for IncomingConnections<'a, A> {
1584     fn next(&mut self) -> Option<IoResult<T>> {
1585         Some(self.inc.accept())
1586     }
1587 }
1588
1589 /// Creates a standard error for a commonly used flavor of error. The `detail`
1590 /// field of the returned error will always be `None`.
1591 ///
1592 /// # Example
1593 ///
1594 /// ```
1595 /// use std::io;
1596 ///
1597 /// let eof = io::standard_error(io::EndOfFile);
1598 /// let einval = io::standard_error(io::InvalidInput);
1599 /// ```
1600 pub fn standard_error(kind: IoErrorKind) -> IoError {
1601     let desc = match kind {
1602         EndOfFile => "end of file",
1603         IoUnavailable => "I/O is unavailable",
1604         InvalidInput => "invalid input",
1605         OtherIoError => "unknown I/O error",
1606         FileNotFound => "file not found",
1607         PermissionDenied => "permission denied",
1608         ConnectionFailed => "connection failed",
1609         Closed => "stream is closed",
1610         ConnectionRefused => "connection refused",
1611         ConnectionReset => "connection reset",
1612         ConnectionAborted => "connection aborted",
1613         NotConnected => "not connected",
1614         BrokenPipe => "broken pipe",
1615         PathAlreadyExists => "file already exists",
1616         PathDoesntExist => "no such file",
1617         MismatchedFileTypeForOperation => "mismatched file type",
1618         ResourceUnavailable => "resource unavailable",
1619         TimedOut => "operation timed out",
1620         ShortWrite(..) => "short write",
1621         NoProgress => "no progress",
1622     };
1623     IoError {
1624         kind: kind,
1625         desc: desc,
1626         detail: None,
1627     }
1628 }
1629
1630 /// A mode specifies how a file should be opened or created. These modes are
1631 /// passed to `File::open_mode` and are used to control where the file is
1632 /// positioned when it is initially opened.
1633 pub enum FileMode {
1634     /// Opens a file positioned at the beginning.
1635     Open,
1636     /// Opens a file positioned at EOF.
1637     Append,
1638     /// Opens a file, truncating it if it already exists.
1639     Truncate,
1640 }
1641
1642 /// Access permissions with which the file should be opened. `File`s
1643 /// opened with `Read` will return an error if written to.
1644 pub enum FileAccess {
1645     /// Read-only access, requests to write will result in an error
1646     Read,
1647     /// Write-only access, requests to read will result in an error
1648     Write,
1649     /// Read-write access, no requests are denied by default
1650     ReadWrite,
1651 }
1652
1653 /// Different kinds of files which can be identified by a call to stat
1654 #[deriving(PartialEq, Show, Hash)]
1655 pub enum FileType {
1656     /// This is a normal file, corresponding to `S_IFREG`
1657     TypeFile,
1658
1659     /// This file is a directory, corresponding to `S_IFDIR`
1660     TypeDirectory,
1661
1662     /// This file is a named pipe, corresponding to `S_IFIFO`
1663     TypeNamedPipe,
1664
1665     /// This file is a block device, corresponding to `S_IFBLK`
1666     TypeBlockSpecial,
1667
1668     /// This file is a symbolic link to another file, corresponding to `S_IFLNK`
1669     TypeSymlink,
1670
1671     /// The type of this file is not recognized as one of the other categories
1672     TypeUnknown,
1673 }
1674
1675 /// A structure used to describe metadata information about a file. This
1676 /// structure is created through the `stat` method on a `Path`.
1677 ///
1678 /// # Example
1679 ///
1680 /// ```
1681 /// # fn main() {}
1682 /// # fn foo() {
1683 /// let info = match Path::new("foo.txt").stat() {
1684 ///     Ok(stat) => stat,
1685 ///     Err(e) => fail!("couldn't read foo.txt: {}", e),
1686 /// };
1687 ///
1688 /// println!("byte size: {}", info.size);
1689 /// # }
1690 /// ```
1691 #[deriving(Hash)]
1692 pub struct FileStat {
1693     /// The size of the file, in bytes
1694     pub size: u64,
1695     /// The kind of file this path points to (directory, file, pipe, etc.)
1696     pub kind: FileType,
1697     /// The file permissions currently on the file
1698     pub perm: FilePermission,
1699
1700     // FIXME(#10301): These time fields are pretty useless without an actual
1701     //                time representation, what are the milliseconds relative
1702     //                to?
1703
1704     /// The time that the file was created at, in platform-dependent
1705     /// milliseconds
1706     pub created: u64,
1707     /// The time that this file was last modified, in platform-dependent
1708     /// milliseconds
1709     pub modified: u64,
1710     /// The time that this file was last accessed, in platform-dependent
1711     /// milliseconds
1712     pub accessed: u64,
1713
1714     /// Information returned by stat() which is not guaranteed to be
1715     /// platform-independent. This information may be useful on some platforms,
1716     /// but it may have different meanings or no meaning at all on other
1717     /// platforms.
1718     ///
1719     /// Usage of this field is discouraged, but if access is desired then the
1720     /// fields are located here.
1721     #[unstable]
1722     pub unstable: UnstableFileStat,
1723 }
1724
1725 /// This structure represents all of the possible information which can be
1726 /// returned from a `stat` syscall which is not contained in the `FileStat`
1727 /// structure. This information is not necessarily platform independent, and may
1728 /// have different meanings or no meaning at all on some platforms.
1729 #[unstable]
1730 #[deriving(Hash)]
1731 pub struct UnstableFileStat {
1732     /// The ID of the device containing the file.
1733     pub device: u64,
1734     /// The file serial number.
1735     pub inode: u64,
1736     /// The device ID.
1737     pub rdev: u64,
1738     /// The number of hard links to this file.
1739     pub nlink: u64,
1740     /// The user ID of the file.
1741     pub uid: u64,
1742     /// The group ID of the file.
1743     pub gid: u64,
1744     /// The optimal block size for I/O.
1745     pub blksize: u64,
1746     /// The blocks allocated for this file.
1747     pub blocks: u64,
1748     /// User-defined flags for the file.
1749     pub flags: u64,
1750     /// The file generation number.
1751     pub gen: u64,
1752 }
1753
1754 bitflags!(
1755     #[doc="A set of permissions for a file or directory is represented
1756 by a set of flags which are or'd together."]
1757     #[deriving(Hash)]
1758     #[deriving(Show)]
1759     flags FilePermission: u32 {
1760         static UserRead     = 0o400,
1761         static UserWrite    = 0o200,
1762         static UserExecute  = 0o100,
1763         static GroupRead    = 0o040,
1764         static GroupWrite   = 0o020,
1765         static GroupExecute = 0o010,
1766         static OtherRead    = 0o004,
1767         static OtherWrite   = 0o002,
1768         static OtherExecute = 0o001,
1769
1770         static UserRWX  = UserRead.bits | UserWrite.bits | UserExecute.bits,
1771         static GroupRWX = GroupRead.bits | GroupWrite.bits | GroupExecute.bits,
1772         static OtherRWX = OtherRead.bits | OtherWrite.bits | OtherExecute.bits,
1773
1774         #[doc="Permissions for user owned files, equivalent to 0644 on
1775 unix-like systems."]
1776         static UserFile = UserRead.bits | UserWrite.bits | GroupRead.bits | OtherRead.bits,
1777
1778         #[doc="Permissions for user owned directories, equivalent to 0755 on
1779 unix-like systems."]
1780         static UserDir  = UserRWX.bits | GroupRead.bits | GroupExecute.bits |
1781                    OtherRead.bits | OtherExecute.bits,
1782
1783         #[doc="Permissions for user owned executables, equivalent to 0755
1784 on unix-like systems."]
1785         static UserExec = UserDir.bits,
1786
1787         #[doc="All possible permissions enabled."]
1788         static AllPermissions = UserRWX.bits | GroupRWX.bits | OtherRWX.bits
1789     }
1790 )
1791
1792 #[cfg(test)]
1793 mod tests {
1794     use super::{IoResult, Reader, MemReader, NoProgress, InvalidInput};
1795     use prelude::*;
1796     use uint;
1797
1798     #[deriving(Clone, PartialEq, Show)]
1799     enum BadReaderBehavior {
1800         GoodBehavior(uint),
1801         BadBehavior(uint)
1802     }
1803
1804     struct BadReader<T> {
1805         r: T,
1806         behavior: Vec<BadReaderBehavior>,
1807     }
1808
1809     impl<T: Reader> BadReader<T> {
1810         fn new(r: T, behavior: Vec<BadReaderBehavior>) -> BadReader<T> {
1811             BadReader { behavior: behavior, r: r }
1812         }
1813     }
1814
1815     impl<T: Reader> Reader for BadReader<T> {
1816         fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
1817             let BadReader { ref mut behavior, ref mut r } = *self;
1818             loop {
1819                 if behavior.is_empty() {
1820                     // fall back on good
1821                     return r.read(buf);
1822                 }
1823                 match behavior.as_mut_slice()[0] {
1824                     GoodBehavior(0) => (),
1825                     GoodBehavior(ref mut x) => {
1826                         *x -= 1;
1827                         return r.read(buf);
1828                     }
1829                     BadBehavior(0) => (),
1830                     BadBehavior(ref mut x) => {
1831                         *x -= 1;
1832                         return Ok(0);
1833                     }
1834                 };
1835                 behavior.shift();
1836             }
1837         }
1838     }
1839
1840     #[test]
1841     fn test_read_at_least() {
1842         let mut r = BadReader::new(MemReader::new(Vec::from_slice(bytes!("hello, world!"))),
1843                                    Vec::from_slice([GoodBehavior(uint::MAX)]));
1844         let mut buf = [0u8, ..5];
1845         assert!(r.read_at_least(1, buf).unwrap() >= 1);
1846         assert!(r.read_exact(5).unwrap().len() == 5); // read_exact uses read_at_least
1847         assert!(r.read_at_least(0, buf).is_ok());
1848
1849         let mut r = BadReader::new(MemReader::new(Vec::from_slice(bytes!("hello, world!"))),
1850                                    Vec::from_slice([BadBehavior(50), GoodBehavior(uint::MAX)]));
1851         assert!(r.read_at_least(1, buf).unwrap() >= 1);
1852
1853         let mut r = BadReader::new(MemReader::new(Vec::from_slice(bytes!("hello, world!"))),
1854                                    Vec::from_slice([BadBehavior(1), GoodBehavior(1),
1855                                                     BadBehavior(50), GoodBehavior(uint::MAX)]));
1856         assert!(r.read_at_least(1, buf).unwrap() >= 1);
1857         assert!(r.read_at_least(1, buf).unwrap() >= 1);
1858
1859         let mut r = BadReader::new(MemReader::new(Vec::from_slice(bytes!("hello, world!"))),
1860                                    Vec::from_slice([BadBehavior(uint::MAX)]));
1861         assert_eq!(r.read_at_least(1, buf).unwrap_err().kind, NoProgress);
1862
1863         let mut r = MemReader::new(Vec::from_slice(bytes!("hello, world!")));
1864         assert_eq!(r.read_at_least(5, buf).unwrap(), 5);
1865         assert_eq!(r.read_at_least(6, buf).unwrap_err().kind, InvalidInput);
1866     }
1867
1868     #[test]
1869     fn test_push_at_least() {
1870         let mut r = BadReader::new(MemReader::new(Vec::from_slice(bytes!("hello, world!"))),
1871                                    Vec::from_slice([GoodBehavior(uint::MAX)]));
1872         let mut buf = Vec::new();
1873         assert!(r.push_at_least(1, 5, &mut buf).unwrap() >= 1);
1874         assert!(r.push_at_least(0, 5, &mut buf).is_ok());
1875
1876         let mut r = BadReader::new(MemReader::new(Vec::from_slice(bytes!("hello, world!"))),
1877                                    Vec::from_slice([BadBehavior(50), GoodBehavior(uint::MAX)]));
1878         assert!(r.push_at_least(1, 5, &mut buf).unwrap() >= 1);
1879
1880         let mut r = BadReader::new(MemReader::new(Vec::from_slice(bytes!("hello, world!"))),
1881                                    Vec::from_slice([BadBehavior(1), GoodBehavior(1),
1882                                                     BadBehavior(50), GoodBehavior(uint::MAX)]));
1883         assert!(r.push_at_least(1, 5, &mut buf).unwrap() >= 1);
1884         assert!(r.push_at_least(1, 5, &mut buf).unwrap() >= 1);
1885
1886         let mut r = BadReader::new(MemReader::new(Vec::from_slice(bytes!("hello, world!"))),
1887                                    Vec::from_slice([BadBehavior(uint::MAX)]));
1888         assert_eq!(r.push_at_least(1, 5, &mut buf).unwrap_err().kind, NoProgress);
1889
1890         let mut r = MemReader::new(Vec::from_slice(bytes!("hello, world!")));
1891         assert_eq!(r.push_at_least(5, 1, &mut buf).unwrap_err().kind, InvalidInput);
1892     }
1893 }