Deep Directory Hierarchies

rock_ridge_file_sourceを作成して、深いディレクトリ階層もサポートしました。
rock_ridge_file_source_impl.hpp
とりあえず動くことを第一に考えて書いたので、前のコードからコピペしまくりです。


ISO 9660ではディレクトリ階層は(ルートを1と数えて)8階層までに制限されています。
Rock Ridgeはこの制約の中でいくらでもディレクトリを掘ることのできるように、深いディレクトリ階層を別のディレクトリに再配置(relocate)することができます。
再配置先のディレクトリは通常/rr_movedというパスです。
ISO 9660との互換性から8階層目のディレクトリは空のファイルに置き換えられ、"CL" System Use Entryでrr_moved配下に再配置されたディレクトリを指すようになっています。


rr_movedはISO 9660でも見えるので、本来のパスが違うものの内容を読むことができます。
ただし、同じディレクトリ階層を2度読んだり、無限ループしたりすることを防ぐため、"RE" System Use Entryで再配置されたディレクトリであることをマーキングされています。


要するに、/1/2/3/4/5/6/7/8/a.txtというファイルを含むIOSイメージをISO 9660として読むと、

/1/2/3/4/5/6/7/8
/RR_MOVED/8/A.txt

となり、Rock Ridgeとして読むと、

/1/2/3/4/5/6/7/8/a.txt
/rr_moved/

となるわけです。
残念ながら、rr_movedディレクトリと通常ディレクトリの区別が付かないため、Rock Ridgeとして呼んだ場合も見えてしまいます。


なお、ISO 9660:1999ではディレクトリ階層の制限が撤廃されていて、深いディレクトリ階層サポートを実装するモチベーションがなかなか上がらなかったのは、その所為だったりします。