Skip to content

Repository files navigation

Ptyxis for OpenBSD

OpenBSD 向けの Ptyxis port です。 Ptyxis は GTK4/libadwaita ベースの GNOME ターミナルエミュレータです。

現在のバージョン

項目 バージョン
Ptyxis 50.1
OpenBSD 7.9 amd64
パッチリビジョン r1
ビルド確認日 2026-07-16

動作確認済み依存ライブラリ

パッケージ バージョン 状態
GTK4 4.20.2 OK
libadwaita 1.8.0 OK
VTE (GTK4) 0.80.4 OK
JSON-GLib 1.10.8 OK
GLib 2.84.4 OK

リポジトリ構成

OpenBSD-Ptyxis/
├── openbsd-port/              # OpenBSD port ファイル群
│   ├── Makefile              # ビルド定義 (V=50.1)
│   ├── distinfo              # チェックサム (SHA256)
│   ├── README.OpenBSD        # OpenBSD 固有のビルド手順
│   ├── patches/              # OpenBSD 用パッチ (16種)
│   │   ├── patch-agent_meson_build                          # Linux専用ビルド制限
│   │   ├── patch-agent_ptyxis-agent_c                       # pledge(2) セキュリティ強化
│   │   ├── patch-agent_ptyxis-process-impl_c                # sysctl(3) プロセス情報取得
│   │   ├── patch-meson_build-fix-linker-flags               # リンカフラグ修正
│   │   ├── patch-src_main_c                                 # XDG_RUNTIME_DIR 自動設定
│   │   ├── patch-src_main_c-openbsd-pledge-unveil           # pledge(2)/unveil(2) サンドボックス
│   │   ├── patch-src_main_c-security-toctou                 # ファイル書き込みを CONSISTENT モードに
│   │   ├── patch-src_ptyxis-client_c-security-dbus-auth     # D-Bus 認証チェック
│   │   ├── patch-src_ptyxis-custom-link_c-security-null     # NULL参照防止
│   │   ├── patch-src_ptyxis-palette_c-perf-hashtable        # O(1) パレット検索
│   │   ├── patch-src_ptyxis-tab_c                           # sys/wait.h インクルード追加
│   │   ├── patch-src_ptyxis-tab_c-perf-freeze-notify        # freeze-notify 最適化
│   │   ├── patch-src_ptyxis-tab_c-perf-notify-batch        # 複数notify一括化(zoom/title等)
│   │   ├── patch-src_ptyxis-terminal_c-perf-list-append     # リストアペンド最適化
│   │   ├── patch-src_ptyxis-terminal_c-security-regex-assert # 正規表現コンパイルエラー処理
│   │   ├── patch-src_ptyxis-util_c                          # wordexp(3)無効化 + NULL修正
│   │   ├── ptyxis-49.3-r1/                                  # 旧バージョン保存
│   │   ├── ptyxis-49.3-r2/                                  # 旧バージョン保存
│   │   ├── ptyxis-49.3-r3/                                  # 旧バージョン保存
│   │   └── ptyxis-50.1-r1/                                  # 現行リビジョン保存
│   └── pkg/                  # パッケージメタデータ
│       ├── DESCR             # パッケージ説明文
│       └── PLIST             # インストールファイルリスト
├── upstream-patches/          # 上流へのバグ報告用パッチ
│   ├── 0001-fix-zoom_font_scales-array-typo.patch
│   ├── 0002-fix-null-deref-in-ptyxis_path_expand.patch
│   ├── HOWTO_SUBMIT.md       # 上流へのパッチ提出手順
│   ├── create-issues.sh      # GitLab issue 作成スクリプト
│   ├── create-mr.sh          # GitLab MR 作成スクリプト
│   └── fork-and-prepare.sh   # フォーク準備スクリプト
├── build-ptyxis.sh            # SSH経由 自動ビルドスクリプト
├── check-version.sh           # バージョン確認スクリプト
├── BUILD_INSTRUCTIONS.md      # 詳細なビルド手順
└── SUMMARY.md                 # 作業サマリー

