// Copyright (c) Tailscale Inc & contributors
// SPDX-License-Identifier: BSD-3-Clause

//go:build linux

package tstest

import (
	"strconv"
	"strings"

	"golang.org/x/sys/unix"
)

// KernelVersion returns the major, minor, and patch version of the Linux kernel.
// It returns (0, 0, 0) if the version cannot be determined.
func KernelVersion() (major, minor, patch int) {
	var uname unix.Utsname
	if err := unix.Uname(&uname); err != nil {
		return 0, 0, 0
	}
	release := unix.ByteSliceToString(uname.Release[:])

	// Parse version string (e.g., "5.15.0-...")
	parts := strings.Split(release, ".")
	if len(parts) < 3 {
		return 0, 0, 0
	}

	major, err := strconv.Atoi(parts[0])
	if err != nil {
		return 0, 0, 0
	}

	minor, err = strconv.Atoi(parts[1])
	if err != nil {
		return 0, 0, 0
	}

	// Patch version may have additional info after a hyphen (e.g., "0-76-generic")
	// Extract just the numeric part before any hyphen
	patchStr, _, _ := strings.Cut(parts[2], "-")

	patch, err = strconv.Atoi(patchStr)
	if err != nil {
		return 0, 0, 0
	}

	return major, minor, patch
}
