github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+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  }