nodes.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. // +build linux
  2. package nodes
  3. import (
  4. "fmt"
  5. "os"
  6. "path/filepath"
  7. "syscall"
  8. "github.com/dotcloud/docker/pkg/libcontainer/devices"
  9. "github.com/dotcloud/docker/pkg/system"
  10. )
  11. // Create the device nodes in the container.
  12. func CreateDeviceNodes(rootfs string, nodesToCreate []*devices.Device) error {
  13. oldMask := system.Umask(0000)
  14. defer system.Umask(oldMask)
  15. for _, node := range nodesToCreate {
  16. if err := CreateDeviceNode(rootfs, node); err != nil {
  17. return err
  18. }
  19. }
  20. return nil
  21. }
  22. // Creates the device node in the rootfs of the container.
  23. func CreateDeviceNode(rootfs string, node *devices.Device) error {
  24. var (
  25. dest = filepath.Join(rootfs, node.Path)
  26. parent = filepath.Dir(dest)
  27. )
  28. if err := os.MkdirAll(parent, 0755); err != nil {
  29. return err
  30. }
  31. fileMode := node.FileMode
  32. switch node.Type {
  33. case 'c':
  34. fileMode |= syscall.S_IFCHR
  35. case 'b':
  36. fileMode |= syscall.S_IFBLK
  37. default:
  38. return fmt.Errorf("%c is not a valid device type for device %s", node.Type, node.Path)
  39. }
  40. if err := system.Mknod(dest, uint32(fileMode), devices.Mkdev(node.MajorNumber, node.MinorNumber)); err != nil && !os.IsExist(err) {
  41. return fmt.Errorf("mknod %s %s", node.Path, err)
  42. }
  43. return nil
  44. }