39 lines
1.1 KiB
Go
39 lines
1.1 KiB
Go
|
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}
|
||
|
}
|