ビルド方法

自動ビルド(推奨)

Fedora ホストから SSH 経由で OpenBSD にビルド・インストールします。

./build-ptyxis.sh

ソース取得、パッチ適用、meson 設定、コンパイル、インストールを一括実行します。 詳細は BUILD_INSTRUCTIONS.md を参照してください。

手動 meson ビルド

# OpenBSD マシンにて
git clone https://gitlab.gnome.org/chergert/ptyxis.git
cd ptyxis
git checkout 50.1

# パッチ適用(16種全て、アルファベット順)
for p in /path/to/openbsd-port/patches/patch-*; do
  patch -p0 < "$p"
done

# ビルド
meson setup build --prefix=/usr/local --buildtype=debugoptimized -Ddevelopment=false
ninja -C build
sudo ninja -C build install

実行

ptyxis

XDG_RUNTIME_DIRpatch-src_main_c により自動的に /tmp/runtime-UID に設定されます。

OpenBSD 向けパッチの概要 (16種)

patch-agent_meson_build

GLIBC 互換レイヤーを Linux 専用に制限します。

-if target_machine.cpu_family() == 'x86_64'
+if target_machine.cpu_family() == 'x86_64' and target_machine.system() == 'linux'

OpenBSD は独自の libc を持つため、Linux 向けの GLIBC 互換シンボルは不要です。

patch-agent_ptyxis-agent_c

pledge(2) を使用して ptyxis-agent の権限を最小化します。

pledge 権限 用途
stdio 基本 I/O、wait4、kqueue、pipe
rpath シェルバイナリ、/etc/passwd の読み取り
wpath PTY 設定のための書き込み
cpath コンテナストレージディレクトリの作成 (mkdir)
tty posix_openpt、grantpt、unlockpt
proc fork、setpgid、kill
exec ユーザーシェルの起動
unix D-Bus socketpair 通信
sendfd/recvfd D-Bus 経由の fd 受け渡し
getpw ログインシェル解決

cpath は podman provider が ~/.local/share/containers/storage/overlay-containers/g_mkdir_with_parents() で作成する際に必要です。欠如すると pledge 違反で SIGABRT が発生します。

patch-agent_ptyxis-process-impl_c

OpenBSD では /proc が通常マウントされておらず、Linux とはレイアウトも異なります。 sysctl(3) を使用してプロセス情報を取得するように置き換えます。

機能 Linux (/proc) OpenBSD (sysctl)
コマンドライン取得 /proc/PID/cmdline KERN_PROC_ARGS + KERN_PROC_ARGV
プロセス種別判定 /proc/PID/exe readlink KERN_PROC + kinfo_proc.p_comm
UID 確認 (sudo検出) /proc/PID/ GFileInfo kinfo_proc.p_uid
作業ディレクトリ取得 /proc/PID/cwd readlink KERN_PROC_CWD

これによりタブタイトルの追跡、sudo 検出、ディレクトリ追跡が OpenBSD で正しく動作します。

patch-src_main_c

OpenBSD では systemd が存在しないため XDG_RUNTIME_DIR が設定されません。 GTK4 と D-Bus はソケットファイルやキャッシュのためにこのディレクトリを必要とします。

未設定の場合、/tmp/runtime-UID(mode 0700)を自動作成して環境変数に設定します。

patch-src_ptyxis-tab_c

sys/wait.h インクルード追加

WIFEXITEDWIFSIGNALED 等のマクロが OpenBSD では sys/wait.h からのみ提供されます。

旧リビジョン(49.3 系)では zoom_font_scales 配列のカンマ/ピリオドのタイポ修正 (1,21.2)も含んでいましたが、上流 50.1 で配列が半ステップ実装に 書き換えられ、タイポ自体が解消されたため本パッチから削除しました。

patch-src_ptyxis-util_c

2つの修正を含みます。

wordexp(3) の無効化

OpenBSD は wordexp(3) を提供しません。~$HOME は別途処理済みのため、 OpenBSD では g_strdup(path) によるシンプルなフォールバックを使用します。

