@@ -38,11 +38,28 @@ impl MioListener {
38
38
match * self {
39
39
MioListener :: Tcp ( ref lst) => lst. accept ( ) . map ( |( stream, _) | MioStream :: Tcp ( stream) ) ,
40
40
#[ cfg( unix) ]
41
- MioListener :: Uds ( ref lst) => lst. accept ( ) . map ( |( stream, _) | MioStream :: Uds ( stream) ) ,
41
+ MioListener :: Uds ( ref lst) => {
42
+ lst. accept ( ) . map ( |( stream, _) | MioStream :: Uds ( stream) )
43
+ }
44
+ }
45
+ }
46
+
47
+ pub ( crate ) fn terminate ( & self ) {
48
+ match * self {
49
+ MioListener :: Tcp ( _) => ( ) ,
50
+ #[ cfg( unix) ]
51
+ MioListener :: Uds ( ref lst) => {
52
+ if let Ok ( addr) = lst. local_addr ( ) {
53
+ if let Some ( path) = addr. as_pathname ( ) {
54
+ let _ = std:: fs:: remove_file ( path) ;
55
+ }
56
+ }
57
+ }
42
58
}
43
59
}
44
60
}
45
61
62
+
46
63
impl Source for MioListener {
47
64
fn register (
48
65
& mut self ,
@@ -74,17 +91,7 @@ impl Source for MioListener {
74
91
match * self {
75
92
MioListener :: Tcp ( ref mut lst) => lst. deregister ( registry) ,
76
93
#[ cfg( unix) ]
77
- MioListener :: Uds ( ref mut lst) => {
78
- let res = lst. deregister ( registry) ;
79
-
80
- // cleanup file path
81
- if let Ok ( addr) = lst. local_addr ( ) {
82
- if let Some ( path) = addr. as_pathname ( ) {
83
- let _ = std:: fs:: remove_file ( path) ;
84
- }
85
- }
86
- res
87
- }
94
+ MioListener :: Uds ( ref mut lst) => lst. deregister ( registry)
88
95
}
89
96
}
90
97
}
@@ -270,4 +277,17 @@ mod tests {
270
277
assert ! ( format!( "{}" , lst) . contains( "/tmp/sock.xxxxx" ) ) ;
271
278
}
272
279
}
280
+
281
+ #[ test]
282
+ #[ cfg( unix) ]
283
+ fn uds_terminate ( ) {
284
+ let socket_path = std:: path:: Path :: new ( "/tmp/sock.xxxx1" ) ;
285
+ let _ = std:: fs:: remove_file ( socket_path) ;
286
+ if let Ok ( socket) = MioUnixListener :: bind ( socket_path) {
287
+ let listener = MioListener :: Uds ( socket) ;
288
+ assert ! ( socket_path. exists( ) ) ;
289
+ listener. terminate ( ) ;
290
+ assert ! ( !socket_path. exists( ) ) ;
291
+ }
292
+ }
273
293
}
0 commit comments