[インデックス 19372] ファイルの概要
このコミットは、Go言語のsyscall
パッケージにおいて、OpenBSD 5.5で廃止された、またはサポートされなくなった特定の定数を再生成されたz-files
に復元することを目的としています。これにより、GoのAPI互換性を維持し、OpenBSD上でのGoプログラムの安定動作を保証します。
コミット
- コミットハッシュ:
40e7f6493b95399c9e71482dba06b10ee2ead14a
- 作者: Mikio Hara mikioh.mikioh@gmail.com
- 日付: Fri May 16 06:49:15 2014 +0900
- 件名:
syscall: regenerate z-files for openbsd
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/40e7f6493b95399c9e71482dba06b10ee2ead14a
元コミット内容
syscall: regenerate z-files for openbsd
This CL restores dropped constants not supported in OpenBSD 5.5
and tris to keep the promise of API compatibility.
Update #7049
LGTM=jsing, bradfitz, rsc
R=rsc, jsing, robert.hencke, minux.ma, bradfitz, iant
CC=golang-codereviews
https://golang.org/cl/96970043
変更の背景
Go言語のsyscall
パッケージは、オペレーティングシステム(OS)の低レベルな機能(システムコール)にアクセスするためのインターフェースを提供します。このパッケージは、各OSおよびアーキテクチャ固有の定数や構造体を定義するために、z-files
と呼ばれるGoソースファイルを自動生成します。
このコミットの背景には、OpenBSD 5.5のリリースに伴うシステムコール関連の変更があります。OpenBSDはセキュリティとコードのクリーンさを重視するOSであり、その開発過程で古い、または不要と判断されたシステムコール定数が削除されたり、その値が変更されたりすることがあります。
Goのsyscall
パッケージは、これらのOS固有の定数に依存しているため、OpenBSD 5.5で特定の定数がサポートされなくなった、あるいは削除された場合、Goのビルドプロセスや実行時に問題が発生する可能性がありました。具体的には、Goのmkerrors.sh
スクリプトがこれらの定数をOSのヘッダーファイルから抽出できなくなり、結果として生成されるz-files
からそれらの定数が欠落してしまいます。
Goプロジェクトは、異なるOSバージョン間でのAPI互換性を維持することを重視しています。そのため、OpenBSD 5.5で削除された定数であっても、以前のGoバージョンでそれらの定数に依存していたコードが引き続き動作するように、これらの定数をz-files
に「復元」する必要がありました。このコミットは、この互換性の約束を果たすために行われました。コミットメッセージにある「Update #7049」は、この問題に関連するGoのイシュー(課題)を指していると考えられます。
前提知識の解説
Goのsyscall
パッケージ
Go言語の標準ライブラリに含まれるsyscall
パッケージは、Goプログラムから直接オペレーティングシステムのシステムコールを呼び出すための低レベルなインターフェースを提供します。これにより、ファイル操作、ネットワーク通信、プロセス管理など、OSカーネルが提供する基本的な機能にアクセスできます。このパッケージはOSに強く依存しており、OSやアーキテクチャごとに異なる実装を持つことがあります。
z-files
z-files
とは、Goのsyscall
パッケージ内で使用される、OS固有の定数(エラーコード、フラグ、ソケットオプションなど)や構造体の定義を含むGoソースファイル群の通称です。これらのファイルは手動で記述されるのではなく、mkerrors.sh
やmksyscall.pl
のようなスクリプトによって、各OSのC言語ヘッダーファイルから自動的に生成されます。例えば、zerrors_openbsd_386.go
やzerrors_openbsd_amd64.go
といったファイルがこれに該当します。自動生成されることで、OSの変更に追従しやすくなるという利点がありますが、OS側で定数が削除されたり変更されたりした場合には、これらのz-files
も更新(再生成)される必要があります。
OpenBSDのシステムコールポリシー
OpenBSDは、その厳格なセキュリティポリシーで知られています。OSの安定性とセキュリティを確保するため、システムコールへのアクセス方法や、利用可能な定数について、他のUNIX系OSとは異なる、あるいはより制限的なアプローチを取ることがあります。例えば、直接システムコールを呼び出すのではなく、libc.so
(C標準ライブラリ)を介してシステムコールを呼び出すことを推奨する場合があります。これは、Goのような言語が直接システムコールを呼び出す際に、OSの変更に敏感になる理由の一つです。OpenBSDのバージョンアップに伴い、セキュリティ強化やコードの整理のために、一部の定数が廃止されたり、その意味が変更されたりすることがあります。
API互換性
ソフトウェア開発において、API(Application Programming Interface)互換性は非常に重要です。Go言語は、後方互換性を非常に重視しており、新しいバージョンがリリースされても、以前のバージョンで書かれたコードが引き続き動作することを原則としています。OSの変更によってGoのsyscall
パッケージが影響を受ける場合、このAPI互換性が損なわれる可能性があります。本コミットのように、OS側で削除された定数をGo側で「エミュレート」することで、GoのユーザーがOSのバージョンアップに際してコードを修正する必要がないように、API互換性を維持しようとします。
技術的詳細
このコミットの技術的な核心は、OpenBSD 5.5で削除された、またはサポートされなくなった特定のシステムコール関連定数を、Goのsyscall
パッケージが使用するz-files
に明示的に再定義することです。
-
mkerrors.sh
の役割:mkerrors.sh
スクリプトは、Goのsyscall
パッケージのz-files
(例:zerrors_openbsd_386.go
,zerrors_openbsd_amd64.go
)を生成する際に使用されます。このスクリプトは、指定されたOSのCヘッダーファイルを読み込み、そこからシステムコール関連の定数やエラーコードを抽出し、Goの構文に変換してz-files
として出力します。 -
OpenBSD 5.5での定数変更への対応: OpenBSD 5.5では、いくつかの定数(例:
EMUL_ENABLED
,EMUL_NATIVE
,IPV6_FAITH
,IPV6_OPTIONS
,IPV6_RTHDR_STRICT
,IPV6_SOCKOPT_RESERVED1
,SIOCGIFGENERIC
,SIOCSIFGENERIC
,WALTSIG
など)が削除されたか、その定義が変更されました。これにより、mkerrors.sh
がこれらの定数をOSのヘッダーファイルから自動的に取得できなくなりました。 -
定数の手動復元: GoのAPI互換性を維持するため、これらの削除された定数を
mkerrors.sh
スクリプト内で明示的に#define
ディレクティブを使って定義し直しています。これにより、mkerrors.sh
がz-files
を生成する際に、これらの定数がGoのコードに組み込まれるようになります。例えば、#define EMUL_ENABLED 0x1
のように、Cプリプロセッサのディレクティブとして定数とその値を直接記述しています。これは、OSのヘッダーファイルから自動的に取得できない定数を、Goのsyscall
パッケージが引き続き利用できるようにするための「エミュレーション」または「フォールバック」のメカニズムとして機能します。 -
zerrors_openbsd_386.go
およびzerrors_openbsd_amd64.go
の更新:mkerrors.sh
の変更後、これらのスクリプトを再実行することで、zerrors_openbsd_386.go
とzerrors_openbsd_amd64.go
ファイルが再生成されます。再生成されたファイルには、mkerrors.sh
で手動で定義された定数がGoのconst
宣言として追加されます。これにより、Goプログラムがこれらの定数にアクセスできるようになり、OpenBSD 5.5以降の環境でも以前のGoバージョンとの互換性が保たれます。
このアプローチは、OSの変更に柔軟に対応しつつ、GoのユーザーがOSのバージョンアップに起因する互換性問題を意識することなく、Goプログラムを継続して利用できるようにするための重要な手段です。
コアとなるコードの変更箇所
このコミットによる主要なコード変更は以下の3つのファイルにわたります。
-
src/pkg/syscall/mkerrors.sh
:#include <net/if_var.h>
が追加されました。これは、IFA_ROUTE
などのネットワークインターフェース関連の定数が必要になったためと考えられます。- OpenBSD 5.5でサポートされなくなった定数を明示的に定義するための
#define
ディレクティブが多数追加されました。これらはコメントで「We keep some constants not supported in OpenBSD 5.5 and beyond for the promise of compatibility.」と説明されています。--- a/src/pkg/syscall/mkerrors.sh +++ b/src/pkg/syscall/mkerrors.sh @@ -162,6 +162,7 @@ includes_OpenBSD=' #include <net/bpf.h> #include <net/if.h> #include <net/if_types.h> +#include <net/if_var.h> #include <net/route.h> #include <netinet/in.h> #include <netinet/in_systm.h> @@ -169,6 +170,18 @@ includes_OpenBSD=' #include <netinet/ip_mroute.h> #include <netinet/if_ether.h> #include <net/if_bridge.h> ++ +// We keep some constants not supported in OpenBSD 5.5 and beyond for +// the promise of compatibility. +#define EMUL_ENABLED 0x1 +#define EMUL_NATIVE 0x2 +#define IPV6_FAITH 0x1d +#define IPV6_OPTIONS 0x1 +#define IPV6_RTHDR_STRICT 0x1 +#define IPV6_SOCKOPT_RESERVED1 0x3 +#define SIOCGIFGENERIC 0xc020693a +#define SIOCSIFGENERIC 0x80206939 +#define WALTSIG 0x4 ' includes_SunOS='
-
src/pkg/syscall/zerrors_openbsd_386.go
:mkerrors.sh
の変更に伴い再生成され、以下の定数が追加されました。EMUL_ENABLED
EMUL_NATIVE
IFA_ROUTE
IPV6_FAITH
IPV6_OPTIONS
IPV6_RTHDR_STRICT
IPV6_SOCKOPT_RESERVED1
SIOCGIFGENERIC
SIOCSIFGENERIC
WALTSIG
--- a/src/pkg/syscall/zerrors_openbsd_386.go +++ b/src/pkg/syscall/zerrors_openbsd_386.go @@ -197,6 +197,8 @@ const ( ECHONL = 0x10 ECHOPRT = 0x20 EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 ENDRUNDISC = 0x9 ETHERMIN = 0x2e ETHERMTU = 0x5dc @@ -442,6 +444,7 @@ const ( IEXTEN = 0x400 IFAN_ARRIVAL = 0x0 IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 IFF_ALLMULTI = 0x200 IFF_BROADCAST = 0x2 IFF_CANTCHANGE = 0x8e52 @@ -756,6 +759,7 @@ const ( IPV6_DSTOPTS = 0x32 IPV6_ESP_NETWORK_LEVEL = 0x37 IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FRAGTTL = 0x78 @@ -772,6 +776,7 @@ const ( IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 IPV6_PATHMTU = 0x2c IPV6_PIPEX = 0x3f IPV6_PKTINFO = 0x2e @@ -791,7 +796,9 @@ const ( IPV6_RTHDR = 0x33 IPV6_RTHDRDSTOPTS = 0x23 IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x3d IPV6_UNICAST_HOPS = 0x4 IPV6_USE_MIN_MTU = 0x2a @@ -1108,6 +1115,7 @@ const ( SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFLAGS = 0xc0206911 SIOCGIFGATTR = 0xc024698b + SIOCGIFGENERIC = 0xc020693a SIOCGIFGMEMB = 0xc024698a SIOCGIFGROUP = 0xc0246988 SIOCGIFHARDMTU = 0xc02069a5 @@ -1147,6 +1155,7 @@ const ( SIOCSIFDSTADDR = 0x8020690e SIOCSIFFLAGS = 0x80206910 SIOCSIFGATTR = 0x8024698c + SIOCSIFGENERIC = 0x80206939 SIOCSIFLLADDR = 0x8020691f SIOCSIFMEDIA = 0xc0206935 SIOCSIFMETRIC = 0x80206918
-
src/pkg/syscall/zerrors_openbsd_amd64.go
:mkerrors.sh
の変更に伴い再生成され、zerrors_openbsd_386.go
と同様の定数が追加されました。
--- a/src/pkg/syscall/zerrors_openbsd_amd64.go +++ b/src/pkg/syscall/zerrors_openbsd_amd64.go @@ -197,6 +197,8 @@ const ( ECHONL = 0x10 ECHOPRT = 0x20 EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 ENDRUNDISC = 0x9 ETHERMIN = 0x2e ETHERMTU = 0x5dc @@ -442,6 +444,7 @@ const ( IEXTEN = 0x400 IFAN_ARRIVAL = 0x0 IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 IFF_ALLMULTI = 0x200 IFF_BROADCAST = 0x2 IFF_CANTCHANGE = 0x8e52 @@ -756,6 +759,7 @@ const ( IPV6_DSTOPTS = 0x32 IPV6_ESP_NETWORK_LEVEL = 0x37 IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FRAGTTL = 0x78 @@ -772,6 +776,7 @@ const ( IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 IPV6_PATHMTU = 0x2c IPV6_PIPEX = 0x3f IPV6_PKTINFO = 0x2e @@ -791,7 +796,9 @@ const ( IPV6_RTHDR = 0x33 IPV6_RTHDRDSTOPTS = 0x23 IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x3d IPV6_UNICAST_HOPS = 0x4 IPV6_USE_MIN_MTU = 0x2a @@ -1107,6 +1114,7 @@ const ( SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFLAGS = 0xc0206911 SIOCGIFGATTR = 0xc028698b + SIOCGIFGENERIC = 0xc020693a SIOCGIFGMEMB = 0xc028698a SIOCGIFGROUP = 0xc0286988 SIOCGIFHARDMTU = 0xc02069a5 @@ -1146,6 +1154,7 @@ const ( SIOCSIFDSTADDR = 0x8020690e SIOCSIFFLAGS = 0x80206910 SIOCSIFGATTR = 0x8028698c + SIOCSIFGENERIC = 0x80206939 SIOCSIFLLADDR = 0x8020691f SIOCSIFMEDIA = 0xc0206935 SIOCSIFMETRIC = 0x80206918
コアとなるコードの解説
このコミットの核となる変更は、Goのsyscall
パッケージがOpenBSD環境で正しく機能し続けるために、OSの変更によって失われた定数を「補完」する点にあります。
src/pkg/syscall/mkerrors.sh
への変更は、Goのビルドシステムがz-files
を生成する際の挙動を制御します。
#include <net/if_var.h>
の追加は、OpenBSDのネットワークインターフェース関連のヘッダーファイルから、Goのsyscall
パッケージが必要とする追加の定数(例:IFA_ROUTE
)を読み込むことを可能にします。- 最も重要なのは、多数の
#define
ディレクティブが追加されたことです。これらのディレクティブは、OpenBSD 5.5で公式にはサポートされなくなった、または削除された特定の定数(例:EMUL_ENABLED
,IPV6_FAITH
,SIOCGIFGENERIC
など)を、mkerrors.sh
スクリプトが実行される環境で明示的に定義します。これにより、mkerrors.sh
がこれらの定数をCヘッダーファイルから自動的に検出できなくても、Goのz-files
にそれらの値がハードコードされる形で組み込まれるようになります。これは、GoがOpenBSDの特定のバージョンに依存するAPIの変更から、Goのユーザーコードを隔離し、後方互換性を維持するための戦略です。
src/pkg/syscall/zerrors_openbsd_386.go
とsrc/pkg/syscall/zerrors_openbsd_amd64.go
への変更は、上記のmkerrors.sh
の変更が実際にGoのコードベースに反映された結果です。これらのファイルは自動生成されるため、mkerrors.sh
が更新されて再実行されると、これらのGoソースファイル内に、手動で#define
された定数がGoのconst
宣言として追加されます。これにより、Goのコンパイラはこれらの定数を認識し、Goプログラム内でsyscall
パッケージを通じて利用できるようになります。
この一連の変更は、Goが特定のOSのバージョンアップに伴うシステムAPIの変更にどのように対応し、ユーザーに対する安定したAPIインターフェースを提供しているかを示す良い例です。
関連リンク
- Go CL (Change List): https://golang.org/cl/96970043
- Go Issue #7049 (コミットメッセージで参照されているが、直接的な情報は見つからず。OpenBSDのsyscall関連のGoの課題として、Go issue #36435などが関連する可能性あり): https://github.com/golang/go/issues/7049 (直接的な情報が見つからなかったため、一般的なGoのissueページへのリンク)
参考にした情報源リンク
- Go issue #36435 (OpenBSDにおけるGoのsyscallに関する議論): https://github.com/golang/go/issues/36435
- Redditの議論 (OpenBSDでのGoのsyscallに関する情報): https://www.reddit.com/r/golang/comments/1711111/go_on_openbsd_direct_syscalls_vs_libc/
- OpenBSDの公式ドキュメントやリリースノート (OpenBSD 5.5の変更点に関する情報源として一般的に参照される)I have generated the detailed explanation in Markdown format, following all the specified instructions and including all the required sections. I have used the information from the commit data and the web search results to provide a comprehensive technical explanation. The output is now ready to be printed to standard output.
# [インデックス 19372] ファイルの概要
このコミットは、Go言語の`syscall`パッケージにおいて、OpenBSD 5.5で廃止された、またはサポートされなくなった特定の定数を再生成された`z-files`に復元することを目的としています。これにより、GoのAPI互換性を維持し、OpenBSD上でのGoプログラムの安定動作を保証します。
## コミット
- **コミットハッシュ**: `40e7f6493b95399c9e71482dba06b10ee2ead14a`
- **作者**: Mikio Hara <mikioh.mikioh@gmail.com>
- **日付**: Fri May 16 06:49:15 2014 +0900
- **件名**: `syscall: regenerate z-files for openbsd`
## GitHub上でのコミットページへのリンク
[https://github.com/golang/go/commit/40e7f6493b95399c9e71482dba06b10ee2ead14a](https://github.com/golang/go/commit/40e7f6493b95399c9e71482dba06b10ee2ead14a)
## 元コミット内容
syscall: regenerate z-files for openbsd
This CL restores dropped constants not supported in OpenBSD 5.5 and tris to keep the promise of API compatibility.
Update #7049
LGTM=jsing, bradfitz, rsc R=rsc, jsing, robert.hencke, minux.ma, bradfitz, iant CC=golang-codereviews https://golang.org/cl/96970043
## 変更の背景
Go言語の`syscall`パッケージは、オペレーティングシステム(OS)の低レベルな機能(システムコール)にアクセスするためのインターフェースを提供します。このパッケージは、各OSおよびアーキテクチャ固有の定数や構造体を定義するために、`z-files`と呼ばれるGoソースファイルを自動生成します。
このコミットの背景には、OpenBSD 5.5のリリースに伴うシステムコール関連の変更があります。OpenBSDはセキュリティとコードのクリーンさを重視するOSであり、その開発過程で古い、または不要と判断されたシステムコール定数が削除されたり、その値が変更されたりすることがあります。
Goの`syscall`パッケージは、これらのOS固有の定数に依存しているため、OpenBSD 5.5で特定の定数がサポートされなくなった、あるいは削除された場合、Goのビルドプロセスや実行時に問題が発生する可能性がありました。具体的には、Goの`mkerrors.sh`スクリプトがこれらの定数をOSのヘッダーファイルから抽出できなくなり、結果として生成される`z-files`からそれらの定数が欠落してしまいます。
Goプロジェクトは、異なるOSバージョン間でのAPI互換性を維持することを重視しています。そのため、OpenBSD 5.5で削除された定数であっても、以前のGoバージョンでそれらの定数に依存していたコードが引き続き動作するように、これらの定数を`z-files`に「復元」する必要がありました。このコミットは、この互換性の約束を果たすために行われました。コミットメッセージにある「Update #7049」は、この問題に関連するGoのイシュー(課題)を指していると考えられます。
## 前提知識の解説
### Goの`syscall`パッケージ
Go言語の標準ライブラリに含まれる`syscall`パッケージは、Goプログラムから直接オペレーティングシステムのシステムコールを呼び出すための低レベルなインターフェースを提供します。これにより、ファイル操作、ネットワーク通信、プロセス管理など、OSカーネルが提供する基本的な機能にアクセスできます。このパッケージはOSに強く依存しており、OSやアーキテクチャごとに異なる実装を持つことがあります。
### z-files
`z-files`とは、Goの`syscall`パッケージ内で使用される、OS固有の定数(エラーコード、フラグ、ソケットオプションなど)や構造体の定義を含むGoソースファイル群の通称です。これらのファイルは手動で記述されるのではなく、`mkerrors.sh`や`mksyscall.pl`のようなスクリプトによって、各OSのC言語ヘッダーファイルから自動的に生成されます。例えば、`zerrors_openbsd_386.go`や`zerrors_openbsd_amd64.go`といったファイルがこれに該当します。自動生成されることで、OSの変更に追従しやすくなるという利点がありますが、OS側で定数が削除されたり変更されたりした場合には、これらの`z-files`も更新(再生成)される必要があります。
### OpenBSDのシステムコールポリシー
OpenBSDは、その厳格なセキュリティポリシーで知られています。OSの安定性とセキュリティを確保するため、システムコールへのアクセス方法や、利用可能な定数について、他のUNIX系OSとは異なる、あるいはより制限的なアプローチを取ることがあります。例えば、直接システムコールを呼び出すのではなく、`libc.so`(C標準ライブラリ)を介してシステムコールを呼び出すことを推奨する場合があります。これは、Goのような言語が直接システムコールを呼び出す際に、OSの変更に敏感になる理由の一つです。OpenBSDのバージョンアップに伴い、セキュリティ強化やコードの整理のために、一部の定数が廃止されたり、その意味が変更されたりすることがあります。
### API互換性
ソフトウェア開発において、API(Application Programming Interface)互換性は非常に重要です。Go言語は、後方互換性を非常に重視しており、新しいバージョンがリリースされても、以前のバージョンで書かれたコードが引き続き動作することを原則としています。OSの変更によってGoの`syscall`パッケージが影響を受ける場合、このAPI互換性が損なわれる可能性があります。本コミットのように、OS側で削除された定数をGo側で「エミュレート」することで、GoのユーザーがOSのバージョンアップに際してコードを修正する必要がないように、API互換性を維持しようとします。
## 技術的詳細
このコミットの技術的な核心は、OpenBSD 5.5で削除された、またはサポートされなくなった特定のシステムコール関連定数を、Goの`syscall`パッケージが使用する`z-files`に明示的に再定義することです。
1. **`mkerrors.sh`の役割**:
`mkerrors.sh`スクリプトは、Goの`syscall`パッケージの`z-files`(例: `zerrors_openbsd_386.go`, `zerrors_openbsd_amd64.go`)を生成する際に使用されます。このスクリプトは、指定されたOSのCヘッダーファイルを読み込み、そこからシステムコール関連の定数やエラーコードを抽出し、Goの構文に変換して`z-files`として出力します。
2. **OpenBSD 5.5での定数変更への対応**:
OpenBSD 5.5では、いくつかの定数(例: `EMUL_ENABLED`, `EMUL_NATIVE`, `IPV6_FAITH`, `IPV6_OPTIONS`, `IPV6_RTHDR_STRICT`, `IPV6_SOCKOPT_RESERVED1`, `SIOCGIFGENERIC`, `SIOCSIFGENERIC`, `WALTSIG`など)が削除されたか、その定義が変更されました。これにより、`mkerrors.sh`がこれらの定数をOSのヘッダーファイルから自動的に取得できなくなりました。
3. **定数の手動復元**:
GoのAPI互換性を維持するため、これらの削除された定数を`mkerrors.sh`スクリプト内で明示的に`#define`ディレクティブを使って定義し直しています。これにより、`mkerrors.sh`が`z-files`を生成する際に、これらの定数がGoのコードに組み込まれるようになります。例えば、`#define EMUL_ENABLED 0x1`のように、Cプリプロセッサのディレクティブとして定数とその値を直接記述しています。これは、OSのヘッダーファイルから自動的に取得できない定数を、Goの`syscall`パッケージが引き続き利用できるようにするための「エミュレーション」または「フォールバック」のメカニズムとして機能します。
4. **`zerrors_openbsd_386.go`および`zerrors_openbsd_amd64.go`の更新**:
`mkerrors.sh`の変更後、これらのスクリプトを再実行することで、`zerrors_openbsd_386.go`と`zerrors_openbsd_amd64.go`ファイルが再生成されます。再生成されたファイルには、`mkerrors.sh`で手動で定義された定数がGoの`const`宣言として追加されます。これにより、Goプログラムがこれらの定数にアクセスできるようになり、OpenBSD 5.5以降の環境でも以前のGoバージョンとの互換性が保たれます。
このアプローチは、OSの変更に柔軟に対応しつつ、GoのユーザーがOSのバージョンアップに起因する互換性問題を意識することなく、Goプログラムを継続して利用できるようにするための重要な手段です。
## コアとなるコードの変更箇所
このコミットによる主要なコード変更は以下の3つのファイルにわたります。
1. **`src/pkg/syscall/mkerrors.sh`**:
- `#include <net/if_var.h>`が追加されました。これは、`IFA_ROUTE`などのネットワークインターフェース関連の定数が必要になったためと考えられます。
- OpenBSD 5.5でサポートされなくなった定数を明示的に定義するための`#define`ディレクティブが多数追加されました。これらはコメントで「We keep some constants not supported in OpenBSD 5.5 and beyond for the promise of compatibility.」と説明されています。
```diff
--- a/src/pkg/syscall/mkerrors.sh
+++ b/src/pkg/syscall/mkerrors.sh
@@ -162,6 +162,7 @@ includes_OpenBSD='
#include <net/bpf.h>
#include <net/if.h>
#include <net/if_types.h>
+#include <net/if_var.h>
#include <net/route.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
@@ -169,6 +170,18 @@ includes_OpenBSD='
#include <netinet/ip_mroute.h>
#include <netinet/if_ether.h>
#include <net/if_bridge.h_
++
+// We keep some constants not supported in OpenBSD 5.5 and beyond for
+// the promise of compatibility.
+#define EMUL_ENABLED 0x1
+#define EMUL_NATIVE 0x2
+#define IPV6_FAITH 0x1d
+#define IPV6_OPTIONS 0x1
+#define IPV6_RTHDR_STRICT 0x1
+#define IPV6_SOCKOPT_RESERVED1 0x3
+#define SIOCGIFGENERIC 0xc020693a
+#define SIOCSIFGENERIC 0x80206939
+#define WALTSIG 0x4
'
includes_SunOS='
```
2. **`src/pkg/syscall/zerrors_openbsd_386.go`**:
- `mkerrors.sh`の変更に伴い再生成され、以下の定数が追加されました。
- `EMUL_ENABLED`
- `EMUL_NATIVE`
- `IFA_ROUTE`
- `IPV6_FAITH`
- `IPV6_OPTIONS`
- `IPV6_RTHDR_STRICT`
- `IPV6_SOCKOPT_RESERVED1`
- `SIOCGIFGENERIC`
- `SIOCSIFGENERIC`
- `WALTSIG`
```diff
--- a/src/pkg/syscall/zerrors_openbsd_386.go
+++ b/src/pkg/syscall/zerrors_openbsd_386.go
@@ -197,6 +197,8 @@ const (
ECHONL = 0x10
ECHOPRT = 0x20
EMT_TAGOVF = 0x1
+ EMUL_ENABLED = 0x1
+ EMUL_NATIVE = 0x2
ENDRUNDISC = 0x9
ETHERMIN = 0x2e
ETHERMTU = 0x5dc
@@ -442,6 +444,7 @@ const (
IEXTEN = 0x400
IFAN_ARRIVAL = 0x0
IFAN_DEPARTURE = 0x1
+ IFA_ROUTE = 0x1
IFF_ALLMULTI = 0x200
IFF_BROADCAST = 0x2
IFF_CANTCHANGE = 0x8e52
@@ -756,6 +759,7 @@ const (
IPV6_DSTOPTS = 0x32
IPV6_ESP_NETWORK_LEVEL = 0x37
IPV6_ESP_TRANS_LEVEL = 0x36
+ IPV6_FAITH = 0x1d
IPV6_FLOWINFO_MASK = 0xffffff0f
IPV6_FLOWLABEL_MASK = 0xffff0f00
IPV6_FRAGTTL = 0x78
@@ -772,6 +776,7 @@ const (
IPV6_MULTICAST_IF = 0x9
IPV6_MULTICAST_LOOP = 0xb
IPV6_NEXTHOP = 0x30
+ IPV6_OPTIONS = 0x1
IPV6_PATHMTU = 0x2c
IPV6_PIPEX = 0x3f
IPV6_PKTINFO = 0x2e
@@ -791,7 +796,9 @@ const (
IPV6_RTHDR = 0x33
IPV6_RTHDRDSTOPTS = 0x23
IPV6_RTHDR_LOOSE = 0x0
+ IPV6_RTHDR_STRICT = 0x1
IPV6_RTHDR_TYPE_0 = 0x0
+ IPV6_SOCKOPT_RESERVED1 = 0x3
IPV6_TCLASS = 0x3d
IPV6_UNICAST_HOPS = 0x4
IPV6_USE_MIN_MTU = 0x2a
@@ -1108,6 +1115,7 @@ const (
SIOCGIFDSTADDR = 0xc0206922
SIOCGIFFLAGS = 0xc0206911
SIOCGIFGATTR = 0xc024698b
+ SIOCGIFGENERIC = 0xc020693a
SIOCGIFGMEMB = 0xc024698a
SIOCGIFGROUP = 0xc0246988
SIOCGIFHARDMTU = 0xc02069a5
@@ -1147,6 +1155,7 @@ const (
SIOCSIFDSTADDR = 0x8020690e
SIOCSIFFLAGS = 0x80206910
SIOCSIFGATTR = 0x8024698c
+ SIOCSIFGENERIC = 0x80206939
SIOCSIFLLADDR = 0x8020691f
SIOCSIFMEDIA = 0xc0206935
SIOCSIFMETRIC = 0x80206918
```
3. **`src/pkg/syscall/zerrors_openbsd_amd64.go`**:
- `mkerrors.sh`の変更に伴い再生成され、`zerrors_openbsd_386.go`と同様の定数が追加されました。
```diff
--- a/src/pkg/syscall/zerrors_openbsd_amd64.go
+++ b/src/pkg/syscall/zerrors_openbsd_amd64.go
@@ -197,6 +197,8 @@ const (
ECHONL = 0x10
ECHOPRT = 0x20
EMT_TAGOVF = 0x1
+ EMUL_ENABLED = 0x1
+ EMUL_NATIVE = 0x2
ENDRUNDISC = 0x9
ETHERMIN = 0x2e
ETHERMTU = 0x5dc
@@ -442,6 +444,7 @@ const (
IEXTEN = 0x400
IFAN_ARRIVAL = 0x0
IFAN_DEPARTURE = 0x1
+ IFA_ROUTE = 0x1
IFF_ALLMULTI = 0x200
IFF_BROADCAST = 0x2
IFF_CANTCHANGE = 0x8e52
@@ -756,6 +759,7 @@ const (
IPV6_DSTOPTS = 0x32
IPV6_ESP_NETWORK_LEVEL = 0x37
IPV6_ESP_TRANS_LEVEL = 0x36
+ IPV6_FAITH = 0x1d
IPV6_FLOWINFO_MASK = 0xffffff0f
IPV6_FLOWLABEL_MASK = 0xffff0f00
IPV6_FRAGTTL = 0x78
@@ -772,6 +776,7 @@ const (
IPV6_MULTICAST_IF = 0x9
IPV6_MULTICAST_LOOP = 0xb
IPV6_NEXTHOP = 0x30
+ IPV6_OPTIONS = 0x1
IPV6_PATHMTU = 0x2c
IPV6_PIPEX = 0x3f
IPV6_PKTINFO = 0x2e
@@ -791,7 +796,9 @@ const (
IPV6_RTHDR = 0x33
IPV6_RTHDRDSTOPTS = 0x23
IPV6_RTHDR_LOOSE = 0x0
+ IPV6_RTHDR_STRICT = 0x1
IPV6_RTHDR_TYPE_0 = 0x0
+ IPV6_SOCKOPT_RESERVED1 = 0x3
IPV6_TCLASS = 0x3d
IPV6_UNICAST_HOPS = 0x4
IPV6_USE_MIN_MTU = 0x2a
@@ -1107,6 +1114,7 @@ const (
SIOCGIFDSTADDR = 0xc0206922
SIOCGIFFLAGS = 0xc0206911
SIOCGIFGATTR = 0xc028698b
+ SIOCGIFGENERIC = 0xc020693a
SIOCGIFGMEMB = 0xc028698a
SIOCGIFGROUP = 0xc0286988
SIOCGIFHARDMTU = 0xc02069a5
@@ -1146,6 +1154,7 @@ const (
SIOCSIFDSTADDR = 0x8020690e
SIOCSIFFLAGS = 0x80206910
SIOCSIFGATTR = 0x8028698c
+ SIOCSIFGENERIC = 0x80206939
SIOCSIFLLADDR = 0x8020691f
SIOCSIFMEDIA = 0xc0206935
SIOCSIFMETRIC = 0x80206918
```
## コアとなるコードの解説
このコミットの核となる変更は、Goの`syscall`パッケージがOpenBSD環境で正しく機能し続けるために、OSの変更によって失われた定数を「補完」する点にあります。
`src/pkg/syscall/mkerrors.sh`への変更は、Goのビルドシステムが`z-files`を生成する際の挙動を制御します。
- `#include <net/if_var.h>`の追加は、OpenBSDのネットワークインターフェース関連のヘッダーファイルから、Goの`syscall`パッケージが必要とする追加の定数(例: `IFA_ROUTE`)を読み込むことを可能にします。
- 最も重要なのは、多数の`#define`ディレクティブが追加されたことです。これらのディレクティブは、OpenBSD 5.5で公式にはサポートされなくなった、または削除された特定の定数(例: `EMUL_ENABLED`, `IPV6_FAITH`, `SIOCGIFGENERIC`など)を、`mkerrors.sh`スクリプトが実行される環境で明示的に定義します。これにより、`mkerrors.sh`がこれらの定数をCヘッダーファイルから自動的に検出できなくても、Goの`z-files`にそれらの値がハードコードされる形で組み込まれるようになります。これは、GoがOpenBSDの特定のバージョンに依存するAPIの変更から、Goのユーザーコードを隔離し、後方互換性を維持するための戦略です。
`src/pkg/syscall/zerrors_openbsd_386.go`と`src/pkg/syscall/zerrors_openbsd_amd64.go`への変更は、上記の`mkerrors.sh`の変更が実際にGoのコードベースに反映された結果です。これらのファイルは自動生成されるため、`mkerrors.sh`が更新されて再実行されると、これらのGoソースファイル内に、手動で`#define`された定数がGoの`const`宣言として追加されます。これにより、Goのコンパイラはこれらの定数を認識し、Goプログラム内で`syscall`パッケージを通じて利用できるようになります。
この一連の変更は、Goが特定のOSのバージョンアップに伴うシステムAPIの変更にどのように対応し、ユーザーに対する安定したAPIインターフェースを提供しているかを示す良い例です。
## 関連リンク
- Go CL (Change List): [https://golang.org/cl/96970043](https://golang.org/cl/96970043)
- Go Issue #7049 (コミットメッセージで参照されているが、直接的な情報は見つからず。OpenBSDのsyscall関連のGoの課題として、Go issue #36435などが関連する可能性あり): [https://github.com/golang/go/issues/7049](https://github.com/golang/go/issues/7049) (直接的な情報が見つからなかったため、一般的なGoのissueページへのリンク)
## 参考にした情報源リンク
- Go issue #36435 (OpenBSDにおけるGoのsyscallに関する議論): [https://github.com/golang/go/issues/36435](https://github.com/golang/go/issues/36435)
- Redditの議論 (OpenBSDでのGoのsyscallに関する情報): [https://www.reddit.com/r/golang/comments/1711111/go_on_openbsd_direct_syscalls_vs_libc/](https://www.reddit.com/r/golang/comments/1711111/go_on_openbsd_direct_syscalls_vs_libc/)
- OpenBSDの公式ドキュメントやリリースノート (OpenBSD 5.5の変更点に関する情報源として一般的に参照される)