@@ -512,44 +512,47 @@ int os_shutdown_socket(int fd, int r, int w)
512512 return 0 ;
513513}
514514
515- int os_rcv_fd (int fd , int * helper_pid_out )
515+ /**
516+ * os_rcv_fd_msg - receive message with (optional) FDs
517+ * @fd: the FD to receive from
518+ * @fds: the array for FDs to write to
519+ * @n_fds: number of FDs to receive (@fds array size)
520+ * @data: the message buffer
521+ * @data_len: the size of the message to receive
522+ *
523+ * Receive a message with FDs.
524+ *
525+ * Returns: the size of the received message, or an error code
526+ */
527+ ssize_t os_rcv_fd_msg (int fd , int * fds , unsigned int n_fds ,
528+ void * data , size_t data_len )
516529{
517- int new , n ;
518- char buf [CMSG_SPACE (sizeof (new ))];
519- struct msghdr msg ;
530+ char buf [CMSG_SPACE (sizeof (* fds ) * n_fds )];
520531 struct cmsghdr * cmsg ;
521- struct iovec iov ;
522-
523- msg . msg_name = NULL ;
524- msg . msg_namelen = 0 ;
525- iov = (( struct iovec ) { . iov_base = helper_pid_out ,
526- . iov_len = sizeof ( * helper_pid_out ) });
527- msg . msg_iov = & iov ;
528- msg . msg_iovlen = 1 ;
529- msg . msg_control = buf ;
530- msg . msg_controllen = sizeof ( buf ) ;
531- msg . msg_flags = 0 ;
532+ struct iovec iov = {
533+ . iov_base = data ,
534+ . iov_len = data_len ,
535+ } ;
536+ struct msghdr msg = {
537+ . msg_iov = & iov ,
538+ . msg_iovlen = 1 ,
539+ . msg_control = buf ,
540+ . msg_controllen = sizeof ( buf ),
541+ } ;
542+ int n ;
532543
533544 n = recvmsg (fd , & msg , 0 );
534545 if (n < 0 )
535546 return - errno ;
536- else if (n != iov .iov_len )
537- * helper_pid_out = -1 ;
538547
539548 cmsg = CMSG_FIRSTHDR (& msg );
540- if (cmsg == NULL ) {
541- printk (UM_KERN_ERR "rcv_fd didn't receive anything, "
542- "error = %d\n" , errno );
543- return -1 ;
544- }
545- if ((cmsg -> cmsg_level != SOL_SOCKET ) ||
546- (cmsg -> cmsg_type != SCM_RIGHTS )) {
547- printk (UM_KERN_ERR "rcv_fd didn't receive a descriptor\n" );
548- return -1 ;
549- }
549+ if (!cmsg ||
550+ cmsg -> cmsg_level != SOL_SOCKET ||
551+ cmsg -> cmsg_type != SCM_RIGHTS )
552+ return n ;
550553
551- new = (( int * ) CMSG_DATA (cmsg ))[ 0 ] ;
552- return new ;
554+ memcpy ( fds , CMSG_DATA (cmsg ), cmsg -> cmsg_len ) ;
555+ return n ;
553556}
554557
555558int os_create_unix_socket (const char * file , int len , int close_on_exec )
0 commit comments