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