# 帳票設計書 9-OS情報レポート

## 概要

本ドキュメントは、libuvライブラリにおける `uv_os_uname()` API関数の帳票設計書である。OSのシステム名・リリース・バージョン・マシンアーキテクチャをuv_utsname_t構造体に出力する機能について定義する。

### 本帳票の処理概要

本帳票は、POSIX `uname()` システムコールのラッパーとして、OSの基本情報を統一されたデータ構造で提供する機能を提供する。

**業務上の目的・背景**：アプリケーションが動作しているOSの種類やバージョンを確認し、プラットフォーム依存の処理分岐やバージョン互換性チェックに利用する。ログ出力やバグレポートにおけるシステム情報の自動収集にも活用される。

**帳票の利用シーン**：アプリケーション起動時のシステム情報ログ出力、プラットフォーム依存処理の分岐判定、バグレポート用システム情報収集、デプロイメント環境の検証。

**主要な出力内容**：
1. sysname（char[256]）：OSシステム名（例：Linux, Darwin, Windows_NT）
2. release（char[256]）：OSリリース番号（例：5.15.0-78-generic）
3. version（char[256]）：OSバージョン文字列
4. machine（char[256]）：マシンアーキテクチャ（例：x86_64, aarch64）

**帳票の出力タイミング**：`uv_os_uname(&utsname)` 呼び出し時に即座に出力される。

**帳票の利用者**：アプリケーション開発者、運用管理者、デプロイメントエンジニア。

## 帳票種別

システム情報レポート（構造体出力）

## 利用画面

| 画面No | 画面名 | URL/ルーティング | 出力操作 |
|--------|--------|-----------------|---------|
| N/A | N/A（C API呼び出し） | N/A | `uv_os_uname(&utsname)` 関数呼び出し |

## 出力形式

### 基本仕様

| 項目 | 内容 |
|-----|------|
| ファイル形式 | メモリ構造体（uv_utsname_t） |
| 出力方法 | 構造体フィールドへの文字列コピー |
| 文字コード | ASCII/UTF-8（OS依存） |

## 帳票レイアウト

### 明細部

| No | 項目名 | 説明 | データ取得元 | 表示形式 | サイズ |
|----|-------|------|-------------|---------|------|
| 1 | sysname | OSシステム名 | uname().sysname | char[256] | 256バイト |
| 2 | release | OSリリース番号 | uname().release（AIX: version.release） | char[256] | 256バイト |
| 3 | version | OSバージョン文字列 | uname().version | char[256] | 256バイト |
| 4 | machine | マシンアーキテクチャ | uname().machine（AIX/PASE: "ppc64"固定） | char[256] | 256バイト |

## 出力条件

### 抽出条件

| 条件名 | 説明 | 必須 |
|-------|------|-----|
| bufferポインタ | 結果を格納するuv_utsname_t構造体へのポインタ | Yes（NULLの場合UV_EINVAL） |

## データベース参照仕様

### 参照テーブル一覧

| テーブル名（データ構造） | 用途 | 結合条件 |
|-----------|------|---------|
| struct utsname | POSIXシステム情報 | uname(&buf)で取得 |

## 計算仕様

### 計算項目一覧

| 項目名 | 計算式 | 端数処理 | 備考 |
|-------|-------|---------|------|
| sysname | uv__strscpy(buffer->sysname, buf.sysname, 256) | N/A | サイズ超過時UV_E2BIG |
| release（AIX） | snprintf(buffer->release, 256, "%s.%s", buf.version, buf.release) | N/A | AIXではversion.releaseの結合 |
| release（その他） | uv__strscpy(buffer->release, buf.release, 256) | N/A | |
| version | uv__strscpy(buffer->version, buf.version, 256) | N/A | |
| machine（AIX/PASE） | uv__strscpy(buffer->machine, "ppc64", 256) | N/A | 固定値 |
| machine（その他） | uv__strscpy(buffer->machine, buf.machine, 256) | N/A | |

