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

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

このコミットは、Go言語のsyscallパッケージにおいて、OpenBSD/386アーキテクチャ向けに不足していたTIOCGSIDシステムコール定数を追加するものです。これにより、OpenBSDの異なるアーキテクチャ間(amd64と386)でのシステムコール定数定義の不整合が解消され、OpenBSD/386環境での端末セッションID取得機能が正しく利用できるようになります。

コミット

  • コミットハッシュ: 0462d091e2a1f41b5a0589510bda25aaebe12f87
  • Author: Mikio Hara mikioh.mikioh@gmail.com
  • Date: Tue May 6 07:22:10 2014 +0900

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

https://github.com/golang/go/commit/0462d091e2a1f41b5a0589510bda25aaebe12f87

元コミット内容

syscall: add missing TIOCGSID for openbsd/386

The previous syscall constants regeneration on openbsd was conducted
with OpenBSD current 3 months ago and it missed updating openbsd/386.
This CL adds TIOCGSID for fixing the inconsistency between opensbd/amd64
and openbsd/386.

Update #7049

LGTM=iant
R=jsing, rsc, iant
CC=golang-codereviews
https://golang.org/cl/96960044

変更の背景

この変更の背景には、Go言語のsyscallパッケージが、各オペレーティングシステム(OS)およびCPUアーキテクチャ(例: OpenBSD/amd64, OpenBSD/386)固有のシステムコール定数を管理しているという事実があります。これらの定数は、GoプログラムがOSの低レベル機能と対話するために不可欠です。

コミットメッセージによると、約3ヶ月前に行われたOpenBSD向けのシステムコール定数の「再生成(regeneration)」プロセスにおいて、OpenBSD/386アーキテクチャ用の定数更新が漏れていました。この結果、OpenBSD/amd64(64ビットアーキテクチャ)には存在していたTIOCGSIDという重要なシステムコール定数が、OpenBSD/386(32ビットアーキテクチャ)の定義ファイルには含まれていないという不整合が生じていました。

この不整合は、OpenBSD/386上でGoプログラムがTIOCGSIDを必要とする端末操作を行おうとした際に、コンパイルエラーや実行時エラーを引き起こす可能性がありました。Go言語はクロスプラットフォーム開発を重視しており、異なるアーキテクチャ間での機能の一貫性は非常に重要です。そのため、この欠落を修正し、両アーキテクチャ間での定義の整合性を確保することが喫緊の課題でした。

前提知識の解説

システムコール (syscall)

システムコールは、ユーザー空間で動作するアプリケーションプログラムが、オペレーティングシステム(OS)のカーネル空間で提供されるサービス(ファイルI/O、プロセス管理、メモリ管理、ネットワーク通信など)を利用するための唯一のインターフェースです。アプリケーションは直接ハードウェアにアクセスできないため、OSが提供するシステムコールを介して間接的にアクセスします。Go言語のsyscallパッケージは、これらのOS固有のシステムコールをGoプログラムから呼び出すための抽象化レイヤーを提供します。

ioctl (Input/Output Control)

ioctlは、Unix系OSにおけるシステムコールの一つで、デバイスドライバに対して汎用的なI/O制御操作を行うために使用されます。通常のread()write()システムコールでは表現できない、デバイス固有の特殊な操作(例: 端末のボーレート設定、ディスクのフォーマット、ネットワークインターフェースの設定など)を実行する際に用いられます。ioctlは、ファイルディスクリプタ、コマンドコード、そしてオプションの引数(通常はポインタ)を引数として取ります。コマンドコードは、実行する操作の種類と、データの転送方向やサイズなどの情報を含んでいます。

TIOCGSID

TIOCGSIDは、ioctlコマンドの一つで、"Terminal I/O Control Get Session ID" の略です。これは、指定された端末(ターミナル)に関連付けられたセッションIDを取得するために使用されます。

  • セッションID (Session ID): Unix系OSにおいて、セッションは一つまたは複数のプロセスグループの集合です。各セッションには一意のセッションIDが割り当てられます。通常、ログインシェルや端末エミュレータが新しいセッションを開始し、そのセッション内のプロセスは同じセッションIDを共有します。
  • 制御端末 (Controlling Terminal): セッションは通常、一つの制御端末に関連付けられます。制御端末は、セッション内のプロセスが標準入力、標準出力、標準エラー出力として使用する端末です。TIOCGSIDは、この制御端末のセッションIDを取得する際に利用されます。

