@@ -121,7 +121,7 @@ mod imp {
121
121
let buf = CString :: new ( os. as_bytes ( ) ) . unwrap ( ) ;
122
122
let fd = unsafe {
123
123
libc:: open ( buf. as_ptr ( ) , libc:: O_RDWR | libc:: O_CREAT ,
124
- libc:: S_IRWXU )
124
+ libc:: S_IRWXU as libc :: c_int )
125
125
} ;
126
126
assert ! ( fd > 0 , "failed to open lockfile: {}" ,
127
127
io:: Error :: last_os_error( ) ) ;
@@ -164,77 +164,55 @@ mod imp {
164
164
}
165
165
166
166
#[ cfg( windows) ]
167
+ #[ allow( bad_style) ]
167
168
mod imp {
168
- use libc;
169
169
use std:: io;
170
170
use std:: mem;
171
- use std:: ffi:: OsStr ;
172
171
use std:: os:: windows:: prelude:: * ;
172
+ use std:: os:: windows:: raw:: HANDLE ;
173
173
use std:: path:: Path ;
174
- use std:: ptr;
175
-
176
- const LOCKFILE_EXCLUSIVE_LOCK : libc:: DWORD = 0x00000002 ;
174
+ use std:: fs:: { File , OpenOptions } ;
175
+
176
+ type DWORD = u32 ;
177
+ type LPOVERLAPPED = * mut OVERLAPPED ;
178
+ type BOOL = i32 ;
179
+ const LOCKFILE_EXCLUSIVE_LOCK : DWORD = 0x00000002 ;
180
+
181
+ #[ repr( C ) ]
182
+ struct OVERLAPPED {
183
+ Internal : usize ,
184
+ InternalHigh : usize ,
185
+ Pointer : * mut u8 ,
186
+ hEvent : * mut u8 ,
187
+ }
177
188
178
- #[ allow( non_snake_case) ]
179
189
extern "system" {
180
- fn LockFileEx ( hFile : libc:: HANDLE ,
181
- dwFlags : libc:: DWORD ,
182
- dwReserved : libc:: DWORD ,
183
- nNumberOfBytesToLockLow : libc:: DWORD ,
184
- nNumberOfBytesToLockHigh : libc:: DWORD ,
185
- lpOverlapped : libc:: LPOVERLAPPED ) -> libc:: BOOL ;
186
- fn UnlockFileEx ( hFile : libc:: HANDLE ,
187
- dwReserved : libc:: DWORD ,
188
- nNumberOfBytesToLockLow : libc:: DWORD ,
189
- nNumberOfBytesToLockHigh : libc:: DWORD ,
190
- lpOverlapped : libc:: LPOVERLAPPED ) -> libc:: BOOL ;
190
+ fn LockFileEx ( hFile : HANDLE ,
191
+ dwFlags : DWORD ,
192
+ dwReserved : DWORD ,
193
+ nNumberOfBytesToLockLow : DWORD ,
194
+ nNumberOfBytesToLockHigh : DWORD ,
195
+ lpOverlapped : LPOVERLAPPED ) -> BOOL ;
191
196
}
192
197
193
198
pub struct Lock {
194
- handle : libc :: HANDLE ,
199
+ _file : File ,
195
200
}
196
201
197
202
impl Lock {
198
203
pub fn new ( p : & Path ) -> Lock {
199
- let os: & OsStr = p. as_ref ( ) ;
200
- let mut p_16: Vec < _ > = os. encode_wide ( ) . collect ( ) ;
201
- p_16. push ( 0 ) ;
202
- let handle = unsafe {
203
- libc:: CreateFileW ( p_16. as_ptr ( ) ,
204
- libc:: FILE_GENERIC_READ |
205
- libc:: FILE_GENERIC_WRITE ,
206
- libc:: FILE_SHARE_READ |
207
- libc:: FILE_SHARE_DELETE |
208
- libc:: FILE_SHARE_WRITE ,
209
- ptr:: null_mut ( ) ,
210
- libc:: CREATE_ALWAYS ,
211
- libc:: FILE_ATTRIBUTE_NORMAL ,
212
- ptr:: null_mut ( ) )
213
- } ;
214
- if handle == libc:: INVALID_HANDLE_VALUE {
215
- panic ! ( "create file error: {}" , io:: Error :: last_os_error( ) ) ;
216
- }
217
- let mut overlapped: libc:: OVERLAPPED = unsafe { mem:: zeroed ( ) } ;
204
+ let f = OpenOptions :: new ( ) . read ( true ) . write ( true ) . create ( true )
205
+ . open ( p) . unwrap ( ) ;
218
206
let ret = unsafe {
219
- LockFileEx ( handle, LOCKFILE_EXCLUSIVE_LOCK , 0 , 100 , 0 ,
207
+ let mut overlapped: OVERLAPPED = mem:: zeroed ( ) ;
208
+ LockFileEx ( f. as_raw_handle ( ) , LOCKFILE_EXCLUSIVE_LOCK , 0 , 100 , 0 ,
220
209
& mut overlapped)
221
210
} ;
222
211
if ret == 0 {
223
212
let err = io:: Error :: last_os_error ( ) ;
224
- unsafe { libc:: CloseHandle ( handle) ; }
225
213
panic ! ( "could not lock `{}`: {}" , p. display( ) , err) ;
226
214
}
227
- Lock { handle : handle }
228
- }
229
- }
230
-
231
- impl Drop for Lock {
232
- fn drop ( & mut self ) {
233
- let mut overlapped: libc:: OVERLAPPED = unsafe { mem:: zeroed ( ) } ;
234
- unsafe {
235
- UnlockFileEx ( self . handle , 0 , 100 , 0 , & mut overlapped) ;
236
- libc:: CloseHandle ( self . handle ) ;
237
- }
215
+ Lock { _file : f }
238
216
}
239
217
}
240
218
}
0 commit comments