I've created a patch for #20226, which maps `EEXIST` to the `PathAlreadyExists` error on Unix. To test this, I use `mkdir`, which raises `EEXIST` if the directory already exists.
On Windows, I map `ERROR_ALREADY_EXISTS` to `PathAlreadyExist`, but I am note sure if `mkdir` on Windows raises `ERROR_ALREADY_EXISTS` and do not have a Windows installation handy for testing.
And I noticed another thing. No error seems to map to `IoErrorKind::PathDoesntExist` and I am wondering what the difference to `FileNotFound` is?
check!(rmdir_recursive(dir));
}
+ #[test]
+ fn mkdir_path_already_exists_error() {
+ use io::{IoError, PathAlreadyExists};
+
+ let tmpdir = tmpdir();
+ let dir = &tmpdir.join("mkdir_error_twice");
+ check!(mkdir(dir, io::USER_RWX));
+ match mkdir(dir, io::USER_RWX) {
+ Err(IoError{kind:PathAlreadyExists,..}) => (),
+ _ => assert!(false)
+ };
+ }
+
#[test]
fn recursive_mkdir() {
let tmpdir = tmpdir();
"file descriptor is not a TTY"),
libc::ETIMEDOUT => (io::TimedOut, "operation timed out"),
libc::ECANCELED => (io::TimedOut, "operation aborted"),
+ libc::consts::os::posix88::EEXIST =>
+ (io::PathAlreadyExists, "path already exists"),
// These two constants can have the same value on some systems,
// but different values on others, so we can't use a match
"invalid handle provided to function"),
libc::ERROR_NOTHING_TO_TERMINATE =>
(io::InvalidInput, "no process to kill"),
+ libc::ERROR_ALREADY_EXISTS =>
+ (io::PathAlreadyExists, "path already exists"),
// libuv maps this error code to EISDIR. we do too. if it is found
// to be incorrect, we can add in some more machinery to only