NULL ポインタ参照の修正(上流バグ)

// Before (bug): ret が NULL の場合クラッシュ
if (!g_path_is_absolute(ret))
// After (fix)
if (ret != NULL && !g_path_is_absolute(ret))

patch-meson_build-fix-linker-flags

リンカフラグ(-Wl,-z,defs 等)が c_args に誤って渡されていたのを link_args に移動します。 src/meson.buildagent/meson.build の両方を修正します。

patch-src_main_c-openbsd-pledge-unveil

pledge(2)unveil(2) によるサンドボックス化を追加します。

  • --import-palette パス: unveil をパレットファイルと宛先ディレクトリに限定し、 pledge("stdio rpath wpath cpath") で制限
  • メインアプリパス: GTK4・フォント・テーマ・シェル等の必要パスを unveil し、 pledge("stdio rpath wpath cpath fattr inet dns unix proc exec prot_exec tty tmppath") で制限

patch-src_main_c-security-toctou

パレットインポート時のファイル書き込みを改善します。

g_file_set_contents()g_file_set_contents_full(..., G_FILE_SET_CONTENTS_CONSISTENT, 0640, ...) に 置き換え、一時ファイル経由のアトミック書き込みと明示的なパーミッション (0640) を保証します。

patch-src_ptyxis-client_c-security-dbus-auth

D-Bus 接続確立前に認証チェックを追加します(OpenBSD 上で検証済み)。

patch-src_ptyxis-custom-link_c-security-null

カスタムリンク処理での NULL ポインタ参照を防止します。

patch-src_ptyxis-palette_c-perf-hashtable

ptyxis_palette_lookup() の O(n) 線形探索を O(1) ハッシュテーブル検索に置き換えます。

GHashTableptyxis_palette_get_all() 初期化時に構築し、items-changed シグナルで更新します。

patch-src_ptyxis-tab_c-perf-freeze-notify

freeze-notify / thaw-notify を使用して、ptyxis_tab_invalidate_progress() の 3つの g_object_notify_by_pspec() 呼び出しを1回の通知サイクルにまとめます。

patch-src_ptyxis-tab_c-perf-notify-batch

ptyxis-tab.c 内の複数プロパティ通知箇所(4箇所)を freeze-notify / thaw-notify で バッチ化します。対象は ptyxis_tab_set_title_prefix()ptyxis_tab_set_zoom() (Ctrl+=/- 毎に発火)、ptyxis_tab_poll_agent_finish()(コマンド実行毎、最も高頻度)、 ptyxis_tab_set_ignore_osc_title() です。

patch-src_ptyxis-terminal_c-perf-list-append

ターミナルウィジェット初期化時のリストアペンド処理を最適化します。

patch-src_ptyxis-terminal_c-security-regex-assert

URL 正規表現のコンパイル失敗時に g_assert (abort) の代わりに g_critical + continue を使用します。 PCRE2 バージョン差異等でコンパイルが失敗してもアプリが起動不能にならないようにします。

パッチバージョニング

パッチは Ptyxis バージョンに連動したリビジョン番号で管理します。

  • 命名規則: ptyxis-{VERSION}-r{N}(例: ptyxis-50.1-r1
  • 各リビジョンはディレクトリ保存(tar.gz は .gitignore で除外)
  • パッチは diff -u で生成(OpenBSD の patch は hunk ヘッダーに厳密)
  • patches/patch-* は常に最新リビジョンのコピーを配置

動作確認状況

  • ビルド成功(OpenBSD 7.9 amd64)
  • 全16パッチ適用成功
  • インストール後のバイナリ起動・バージョン表示確認(ptyxis --version
  • 実機での複数タブ・端末操作の目視確認(未実施、次回引き継ぎ)

利用できない機能(Linux 専用)

機能 理由
Podman/Toolbox/Distrobox 統合 Linux コンテナランタイム依存
libportal 機能 Flatpak ポータル依存
systemd スコープ systemd 依存

参考リンク

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages