@@ -2285,11 +2285,7 @@ impl crate::Socket {
2285
2285
}
2286
2286
}
2287
2287
2288
- /// Get the value of the `IP_FREEBIND` option on this socket.
2289
- ///
2290
- /// For more information about this option, see [`set_freebind`].
2291
- ///
2292
- /// [`set_freebind`]: crate::Socket::set_freebind
2288
+ /// This method is deprecated, use [`crate::Socket::ip_bindany_v4`].
2293
2289
#[ cfg( all(
2294
2290
feature = "all" ,
2295
2291
any( target_os = "android" , target_os = "fuchsia" , target_os = "linux" )
@@ -2301,20 +2297,12 @@ impl crate::Socket {
2301
2297
any( target_os = "android" , target_os = "fuchsia" , target_os = "linux" )
2302
2298
) ) )
2303
2299
) ]
2300
+ #[ deprecated = "Use `Socket::ip_bindany_v4` instead" ]
2304
2301
pub fn freebind ( & self ) -> io:: Result < bool > {
2305
- unsafe {
2306
- getsockopt :: < c_int > ( self . as_raw ( ) , libc:: SOL_IP , libc:: IP_FREEBIND )
2307
- . map ( |freebind| freebind != 0 )
2308
- }
2302
+ self . ip_bindany_v4 ( )
2309
2303
}
2310
2304
2311
- /// Set value for the `IP_FREEBIND` option on this socket.
2312
- ///
2313
- /// If enabled, this boolean option allows binding to an IP address that is
2314
- /// nonlocal or does not (yet) exist. This permits listening on a socket,
2315
- /// without requiring the underlying network interface or the specified
2316
- /// dynamic IP address to be up at the time that the application is trying
2317
- /// to bind to it.
2305
+ /// This method is deprecated, use [`crate::Socket::set_ip_bindany_v4`].
2318
2306
#[ cfg( all(
2319
2307
feature = "all" ,
2320
2308
any( target_os = "android" , target_os = "fuchsia" , target_os = "linux" )
@@ -2326,80 +2314,31 @@ impl crate::Socket {
2326
2314
any( target_os = "android" , target_os = "fuchsia" , target_os = "linux" )
2327
2315
) ) )
2328
2316
) ]
2317
+ #[ deprecated = "Use `Socket::set_ip_bindany_v4` instead" ]
2329
2318
pub fn set_freebind ( & self , freebind : bool ) -> io:: Result < ( ) > {
2330
- unsafe {
2331
- setsockopt (
2332
- self . as_raw ( ) ,
2333
- libc:: SOL_IP ,
2334
- libc:: IP_FREEBIND ,
2335
- freebind as c_int ,
2336
- )
2337
- }
2319
+ self . set_ip_bindany_v4 ( freebind)
2338
2320
}
2339
2321
2340
- /// Get the value of the `IPV6_FREEBIND` option on this socket.
2341
- ///
2342
- /// This is an IPv6 counterpart of `IP_FREEBIND` socket option on
2343
- /// Android/Linux. For more information about this option, see
2344
- /// [`set_freebind`].
2345
- ///
2346
- /// [`set_freebind`]: crate::Socket::set_freebind
2322
+ /// This method is deprecated, use [`crate::Socket::ip_bindany_v6`].
2347
2323
#[ cfg( all( feature = "all" , any( target_os = "android" , target_os = "linux" ) ) ) ]
2348
2324
#[ cfg_attr(
2349
2325
docsrs,
2350
2326
doc( cfg( all( feature = "all" , any( target_os = "android" , target_os = "linux" ) ) ) )
2351
2327
) ]
2328
+ #[ deprecated = "Use `Socket::ip_bindany_v6` instead" ]
2352
2329
pub fn freebind_ipv6 ( & self ) -> io:: Result < bool > {
2353
- unsafe {
2354
- getsockopt :: < c_int > ( self . as_raw ( ) , libc:: SOL_IPV6 , libc:: IPV6_FREEBIND )
2355
- . map ( |freebind| freebind != 0 )
2356
- }
2330
+ self . ip_bindany_v6 ( )
2357
2331
}
2358
2332
2359
- /// Set value for the `IPV6_FREEBIND` option on this socket.
2360
- ///
2361
- /// This is an IPv6 counterpart of `IP_FREEBIND` socket option on
2362
- /// Android/Linux. For more information about this option, see
2363
- /// [`set_freebind`].
2364
- ///
2365
- /// [`set_freebind`]: crate::Socket::set_freebind
2366
- ///
2367
- /// # Examples
2368
- ///
2369
- /// On Linux:
2370
- ///
2371
- /// ```
2372
- /// use socket2::{Domain, Socket, Type};
2373
- /// use std::io::{self, Error, ErrorKind};
2374
- ///
2375
- /// fn enable_freebind(socket: &Socket) -> io::Result<()> {
2376
- /// match socket.domain()? {
2377
- /// Domain::IPV4 => socket.set_freebind(true)?,
2378
- /// Domain::IPV6 => socket.set_freebind_ipv6(true)?,
2379
- /// _ => return Err(Error::new(ErrorKind::Other, "unsupported domain")),
2380
- /// };
2381
- /// Ok(())
2382
- /// }
2383
- ///
2384
- /// # fn main() -> io::Result<()> {
2385
- /// # let socket = Socket::new(Domain::IPV6, Type::STREAM, None)?;
2386
- /// # enable_freebind(&socket)
2387
- /// # }
2388
- /// ```
2333
+ /// This method is deprecated, use [`crate::Socket::set_ip_bindany_v6`].
2389
2334
#[ cfg( all( feature = "all" , any( target_os = "android" , target_os = "linux" ) ) ) ]
2390
2335
#[ cfg_attr(
2391
2336
docsrs,
2392
2337
doc( cfg( all( feature = "all" , any( target_os = "android" , target_os = "linux" ) ) ) )
2393
2338
) ]
2339
+ #[ deprecated = "Use `Socket::set_ip_bindany_v6` instead" ]
2394
2340
pub fn set_freebind_ipv6 ( & self , freebind : bool ) -> io:: Result < ( ) > {
2395
- unsafe {
2396
- setsockopt (
2397
- self . as_raw ( ) ,
2398
- libc:: SOL_IPV6 ,
2399
- libc:: IPV6_FREEBIND ,
2400
- freebind as c_int ,
2401
- )
2402
- }
2341
+ self . set_ip_bindany_v6 ( freebind)
2403
2342
}
2404
2343
2405
2344
/// Get the value for the `SO_ORIGINAL_DST` option on this socket.
@@ -3239,6 +3178,96 @@ impl crate::Socket {
3239
3178
)
3240
3179
}
3241
3180
}
3181
+
3182
+ /// Get the value of the bind-any-like option on this socket.
3183
+ /// The option is that `IP_FREEBIND` on Android/Fuchisa/Linux,
3184
+ /// `IP_BINDANY` on FreeBSD and `SO_BINDANY` on FreeBSD.
3185
+ ///
3186
+ /// For more information about this option, see [`set_ip_bindany_v4`].
3187
+ ///
3188
+ /// [`set_ip_bindany_v4`]: crate::Socket::set_ip_bindany_v4
3189
+ #[ cfg( all(
3190
+ feature = "all" ,
3191
+ any( target_os = "android" , target_os = "fuchsia" , target_os = "linux" )
3192
+ ) ) ]
3193
+ #[ cfg_attr(
3194
+ docsrs,
3195
+ doc( cfg( all(
3196
+ feature = "all" ,
3197
+ any( target_os = "android" , target_os = "fuchsia" , target_os = "linux" )
3198
+ ) ) )
3199
+ ) ]
3200
+ pub fn ip_bindany_v4 ( & self ) -> io:: Result < bool > {
3201
+ #[ cfg( any( target_os = "android" , target_os = "fuchsia" , target_os = "linux" ) ) ]
3202
+ let ( level, opt) = ( libc:: SOL_IP , libc:: IP_FREEBIND ) ;
3203
+
3204
+ unsafe { getsockopt :: < c_int > ( self . as_raw ( ) , level, opt) . map ( |bindany| bindany != 0 ) }
3205
+ }
3206
+
3207
+ /// Set the value of the bind-any-like option on this socket.
3208
+ /// The option is that `IP_FREEBIND` on Android/Fuchisa/Linux,
3209
+ /// `IP_BINDANY` on FreeBSD and `SO_BINDANY` on FreeBSD.
3210
+ ///
3211
+ /// The option allows the socket to be bound to addresses which are not
3212
+ /// nonlocal. This permits listening on a socket, without requiring the
3213
+ /// underlying network interface or the specified dynamic IP address to
3214
+ /// be up at the time that the application is trying to bind to it.
3215
+ #[ cfg( all(
3216
+ feature = "all" ,
3217
+ any( target_os = "android" , target_os = "fuchsia" , target_os = "linux" )
3218
+ ) ) ]
3219
+ #[ cfg_attr(
3220
+ docsrs,
3221
+ doc( cfg( all(
3222
+ feature = "all" ,
3223
+ any( target_os = "android" , target_os = "fuchsia" , target_os = "linux" )
3224
+ ) ) )
3225
+ ) ]
3226
+ pub fn set_ip_bindany_v4 ( & self , bindany : bool ) -> io:: Result < ( ) > {
3227
+ #[ cfg( any( target_os = "android" , target_os = "fuchsia" , target_os = "linux" ) ) ]
3228
+ let ( level, opt) = ( libc:: SOL_IP , libc:: IP_FREEBIND ) ;
3229
+
3230
+ unsafe { setsockopt ( self . as_raw ( ) , level, opt, bindany as c_int ) }
3231
+ }
3232
+
3233
+ /// Get the value of the bind-any-like option on this socket.
3234
+ /// The option is that `IPV6_FREEBIND` on Android/Linux,
3235
+ /// `IPV6_BINDANY` on FreeBSD and `SO_BINDANY` on FreeBSD.
3236
+ ///
3237
+ /// For more information about this option, see [`set_ip_bindany_v6`].
3238
+ ///
3239
+ /// [`set_ip_bindany_v6`]: crate::Socket::set_ip_bindany_v6
3240
+ #[ cfg( all( feature = "all" , any( target_os = "android" , target_os = "linux" ) ) ) ]
3241
+ #[ cfg_attr(
3242
+ docsrs,
3243
+ doc( cfg( all( feature = "all" , any( target_os = "android" , target_os = "linux" ) ) ) )
3244
+ ) ]
3245
+ pub fn ip_bindany_v6 ( & self ) -> io:: Result < bool > {
3246
+ #[ cfg( any( target_os = "android" , target_os = "linux" ) ) ]
3247
+ let ( level, opt) = ( libc:: SOL_IPV6 , libc:: IPV6_FREEBIND ) ;
3248
+
3249
+ unsafe { getsockopt :: < c_int > ( self . as_raw ( ) , level, opt) . map ( |bindany| bindany != 0 ) }
3250
+ }
3251
+
3252
+ /// Set the value of the bind-any-like option on this socket.
3253
+ /// The option is that `IPV6_FREEBIND` on Android/Linux,
3254
+ /// `IPV6_BINDANY` on FreeBSD and `SO_BINDANY` on FreeBSD.
3255
+ ///
3256
+ /// This is an IPv6 counterpart of `set_ip_bindany_v4` on a socket.
3257
+ /// For more information about this option, see [`set_ip_bindany_v4`].
3258
+ ///
3259
+ /// [`set_ip_bindany_v4`]: crate::Socket::set_ip_bindany_v4
3260
+ #[ cfg( all( feature = "all" , any( target_os = "android" , target_os = "linux" ) ) ) ]
3261
+ #[ cfg_attr(
3262
+ docsrs,
3263
+ doc( cfg( all( feature = "all" , any( target_os = "android" , target_os = "linux" ) ) ) )
3264
+ ) ]
3265
+ pub fn set_ip_bindany_v6 ( & self , bindany : bool ) -> io:: Result < ( ) > {
3266
+ #[ cfg( any( target_os = "android" , target_os = "linux" ) ) ]
3267
+ let ( level, opt) = ( libc:: SOL_IPV6 , libc:: IPV6_FREEBIND ) ;
3268
+
3269
+ unsafe { setsockopt ( self . as_raw ( ) , level, opt, bindany as c_int ) }
3270
+ }
3242
3271
}
3243
3272
3244
3273
/// See [`Socket::dccp_available_ccids`].
0 commit comments