@@ -121,7 +121,7 @@ mod imp {
121121 let buf = CString :: new ( os. as_bytes ( ) ) . unwrap ( ) ;
122122 let fd = unsafe {
123123 libc:: open ( buf. as_ptr ( ) , libc:: O_RDWR | libc:: O_CREAT ,
124- libc:: S_IRWXU )
124+ libc:: S_IRWXU as libc :: c_int )
125125 } ;
126126 assert ! ( fd > 0 , "failed to open lockfile: {}" ,
127127 io:: Error :: last_os_error( ) ) ;
@@ -164,77 +164,55 @@ mod imp {
164164}
165165
166166#[ cfg( windows) ]
167+ #[ allow( bad_style) ]
167168mod imp {
168- use libc;
169169 use std:: io;
170170 use std:: mem;
171- use std:: ffi:: OsStr ;
172171 use std:: os:: windows:: prelude:: * ;
172+ use std:: os:: windows:: raw:: HANDLE ;
173173 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+ }
177188
178- #[ allow( non_snake_case) ]
179189 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 ;
191196 }
192197
193198 pub struct Lock {
194- handle : libc :: HANDLE ,
199+ _file : File ,
195200 }
196201
197202 impl Lock {
198203 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 ( ) ;
218206 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 ,
220209 & mut overlapped)
221210 } ;
222211 if ret == 0 {
223212 let err = io:: Error :: last_os_error ( ) ;
224- unsafe { libc:: CloseHandle ( handle) ; }
225213 panic ! ( "could not lock `{}`: {}" , p. display( ) , err) ;
226214 }
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 }
238216 }
239217 }
240218}
0 commit comments