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} }