@@ -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,10 @@ 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 )
505
+ . unwrap ( )
506
+ . try_into ( )
507
+ . unwrap ( ) ;
503
508
* addrlen = size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) ;
504
509
}
505
510
}
@@ -564,7 +569,7 @@ pub unsafe extern "C" fn sys_bind(fd: i32, name: *const sockaddr, namelen: sockl
564
569
|e| -num:: ToPrimitive :: to_i32 ( & e) . unwrap ( ) ,
565
570
|v| match family {
566
571
#[ cfg( any( feature = "tcp" , feature = "udp" ) ) ]
567
- AF_INET => {
572
+ AF_INET_OLD | AF_INET => {
568
573
if namelen < size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) {
569
574
return -crate :: errno:: EINVAL ;
570
575
}
@@ -606,7 +611,7 @@ pub unsafe extern "C" fn sys_connect(fd: i32, name: *const sockaddr, namelen: so
606
611
607
612
let endpoint = match sa_family {
608
613
#[ cfg( any( feature = "tcp" , feature = "udp" ) ) ]
609
- AF_INET => {
614
+ AF_INET_OLD | AF_INET => {
610
615
if namelen < size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) {
611
616
return -crate :: errno:: EINVAL ;
612
617
}
@@ -663,6 +668,10 @@ pub unsafe extern "C" fn sys_getsockname(
663
668
if * addrlen >= size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) {
664
669
let addr = unsafe { & mut * addr. cast ( ) } ;
665
670
* addr = sockaddr_in:: from ( endpoint) ;
671
+ addr. sin_family = block_on ( v. inet_domain ( ) , None )
672
+ . unwrap ( )
673
+ . try_into ( )
674
+ . unwrap ( ) ;
666
675
* addrlen = size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) ;
667
676
} else {
668
677
return -crate :: errno:: EINVAL ;
@@ -803,6 +812,10 @@ pub unsafe extern "C" fn sys_getpeername(
803
812
if * addrlen >= size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) {
804
813
let addr = unsafe { & mut * addr. cast ( ) } ;
805
814
* addr = sockaddr_in:: from ( endpoint) ;
815
+ addr. sin_family = block_on ( v. inet_domain ( ) , None )
816
+ . unwrap ( )
817
+ . try_into ( )
818
+ . unwrap ( ) ;
806
819
* addrlen = size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) ;
807
820
} else {
808
821
return -crate :: errno:: EINVAL ;
@@ -915,7 +928,7 @@ pub unsafe extern "C" fn sys_sendto(
915
928
if #[ cfg( any( feature = "tcp" , feature = "udp" ) ) ] {
916
929
let sa_family = unsafe { i32 :: from( ( * addr) . sa_family) } ;
917
930
918
- if sa_family == AF_INET {
931
+ if sa_family == AF_INET_OLD || sa_family == AF_INET {
919
932
if addr_len < size_of:: <sockaddr_in>( ) . try_into( ) . unwrap( ) {
920
933
return ( -crate :: errno:: EINVAL ) . try_into( ) . unwrap( ) ;
921
934
}
@@ -982,6 +995,10 @@ pub unsafe extern "C" fn sys_recvfrom(
982
995
if * addrlen >= size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) {
983
996
let addr = unsafe { & mut * addr. cast ( ) } ;
984
997
* addr = sockaddr_in:: from ( endpoint) ;
998
+ addr. sin_family = block_on ( v. inet_domain ( ) , None )
999
+ . unwrap ( )
1000
+ . try_into ( )
1001
+ . unwrap ( ) ;
985
1002
* addrlen = size_of :: < sockaddr_in > ( ) . try_into ( ) . unwrap ( ) ;
986
1003
} else {
987
1004
return ( -crate :: errno:: EINVAL ) . try_into ( ) . unwrap ( ) ;
0 commit comments