@@ -28,8 +28,10 @@ mod userfs;
28
28
use std:: convert:: TryFrom ;
29
29
use std:: io;
30
30
use std:: net:: { SocketAddr , ToSocketAddrs } ;
31
- #[ cfg( all( not( windows) , feature = "tls" ) ) ]
31
+ #[ cfg( all( not( windows) , feature ="tls" ) ) ]
32
32
use std:: os:: unix:: io:: { FromRawFd , AsRawFd } ;
33
+ #[ cfg( all( windows, feature ="tls" ) ) ]
34
+ use std:: os:: windows:: prelude:: { AsRawSocket , FromRawSocket } ;
33
35
use std:: process:: exit;
34
36
use std:: sync:: Arc ;
35
37
@@ -41,9 +43,10 @@ use hyper::{
41
43
server:: conn:: { AddrIncoming , AddrStream } ,
42
44
service:: { make_service_fn, service_fn} ,
43
45
} ;
44
- #[ cfg( all ( not ( windows ) , feature = "tls" ) ) ]
46
+ #[ cfg( feature = "tls" ) ]
45
47
use tls_listener:: TlsListener ;
46
- #[ cfg( all( not( windows) , feature = "tls" ) ) ]
48
+ use tokio:: time:: error:: Elapsed ;
49
+ #[ cfg( feature = "tls" ) ]
47
50
use tokio_rustls:: server:: TlsStream ;
48
51
use webdav_handler:: { davpath:: DavPath , DavConfig , DavHandler , DavMethod , DavMethodSet } ;
49
52
use webdav_handler:: { fakels:: FakeLs , fs:: DavFileSystem , ls:: DavLockSystem } ;
@@ -52,7 +55,7 @@ use crate::config::{AcctType, Auth, CaseInsensitive, Handler, Location, OnNotfou
52
55
use crate :: rootfs:: RootFs ;
53
56
use crate :: router:: MatchedRoute ;
54
57
use crate :: suid:: proc_switch_ugid;
55
- #[ cfg( all ( not ( windows ) , feature = "tls" ) ) ]
58
+ #[ cfg( feature = "tls" ) ]
56
59
use crate :: tls:: tls_acceptor;
57
60
use crate :: userfs:: UserFs ;
58
61
@@ -463,7 +466,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
463
466
// build servers (one for each listen address).
464
467
let dav_server = Server :: new ( config. clone ( ) , auth) ;
465
468
let mut servers = Vec :: new ( ) ;
466
- #[ cfg( all ( not ( windows ) , feature = "tls" ) ) ]
469
+ #[ cfg( feature = "tls" ) ]
467
470
let mut tls_servers = Vec :: new ( ) ;
468
471
469
472
// Plaintext servers.
@@ -499,7 +502,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
499
502
} ) ;
500
503
}
501
504
502
- #[ cfg( all ( not ( windows ) , feature = "tls" ) ) ]
505
+ #[ cfg( feature = "tls" ) ]
503
506
// TLS servers.
504
507
if tls_addrs. len ( ) > 0 {
505
508
let tls_acceptor = tls_acceptor ( & config. server ) ?;
@@ -527,22 +530,52 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
527
530
// we run it in a loop. Every time the loop is entered we dup() the
528
531
// listening fd and create a new TcpListener. This way, we should
529
532
// not lose any pending connections during a restart.
533
+ #[ cfg( not( windows) ) ]
530
534
let master_listen_fd = listener. as_raw_fd ( ) ;
535
+ #[ cfg( windows) ]
536
+ let master_listen_fd = listener. as_raw_socket ( ) ;
531
537
std:: mem:: forget ( listener) ;
532
-
533
538
println ! ( "Listening on https://{:?}" , sockaddr) ;
534
539
tls_servers. push ( async move {
535
540
loop {
536
541
// reuse the incoming socket after the server exits.
542
+ #[ cfg( not( windows) ) ]
537
543
let listen_fd = match nix:: unistd:: dup ( master_listen_fd) {
538
544
Ok ( fd) => fd,
539
545
Err ( e) => {
540
546
eprintln ! ( "{}: server error: dup: {}" , PROGNAME , e) ;
541
547
break ;
542
548
}
543
549
} ;
550
+ #[ cfg( windows) ]
551
+ let listen_fd = {
552
+ let mut infoW= winapi:: um:: winsock2:: WSAPROTOCOL_INFOW { ..Default :: default ( ) } ; // = Default::default();
553
+ let error = unsafe { winapi:: um:: winsock2:: WSADuplicateSocketW ( master_listen_fd as usize ,
554
+ winapi:: um:: processthreadsapi:: GetCurrentProcessId ( ) ,
555
+ & mut infoW) } ;
556
+ if error != 0 {
557
+ // let error = unsafe { winapi::um::errhandlingapi::GetLastError() };
558
+ eprintln ! ( "{}: WSADuplicateSocketW error" , PROGNAME ) ;
559
+ break ;
560
+ }
561
+ let listen_fd = unsafe { winapi:: um:: winsock2:: WSASocketW (
562
+ winapi:: shared:: ws2def:: AF_INET ,
563
+ winapi:: shared:: ws2def:: SOCK_STREAM ,
564
+ winapi:: shared:: ws2def:: IPPROTO_TCP as i32 ,
565
+ & mut infoW,
566
+ 0 ,
567
+ 0 ) } ;
568
+ if listen_fd == winapi:: um:: winsock2:: INVALID_SOCKET {
569
+ eprintln ! ( "{}: Socket Duplicate error" , PROGNAME ) ;
570
+ break ;
571
+ }
572
+ listen_fd
573
+ } ;
544
574
// SAFETY: listen_fd is unique (we just dup'ed it).
575
+ #[ cfg( not( windows) ) ]
545
576
let std_listen = unsafe { std:: net:: TcpListener :: from_raw_fd ( listen_fd) } ;
577
+ #[ cfg( windows) ]
578
+ let std_listen = unsafe { std:: net:: TcpListener :: from_raw_socket ( listen_fd as u64 ) } ;
546
579
let listener = match tokio:: net:: TcpListener :: from_std ( std_listen) {
547
580
Ok ( l) => l,
548
581
Err ( e) => {
@@ -588,7 +621,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
588
621
for server in servers. drain ( ..) {
589
622
tasks. push ( tokio:: spawn ( server) ) ;
590
623
}
591
- #[ cfg( all ( not ( windows ) , feature = "tls" ) ) ]
624
+ #[ cfg( feature = "tls" ) ]
592
625
for server in tls_servers. drain ( ..) {
593
626
tasks. push ( tokio:: spawn ( server) ) ;
594
627
}
0 commit comments