github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/pkg/parsers/kernel/kernel.go (about)

     1  //go:build !windows
     2  // +build !windows
     3  
     4  // Package kernel provides helper function to get, parse and compare kernel
     5  // versions for different platforms.
     6  package kernel // import "github.com/docker/docker/pkg/parsers/kernel"
     7  
     8  import (
     9  	"errors"
    10  	"fmt"
    11  )
    12  
    13  // VersionInfo holds information about the kernel.
    14  type VersionInfo struct {
    15  	Kernel int    // Version of the kernel (e.g. 4.1.2-generic -> 4)
    16  	Major  int    // Major part of the kernel version (e.g. 4.1.2-generic -> 1)
    17  	Minor  int    // Minor part of the kernel version (e.g. 4.1.2-generic -> 2)
    18  	Flavor string // Flavor of the kernel version (e.g. 4.1.2-generic -> generic)
    19  }
    20  
    21  func (k *VersionInfo) String() string {
    22  	return fmt.Sprintf("%d.%d.%d%s", k.Kernel, k.Major, k.Minor, k.Flavor)
    23  }
    24  
    25  // CompareKernelVersion compares two kernel.VersionInfo structs.
    26  // Returns -1 if a < b, 0 if a == b, 1 it a > b
    27  func CompareKernelVersion(a, b VersionInfo) int {
    28  	if a.Kernel < b.Kernel {
    29  		return -1
    30  	} else if a.Kernel > b.Kernel {
    31  		return 1
    32  	}
    33  
    34  	if a.Major < b.Major {
    35  		return -1
    36  	} else if a.Major > b.Major {
    37  		return 1
    38  	}
    39  
    40  	if a.Minor < b.Minor {
    41  		return -1
    42  	} else if a.Minor > b.Minor {
    43  		return 1
    44  	}
    45  
    46  	return 0
    47  }
    48  
    49  // ParseRelease parses a string and creates a VersionInfo based on it.
    50  func ParseRelease(release string) (*VersionInfo, error) {
    51  	var (
    52  		kernel, major, minor, parsed int
    53  		flavor, partial              string
    54  	)
    55  
    56  	// Ignore error from Sscanf to allow an empty flavor.  Instead, just
    57  	// make sure we got all the version numbers.
    58  	parsed, _ = fmt.Sscanf(release, "%d.%d%s", &kernel, &major, &partial)
    59  	if parsed < 2 {
    60  		return nil, errors.New("Can't parse kernel version " + release)
    61  	}
    62  
    63  	// sometimes we have 3.12.25-gentoo, but sometimes we just have 3.12-1-amd64
    64  	parsed, _ = fmt.Sscanf(partial, ".%d%s", &minor, &flavor)
    65  	if parsed < 1 {
    66  		flavor = partial
    67  	}
    68  
    69  	return &VersionInfo{
    70  		Kernel: kernel,
    71  		Major:  major,
    72  		Minor:  minor,
    73  		Flavor: flavor,
    74  	}, nil
    75  }