@@ -2,14 +2,14 @@ use std::{fs::remove_file, path::PathBuf};
22
33use anyhow:: { bail, Context } ;
44use tokio:: net:: TcpListener ;
5- use tracing:: warn;
5+ use tracing:: { info , warn} ;
66
77#[ cfg( unix) ]
88use tokio:: net:: UnixListener ;
99
1010use crate :: net:: { self , Stream } ;
1111
12- use super :: { udp_listen :: FixedTargetAddrUDPListener , Addr } ;
12+ use super :: { udp_fixed_listen :: FixedTargetAddrUDPListener , Addr } ;
1313
1414#[ derive( Debug ) ]
1515pub enum Listener {
@@ -27,37 +27,53 @@ pub async fn listen(
2727) -> anyhow:: Result < Listener > {
2828 match laddr. network {
2929 net:: Network :: TCP => {
30- let r = TcpListener :: bind ( laddr. get_socket_addr ( ) . expect ( "a has socket addr" ) )
31- . await
32- . context ( "tcp listen failed" ) ?;
30+ let r = TcpListener :: bind (
31+ laddr
32+ . get_socket_addr ( )
33+ . context ( "listen tcp but has no socket addr" ) ?,
34+ )
35+ . await
36+ . context ( "tcp listen failed" ) ?;
3337 Ok ( Listener :: TCP ( r) )
3438 }
35- net:: Network :: UDP => Ok ( Listener :: UDP (
36- FixedTargetAddrUDPListener :: new ( laddr. clone ( ) , opt_fixed_target_addr. unwrap ( ) ) . await ?,
37- ) ) ,
39+ net:: Network :: UDP => {
40+ let ft = match opt_fixed_target_addr {
41+ Some ( ft) => ft,
42+ None => bail ! ( "listen udp requires a fixed_target_addr" ) ,
43+ } ;
44+ Ok ( Listener :: UDP (
45+ FixedTargetAddrUDPListener :: new ( laddr. clone ( ) , ft) . await ?,
46+ ) )
47+ }
3848
3949 #[ cfg( unix) ]
4050 net:: Network :: Unix => {
41- let file_n = laddr. get_name ( ) . expect ( "a has a name") ;
51+ let file_n = laddr. get_name ( ) . context ( "listen unix but has no name") ? ;
4252 let p = PathBuf :: from ( file_n. clone ( ) ) ;
4353
44- // is_file returns false for unix domain socket
45-
46- if p. exists ( ) && !p. is_dir ( ) {
47- warn ! (
48- "unix listen: previous {:?} exists, will delete it for new listening." ,
49- p
50- ) ;
51- remove_file ( p. clone ( ) ) . context ( "unix listen try remove previous file failed" ) ?;
52- }
53- let r = UnixListener :: bind ( p) . context ( "unix listen failed" ) ?;
54+ remove_unix ( & p, true ) ?;
55+ let r = UnixListener :: bind ( p) . context ( "listen unix failed" ) ?;
5456
5557 Ok ( Listener :: UNIX ( ( r, file_n) ) )
5658 }
5759 _ => bail ! ( "listen not implemented for this network: {}" , laddr. network) ,
5860 }
5961}
6062
63+ fn remove_unix ( p : & PathBuf , warn : bool ) -> anyhow:: Result < ( ) > {
64+ // is_file returns false for unix domain socket
65+
66+ if p. exists ( ) && !p. is_dir ( ) && !p. is_file ( ) {
67+ if warn {
68+ warn ! ( "unix: previous {:?} exists, will remove it!" , p) ;
69+ } else {
70+ info ! ( "removing unix: {:?}" , p) ;
71+ }
72+ remove_file ( p. clone ( ) ) . context ( "unix try remove previous file failed" ) ?;
73+ }
74+ Ok ( ( ) )
75+ }
76+
6177impl Drop for Listener {
6278 fn drop ( & mut self ) {
6379 self . clean_up ( )
@@ -84,7 +100,7 @@ impl Listener {
84100 Err ( e) => format ! ( "no laddr, e:{e}" ) ,
85101 }
86102 }
87- Listener :: UDP ( u) => format ! ( "{}" , u. laddr) ,
103+ Listener :: UDP ( u) => format ! ( "{}" , u. laddr( ) ) ,
88104
89105 #[ cfg( unix) ]
90106 Listener :: UNIX ( u) => {
@@ -102,17 +118,12 @@ impl Listener {
102118 #[ cfg( unix) ]
103119 Listener :: UNIX ( ( _, file_n) ) => {
104120 let p = PathBuf :: from ( file_n. clone ( ) ) ;
105- if p. exists ( ) && !p. is_dir ( ) {
106- warn ! ( "unix clean up: will delete {:?}" , p) ;
107- let r = remove_file ( p. clone ( ) ) . context ( "unix clean up delete file failed" ) ;
108- if let Err ( e) = r {
109- warn ! ( "{}" , e)
110- }
121+ let r = remove_unix ( & p, false ) ;
122+ if let Err ( e) = r {
123+ warn ! ( "{}" , e)
111124 }
112125 }
113- Listener :: UDP ( ul) => {
114- ul. shutdown ( ) ;
115- }
126+
116127 _ => { }
117128 }
118129 }
0 commit comments