[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 メーリングリストの案内