## 処理フロー

### 出力フロー

```mermaid
flowchart TD
    A[uv_os_uname呼び出し] --> B{buffer == NULL?}
    B -->|Yes| C[UV_EINVAL返却]
    B -->|No| D[uname実行]
    D --> E{成功?}
    E -->|No| F[UV__ERR errno 返却]
    E -->|Yes| G[sysnameをコピー]
    G --> H{E2BIG?}
    H -->|Yes| I[UV_E2BIG返却]
    H -->|No| J{AIX?}
    J -->|Yes| K[snprintfでversion.release結合]
    J -->|No| L[releaseをコピー]
    K --> M[versionをコピー]
    L --> M
    M --> N{AIX/PASE?}
    N -->|Yes| O[machine = ppc64]
    N -->|No| P[machineをコピー]
    O --> Q[0を返却]
    P --> Q
```

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 表示メッセージ | 対処方法 |
|----------|---------|--------------|---------|
| NULLポインタ | buffer==NULLの場合 | N/A | UV_EINVALを返却 |
| システムコール失敗 | uname()が-1を返した場合 | N/A | UV__ERR(errno)を返却 |
| バッファ溢れ | 文字列が256バイトを超える場合 | N/A | UV_E2BIGを返却 |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定データ件数 | 1件（固定） |
| 目標出力時間 | マイクロ秒オーダー |
| 同時出力数上限 | N/A |

## セキュリティ考慮事項

OS情報は攻撃者にとってシステム脆弱性の特定に利用される可能性がある。外部に公開するログにOS情報を含める場合は注意が必要。

## 備考

- uv_utsname_t構造体にはPOSIXのutsnameにあるnodename, domainnameフィールドが含まれない（"meaningless"として除外）
- AIXではreleaseフィールドがversion.release形式で構成される
- AIX/PASEではmachineフィールドが"ppc64"固定
- 各フィールドのバッファサイズは256バイト

---

## コードリーディングガイド

本帳票を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | uv.h | `include/uv.h` | uv_utsname_s構造体（1245-1253行目）の4フィールド（sysname, release, version, machine、各256バイト） |

**読解のコツ**: 構造体コメント（1250-1252行目）にnodename/domainnameが除外されている理由が記載されている。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | core.c | `src/unix/core.c` | uv_os_uname()（1850-1889行目）の実装全体を読む |

**主要処理フロー**:
1. **1854-1855行目**: NULLチェック
2. **1857-1860行目**: uname()システムコール実行
3. **1862-1864行目**: sysnameをuv__strscpy()でコピー
4. **1866-1880行目**: AIX向け特殊処理（version.release結合）
5. **1882-1884行目**: versionをコピー
6. **1886-1889行目**: AIX/PASE向けmachine固定値 or 通常コピー

### プログラム呼び出し階層図

```
uv_os_uname(buffer)                           [src/unix/core.c:1850]
    |
    +-- uname(&buf)                           [POSIXシステムコール]
    +-- uv__strscpy()                         [src/strscpy.h]  ※各フィールドコピー
    +-- snprintf()                            [標準ライブラリ]  ※AIXのrelease結合
```

### データフロー図

```
[入力]                    [処理]                            [出力]

uname()                   uv_os_uname()                    uv_utsname_t*
  struct utsname           core.c:1850                      .sysname[256]
    .sysname --------->    uv__strscpy()  --------->        .release[256]
    .release --------->    (AIX: snprintf)                  .version[256]
    .version --------->    uv__strscpy()  --------->        .machine[256]
    .machine --------->    (AIX: "ppc64")
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| uv.h | `include/uv.h` | ヘッダ | uv_utsname_t構造体定義、API宣言 |
| core.c | `src/unix/core.c` | ソース | Unix版uv_os_uname()実装 |
| strscpy.h | `src/strscpy.h` | 内部ヘッダ | uv__strscpy()安全文字列コピー関数 |
| util.c | `src/win/util.c` | ソース | Windows版実装（参考） |
