NetBSD-10で新たに追加されたユーザランドのコマンド

[NetBSD Advent Calendar 2024](https://qiita.com/advent-calendar/2024/netbsd) 10日目の記事です。今日はNetBSD-10で新たに追加されたユーザランドのコマンドを見てみようと思います。

[NetBSD-10のリリースノート](https://www.netbsd.org/releases/formal-10/NetBSD-10.0.html)の"New userspace programs"に新たに追加されたコマンドの説明があります。どうやら以下のコマンドが追加されているようです。

 * [aiomixer(1)](https://man.netbsd.org/NetBSD-10.0/aiomixer.1)
 * [realpath(1)](https://man.netbsd.org/NetBSD-10.0/realpath.1)
 * [tradcpp(1)](https://man.netbsd.org/NetBSD-10.0/tradcpp.1)
 * [ioctlprint(1)](https://man.netbsd.org/NetBSD-10.0/ioctlprint.1)
 * [testpat(6)](https://man.netbsd.org/NetBSD-10.0/testpat.6)
 * [warp(6)](https://man.netbsd.org/NetBSD-10.0/warp.6)
 * [fsck_udf(8))](https://man.netbsd.org/NetBSD-10.0/fsck_udf.8)

これらのコマンドを順に見てみます。

## aiomixer(1)

[aiomixer(1)](https://man.netbsd.org/NetBSD-10.0/aiomixer.1)は[curses(3)](https://man.netbsd.org/NetBSD-10.0/curses.3)ベースのオーディオミキサーです。音量などはCUIツールの[mixerctl(1)](https://man.netbsd.org/mixerctl.1)でも設定可能ですが、設定したい値(パラメータ)をその都度確認して設定するのはちょっと面倒です…。

```sh
$ mixerctl -a | grep master
outputs.master=127,127
$
$ # 音量を設定する。
$ mixerctl -w outputs.master=140,140
outputs.master: 127,127 -> 143,143
```

aiomixerを使用することで、CUIでも音量やミュートと言ったサウンドデバイスで頻繁に設定する項目を楽に設定できます。

![img01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/1bfed546-5dc8-0818-aeeb-e1958cd78d91.png)

## realpath(1)

[realpath(1)](https://man.netbsd.org/NetBSD-10.0/realpath.1)は相対パスを絶対パスに変換(正規化)するコマンドです。

```sh
$ realpath /usr/src
/usr/src
$
$ realpath /usr/src/../../usr/src/../src
/usr/src
```

manページを見ると、FreeBSD-4.3で追加された `realpath(3)` をNetBSD-10に取り込んだという経緯のようです(逆に今までNetBSDに入ってなかったのか…とも思います)。また、その際にGNU Coreutils版の[realpath(3)](https://ja.manpages.org/realpath)との互換性を高める修正が追加されているとのことです。

## tradcpp(1)

[tradcpp(1)](https://man.netbsd.org/NetBSD-10.0/tradcpp.1)はK&RスタイルのCマクロ・プロセッサです。Cコンパイラがインストールされていない環境でCプリプロセッサの利用を想定し(設定ファイルでCプリプロセッサマクロを使用するケースがあるのだとか)、ベースコマンドに含めているとのこと。

例として、以下のようなCプリプロセッサマクロの展開を考えてみます。

```c
/* foo.h */

#include <bar.h>
#include <bar.h>

char str[] = STR
char join_str[] = JOIN_STR(HELLO, WORLD)
```

```c
/* bar.h */

#ifndef BAR_H
#define BAR_H

#define STR "HELLO"
#define JOIN_STR(x, y) x ## y

#endif /* BAR_H */
```

`tradcpp` でプリプロセッサに通してみます。`ifndef` による多重インクルードガードとマクロ定数の展開は行えますが、 `##` によるシンボルの連結は行えないようです。

```sh
$ tradcpp -I. bar.h
$ tradcpp -I. foo.h
...
char str[] = "HELLO"
char join_str[] = HELLO ##  WORLD
```

`cpp` コマンドであれば、 `##` によるシンボルの連結も行えます( `##` 記法はK&Rスタイルのプリプロセッサではサポートされていないという話かと思います)。

```sh
$ cpp -I. foo.h
# 1 "foo.h"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "foo.h"


# 1 "./bar.h" 1
# 4 "foo.h" 2


char str[] = "HELLO"
char join_str[] = HELLOWORLD
```

## ioctlprint(1)

[ioctlprint(1)](https://man.netbsd.org/NetBSD-10.0/ioctlprint.1)は[ioctl(2)](https://man.netbsd.org/NetBSD-10.0/ioctl.2)で指定可能なリクエストの一覧を出力するコマンドです。

```sh
$ ioctlprint -l
DRVRESUMEDEV    _IOW('D', 126, struct devpmargs)        0x8014447e
HPCFBIO_GDSPCONF        _IOWR('H', 2, struct hpcfb_dspconf)     0xc0784802
...
KFILTER_BYNAME  _IOWR('k', 1, struct kfilter_mapping)   0xc0186b01
TIOCSPGRP       _IOW('t', 118, int)     0x80047476
$
$ ioctlprint -l | wc -l
    1549
```

リクエスト一覧は得られるのですが、どのデバイスに対してリクエスト可能な値なのかがパッと見では分からないため、べつのコマンド(またはソースコード)と照らし合わせて使用する感じになりそうです。

## testpat(6)

[testpat(6)](https://man.netbsd.org/NetBSD-10.0/testpat.6)は端末上にテストパターンを表示するコマンドです。こちらも[curses(3)](https://man.netbsd.org/NetBSD-10.0/curses.3)を使用しています。

![img02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/dc8c7519-1073-726b-d49a-dde1c10ba3be.png)

## warp(6)

[warp(6)](https://man.netbsd.org/NetBSD-10.0/warp.6)はCUIベースの"a real-time space war game"というゲームのようです。操作方法がよく分からずググってみたのですが、解説サイト等は見つけられませんでした。

![img03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/fe263553-ae47-0ae1-a414-6d67ef8470af.png)

ちなみに、このゲームはPerl言語で有名な[Larry Wall](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%AA%E3%83%BC%E3%83%BB%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB)さんによる作品とのことです。

## fsck_udf(8)

[fsck_udf(8))](https://man.netbsd.org/NetBSD-10.0/fsck_udf.8)は[UDF(Universal Disk Format)](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88)に対するファイルシステムのチェックと(必要に応じて)リペアを実行するコマンドです。インストールCDから起動した際にディスクのチェックを行うような機能を提供するコマンドと考えると理解しやすいかと思います。

## まとめ

NetBSD-10で新たに追加されたユーザランドのコマンドをざっと眺めてみました。実運用での利用が想定されるものから、サンプル的な位置づけのものもあり、もう一歩踏み込んで使い込んでみるとより面白い発見がありそうです。