@@ -466,7 +466,7 @@ static int pid_notify_with_fds_internal(
466
466
struct cmsghdr * cmsg = NULL ;
467
467
const char * e ;
468
468
bool send_ucred ;
469
- int r ;
469
+ int type , r ;
470
470
471
471
if (!state )
472
472
return - EINVAL ;
@@ -491,30 +491,33 @@ static int pid_notify_with_fds_internal(
491
491
if (address .sockaddr .vm .svm_family == AF_VSOCK && address .sockaddr .vm .svm_cid == VMADDR_CID_ANY )
492
492
return - EINVAL ;
493
493
494
+ type = address .type == 0 ? SOCK_DGRAM : address .type ;
495
+
494
496
/* At the time of writing QEMU does not yet support AF_VSOCK + SOCK_DGRAM and returns
495
497
* ENODEV. Fallback to SOCK_SEQPACKET in that case. */
496
- fd = socket (address .sockaddr .sa .sa_family , SOCK_DGRAM |SOCK_CLOEXEC , 0 );
498
+ fd = socket (address .sockaddr .sa .sa_family , type |SOCK_CLOEXEC , 0 );
497
499
if (fd < 0 ) {
498
- if (!(ERRNO_IS_NOT_SUPPORTED (errno ) || errno == ENODEV ) || address .sockaddr .sa .sa_family != AF_VSOCK )
499
- return log_debug_errno (errno , "Failed to open datagram notify socket to '%s': %m" , e );
500
+ if (!(ERRNO_IS_NOT_SUPPORTED (errno ) || errno == ENODEV ) || address .sockaddr .sa .sa_family != AF_VSOCK || address . type > 0 )
501
+ return log_debug_errno (errno , "Failed to open %s notify socket to '%s': %m" , socket_address_type_to_string ( type ) , e );
500
502
501
- fd = socket (address .sockaddr .sa .sa_family , SOCK_SEQPACKET |SOCK_CLOEXEC , 0 );
503
+ type = SOCK_SEQPACKET ;
504
+ fd = socket (address .sockaddr .sa .sa_family , type |SOCK_CLOEXEC , 0 );
502
505
if (fd < 0 )
503
- return log_debug_errno (errno , "Failed to open sequential packet socket to '%s': %m" , e );
506
+ return log_debug_errno (errno , "Failed to open %s socket to '%s': %m" , socket_address_type_to_string (type ), e );
507
+ }
504
508
509
+ if (address .sockaddr .sa .sa_family == AF_VSOCK ) {
505
510
r = vsock_bind_privileged_port (fd );
506
511
if (r < 0 && !ERRNO_IS_PRIVILEGE (r ))
507
512
return log_debug_errno (r , "Failed to bind socket to privileged port: %m" );
513
+ }
508
514
515
+ if (IN_SET (type , SOCK_STREAM , SOCK_SEQPACKET )) {
509
516
if (connect (fd , & address .sockaddr .sa , address .size ) < 0 )
510
517
return log_debug_errno (errno , "Failed to connect socket to '%s': %m" , e );
511
518
512
519
msghdr .msg_name = NULL ;
513
520
msghdr .msg_namelen = 0 ;
514
- } else if (address .sockaddr .sa .sa_family == AF_VSOCK ) {
515
- r = vsock_bind_privileged_port (fd );
516
- if (r < 0 && !ERRNO_IS_PRIVILEGE (r ))
517
- return log_debug_errno (r , "Failed to bind socket to privileged port: %m" );
518
521
}
519
522
520
523
(void ) fd_inc_sndbuf (fd , SNDBUF_SIZE );
0 commit comments