@@ -25,7 +25,8 @@ use crate::fd::{
25
25
use crate :: syscalls:: block_on;
26
26
27
27
pub const AF_UNSPEC : i32 = 0 ;
28
- pub const AF_INET : i32 = 0 ;
28
+ pub const AF_INET_OLD : i32 = 0 ;
29
+ pub const AF_INET : i32 = 3 ;
29
30
pub const AF_INET6 : i32 = 1 ;
30
31
pub const AF_VSOCK : i32 = 2 ;
31
32
pub const IPPROTO_IP : i32 = 0 ;
@@ -437,7 +438,7 @@ pub extern "C" fn sys_socket(domain: i32, type_: SockType, protocol: i32) -> i32
437
438
}
438
439
439
440
#[ cfg( any( feature = "tcp" , feature = "udp" ) ) ]
440
- if ( domain == AF_INET || domain == AF_INET6 )
441
+ if ( domain == AF_INET_OLD || domain == AF_INET || domain == AF_INET6 )
441
442
&& type_. intersects ( SockType :: SOCK_STREAM | SockType :: SOCK_DGRAM )
442
443
{
443
444
let mut guard = NIC . lock ( ) ;
@@ -447,7 +448,7 @@ pub extern "C" fn sys_socket(domain: i32, type_: SockType, protocol: i32) -> i32
447
448
if type_. contains ( SockType :: SOCK_DGRAM ) {
448
449
let handle = nic. create_udp_handle ( ) . unwrap ( ) ;
449
450
drop ( guard) ;
450
- let socket = Arc :: new ( async_lock:: RwLock :: new ( udp:: Socket :: new ( handle) ) ) ;
451
+ let socket = Arc :: new ( async_lock:: RwLock :: new ( udp:: Socket :: new ( handle, domain ) ) ) ;
451
452
452
453
if type_. contains ( SockType :: SOCK_NONBLOCK ) {
453
454
block_on ( socket. set_status_flags ( fd:: StatusFlags :: O_NONBLOCK ) , None ) . unwrap ( ) ;
@@ -462,7 +463,7 @@ pub extern "C" fn sys_socket(domain: i32, type_: SockType, protocol: i32) -> i32
462
463
if type_. contains ( SockType :: SOCK_STREAM ) {
463
464
let handle = nic. create_tcp_handle ( ) . unwrap ( ) ;
464
465
drop ( guard) ;
465
- let socket = Arc :: new ( async_lock:: RwLock :: new ( tcp:: Socket :: new ( handle) ) ) ;
466
+ let socket = Arc :: new ( async_lock:: RwLock :: new ( tcp:: Socket :: new ( handle, domain ) ) ) ;
466
467
467
468
if type_. contains ( SockType :: SOCK_NONBLOCK ) {
468
469
block_on ( socket. set_status_flags ( fd:: StatusFlags :: O_NONBLOCK ) , None ) . unwrap ( ) ;
@@ -500,6 +501,7 @@ pub unsafe extern "C" fn sys_accept(fd: i32, addr: *mut sockaddr, addrlen: *mut
500
501
if * addrlen >= size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) {
501
502
let addr = unsafe { & mut * addr. cast ( ) } ;
502
503
* addr = sockaddr_in:: from ( endpoint) ;
504
+ addr. sin_family = block_on ( v. inet_domain ( ) , None ) . unwrap ( ) . try_into ( ) . unwrap ( ) ;
503
505
* addrlen = size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) ;
504
506
}
505
507
}
@@ -564,7 +566,7 @@ pub unsafe extern "C" fn sys_bind(fd: i32, name: *const sockaddr, namelen: sockl
564
566
|e| -num:: ToPrimitive :: to_i32 ( & e) . unwrap ( ) ,
565
567
|v| match family {
566
568
#[ cfg( any( feature = "tcp" , feature = "udp" ) ) ]
567
- AF_INET => {
569
+ AF_INET_OLD | AF_INET => {
568
570
if namelen < size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) {
569
571
return -crate :: errno:: EINVAL ;
570
572
}
@@ -606,7 +608,7 @@ pub unsafe extern "C" fn sys_connect(fd: i32, name: *const sockaddr, namelen: so
606
608
607
609
let endpoint = match sa_family {
608
610
#[ cfg( any( feature = "tcp" , feature = "udp" ) ) ]
609
- AF_INET => {
611
+ AF_INET_OLD | AF_INET => {
610
612
if namelen < size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) {
611
613
return -crate :: errno:: EINVAL ;
612
614
}
@@ -663,6 +665,7 @@ pub unsafe extern "C" fn sys_getsockname(
663
665
if * addrlen >= size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) {
664
666
let addr = unsafe { & mut * addr. cast ( ) } ;
665
667
* addr = sockaddr_in:: from ( endpoint) ;
668
+ addr. sin_family = block_on ( v. inet_domain ( ) , None ) . unwrap ( ) . try_into ( ) . unwrap ( ) ;
666
669
* addrlen = size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) ;
667
670
} else {
668
671
return -crate :: errno:: EINVAL ;
@@ -803,6 +806,7 @@ pub unsafe extern "C" fn sys_getpeername(
803
806
if * addrlen >= size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) {
804
807
let addr = unsafe { & mut * addr. cast ( ) } ;
805
808
* addr = sockaddr_in:: from ( endpoint) ;
809
+ addr. sin_family = block_on ( v. inet_domain ( ) , None ) . unwrap ( ) . try_into ( ) . unwrap ( ) ;
806
810
* addrlen = size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) ;
807
811
} else {
808
812
return -crate :: errno:: EINVAL ;
@@ -915,7 +919,7 @@ pub unsafe extern "C" fn sys_sendto(
915
919
if #[ cfg( any( feature = "tcp" , feature = "udp" ) ) ] {
916
920
let sa_family = unsafe { i32 :: from( ( * addr) . sa_family) } ;
917
921
918
- if sa_family == AF_INET {
922
+ if sa_family == AF_INET_OLD || sa_family == AF_INET {
919
923
if addr_len < size_of:: <sockaddr_in>( ) . try_into( ) . unwrap( ) {
920
924
return ( -crate :: errno:: EINVAL ) . try_into( ) . unwrap( ) ;
921
925
}
@@ -982,6 +986,7 @@ pub unsafe extern "C" fn sys_recvfrom(
982
986
if * addrlen >= size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) {
983
987
let addr = unsafe { & mut * addr. cast ( ) } ;
984
988
* addr = sockaddr_in:: from ( endpoint) ;
989
+ addr. sin_family = block_on ( v. inet_domain ( ) , None ) . unwrap ( ) . try_into ( ) . unwrap ( ) ;
985
990
* addrlen = size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) ;
986
991
} else {
987
992
return ( -crate :: errno:: EINVAL ) . try_into ( ) . unwrap ( ) ;
0 commit comments