devices_linux.go 1.1 KB

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