github.com/wulonghui/docker@v1.8.0-rc2/pkg/parsers/kernel/kernel.go (about) 1 // +build !windows 2 3 package kernel 4 5 import ( 6 "bytes" 7 "errors" 8 "fmt" 9 ) 10 11 type KernelVersionInfo struct { 12 Kernel int 13 Major int 14 Minor int 15 Flavor string 16 } 17 18 func (k *KernelVersionInfo) String() string { 19 return fmt.Sprintf("%d.%d.%d%s", k.Kernel, k.Major, k.Minor, k.Flavor) 20 } 21 22 // Compare two KernelVersionInfo struct. 23 // Returns -1 if a < b, 0 if a == b, 1 it a > b 24 func CompareKernelVersion(a, b *KernelVersionInfo) int { 25 if a.Kernel < b.Kernel { 26 return -1 27 } else if a.Kernel > b.Kernel { 28 return 1 29 } 30 31 if a.Major < b.Major { 32 return -1 33 } else if a.Major > b.Major { 34 return 1 35 } 36 37 if a.Minor < b.Minor { 38 return -1 39 } else if a.Minor > b.Minor { 40 return 1 41 } 42 43 return 0 44 } 45 46 func GetKernelVersion() (*KernelVersionInfo, error) { 47 var ( 48 err error 49 ) 50 51 uts, err := uname() 52 if err != nil { 53 return nil, err 54 } 55 56 release := make([]byte, len(uts.Release)) 57 58 i := 0 59 for _, c := range uts.Release { 60 release[i] = byte(c) 61 i++ 62 } 63 64 // Remove the \x00 from the release for Atoi to parse correctly 65 release = release[:bytes.IndexByte(release, 0)] 66 67 return ParseRelease(string(release)) 68 } 69 70 func ParseRelease(release string) (*KernelVersionInfo, error) { 71 var ( 72 kernel, major, minor, parsed int 73 flavor, partial string 74 ) 75 76 // Ignore error from Sscanf to allow an empty flavor. Instead, just 77 // make sure we got all the version numbers. 78 parsed, _ = fmt.Sscanf(release, "%d.%d%s", &kernel, &major, &partial) 79 if parsed < 2 { 80 return nil, errors.New("Can't parse kernel version " + release) 81 } 82 83 // sometimes we have 3.12.25-gentoo, but sometimes we just have 3.12-1-amd64 84 parsed, _ = fmt.Sscanf(partial, ".%d%s", &minor, &flavor) 85 if parsed < 1 { 86 flavor = partial 87 } 88 89 return &KernelVersionInfo{ 90 Kernel: kernel, 91 Major: major, 92 Minor: minor, 93 Flavor: flavor, 94 }, nil 95 }