[samba-jp:22946] Re: 末尾に空白があるファイルのファイル名が化ける

HAT hat @ fa2.so-net.ne.jp
2019年 2月 28日 (木) 00:26:43 JST


HATです。

Wed, 27 Feb 2019 11:36:07 +0900, User Ribbon <ribbon @ ns.ribbon.or.jp>:
> MacからWindows にSMBで繋いでファイルを送り込むときには、
> ファイル名置換されるのでしょうか?
> 
> となると、Windows上では、変なファイル名は存在し得ない?

はい。

Macのファイル名の置換は、Windows NTが実装していたSFM (Services for
Macintosh)のアルゴリズムに由来します。
SFMというのは、Windows NTに実装されていた機能であり、Macのファイル共有である
AFPプロトコルのサーバにするものです。

これの仕様は、
SFM Converts Macintosh HFS Filenames to NTFS Unicode
というタイトルで

http://support.microsoft.com/kb/q117258/

にありましたが、現在はなくなっています。

探したところ、当時の資料はWayback Machineにあるアーカイブで読めます。

https://web.archive.org/web/20070510081626/http://support.microsoft.com/kb/117258

この時代はAFPのバージョンが2.xであり、ファイル名はUnicodeでなくMacRomanで
扱われていました。
MacRomanでは使えるが、NTFSではファイル名に使えない文字を置き換える仕様です。

「"*/<>?\|」がWindowsファイル名で使えないのは有名な話であり、単純に
置換するだけで済みます。

ややこしいのが、
「ファイル名の最後がスペース」
「ファイル名の最後がピリオド」
のとき、置換が発生します。
ファイル名の途中の場合は置換は発生しません。

このあと時代が変わり、Mac OS Xが登場すると、AFPではなくSMBでWindowsに
接続できるようになります。
初期のMac OS Xでは、Windows禁止文字入りのファイル名をSMB Serverに
送ろうとすると、Mac OS X自身がエラーを出して、SMB serverには何も送信しない
仕様でした。
また、Sambaは、ローカルファイルシステム上に禁止文字があった場合、mangleする
仕様です。
このmangleしている様子は、私が10年前に書いたページ (のアーカイブ)で
確認できます。

https://web.archive.org/web/20090518170048/http://www003.upp.so-net.ne.jp/hat/netatalk/andsamba.html

更にこのあとの時代、2010年9月1日に、Mac OS Xのカーネルソースコードを
読んでいて、SFMと同様のアルゴリズムを実装していることに気づきました。

https://hatx.hatenablog.com/entry/2010/09/01/214439

Mac OS X側が、予め文字を置換してから、SMB上に流すわけです。

更に更にこのあとの時代、sambaにvfs_fruitが実装され、SFM相当の文字列置換が
実装されます。Mac OS Xが置換して送ってきた文字を再び元の文字に
置換し、ローカルファイルシステムに保存します。

例えば'<'という文字はSFMの仕様で0xf023に置換されることになっているので、

Mac上の'<' → SMB上に0xf023で流す → 受け取ったSambaのvfs_fruitが'<'に戻す

という動作をします。
ここで問題となるのが、
「ファイル名の最後がスペース」
「ファイル名の最後がピリオド」
については、ルールがややこしいので、置換が実装されていないことです。

この問題が、前回紹介した
https://bugzilla.samba.org/show_bug.cgi?id=11255
になります。

-- 
HAT


samba-jp メーリングリストの案内