@@ -2,7 +2,11 @@ use std::env;
22use std:: io:: { self , Read , Write } ;
33
44#[ cfg( not( windows) ) ]
5+ use std:: os:: unix:: io:: AsRawFd ;
56use std:: os:: unix:: net:: UnixStream ;
7+ use nix:: sys:: socket;
8+ use nix:: sys:: socket:: sockopt:: SndBuf ;
9+ use nix:: sys:: socket:: sockopt:: RcvBuf ;
610
711#[ cfg( windows) ]
812use named_pipe:: PipeClient ;
@@ -28,25 +32,27 @@ impl<W: Write> Write for ProxySocket<W> {
2832}
2933
3034#[ cfg( windows) ]
31- pub fn connect ( ) -> io:: Result < ProxySocket < PipeClient > > {
35+ pub fn connect ( buffer_size : u32 ) -> io:: Result < ProxySocket < PipeClient > > {
3236 let username = env:: var ( "USERNAME" ) . unwrap ( ) ;
3337 let pipe_name = format ! ( "\\ \\ .\\ pipe\\ keepassxc\\ {}\\ kpxc_server" , username) ;
3438 let client = PipeClient :: connect ( pipe_name) ?;
3539 Ok ( ProxySocket { inner : client } )
3640}
3741
3842#[ cfg( not( windows) ) ]
39- pub fn connect ( ) -> io:: Result < ProxySocket < UnixStream > > {
43+ pub fn connect ( buffer_size : u32 ) -> io:: Result < ProxySocket < UnixStream > > {
4044 use std:: time:: Duration ;
4145
4246 let socket_name = "kpxc_server" ;
4347 let socket: String ;
44- if let Ok ( xdg ) = env:: var ( "XDG_RUNTIME_DIR" ) {
45- socket = format ! ( "{}/{}" , xdg , socket_name) ;
48+ if let Ok ( dir ) = if cfg ! ( target_os = "macos" ) { env:: var ( "TMPDIR" ) } else { env :: var ( " XDG_RUNTIME_DIR") } {
49+ socket = format ! ( "{}/{}" , dir , socket_name) ;
4650 } else {
4751 socket = format ! ( "/tmp/{}" , socket_name) ;
4852 }
4953 let s = UnixStream :: connect ( socket) ?;
54+ socket:: setsockopt ( s. as_raw_fd ( ) , SndBuf , & ( buffer_size as usize ) ) . expect ( "setsockopt for SndBuf failed" ) ;
55+ socket:: setsockopt ( s. as_raw_fd ( ) , RcvBuf , & ( buffer_size as usize ) ) . expect ( "setsockopt for RcvBuf failed" ) ;
5056 let timeout: Option < Duration > = Some ( Duration :: from_secs ( 1 ) ) ;
5157 s. set_read_timeout ( timeout) ?;
5258 Ok ( ProxySocket { inner : s } )
0 commit comments