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 を参照してください。
# 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 installptyxisXDG_RUNTIME_DIR は patch-src_main_c により自動的に /tmp/runtime-UID に設定されます。
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 互換シンボルは不要です。
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 が発生します。
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 で正しく動作します。
OpenBSD では systemd が存在しないため XDG_RUNTIME_DIR が設定されません。
GTK4 と D-Bus はソケットファイルやキャッシュのためにこのディレクトリを必要とします。
未設定の場合、/tmp/runtime-UID(mode 0700)を自動作成して環境変数に設定します。
sys/wait.h インクルード追加
WIFEXITED、WIFSIGNALED 等のマクロが OpenBSD では sys/wait.h からのみ提供されます。
旧リビジョン(49.3 系)では
zoom_font_scales配列のカンマ/ピリオドのタイポ修正 (1,2→1.2)も含んでいましたが、上流 50.1 で配列が半ステップ実装に 書き換えられ、タイポ自体が解消されたため本パッチから削除しました。
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))リンカフラグ(-Wl,-z,defs 等)が c_args に誤って渡されていたのを link_args に移動します。
src/meson.build と agent/meson.build の両方を修正します。
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")で制限
パレットインポート時のファイル書き込みを改善します。
g_file_set_contents() を g_file_set_contents_full(..., G_FILE_SET_CONTENTS_CONSISTENT, 0640, ...) に
置き換え、一時ファイル経由のアトミック書き込みと明示的なパーミッション (0640) を保証します。
D-Bus 接続確立前に認証チェックを追加します(OpenBSD 上で検証済み)。
カスタムリンク処理での NULL ポインタ参照を防止します。
ptyxis_palette_lookup() の O(n) 線形探索を O(1) ハッシュテーブル検索に置き換えます。
GHashTable を ptyxis_palette_get_all() 初期化時に構築し、items-changed シグナルで更新します。
freeze-notify / thaw-notify を使用して、ptyxis_tab_invalidate_progress() の
3つの g_object_notify_by_pspec() 呼び出しを1回の通知サイクルにまとめます。
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() です。
ターミナルウィジェット初期化時のリストアペンド処理を最適化します。
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) - 実機での複数タブ・端末操作の目視確認(未実施、次回引き継ぎ)
| 機能 | 理由 |
|---|---|
| Podman/Toolbox/Distrobox 統合 | Linux コンテナランタイム依存 |
| libportal 機能 | Flatpak ポータル依存 |
| systemd スコープ | systemd 依存 |