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

[インデックス 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.shmksyscall.plのようなスクリプトによって、各OSのC言語ヘッダーファイルから自動的に生成されます。例えば、zerrors_openbsd_386.gozerrors_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.shz-filesを生成する際に、これらの定数がGoのコードに組み込まれるようになります。例えば、#define EMUL_ENABLED 0x1のように、Cプリプロセッサのディレクティブとして定数とその値を直接記述しています。これは、OSのヘッダーファイルから自動的に取得できない定数を、Goのsyscallパッケージが引き続き利用できるようにするための「エミュレーション」または「フォールバック」のメカニズムとして機能します。

  4. zerrors_openbsd_386.goおよびzerrors_openbsd_amd64.goの更新: mkerrors.shの変更後、これらのスクリプトを再実行することで、zerrors_openbsd_386.gozerrors_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.」と説明されています。
      --- 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
    --- 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と同様の定数が追加されました。
    --- 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.gosrc/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の変更点に関する情報源として一般的に参照される)