1
1
pub use libc:: dev_t;
2
+ pub use libc:: stat as FileStat ;
2
3
3
4
use std:: fmt;
4
5
use std:: io:: FilePermission ;
6
+ use std:: mem;
5
7
use std:: path:: Path ;
6
8
use libc:: mode_t;
7
- use errno:: { SysResult , from_ffi} ;
9
+ use errno:: { SysResult , SysError , from_ffi} ;
10
+ use fcntl:: Fd ;
8
11
9
12
mod ffi {
10
13
use libc:: { c_char, c_int, mode_t, dev_t} ;
14
+ pub use libc:: { stat, fstat} ;
11
15
12
16
extern {
13
17
pub fn mknod ( pathname : * const c_char , mode : mode_t , dev : dev_t ) -> c_int ;
@@ -32,18 +36,41 @@ impl fmt::Show for SFlag {
32
36
}
33
37
34
38
pub fn mknod ( path : & Path , kind : SFlag , perm : FilePermission , dev : dev_t ) -> SysResult < ( ) > {
35
- let res = unsafe { ffi:: mknod ( path. to_c_str ( ) . as_ptr ( ) , kind. bits | perm. bits ( ) , dev) } ;
39
+ let res = unsafe { ffi:: mknod ( path. to_c_str ( ) . as_ptr ( ) , kind. bits | perm. bits ( ) as mode_t , dev) } ;
36
40
from_ffi ( res)
37
41
}
38
42
39
43
static MINORBITS : uint = 20 ;
40
44
// static MINORMASK: dev_t = ((1 << MINORBITS) - 1);
41
45
46
+ #[ cfg( target_os = "linux" ) ]
42
47
pub fn mkdev ( major : u64 , minor : u64 ) -> dev_t {
43
48
( major << MINORBITS ) | minor
44
49
}
45
50
46
51
pub fn umask ( mode : FilePermission ) -> FilePermission {
47
- let prev = unsafe { ffi:: umask ( mode. bits ( ) ) } ;
48
- FilePermission :: from_bits ( prev) . expect ( "[BUG] umask returned invalid FilePermission" )
52
+ let prev = unsafe { ffi:: umask ( mode. bits ( ) as mode_t ) } ;
53
+ FilePermission :: from_bits ( prev as u32 ) . expect ( "[BUG] umask returned invalid FilePermission" )
54
+ }
55
+
56
+ pub fn stat ( path : & Path ) -> SysResult < FileStat > {
57
+ let mut dst = unsafe { mem:: uninitialized ( ) } ;
58
+ let res = unsafe { ffi:: stat ( path. to_c_str ( ) . as_ptr ( ) , & mut dst as * mut FileStat ) } ;
59
+
60
+ if res < 0 {
61
+ return Err ( SysError :: last ( ) ) ;
62
+ }
63
+
64
+ Ok ( dst)
65
+ }
66
+
67
+ pub fn fstat ( fd : Fd ) -> SysResult < FileStat > {
68
+ let mut dst = unsafe { mem:: uninitialized ( ) } ;
69
+ let res = unsafe { ffi:: fstat ( fd, & mut dst as * mut FileStat ) } ;
70
+
71
+ if res < 0 {
72
+ return Err ( SysError :: last ( ) ) ;
73
+ }
74
+
75
+ Ok ( dst)
49
76
}
0 commit comments