func RecvMsg()

in pkg/util/fdchannel.go [47:84]


func RecvMsg(via net.Conn) (int, []byte, error) {
	klog.V(4).Info("get the underlying socket")
	conn, ok := via.(*net.UnixConn)
	if !ok {
		return 0, nil, errors.New("failed to cast via to *net.UnixConn")
	}
	connf, err := conn.File()
	if err != nil {
		return 0, nil, err
	}
	socket := int(connf.Fd())
	defer connf.Close()

	klog.V(4).Info("calling recvmsg...")
	buf := make([]byte, syscall.CmsgSpace(4))
	b := make([]byte, 5000)
	//nolint:dogsled
	n, _, _, _, err := syscall.Recvmsg(socket, b, buf, 0)
	if err != nil {
		return 0, nil, err
	}
	klog.V(4).Infof("received message of %d bytes", n)

	klog.V(4).Info("parsing SCM...")
	var msgs []syscall.SocketControlMessage
	msgs, err = syscall.ParseSocketControlMessage(buf)
	if err != nil {
		return 0, nil, err
	}

	klog.V(4).Info("parsing SCM_RIGHTS...")
	fds, err := syscall.ParseUnixRights(&msgs[0])
	if err != nil {
		return 0, nil, err
	}

	return fds[0], b[:n], err
}