diff options
| author | Aaron Turon <aturon@mozilla.com> | 2014-05-02 10:56:26 -0700 |
|---|---|---|
| committer | Aaron Turon <aturon@mozilla.com> | 2014-05-05 15:24:36 -0700 |
| commit | 8d1d7d9b5f3920d70b1edcc258a86106527e83f7 (patch) | |
| tree | 2c699707e94f9c3676bfdc3ee0492d728d3ff641 /src/libnative | |
| parent | c00d8fd9a07244a13d1cc7162a80c3d618935ce8 (diff) | |
| download | rust-8d1d7d9b5f3920d70b1edcc258a86106527e83f7.tar.gz rust-8d1d7d9b5f3920d70b1edcc258a86106527e83f7.zip | |
Change std::io::FilePermission to a typesafe representation
This patch changes `std::io::FilePermissions` from an exposed `u32` representation to a typesafe representation (that only allows valid flag combinations) using the `std::bitflags`, thus ensuring a greater degree of safety on the Rust side. Despite the change to the type, most code should continue to work as-is, sincde the new type provides bit operations in the style of C flags. To get at the underlying integer representation, use the `bits` method; to (unsafely) convert to `FilePermissions`, use `FilePermissions::from_bits`. Closes #6085. [breaking-change]
Diffstat (limited to 'src/libnative')
| -rw-r--r-- | src/libnative/io/file_unix.rs | 8 | ||||
| -rw-r--r-- | src/libnative/io/file_win32.rs | 6 |
2 files changed, 9 insertions, 5 deletions
diff --git a/src/libnative/io/file_unix.rs b/src/libnative/io/file_unix.rs index 7c19eb54326..94ca6027841 100644 --- a/src/libnative/io/file_unix.rs +++ b/src/libnative/io/file_unix.rs @@ -335,7 +335,7 @@ pub fn open(path: &CString, fm: io::FileMode, fa: io::FileAccess) pub fn mkdir(p: &CString, mode: io::FilePermission) -> IoResult<()> { super::mkerr_libc(retry(|| unsafe { - libc::mkdir(p.with_ref(|p| p), mode as libc::mode_t) + libc::mkdir(p.with_ref(|p| p), mode.bits() as libc::mode_t) })) } @@ -392,7 +392,7 @@ pub fn rename(old: &CString, new: &CString) -> IoResult<()> { pub fn chmod(p: &CString, mode: io::FilePermission) -> IoResult<()> { super::mkerr_libc(retry(|| unsafe { - libc::chmod(p.with_ref(|p| p), mode as libc::mode_t) + libc::chmod(p.with_ref(|p| p), mode.bits() as libc::mode_t) })) } @@ -470,7 +470,9 @@ fn mkstat(stat: &libc::stat, path: &CString) -> io::FileStat { path: Path::new(path), size: stat.st_size as u64, kind: kind, - perm: (stat.st_mode) as io::FilePermission & io::AllPermissions, + perm: unsafe { + io::FilePermission::from_bits(stat.st_mode as u32) & io::AllPermissions + }, created: mktime(stat.st_ctime as u64, stat.st_ctime_nsec as u64), modified: mktime(stat.st_mtime as u64, stat.st_mtime_nsec as u64), accessed: mktime(stat.st_atime as u64, stat.st_atime_nsec as u64), diff --git a/src/libnative/io/file_win32.rs b/src/libnative/io/file_win32.rs index 88ba6dcbc7e..945a1f0d612 100644 --- a/src/libnative/io/file_win32.rs +++ b/src/libnative/io/file_win32.rs @@ -391,7 +391,7 @@ pub fn rename(old: &CString, new: &CString) -> IoResult<()> { pub fn chmod(p: &CString, mode: io::FilePermission) -> IoResult<()> { super::mkerr_libc(as_utf16_p(p.as_str().unwrap(), |p| unsafe { - libc::wchmod(p, mode as libc::c_int) + libc::wchmod(p, mode.bits() as libc::c_int) })) } @@ -470,7 +470,9 @@ fn mkstat(stat: &libc::stat, path: &CString) -> io::FileStat { path: Path::new(path), size: stat.st_size as u64, kind: kind, - perm: (stat.st_mode) as io::FilePermission & io::AllPermissions, + perm: unsafe { + io::FilePermission::from_bits(stat.st_mode as u32) & io::AllPermissions + }, created: stat.st_ctime as u64, modified: stat.st_mtime as u64, accessed: stat.st_atime as u64, |