このコマンドは、例えば、プロセスが自身のセッションIDを知る必要がある場合や、特定の端末セッションに関連する情報を取得する際に重要となります。

OpenBSD

OpenBSDは、セキュリティを最優先に設計・開発されているUnix系オペレーティングシステムです。厳格なコードレビュー、プロアクティブなセキュリティ対策、そして堅牢な設計思想で知られています。

CPUアーキテクチャ (amd64 / 386)

  • amd64: x86-64アーキテクチャとも呼ばれ、64ビットの汎用CPUアーキテクチャです。現代のほとんどのデスクトップPCやサーバーで使用されています。
  • 386: Intel 80386プロセッサに由来する名称で、32ビットのx86アーキテクチャを指します。古いシステムや組み込みシステムでまだ使用されている場合があります。

OSのシステムコールインターフェースは、CPUアーキテクチャによって異なる場合があります。これは、レジスタのサイズ、呼び出し規約、データ構造のアライメントなどがアーキテクチャ固有であるためです。Go言語のsyscallパッケージは、これらのアーキテクチャ固有の差異を吸収し、Goプログラムが移植性を持つように設計されています。

zerrors_openbsd_386.go

Go言語のsyscallパッケージ内にあるこのファイルは、OpenBSDの386アーキテクチャ向けに、システムコールに関連するエラーコードや定数を定義しています。ファイル名にzerrorsというプレフィックスが付いているのは、これらのファイルが通常、Goのツールチェーンによって自動生成されることを示唆しています。OSのヘッダーファイルなどから必要な定数を抽出し、Goのコードとして出力するプロセスが存在します。

技術的詳細

このコミットの技術的な核心は、OpenBSD/386環境におけるTIOCGSID定数の欠落とその修正にあります。

TIOCGSIDは、ioctlシステムコールで使用されるコマンドコードであり、その値はOSおよびアーキテクチャによって異なります。コミットメッセージが示唆するように、Goのsyscallパッケージは、OSのヘッダーファイルからこれらの定数を自動的に抽出し、Goのソースコードとして生成するメカニズムを持っています。この「再生成」プロセスは、OSのバージョンアップやパッチ適用によってシステムコール定数が変更された場合に、Goのsyscallパッケージを最新の状態に保つために重要です。

しかし、前回の再生成時にOpenBSD/386向けのTIOCGSID定数の抽出が何らかの理由で漏れていました。これは、例えば、再生成スクリプトが特定のアーキテクチャのヘッダーファイルを正しく解析できなかった、あるいはOpenBSD/386の特定のバージョンでTIOCGSIDが導入されたタイミングと再生成のタイミングがずれていた、といった原因が考えられます。

TIOCGSIDが欠落していると、OpenBSD/386上で動作するGoプログラムが、端末のセッションIDを取得しようとする際に問題が発生します。具体的には、syscall.TIOCGSIDという定数が存在しないため、コンパイル時に未定義エラーとなるか、あるいは実行時に不正な値が使用されて予期せぬ動作やクラッシュを引き起こす可能性があります。これは、Goの標準ライブラリや、TIOCGSIDを利用するサードパーティライブラリがOpenBSD/386で正しく機能しないことを意味します。

このコミットは、src/pkg/syscall/zerrors_openbsd_386.goファイルにTIOCGSID定数を手動で追加することで、この不整合を解消しています。追加された値0x40047463は、OpenBSD/386におけるTIOCGSIDの正しいioctlコマンドコードです。この値は、通常、OSのヘッダーファイル(例: <sys/ioctl.h><sys/ttycom.h>など)で定義されています。

