Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 10435] ファイルの概要

このコミットは、Go言語の標準ライブラリ os パッケージにおけるOpenBSD環境でのホスト名テストを再有効化するものです。以前はSysctl()の機能が不完全であったため無効化されていましたが、その問題が解決されたことにより、テストが再び実行可能になりました。

コミット

commit ea2c0cd88f830a1f8af9ee5f9a9cfb643f3cbd30
Author: Joel Sing <jsing@google.com>
Date:   Fri Nov 18 01:53:07 2011 +1100

    os: re-enable hostname test on openbsd

    Now that Sysctl() works, re-enable the hostname test.

    R=golang-dev, mikioh.mikioh
    CC=golang-dev
    https://golang.org/cl/5408042

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/ea2c0cd88f830a1f8af9ee5f9a9cfb643f3cbd30

元コミット内容

    os: re-enable hostname test on openbsd

    Now that Sysctl() works, re-enable the hostname test.

    R=golang-dev, mikioh.mikioh
    CC=golang-dev
    https://golang.org/cl/5408042

変更の背景

このコミットの背景には、Go言語のosパッケージがOpenBSD上でホスト名を取得する際に使用するSysctl()システムコールに関する以前の問題があります。Sysctl()は、Unix系システムにおいてカーネルパラメータを読み書きするための汎用的なインターフェースを提供します。OpenBSD環境では、特にnametomib()という機能(人間が読めるsysctl名を、システムコールが理解できる数値のMIB配列に変換する機能)に問題があったため、ホスト名を取得するテストが一時的に無効化されていました。

コミットメッセージにある「Now that Sysctl() works」という記述は、このSysctl()の実装、特にnametomib()のOpenBSDにおける問題が解決されたことを示唆しています。これにより、ホスト名取得の機能がOpenBSD上で正しく動作するようになったため、関連するテストを再度有効にすることが可能になりました。テストを有効にすることで、OpenBSD環境におけるosパッケージのホスト名取得機能の正確性と信頼性が保証されます。

前提知識の解説

Sysctl

Sysctlは、Unix系オペレーティングシステム(Linux, BSD系など)において、実行中のカーネルのパラメータを動的に照会および変更するためのメカニズムです。これにより、システム管理者はカーネルの動作を調整したり、システム情報を取得したりすることができます。例えば、ネットワーク設定、メモリ管理、ファイルシステムの挙動など、多岐にわたるカーネルの側面を制御できます。

sysctlは通常、sysctl(2)システムコールを通じてアクセスされます。このシステムコールは、パラメータを識別するためにManagement Information Base (MIB) と呼ばれる整数配列を使用します。

nametomib()

nametomib()は、人間が読める形式のsysctlパラメータ名(例: "kern.ostype", "net.inet.ip.forwarding")を、sysctl(2)システムコールが要求する数値のMIB配列に変換する機能です。多くのシステムでは、この変換はライブラリ関数によって内部的に処理されますが、Go言語のような低レベルのシステムコールを扱う言語では、この変換を自身で実装するか、適切なライブラリ(Goの場合はgolang.org/x/sys/unixパッケージなど)を利用する必要があります。

OpenBSDでは、他のBSDシステムとは異なり、標準Cライブラリにsysctlbyname(3)関数が提供されていません。そのため、GoがOpenBSD上でsysctlを扱う際には、nametomibの変換をGoのランタイムまたは関連パッケージが内部的に処理する必要があります。過去には、このnametomibの内部ルックアップテーブルが不完全であったり、特定のsysctl変数がマッピングされていなかったりする問題が発生することがありました。

Go言語におけるSysctlの利用

Go言語では、golang.org/x/sys/unixパッケージを通じてsysctl機能にアクセスします。このパッケージは、各OSのシステムコールをGoから呼び出すための低レベルなインターフェースを提供します。unix.Sysctl()関数は、内部的にnametomib変換を行い、指定されたsysctl名の値を文字列として返します。

技術的詳細

このコミットは、Go言語のosパッケージがOpenBSD上でホスト名を取得する際の基盤となるSysctl()機能が完全に動作するようになったことを受けて行われました。以前は、OpenBSDのnametomib()に関する問題(Goの内部実装におけるルックアップテーブルの不完全さなど)により、os.Hostname()関数が正しく機能しない可能性がありました。そのため、os_test.go内のTestHostname関数において、OpenBSD環境ではテストをスキップする処理が明示的に記述されていました。

このコミットが行われた時点(2011年)で、GoのOpenBSDサポートにおけるSysctl()の実装が改善され、nametomib()の変換が正確に行われるようになったと考えられます。これにより、os.Hostname()が期待通りに動作するようになり、その動作を検証するためのテストを再有効化することが可能になりました。

具体的には、src/pkg/os/os_test.goからOpenBSDでのテストスキップロジックが削除されました。これは、Sysctl()がOpenBSD上で信頼性高く機能するようになったという確信に基づいています。この変更により、Goの標準ライブラリはOpenBSD環境においても、ホスト名取得機能の品質保証を継続できるようになりました。

コアとなるコードの変更箇所

変更はsrc/pkg/os/os_test.goファイルに対して行われました。具体的には、以下の5行が削除されています。

--- a/src/pkg/os/os_test.go
+++ b/src/pkg/os/os_test.go
@@ -942,11 +942,6 @@ func TestHostname(t *testing.T) {
 		return
 	}

-// TODO(jsing): Fix nametomib() on OpenBSD
-	if syscall.OS == "openbsd" {
-		return
-	}
-
 	// Check internal Hostname() against the output of /bin/hostname.
 	// Allow that the internal Hostname returns a Fully Qualified Domain Name
 	// and the /bin/hostname only returns the first component

コアとなるコードの解説

削除されたコードブロックは、TestHostname関数内でOpenBSD環境の場合にテストを早期に終了させるための条件分岐でした。

// TODO(jsing): Fix nametomib() on OpenBSD
if syscall.OS == "openbsd" {
	return
}
  • // TODO(jsing): Fix nametomib() on OpenBSD: このコメントは、OpenBSDにおけるnametomib()の問題が未解決であることを示していました。これは、Sysctl()がホスト名を取得するために内部的に使用するnametomib()の機能が、OpenBSD上で正しく動作していなかったことを意味します。
  • if syscall.OS == "openbsd" { return }: この行は、現在のオペレーティングシステムがOpenBSDである場合に、TestHostname関数を即座に終了させる(テストをスキップする)ための条件です。

このコードが削除されたことにより、TestHostname関数はOpenBSD環境でもスキップされずに実行されるようになりました。これは、Sysctl()(およびその内部のnametomib())がOpenBSD上で期待通りに機能するようになったため、ホスト名取得のテストが正常に完了すると見なされたことを意味します。

関連リンク

参考にした情報源リンク