@@ -11,6 +11,8 @@ pub use self::ffi::flock;
11
11
mod ffi {
12
12
pub use libc:: { open, fcntl} ;
13
13
pub use self :: os:: * ;
14
+ pub use libc:: funcs:: bsd44:: flock as libc_flock;
15
+ pub use libc:: consts:: os:: bsd44:: { LOCK_SH , LOCK_EX , LOCK_NB , LOCK_UN } ;
14
16
15
17
#[ cfg( any( target_os = "linux" , target_os = "android" ) ) ]
16
18
mod os {
@@ -128,6 +130,36 @@ pub fn fcntl(fd: RawFd, arg: FcntlArg) -> Result<c_int> {
128
130
Ok ( res)
129
131
}
130
132
133
+ pub enum FlockArg {
134
+ LockShared ,
135
+ LockExclusive ,
136
+ Unlock ,
137
+ LockSharedNonblock ,
138
+ LockExclusiveNonblock ,
139
+ UnlockNonblock ,
140
+ }
141
+
142
+ pub fn flock ( fd : RawFd , arg : FlockArg ) -> Result < ( ) > {
143
+ use self :: FlockArg :: * ;
144
+
145
+ let res = unsafe {
146
+ match arg {
147
+ LockShared => ffi:: libc_flock ( fd, ffi:: LOCK_SH ) ,
148
+ LockExclusive => ffi:: libc_flock ( fd, ffi:: LOCK_EX ) ,
149
+ Unlock => ffi:: libc_flock ( fd, ffi:: LOCK_UN ) ,
150
+ LockSharedNonblock => ffi:: libc_flock ( fd, ffi:: LOCK_SH | ffi:: LOCK_NB ) ,
151
+ LockExclusiveNonblock => ffi:: libc_flock ( fd, ffi:: LOCK_EX | ffi:: LOCK_NB ) ,
152
+ UnlockNonblock => ffi:: libc_flock ( fd, ffi:: LOCK_UN | ffi:: LOCK_NB ) ,
153
+ }
154
+ } ;
155
+
156
+ if res < 0 {
157
+ return Err ( Error :: Sys ( Errno :: last ( ) ) ) ;
158
+ }
159
+
160
+ Ok ( ( ) )
161
+ }
162
+
131
163
#[ cfg( any( target_os = "linux" , target_os = "android" ) ) ]
132
164
mod consts {
133
165
use libc:: c_int;
0 commit comments