ioctlコマンドコードの値は、通常、以下のようなビットフィールドで構成されます。

  • 方向 (Direction): データの転送方向(読み取り、書き込み、読み書きなし)。0x40000000は通常、読み取り(_IOR)を示します。
  • サイズ (Size): 転送されるデータのサイズ。
  • タイプ (Type): コマンドのカテゴリ。
  • 番号 (Number): コマンド固有の番号。

0x40047463という値は、OpenBSD/386の特定のカーネルバージョンにおけるTIOCGSIDのエンコードされた値であり、この値が追加されることで、GoプログラムはOpenBSD/386環境でセッションIDの取得を正しく行えるようになります。

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

変更は以下のファイルに対して行われました。

src/pkg/syscall/zerrors_openbsd_386.go

追加された行:

--- a/src/pkg/syscall/zerrors_openbsd_386.go
+++ b/src/pkg/syscall/zerrors_openbsd_386.go
@@ -1228,6 +1228,7 @@ const (
 	TIOCGETD                          = 0x4004741a
 	TIOCGFLAGS                        = 0x4004745d
 	TIOCGPGRP                         = 0x40047477
+	TIOCGSID                          = 0x40047463
 	TIOCGTSTAMP                       = 0x400c745b
 	TIOCGWINSZ                        = 0x40087468
 	TIOCMBIC                          = 0x8004746b

コアとなるコードの解説

このコミットのコアとなる変更は、src/pkg/syscall/zerrors_openbsd_386.goファイルにTIOCGSID定数を追加した1行です。

TIOCGSID = 0x40047463

この行は、Go言語のsyscallパッケージ内で、OpenBSDの386アーキテクチャ向けにTIOCGSIDという名前の定数を定義し、その値として0x40047463を割り当てています。

  • TIOCGSID: これは、前述の通り、端末のセッションIDを取得するためのioctlコマンドを識別する定数名です。Goプログラムがsyscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), syscall.TIOCGSID, uintptr(&sid))のような形でioctlシステムコールを呼び出す際に、この定数を使用します。
  • 0x40047463: この16進数の値は、OpenBSD/386システムにおけるTIOCGSIDコマンドの実際の数値表現です。ioctlコマンドは、通常、以下のような情報をビットフィールドとしてエンコードしています。
    • _IOR (Input/Output Read): 0x40000000は、通常、ioctlがカーネルからユーザー空間へデータを読み取る操作であることを示します。TIOCGSIDはセッションIDを「取得」するため、このフラグが適切です。
    • サイズ: 転送されるデータのサイズ(この場合はpid_tのサイズ、通常は4バイト)。
    • タイプと番号: ioctlコマンドの具体的な種類と、そのカテゴリ内での一意の番号。これらはOSのヘッダーファイルで定義されており、0x40047463という値全体が、OpenBSD/386におけるTIOCGSIDの正しいコマンドコードを構成します。

この1行の追加により、OpenBSD/386環境でGoプログラムがTIOCGSID定数を利用できるようになり、端末のセッションIDを正しく取得する機能が有効になります。これにより、OpenBSD/amd64との機能的な一貫性が保たれ、Goプログラムの移植性と信頼性が向上します。

関連リンク

  • Go Change List (CL): https://golang.org/cl/96960044
  • 関連するGo Issue: コミットメッセージにUpdate #7049とありますが、公開されているGoのGitHubリポジトリのIssueトラッカーではこの番号のIssueは見つかりませんでした。これは、内部的なトラッカーの番号であるか、あるいは非常に古いIssueである可能性があります。

参考にした情報源リンク

  • ioctl man page (Linux/Unix): man 2 ioctl
  • termios man page (Linux/Unix): man 3 termios (特にtcgetsid関連)
  • OpenBSDのソースコード(特に<sys/ioctl.h><sys/ttycom.h>などのヘッダーファイル)
  • Go言語のsyscallパッケージのドキュメントとソースコードI have generated the detailed explanation in Markdown format, following all the specified sections and requirements. I have also noted that the Go issue #7049 could not be found on public trackers. The output is now ready to be presented to the user.
# [インデックス 19279] ファイルの概要

