@@ -1293,13 +1293,19 @@ impl File {
12931293        return  Ok ( ( ) ) ; 
12941294    } 
12951295
1296+     #[ cfg( any( target_os = "solaris" , ) ) ]  
1297+     pub  fn  lock ( & self )  -> io:: Result < ( ) >  { 
1298+         self . emulate_flock ( libc:: F_WRLCK ,  libc:: F_SETLK ) ; 
1299+     } 
1300+ 
12961301    #[ cfg( not( any(  
12971302        target_os = "freebsd" ,  
12981303        target_os = "fuchsia" ,  
12991304        target_os = "linux" ,  
13001305        target_os = "netbsd" ,  
13011306        target_os = "openbsd" ,  
13021307        target_os = "cygwin" ,  
1308+         target_os = "solaris" ,  
13031309        target_vendor = "apple" ,  
13041310    ) ) ) ]  
13051311    pub  fn  lock ( & self )  -> io:: Result < ( ) >  { 
@@ -1320,13 +1326,19 @@ impl File {
13201326        return  Ok ( ( ) ) ; 
13211327    } 
13221328
1329+     #[ cfg( any( target_os = "solaris" , ) ) ]  
1330+     pub  fn  lock_shared ( & self )  -> io:: Result < ( ) >  { 
1331+         self . emulate_flock ( libc:: F_RDLCK ,  libc:: F_SETLK ) ; 
1332+     } 
1333+ 
13231334    #[ cfg( not( any(  
13241335        target_os = "freebsd" ,  
13251336        target_os = "fuchsia" ,  
13261337        target_os = "linux" ,  
13271338        target_os = "netbsd" ,  
13281339        target_os = "openbsd" ,  
13291340        target_os = "cygwin" ,  
1341+         target_os = "solaris" ,  
13301342        target_vendor = "apple" ,  
13311343    ) ) ) ]  
13321344    pub  fn  lock_shared ( & self )  -> io:: Result < ( ) >  { 
@@ -1355,13 +1367,28 @@ impl File {
13551367        } 
13561368    } 
13571369
1370+     #[ cfg( any( target_os = "solaris" , ) ) ]  
1371+     pub  fn  try_lock ( & self )  -> io:: Result < ( ) >  { 
1372+         let  result = self . emulate_flock ( libc:: F_WRLCK ,  libc:: F_SETLKW ) ; 
1373+         if  let  Err ( err)  = result { 
1374+             if  err. kind ( )  == io:: ErrorKind :: WouldBlock  { 
1375+                 Err ( TryLockError :: WouldBlock ) 
1376+             }  else  { 
1377+                 Err ( TryLockError :: Error ( err) ) 
1378+             } 
1379+         }  else  { 
1380+             Ok ( ( ) ) 
1381+         } 
1382+     } 
1383+ 
13581384    #[ cfg( not( any(  
13591385        target_os = "freebsd" ,  
13601386        target_os = "fuchsia" ,  
13611387        target_os = "linux" ,  
13621388        target_os = "netbsd" ,  
13631389        target_os = "openbsd" ,  
13641390        target_os = "cygwin" ,  
1391+         target_os = "solaris" ,  
13651392        target_vendor = "apple" ,  
13661393    ) ) ) ]  
13671394    pub  fn  try_lock ( & self )  -> Result < ( ) ,  TryLockError >  { 
@@ -1393,13 +1420,28 @@ impl File {
13931420        } 
13941421    } 
13951422
1423+     #[ cfg( any( target_os = "solaris" , ) ) ]  
1424+     pub  fn  try_lock_shared ( & self )  -> io:: Result < ( ) >  { 
1425+         let  result = self . emulate_flock ( libc:: F_RDLCK ,  libc:: F_SETLKW ) ; 
1426+         if  let  Err ( err)  = result { 
1427+             if  err. kind ( )  == io:: ErrorKind :: WouldBlock  { 
1428+                 Err ( TryLockError :: WouldBlock ) 
1429+             }  else  { 
1430+                 Err ( TryLockError :: Error ( err) ) 
1431+             } 
1432+         }  else  { 
1433+             Ok ( ( ) ) 
1434+         } 
1435+     } 
1436+ 
13961437    #[ cfg( not( any(  
13971438        target_os = "freebsd" ,  
13981439        target_os = "fuchsia" ,  
13991440        target_os = "linux" ,  
14001441        target_os = "netbsd" ,  
14011442        target_os = "openbsd" ,  
14021443        target_os = "cygwin" ,  
1444+         target_os = "solaris" ,  
14031445        target_vendor = "apple" ,  
14041446    ) ) ) ]  
14051447    pub  fn  try_lock_shared ( & self )  -> Result < ( ) ,  TryLockError >  { 
@@ -1423,19 +1465,34 @@ impl File {
14231465        return  Ok ( ( ) ) ; 
14241466    } 
14251467
1468+     #[ cfg( any( target_os = "solaris" , ) ) ]  
1469+     pub  fn  unlock ( & self )  -> io:: Result < ( ) >  { 
1470+         self . emulate_flock ( libc:: F_UNLCK ,  libc:: F_SETLK ) 
1471+     } 
1472+ 
14261473    #[ cfg( not( any(  
14271474        target_os = "freebsd" ,  
14281475        target_os = "fuchsia" ,  
14291476        target_os = "linux" ,  
14301477        target_os = "netbsd" ,  
14311478        target_os = "openbsd" ,  
14321479        target_os = "cygwin" ,  
1480+         target_os = "solaris" ,  
14331481        target_vendor = "apple" ,  
14341482    ) ) ) ]  
14351483    pub  fn  unlock ( & self )  -> io:: Result < ( ) >  { 
14361484        Err ( io:: const_error!( io:: ErrorKind :: Unsupported ,  "unlock() not supported" ) ) 
14371485    } 
14381486
1487+     /// Emulates flock by `fcntl`. 
1488+ #[ cfg( any( target_os = "solaris" , ) ) ]  
1489+     fn  emulate_flock ( & self ,  lock_type :  libc:: c_int ,  cmd :  libc:: c_int )  -> Result < ( ) >  { 
1490+         let  mut  flock:  libc:: flock  = unsafe  {  mem:: zeroed ( )  } ; 
1491+         flock. l_whence  = libc:: SEEK_SET ; 
1492+         flock. l_type  = lock_type; 
1493+         cvt ( unsafe  {  libc:: fcntl ( file. as_raw_fd ( ) ,  cmd,  & flock)  } ) 
1494+     } 
1495+ 
14391496    pub  fn  truncate ( & self ,  size :  u64 )  -> io:: Result < ( ) >  { 
14401497        let  size:  off64_t  =
14411498            size. try_into ( ) . map_err ( |e| io:: Error :: new ( io:: ErrorKind :: InvalidInput ,  e) ) ?; 
0 commit comments