getKernelVersion_linux.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package docker
  2. import (
  3. "bytes"
  4. "github.com/dotcloud/docker/utils"
  5. "strconv"
  6. "strings"
  7. "syscall"
  8. )
  9. // FIXME: Move this to utils package
  10. func getKernelVersion() (*utils.KernelVersionInfo, error) {
  11. var (
  12. uts syscall.Utsname
  13. flavor string
  14. kernel, major, minor int
  15. err error
  16. )
  17. if err := syscall.Uname(&uts); err != nil {
  18. return nil, err
  19. }
  20. release := make([]byte, len(uts.Release))
  21. i := 0
  22. for _, c := range uts.Release {
  23. release[i] = byte(c)
  24. i++
  25. }
  26. // Remove the \x00 from the release for Atoi to parse correctly
  27. release = release[:bytes.IndexByte(release, 0)]
  28. tmp := strings.SplitN(string(release), "-", 2)
  29. tmp2 := strings.SplitN(tmp[0], ".", 3)
  30. if len(tmp2) > 0 {
  31. kernel, err = strconv.Atoi(tmp2[0])
  32. if err != nil {
  33. return nil, err
  34. }
  35. }
  36. if len(tmp2) > 1 {
  37. major, err = strconv.Atoi(tmp2[1])
  38. if err != nil {
  39. return nil, err
  40. }
  41. }
  42. if len(tmp2) > 2 {
  43. minor, err = strconv.Atoi(tmp2[2])
  44. if err != nil {
  45. return nil, err
  46. }
  47. }
  48. if len(tmp) == 2 {
  49. flavor = tmp[1]
  50. } else {
  51. flavor = ""
  52. }
  53. return &utils.KernelVersionInfo{
  54. Kernel: kernel,
  55. Major: major,
  56. Minor: minor,
  57. Flavor: flavor,
  58. }, nil
  59. }