github.com/rawahars/moby@v24.0.4+incompatible/daemon/devices_linux.go (about) 1 package daemon // import "github.com/docker/docker/daemon" 2 3 import ( 4 "github.com/docker/docker/api/types/container" 5 "github.com/docker/docker/pkg/capabilities" 6 specs "github.com/opencontainers/runtime-spec/specs-go" 7 ) 8 9 var deviceDrivers = map[string]*deviceDriver{} 10 11 type deviceDriver struct { 12 capset capabilities.Set 13 updateSpec func(*specs.Spec, *deviceInstance) error 14 } 15 16 type deviceInstance struct { 17 req container.DeviceRequest 18 selectedCaps []string 19 } 20 21 func registerDeviceDriver(name string, d *deviceDriver) { 22 deviceDrivers[name] = d 23 } 24 25 func (daemon *Daemon) handleDevice(req container.DeviceRequest, spec *specs.Spec) error { 26 if req.Driver == "" { 27 for _, dd := range deviceDrivers { 28 if selected := dd.capset.Match(req.Capabilities); selected != nil { 29 return dd.updateSpec(spec, &deviceInstance{req: req, selectedCaps: selected}) 30 } 31 } 32 } else if dd := deviceDrivers[req.Driver]; dd != nil { 33 if selected := dd.capset.Match(req.Capabilities); selected != nil { 34 return dd.updateSpec(spec, &deviceInstance{req: req, selectedCaps: selected}) 35 } 36 } 37 return incompatibleDeviceRequest{req.Driver, req.Capabilities} 38 }