getKernelVersion_linux.go 1.1 KB

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