ソースを参照

Move getKernelVersion to utils package

Guillaume J. Charmes 12 年 前
コミット
f3bab52df4
5 ファイル変更88 行追加9 行削除
  1. 1 1
      runtime.go
  2. 0 8
      utils.go
  3. 10 0
      utils/uname_darwin.go
  4. 15 0
      utils/uname_linux.go
  5. 62 0
      utils/utils.go

+ 1 - 1
runtime.go

@@ -251,7 +251,7 @@ func NewRuntime(autoRestart bool) (*Runtime, error) {
 		return nil, err
 	}
 
-	if k, err := GetKernelVersion(); err != nil {
+	if k, err := utils.GetKernelVersion(); err != nil {
 		log.Printf("WARNING: %s\n", err)
 	} else {
 		runtime.kernelVersion = k

+ 0 - 8
utils.go

@@ -1,9 +1,5 @@
 package docker
 
-import (
-	"github.com/dotcloud/docker/utils"
-)
-
 // Compare two Config struct. Do not compare the "Image" nor "Hostname" fields
 // If OpenStdin is set, then it differs
 func CompareConfig(a, b *Config) bool {
@@ -51,7 +47,3 @@ func CompareConfig(a, b *Config) bool {
 
 	return true
 }
-
-func GetKernelVersion() (*utils.KernelVersionInfo, error) {
-	return getKernelVersion()
-}

+ 10 - 0
utils/uname_darwin.go

@@ -0,0 +1,10 @@
+package utils
+
+import (
+	"errors"
+	"syscall"
+)
+
+func uname() (*syscall.Utsname, error) {
+	return nil, errors.New("Kernel version detection is not available on darwin")
+}

+ 15 - 0
utils/uname_linux.go

@@ -0,0 +1,15 @@
+package utils
+
+import (
+	"syscall"
+)
+
+// FIXME: Move this to utils package
+func uname() (*syscall.Utsname, error) {
+	uts := &syscall.Utsname{}
+
+	if err := syscall.Uname(uts); err != nil {
+		return nil, err
+	}
+	return uts, nil
+}

+ 62 - 0
utils/utils.go

@@ -14,6 +14,7 @@ import (
 	"os/exec"
 	"path/filepath"
 	"runtime"
+	"strconv"
 	"strings"
 	"sync"
 	"time"
@@ -468,3 +469,64 @@ func FindCgroupMountpoint(cgroupType string) (string, error) {
 
 	return "", fmt.Errorf("cgroup mountpoint not found for %s", cgroupType)
 }
+
+func GetKernelVersion() (*KernelVersionInfo, error) {
+	var (
+		flavor               string
+		kernel, major, minor int
+		err                  error
+	)
+
+	uts, err := uname()
+	if err != nil {
+		return nil, err
+	}
+
+	release := make([]byte, len(uts.Release))
+
+	i := 0
+	for _, c := range uts.Release {
+		release[i] = byte(c)
+		i++
+	}
+
+	// Remove the \x00 from the release for Atoi to parse correctly
+	release = release[:bytes.IndexByte(release, 0)]
+
+	tmp := strings.SplitN(string(release), "-", 2)
+	tmp2 := strings.SplitN(tmp[0], ".", 3)
+
+	if len(tmp2) > 0 {
+		kernel, err = strconv.Atoi(tmp2[0])
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	if len(tmp2) > 1 {
+		major, err = strconv.Atoi(tmp2[1])
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	if len(tmp2) > 2 {
+		minor, err = strconv.Atoi(tmp2[2])
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	if len(tmp) == 2 {
+		flavor = tmp[1]
+	} else {
+		flavor = ""
+	}
+
+	return &KernelVersionInfo{
+		Kernel: kernel,
+		Major:  major,
+		Minor:  minor,
+		Flavor: flavor,
+	}, nil
+}