@@ -3,10 +3,19 @@ extern crate futures;
3
3
extern crate tokio_core;
4
4
5
5
use async_dnssd:: TimeoutTrait ;
6
- use futures:: { Future , Stream } ;
7
- use std:: env;
8
- use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr } ;
9
- use std:: time:: Duration ;
6
+ use futures:: {
7
+ Future ,
8
+ Stream ,
9
+ } ;
10
+ use std:: {
11
+ env,
12
+ net:: {
13
+ IpAddr ,
14
+ Ipv4Addr ,
15
+ Ipv6Addr ,
16
+ } ,
17
+ time:: Duration ,
18
+ } ;
10
19
use tokio_core:: reactor:: Core ;
11
20
12
21
fn decode_address ( a : & async_dnssd:: QueryRecordResult ) -> Option < IpAddr > {
@@ -40,129 +49,133 @@ fn main() {
40
49
41
50
// Use `cargo run --example browse` to list all services broadcasting
42
51
// or `cargo run --example browse -- _http._tcp` to resolve a service.
43
- let query = env:: args ( ) . nth ( 1 ) . unwrap_or_else ( || list_all_services. to_string ( ) ) ;
52
+ let query = env:: args ( )
53
+ . nth ( 1 )
54
+ . unwrap_or_else ( || list_all_services. to_string ( ) ) ;
44
55
println ! ( "Browse: {}" , query) ;
45
56
46
- let listing = async_dnssd:: browse (
47
- async_dnssd:: Interface :: Any ,
48
- & query,
49
- None ,
50
- & handle
51
- ) . expect ( "failed browse" )
52
- . timeout ( search_timeout) . expect ( "failed timeout" )
53
- . map_err ( |e| e. into_io_error ( ) )
54
- . for_each ( |service| {
55
- let added = service. flags & async_dnssd:: BrowsedFlag :: Add ;
56
- if query == list_all_services {
57
- // resolving MetaQuery responses isn't useful (and fails
58
- // with "bad param")... we'd need to browse them
59
-
60
- let mut reg_type = service. reg_type . as_str ( ) ;
61
- if reg_type. ends_with ( '.' ) {
62
- reg_type = & reg_type[ ..reg_type. len ( ) -1 ] ;
63
- }
64
- let reg_type = service. service_name . clone ( ) + "." + reg_type;
65
- println ! (
66
- "Service Type {}{:?}@{:?}\t \t [{:?}]" ,
67
- if added { '+' } else { '-' } ,
68
- reg_type,
69
- service. domain,
70
- service
71
- ) ;
72
-
73
- return Ok ( ( ) ) ;
74
- }
75
-
76
- println ! (
77
- "Service {}{:?}@{:?} (type {:?})\t \t [{:?}]" ,
78
- if added { '+' } else { '-' } ,
79
- service. service_name,
80
- service. domain,
81
- service. reg_type,
82
- service
83
- ) ;
84
-
85
- if !added {
86
- // only resolve added services
87
- return Ok ( ( ) ) ;
88
- }
57
+ let listing =
58
+ async_dnssd:: browse ( async_dnssd:: Interface :: Any , & query, None , & handle)
59
+ . expect ( "failed browse" )
60
+ . timeout ( search_timeout)
61
+ . expect ( "failed timeout" )
62
+ . map_err ( |e| e. into_io_error ( ) )
63
+ . for_each ( |service| {
64
+ let added = service. flags & async_dnssd:: BrowsedFlag :: Add ;
65
+ if query == list_all_services {
66
+ // resolving MetaQuery responses isn't useful (and fails
67
+ // with "bad param")... we'd need to browse them
89
68
90
- let service_name_e = service. service_name . clone ( ) ;
69
+ let mut reg_type = service. reg_type . as_str ( ) ;
70
+ if reg_type. ends_with ( '.' ) {
71
+ reg_type = & reg_type[ ..reg_type. len ( ) - 1 ] ;
72
+ }
73
+ let reg_type =
74
+ service. service_name . clone ( ) + "." + reg_type;
75
+ println ! (
76
+ "Service Type {}{:?}@{:?}\t \t [{:?}]" ,
77
+ if added { '+' } else { '-' } ,
78
+ reg_type,
79
+ service. domain,
80
+ service
81
+ ) ;
91
82
92
- let inner_handle = handle. clone ( ) ;
93
- handle. spawn (
94
- match service. resolve ( & handle) {
95
- Ok ( r) => r,
96
- Err ( e) => {
97
- println ! ( "resolve failed: {:?}" , e) ;
98
83
return Ok ( ( ) ) ;
99
84
}
100
- }
101
- . timeout ( resolve_timeout) . expect ( "failed timeout" )
102
- . map_err ( |e| e. into_io_error ( ) )
103
- . for_each ( move |r| {
85
+
104
86
println ! (
105
- "Resolved {:?}: {:?}:{} (txt {:?})\t \t [{:?}]" ,
87
+ "Service {}{:?}@{:?} (type {:?})\t \t [{:?}]" ,
88
+ if added { '+' } else { '-' } ,
106
89
service. service_name,
107
- r. host_target,
108
- r. port,
109
- String :: from_utf8_lossy( & r. txt) ,
110
- r
90
+ service. domain,
91
+ service. reg_type,
92
+ service
111
93
) ;
112
- let host_target = r. host_target . clone ( ) ;
113
- let host_target_e = r. host_target . clone ( ) ;
114
- inner_handle. spawn (
115
- // Query IPv4
116
- async_dnssd:: query_record (
117
- async_dnssd:: QueryRecordFlags :: none ( ) ,
118
- async_dnssd:: Interface :: Any ,
119
- & r. host_target ,
120
- 1 , // 1 = A.
121
- 1 ,
122
- & inner_handle
123
- ) ?
124
- . timeout ( address_timeout) ?
125
- . select (
126
- // Query IPv6 and merge the results
127
- async_dnssd:: query_record (
128
- async_dnssd:: QueryRecordFlags :: none ( ) ,
129
- async_dnssd:: Interface :: Any ,
130
- & r. host_target ,
131
- 28 , // 28 = AAAA.
132
- 1 ,
133
- & inner_handle
134
- ) ?
135
- . timeout ( address_timeout) ?
136
- )
94
+
95
+ if !added {
96
+ // only resolve added services
97
+ return Ok ( ( ) ) ;
98
+ }
99
+
100
+ let service_name_e = service. service_name . clone ( ) ;
101
+
102
+ let inner_handle = handle. clone ( ) ;
103
+ handle. spawn (
104
+ match service. resolve ( & handle) {
105
+ Ok ( r) => r,
106
+ Err ( e) => {
107
+ println ! ( "resolve failed: {:?}" , e) ;
108
+ return Ok ( ( ) ) ;
109
+ } ,
110
+ }
111
+ . timeout ( resolve_timeout)
112
+ . expect ( "failed timeout" )
137
113
. map_err ( |e| e. into_io_error ( ) )
138
- . for_each ( move |a| {
139
- match decode_address ( & a) {
140
- Some ( addr) => println ! (
141
- "Address for {}: {}\t \t [{:?}]" ,
142
- host_target,
143
- addr,
144
- a
145
- ) ,
146
- None => println ! (
147
- "Address for {}: <unknown>\t \t [{:?}]" ,
148
- host_target,
149
- a
150
- ) ,
151
- }
152
- Ok ( ( ) )
153
- } ) . or_else ( move |e| {
154
- println ! ( "query_record {} failed: {}" , host_target_e, e) ;
114
+ . for_each ( move |r| {
115
+ println ! (
116
+ "Resolved {:?}: {:?}:{} (txt {:?})\t \t [{:?}]" ,
117
+ service. service_name,
118
+ r. host_target,
119
+ r. port,
120
+ String :: from_utf8_lossy( & r. txt) ,
121
+ r
122
+ ) ;
123
+ let host_target = r. host_target . clone ( ) ;
124
+ let host_target_e = r. host_target . clone ( ) ;
125
+ inner_handle. spawn (
126
+ // Query IPv4
127
+ async_dnssd:: query_record (
128
+ async_dnssd:: QueryRecordFlags :: none ( ) ,
129
+ async_dnssd:: Interface :: Any ,
130
+ & r. host_target ,
131
+ 1 , // 1 = A.
132
+ 1 ,
133
+ & inner_handle,
134
+ ) ?
135
+ . timeout ( address_timeout) ?
136
+ . select (
137
+ // Query IPv6 and merge the results
138
+ async_dnssd:: query_record (
139
+ async_dnssd:: QueryRecordFlags :: none ( ) ,
140
+ async_dnssd:: Interface :: Any ,
141
+ & r. host_target ,
142
+ 28 , // 28 = AAAA.
143
+ 1 ,
144
+ & inner_handle,
145
+ ) ?
146
+ . timeout ( address_timeout) ?,
147
+ )
148
+ . map_err ( |e| e. into_io_error ( ) )
149
+ . for_each ( move |a| {
150
+ match decode_address ( & a) {
151
+ Some ( addr) => println ! (
152
+ "Address for {}: {}\t \t [{:?}]" ,
153
+ host_target, addr, a
154
+ ) ,
155
+ None => println ! (
156
+ "Address for {}: <unknown>\t \t [{:?}]" ,
157
+ host_target, a
158
+ ) ,
159
+ }
160
+ Ok ( ( ) )
161
+ } )
162
+ . or_else ( move |e| {
163
+ println ! (
164
+ "query_record {} failed: {}" ,
165
+ host_target_e, e
166
+ ) ;
167
+ Ok ( ( ) )
168
+ } ) ,
169
+ ) ;
155
170
Ok ( ( ) )
156
171
} )
172
+ . or_else ( move |e| {
173
+ println ! ( "resolve {:?} failed: {}" , service_name_e, e) ;
174
+ Ok ( ( ) )
175
+ } ) ,
157
176
) ;
158
- Ok ( ( ) )
159
- } ) . or_else ( move |e| {
160
- println ! ( "resolve {:?} failed: {}" , service_name_e, e) ;
161
- Ok ( ( ) )
162
- } )
163
- ) ;
164
177
165
- Ok ( ( ) )
166
- } ) ;
178
+ Ok ( ( ) )
179
+ } ) ;
167
180
core. run ( listing) . unwrap ( ) ;
168
181
}
0 commit comments