@@ -21,7 +21,7 @@ use nix::unistd::close;
21
21
use nix:: unistd:: pipe2;
22
22
use protobuf:: { CodedInputStream , Message } ;
23
23
use std:: collections:: HashMap ;
24
- use std:: os:: unix:: io:: RawFd ;
24
+ use std:: os:: unix:: io:: { AsRawFd , FromRawFd , RawFd } ;
25
25
use std:: sync:: atomic:: { AtomicBool , AtomicUsize , Ordering } ;
26
26
use std:: sync:: mpsc:: { channel, sync_channel, Receiver , Sender , SyncSender } ;
27
27
use std:: sync:: { Arc , Mutex } ;
@@ -279,8 +279,9 @@ impl Server {
279
279
}
280
280
281
281
let ( fd, _) = common:: do_bind ( host) ?;
282
- self . listeners . push ( fd) ;
282
+ common :: do_listen ( fd) ? ;
283
283
284
+ self . listeners . push ( fd) ;
284
285
Ok ( self )
285
286
}
286
287
@@ -341,8 +342,6 @@ impl Server {
341
342
let service_quit = self . quit . clone ( ) ;
342
343
let monitor_fd = self . monitor_fd . 0 ;
343
344
344
- common:: do_listen ( listener) ?;
345
-
346
345
let handler = thread:: Builder :: new ( )
347
346
. name ( "listener_loop" . into ( ) )
348
347
. spawn ( move || {
@@ -508,3 +507,15 @@ impl Server {
508
507
}
509
508
}
510
509
}
510
+
511
+ impl FromRawFd for Server {
512
+ unsafe fn from_raw_fd ( fd : RawFd ) -> Self {
513
+ Self :: default ( ) . add_listener ( fd) . unwrap ( )
514
+ }
515
+ }
516
+
517
+ impl AsRawFd for Server {
518
+ fn as_raw_fd ( & self ) -> RawFd {
519
+ self . listeners [ 0 ]
520
+ }
521
+ }
0 commit comments