daemon/devices_linux.go
8f936ae8
 package daemon // import "github.com/docker/docker/daemon"
 
 import (
 	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/pkg/capabilities"
 	specs "github.com/opencontainers/runtime-spec/specs-go"
 )
 
 var deviceDrivers = map[string]*deviceDriver{}
 
 type deviceDriver struct {
 	capset     capabilities.Set
 	updateSpec func(*specs.Spec, *deviceInstance) error
 }
 
 type deviceInstance struct {
 	req          container.DeviceRequest
 	selectedCaps []string
 }
 
 func registerDeviceDriver(name string, d *deviceDriver) {
 	deviceDrivers[name] = d
 }
 
 func (daemon *Daemon) handleDevice(req container.DeviceRequest, spec *specs.Spec) error {
 	if req.Driver == "" {
 		for _, dd := range deviceDrivers {
 			if selected := dd.capset.Match(req.Capabilities); selected != nil {
 				return dd.updateSpec(spec, &deviceInstance{req: req, selectedCaps: selected})
 			}
 		}
 	} else if dd := deviceDrivers[req.Driver]; dd != nil {
 		if selected := dd.capset.Match(req.Capabilities); selected != nil {
 			return dd.updateSpec(spec, &deviceInstance{req: req, selectedCaps: selected})
 		}
 	}
 	return incompatibleDeviceRequest{req.Driver, req.Capabilities}
 }