syscall, internal/routebsd: use hw.supported_arches on FreeBSD

Reading textual representation of the kernel config file to search for
the "machine" config clause is awful, not to mention that kern.conftxt
might be disabled at all.

Use sysctl hw.supported_archs to detect 32bit binary running on amd64
host.
This commit is contained in:
Konstantin Belousov 2025-05-28 21:36:31 +03:00
parent 96a6e147b2
commit 9a9c35b386
2 changed files with 15 additions and 38 deletions

View File

@ -5,6 +5,7 @@
package routebsd
import (
"internal/stringslite"
"syscall"
"unsafe"
)
@ -25,26 +26,9 @@ func probeRoutingStack() (int, map[int]*wireFormat) {
// to know the underlying kernel's architecture because the
// alignment for routing facilities are set at the build time
// of the kernel.
conf, _ := syscall.Sysctl("kern.conftxt")
for i, j := 0, 0; j < len(conf); j++ {
if conf[j] != '\n' {
continue
}
s := conf[i:j]
i = j + 1
if len(s) > len("machine") && s[:len("machine")] == "machine" {
s = s[len("machine"):]
for k := 0; k < len(s); k++ {
if s[k] == ' ' || s[k] == '\t' {
s = s[1:]
}
break
}
if s == "amd64" {
align = 8
}
break
}
arches, _ := syscall.Sysctl("hw.supported_archs")
if stringslite.Index(arches, "amd64") >= 0 {
align = 8
}
ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdr}
ifm.parse = ifm.parseInterfaceMessage

View File

@ -4,28 +4,21 @@
package syscall
import "unsafe"
import (
"internal/stringslite"
"unsafe"
)
func init() {
conf, _ := Sysctl("kern.conftxt")
for i, j := 0, 0; j < len(conf); j++ {
if conf[j] != '\n' {
continue
}
s := conf[i:j]
i = j + 1
if len(s) > len("machine") && s[:len("machine")] == "machine" {
s = s[len("machine"):]
for k := 0; k < len(s); k++ {
if s[k] == ' ' || s[k] == '\t' {
s = s[1:]
}
break
}
freebsdConfArch = s
break
machine, _ := Sysctl("hw.machine")
if machine == "i386" {
arches, _ := Sysctl("hw.supported_archs")
amd64 := "amd64"
if stringslite.Index(arches, amd64) >= 0 {
machine = amd64
}
}
freebsdConfArch = machine
}
func (any *anyMessage) toRoutingMessage(b []byte) RoutingMessage {