@@ -5,12 +5,20 @@ extern crate ref_slice;
5
5
#[ macro_use]
6
6
extern crate error_chain;
7
7
8
+ use std:: io:: { Read , Write } ;
9
+ use std:: path:: PathBuf ;
10
+ use std:: time:: Duration ;
11
+ use std:: { env, fs, io, process, thread} ;
12
+
13
+ #[ cfg( not( unix) ) ]
14
+ use std:: fs:: OpenOptions ;
15
+
16
+ #[ cfg( unix) ]
8
17
use std:: ffi:: CString ;
18
+ #[ cfg( unix) ]
9
19
use std:: fs:: File ;
10
- use std :: io :: { Read , Write } ;
20
+ # [ cfg ( unix ) ]
11
21
use std:: os:: unix:: ffi:: OsStringExt ;
12
- use std:: path:: PathBuf ;
13
- use std:: { env, fs, io, process} ;
14
22
15
23
use clap:: { App , Arg } ;
16
24
use ref_slice:: ref_slice_mut;
@@ -22,6 +30,10 @@ mod errors {
22
30
}
23
31
24
32
fn main ( ) {
33
+ fn show_backtrace ( ) -> bool {
34
+ env:: var ( "RUST_BACKTRACE" ) . as_ref ( ) . map ( |s| & s[ ..] ) == Ok ( "1" )
35
+ }
36
+
25
37
if let Err ( e) = run ( ) {
26
38
let stderr = io:: stderr ( ) ;
27
39
let mut stderr = stderr. lock ( ) ;
@@ -34,7 +46,6 @@ fn main() {
34
46
35
47
if show_backtrace ( ) {
36
48
if let Some ( backtrace) = e. backtrace ( ) {
37
- writeln ! ( stderr, "backtrace:" ) . ok ( ) ;
38
49
writeln ! ( stderr, "{:?}" , backtrace) . ok ( ) ;
39
50
}
40
51
}
@@ -57,20 +68,37 @@ fn run() -> Result<()> {
57
68
. chain_err ( || format ! ( "couldn't remove {}" , pipe_) ) ) ;
58
69
}
59
70
60
- let cpipe = try!( CString :: new ( pipe. clone ( ) . into_os_string ( ) . into_vec ( ) )
61
- . chain_err ( || format ! ( "error converting {} to a C string" , pipe_) ) ) ;
71
+ let mut stream = match ( ) {
72
+ #[ cfg( unix) ]
73
+ ( ) => {
74
+ let cpipe =
75
+ try!( CString :: new ( pipe. clone ( ) . into_os_string ( ) . into_vec ( ) )
76
+ . chain_err ( || {
77
+ format ! ( "error converting {} to a C string" , pipe_)
78
+ } ) ) ;
79
+
80
+ match unsafe { libc:: mkfifo ( cpipe. as_ptr ( ) , 0o644 ) } {
81
+ 0 => { }
82
+ e => {
83
+ try!( Err ( io:: Error :: from_raw_os_error ( e) ) . chain_err ( || {
84
+ format ! ( "couldn't create a named pipe in {}" , pipe_)
85
+ } ) )
86
+ }
87
+ }
62
88
63
- match unsafe { libc:: mkfifo ( cpipe. as_ptr ( ) , 0o644 ) } {
64
- 0 => { }
65
- e => {
66
- try!( Err ( io:: Error :: from_raw_os_error ( e) ) . chain_err ( || {
67
- format ! ( "couldn't create a named pipe in {}" , pipe_)
68
- } ) )
89
+ let mut stream = try!( File :: open ( & pipe)
90
+ . chain_err ( || format ! ( "couldn't open {}" , pipe_) ) ) ;
69
91
}
70
- }
71
-
72
- let mut stream = try!( File :: open ( & pipe)
73
- . chain_err ( || format ! ( "couldn't open {}" , pipe_) ) ) ;
92
+ #[ cfg( not( unix) ) ]
93
+ ( ) => {
94
+ try!( OpenOptions :: new ( )
95
+ . create ( true )
96
+ . read ( true )
97
+ . write ( true )
98
+ . open ( & pipe)
99
+ . chain_err ( || format ! ( "couldn't open {}" , pipe_) ) )
100
+ }
101
+ } ;
74
102
75
103
let mut header = 0 ;
76
104
@@ -108,11 +136,14 @@ fn run() -> Result<()> {
108
136
}
109
137
}
110
138
} ) ( ) {
111
- writeln ! ( stderr, "error: {}" , e) . ok ( ) ;
139
+ match e. kind ( ) {
140
+ io:: ErrorKind :: UnexpectedEof => {
141
+ thread:: sleep ( Duration :: from_millis ( 100 ) ) ;
142
+ }
143
+ _ => {
144
+ writeln ! ( stderr, "error: {:?}" , e. kind( ) ) . ok ( ) ;
145
+ }
146
+ }
112
147
}
113
148
}
114
149
}
115
-
116
- fn show_backtrace ( ) -> bool {
117
- env:: var ( "RUST_BACKTRACE" ) . as_ref ( ) . map ( |s| & s[ ..] ) == Ok ( "1" )
118
- }
0 commit comments