Fuse4Xでのデフォルトボリューム名を変更する(OSXFUSEも)

Mac OS X Lionではmacfuseがサポートされなくなってしまったので、代わりにMacPortsではFuse4Xが使われている。
Fuse4Xになってから、sshfsなどでマウントするとデスクトップに現れるマウントボリュームの名前がちょっと情報不足で不便だ。例えば"Fuse4X Volume 0 (sshfs)"などとなる。
このページの説明に従って、マウント時に"-o volname=hoge"とかすれば自分で指定できるのだが、それもそれで面倒だ。
そこで以前のように自動でわかりやすい名前になる方法を探ってみた。

MacPortsのfuse4xのソースを少しだけいじりビルドし直すという方法で解決した。
まず、MacPortsでバイナリ共有をしている人は共有サーバー側であらかじめfuse4xを削除しておこう。でないと、コンパイル済みバイナリが再度インストールされてしまう。

強制的にfuse4xをアンインストールする。

sudo port -f uninstall fuse4x

fuse4xをパッチを当てた状態まで展開

sudo port patch fuse4x +universal

fuse4xのソースが展開されているディレクトリへ移動

cd $(port dir fuse4x)/work
cd fuse4x-*

修正すべきソースファイルをrootで開く

sudo -e ./lib/mount_darwin.c

開いたら、以下の様な内容の部分を探す。

if (!*opts.fuse_args.volname)
	snprintf(opts.fuse_args.volname, MAXPATHLEN, "fuse4x volume %d (%s)", device_no, getprogname());

どうやら、opts.fuse_args.volnameがボリューム名になるらしく、これをいじくれば良い。
この部分の少し上にfsnameというのがあり、わかりやすい名前になるのでそれに書き換える。

snprintf(opts.fuse_args.volname, MAXPATHLEN, "%s", opts.fuse_args.fsname);

マウントパス名にしたければ

const char* const mntname = strrchr(opts.fuse_args.mntpath, '/');
snprintf(opts.fuse_args.volname, MAXPATHLEN, "%s", mntname+1);

とか。

書き換えたら、ビルドとインストールを行う。

sudo port install fuse4x +universal

このおかげでボリューム名はだいぶわかりやすくなった。
パッチとして作ればよかったかもしれないが、よくわからなかったので手動編集の方法を紹介した。

OSXFUSEの場合 (2014/06/11 追記)

基本は同じ

sudo port -f uninstall osxfuse
sudo port -s patch osxfuse
cd $(port dir osxfuse)/work

修正すべきファイルは異なってくる。該当するソースファイルを探してみる。

grep -r "OSXFUSE Volume" .

2つマッチするがどうやら ./osxfuse-osxfuse-7b0d8d3/kext/mount/mount_osxfusefs.c というのが正解のようだ。

sudo -e ./osxfuse-osxfuse-7b0d8d3/kext/mount/mount_osxfusefs.c

OSXFUSE Volumeがマッチする箇所のあたりはこのようになっている。

    if (!volname) {
        if (daemon_name) {
            snprintf(args.volname, MAXPATHLEN, "OSXFUSE Volume %d (%s)",
                     dindex, daemon_name);
        } else {
            snprintf(args.volname, MAXPATHLEN, "OSXFUSE Volume %d", dindex);
        }
    } else {

これをmntpathを使って

    if (!volname) {
        if(mntpath) {
            const char* const mntname = strrchr(mntpath, '/');
            snprintf(args.volname, MAXPATHLEN, "%s", mntname+1);
        } else if (daemon_name) {
            snprintf(args.volname, MAXPATHLEN, "OSXFUSE Volume %d (%s)",
                     dindex, daemon_name);
        } else {
            snprintf(args.volname, MAXPATHLEN, "OSXFUSE Volume %d", dindex);
        }
    } else {

と書き換えた。適当に好みで。

あとはビルド。

cd
sudo port -s install osxfuse