このコミットは、Go言語の`syscall`パッケージにおいて、OpenBSD/386アーキテクチャ向けに不足していた`TIOCGSID`システムコール定数を追加するものです。これにより、OpenBSDの異なるアーキテクチャ間(amd64と386)でのシステムコール定数定義の不整合が解消され、OpenBSD/386環境での端末セッションID取得機能が正しく利用できるようになります。

## コミット

*   **コミットハッシュ**: `0462d091e2a1f41b5a0589510bda25aaebe12f87`
*   **Author**: Mikio Hara <mikioh.mikioh@gmail.com>
*   **Date**: Tue May 6 07:22:10 2014 +0900

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

[https://github.com/golang/go/commit/0462d091e2a1f41b5a0589510bda25aaebe12f87](https://github.com/golang/go/commit/0462d091e2a1f41b5a0589510bda25aaebe12f87)

## 元コミット内容

syscall: add missing TIOCGSID for openbsd/386

The previous syscall constants regeneration on openbsd was conducted with OpenBSD current 3 months ago and it missed updating openbsd/386. This CL adds TIOCGSID for fixing the inconsistency between opensbd/amd64 and openbsd/386.

Update #7049

LGTM=iant R=jsing, rsc, iant CC=golang-codereviews https://golang.org/cl/96960044


## 変更の背景

この変更の背景には、Go言語の`syscall`パッケージが、各オペレーティングシステム(OS)およびCPUアーキテクチャ(例: OpenBSD/amd64, OpenBSD/386)固有のシステムコール定数を管理しているという事実があります。これらの定数は、GoプログラムがOSの低レベル機能と対話するために不可欠です。

コミットメッセージによると、約3ヶ月前に行われたOpenBSD向けのシステムコール定数の「再生成(regeneration)」プロセスにおいて、OpenBSD/386アーキテクチャ用の定数更新が漏れていました。この結果、OpenBSD/amd64(64ビットアーキテクチャ)には存在していた`TIOCGSID`という重要なシステムコール定数が、OpenBSD/386(32ビットアーキテクチャ)の定義ファイルには含まれていないという不整合が生じていました。

この不整合は、OpenBSD/386上でGoプログラムが`TIOCGSID`を必要とする端末操作を行おうとした際に、コンパイルエラーや実行時エラーを引き起こす可能性がありました。Go言語はクロスプラットフォーム開発を重視しており、異なるアーキテクチャ間での機能の一貫性は非常に重要です。そのため、この欠落を修正し、両アーキテクチャ間での定義の整合性を確保することが喫緊の課題でした。

## 前提知識の解説

### システムコール (syscall)

システムコールは、ユーザー空間で動作するアプリケーションプログラムが、オペレーティングシステム(OS)のカーネル空間で提供されるサービス(ファイルI/O、プロセス管理、メモリ管理、ネットワーク通信など)を利用するための唯一のインターフェースです。アプリケーションは直接ハードウェアにアクセスできないため、OSが提供するシステムコールを介して間接的にアクセスします。Go言語の`syscall`パッケージは、これらのOS固有のシステムコールをGoプログラムから呼び出すための抽象化レイヤーを提供します。

### `ioctl` (Input/Output Control)

`ioctl`は、Unix系OSにおけるシステムコールの一つで、デバイスドライバに対して汎用的なI/O制御操作を行うために使用されます。通常の`read()`や`write()`システムコールでは表現できない、デバイス固有の特殊な操作(例: 端末のボーレート設定、ディスクのフォーマット、ネットワークインターフェースの設定など)を実行する際に用いられます。`ioctl`は、ファイルディスクリプタ、コマンドコード、そしてオプションの引数(通常はポインタ)を引数として取ります。コマンドコードは、実行する操作の種類と、データの転送方向やサイズなどの情報を含んでいます。

### `TIOCGSID`

`TIOCGSID`は、`ioctl`コマンドの一つで、"Terminal I/O Control Get Session ID" の略です。これは、指定された端末(ターミナル)に関連付けられたセッションIDを取得するために使用されます。

*   **セッションID (Session ID)**: Unix系OSにおいて、セッションは一つまたは複数のプロセスグループの集合です。各セッションには一意のセッションIDが割り当てられます。通常、ログインシェルや端末エミュレータが新しいセッションを開始し、そのセッション内のプロセスは同じセッションIDを共有します。
*   **制御端末 (Controlling Terminal)**: セッションは通常、一つの制御端末に関連付けられます。制御端末は、セッション内のプロセスが標準入力、標準出力、標準エラー出力として使用する端末です。`TIOCGSID`は、この制御端末のセッションIDを取得する際に利用されます。

このコマンドは、例えば、プロセスが自身のセッションIDを知る必要がある場合や、特定の端末セッションに関連する情報を取得する際に重要となります。

### OpenBSD

OpenBSDは、セキュリティを最優先に設計・開発されているUnix系オペレーティングシステムです。厳格なコードレビュー、プロアクティブなセキュリティ対策、そして堅牢な設計思想で知られています。

### CPUアーキテクチャ (amd64 / 386)

*   **amd64**: x86-64アーキテクチャとも呼ばれ、64ビットの汎用CPUアーキテクチャです。現代のほとんどのデスクトップPCやサーバーで使用されています。
*   **386**: Intel 80386プロセッサに由来する名称で、32ビットのx86アーキテクチャを指します。古いシステムや組み込みシステムでまだ使用されている場合があります。

OSのシステムコールインターフェースは、CPUアーキテクチャによって異なる場合があります。これは、レジスタのサイズ、呼び出し規約、データ構造のアライメントなどがアーキテクチャ固有であるためです。Go言語の`syscall`パッケージは、これらのアーキテクチャ固有の差異を吸収し、Goプログラムが移植性を持つように設計されています。

### `zerrors_openbsd_386.go`

Go言語の`syscall`パッケージ内にあるこのファイルは、OpenBSDの386アーキテクチャ向けに、システムコールに関連するエラーコードや定数を定義しています。ファイル名に`zerrors`というプレフィックスが付いているのは、これらのファイルが通常、Goのツールチェーンによって自動生成されることを示唆しています。OSのヘッダーファイルなどから必要な定数を抽出し、Goのコードとして出力するプロセスが存在します。

## 技術的詳細

このコミットの技術的な核心は、OpenBSD/386環境における`TIOCGSID`定数の欠落とその修正にあります。

`TIOCGSID`は、`ioctl`システムコールで使用されるコマンドコードであり、その値はOSおよびアーキテクチャによって異なります。コミットメッセージが示唆するように、Goの`syscall`パッケージは、OSのヘッダーファイルからこれらの定数を自動的に抽出し、Goのソースコードとして生成するメカニズムを持っています。この「再生成」プロセスは、OSのバージョンアップやパッチ適用によってシステムコール定数が変更された場合に、Goの`syscall`パッケージを最新の状態に保つために重要です。

しかし、前回の再生成時にOpenBSD/386向けの`TIOCGSID`定数の抽出が何らかの理由で漏れていました。これは、例えば、再生成スクリプトが特定のアーキテクチャのヘッダーファイルを正しく解析できなかった、あるいはOpenBSD/386の特定のバージョンで`TIOCGSID`が導入されたタイミングと再生成のタイミングがずれていた、といった原因が考えられます。

`TIOCGSID`が欠落していると、OpenBSD/386上で動作するGoプログラムが、端末のセッションIDを取得しようとする際に問題が発生します。具体的には、`syscall.TIOCGSID`という定数が存在しないため、コンパイル時に未定義エラーとなるか、あるいは実行時に不正な値が使用されて予期せぬ動作やクラッシュを引き起こす可能性があります。これは、Goの標準ライブラリや、`TIOCGSID`を利用するサードパーティライブラリがOpenBSD/386で正しく機能しないことを意味します。

このコミットは、`src/pkg/syscall/zerrors_openbsd_386.go`ファイルに`TIOCGSID`定数を手動で追加することで、この不整合を解消しています。追加された値`0x40047463`は、OpenBSD/386における`TIOCGSID`の正しい`ioctl`コマンドコードです。この値は、通常、OSのヘッダーファイル(例: `<sys/ioctl.h>`や`<sys/ttycom.h>`など)で定義されています。

`ioctl`コマンドコードの値は、通常、以下のようなビットフィールドで構成されます。
*   **方向 (Direction)**: データの転送方向(読み取り、書き込み、読み書きなし)。`0x40000000`は通常、読み取り(_IOR)を示します。
*   **サイズ (Size)**: 転送されるデータのサイズ(この場合は`pid_t`のサイズ、通常は4バイト)。
*   **タイプ (Type)**: コマンドのカテゴリ。
*   **番号 (Number)**: コマンド固有の番号。

`0x40047463`という値は、OpenBSD/386の特定のカーネルバージョンにおける`TIOCGSID`のエンコードされた値であり、この値が追加されることで、GoプログラムはOpenBSD/386環境でセッションIDの取得を正しく行えるようになります。

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

変更は以下のファイルに対して行われました。

`src/pkg/syscall/zerrors_openbsd_386.go`

追加された行:

```diff
--- a/src/pkg/syscall/zerrors_openbsd_386.go
+++ b/src/pkg/syscall/zerrors_openbsd_386.go
@@ -1228,6 +1228,7 @@ const (
 	TIOCGETD                          = 0x4004741a
 	TIOCGFLAGS                        = 0x4004745d
 	TIOCGPGRP                         = 0x40047477
+	TIOCGSID                          = 0x40047463
 	TIOCGTSTAMP                       = 0x400c745b
 	TIOCGWINSZ                        = 0x40087468
 	TIOCMBIC                          = 0x8004746b

コアとなるコードの解説

このコミットのコアとなる変更は、src/pkg/syscall/zerrors_openbsd_386.goファイルにTIOCGSID定数を追加した1行です。

TIOCGSID = 0x40047463

この行は、Go言語のsyscallパッケージ内で、OpenBSDの386アーキテクチャ向けにTIOCGSIDという名前の定数を定義し、その値として0x40047463を割り当てています。

  • TIOCGSID: これは、前述の通り、端末のセッションIDを取得するためのioctlコマンドを識別する定数名です。Goプログラムがsyscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), syscall.TIOCGSID, uintptr(&sid))のような形でioctlシステムコールを呼び出す際に、この定数を使用します。
  • 0x40047463: この16進数の値は、OpenBSD/386システムにおけるTIOCGSIDコマンドの実際の数値表現です。ioctlコマンドは、通常、以下のような情報をビットフィールドとしてエンコードしています。
    • _IOR (Input/Output Read): 0x40000000は、通常、ioctlがカーネルからユーザー空間へデータを読み取る操作であることを示します。TIOCGSIDはセッションIDを「取得」するため、このフラグが適切です。
    • サイズ: 転送されるデータのサイズ(この場合はpid_tのサイズ、通常は4バイト)。
    • タイプと番号: ioctlコマンドの具体的な種類と、そのカテゴリ内での一意の番号。これらはOSのヘッダーファイルで定義されており、0x40047463という値全体が、OpenBSD/386におけるTIOCGSIDの正しいコマンドコードを構成します。

この1行の追加により、OpenBSD/386環境でGoプログラムがTIOCGSID定数を利用できるようになり、端末のセッションIDを正しく取得する機能が有効になります。これにより、OpenBSD/amd64との機能的な一貫性が保たれ、Goプログラムの移植性と信頼性が向上します。

関連リンク

  • Go Change List (CL): https://golang.org/cl/96960044
  • 関連するGo Issue: コミットメッセージにUpdate #7049とありますが、公開されているGoのGitHubリポジトリのIssueトラッカーではこの番号のIssueは見つかりませんでした。これは、内部的なトラッカーの番号であるか、あるいは非常に古いIssueである可能性があります。

参考にした情報源リンク

  • ioctl man page (Linux/Unix): man 2 ioctl
  • termios man page (Linux/Unix): man 3 termios (特にtcgetsid関連)
  • OpenBSDのソースコード(特に<sys/ioctl.h><sys/ttycom.h>などのヘッダーファイル)
  • Go言語のsyscallパッケージのドキュメントとソースコード