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  }