|
| 1 | +pub mod stat { |
| 2 | + pub use libc::dev_t; |
| 3 | + |
| 4 | + use std::fmt; |
| 5 | + use std::io::FilePermission; |
| 6 | + use std::path::Path; |
| 7 | + use libc::mode_t; |
| 8 | + use errno::{SysResult, from_ffi}; |
| 9 | + |
| 10 | + mod ffi { |
| 11 | + use libc::{c_char, c_int, mode_t, dev_t}; |
| 12 | + |
| 13 | + extern { |
| 14 | + pub fn mknod(pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int; |
| 15 | + pub fn umask(mask: mode_t) -> mode_t; |
| 16 | + } |
| 17 | + } |
| 18 | + |
| 19 | + bitflags!( |
| 20 | + flags SFlag: mode_t { |
| 21 | + static S_IFREG = 0o100000, |
| 22 | + static S_IFCHR = 0o020000, |
| 23 | + static S_IFBLK = 0o060000, |
| 24 | + static S_IFIFO = 0o010000, |
| 25 | + static S_IFSOCK = 0o140000 |
| 26 | + } |
| 27 | + ) |
| 28 | + |
| 29 | + impl fmt::Show for SFlag { |
| 30 | + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { |
| 31 | + write!(fmt, "SFlag {{ bits: {} }}", self.bits()) |
| 32 | + } |
| 33 | + } |
| 34 | + |
| 35 | + pub fn mknod(path: &Path, kind: SFlag, perm: FilePermission, dev: dev_t) -> SysResult<()> { |
| 36 | + let res = unsafe { ffi::mknod(path.to_c_str().as_ptr(), kind.bits | perm.bits(), dev) }; |
| 37 | + from_ffi(res) |
| 38 | + } |
| 39 | + |
| 40 | + static MINORBITS: uint = 20; |
| 41 | + static MINORMASK: dev_t = ((1 << MINORBITS) - 1); |
| 42 | + |
| 43 | + pub fn mkdev(major: u64, minor: u64) -> dev_t { |
| 44 | + (major << MINORBITS) | minor |
| 45 | + } |
| 46 | + |
| 47 | + pub fn umask(mode: FilePermission) -> FilePermission { |
| 48 | + let prev = unsafe { ffi::umask(mode.bits()) }; |
| 49 | + FilePermission::from_bits(prev).expect("[BUG] umask returned invalid FilePermission") |
| 50 | + } |
| 51 | +} |
0 commit comments