// Copyright 2011 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// +build solaris

package net

import "syscall"

func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error {
	// See golang.org/issue/7399.
	return syscall.EINVAL
}

func setIPv4MulticastLoopback(fd *netFD, v bool) error {
	// See golang.org/issue/7399.
	return syscall.EINVAL
}

func joinIPv4Group(fd *netFD, ifi *Interface, ip IP) error {
	// See golang.org/issue/7399.
	return syscall.EINVAL
}

func setIPv6MulticastInterface(fd *netFD, ifi *Interface) error {
	// See golang.org/issue/7399.
	return syscall.EINVAL
}

func setIPv6MulticastLoopback(fd *netFD, v bool) error {
	// See golang.org/issue/7399.
	return syscall.EINVAL
}

func joinIPv6Group(fd *netFD, ifi *Interface, ip IP) error {
	// See golang.org/issue/7399.
	return syscall.EINVAL
}
