In article <
87639nskdz.fsf@...>,
Tanaka Akira <
akr@...> writes:
> 配列の第一要素が Dir (や IO) のときに、その fd を openat の
> dirfd に渡すという話ならセキュリティ的な意味はあると思います。
いろいろ考えると、この、いままでパス名を受け付けていたところに
[dir, str] という 2要素の配列を受け付けるというのがいいんじゃ
ないですかね。
* メソッドを増やさないので覚えることが少ない
* File.rename と File.link も同じ方針で扱えるので覚えること
が少ない
(renameat と linkat はディレクトリをふたつ指定できるので
Dir のインスタンスメソッドという形では扱えない)
* to_path の返り値も [dir, str] を受け付けるようにすれば
Pathname も扱える
(Pathname は dir も記録できるように拡張し、
Pathname#to_path が [dir, str] を返す)
概念的なことをいうと、パス名というのがファイルシステム内でファ
イルを同定するものとすると、相対パスはむしろそれ単独では不完
全なものです。その場合、起点となる Dir と対にしたほうが意図
を確実に表現できるので、その対をひとまとまりとして扱ったほう
が意図せざることが起きにくい、安定したプログラムを書きやすく
なるでしょう。
欠点は、機能の有無を respond_to? では判定できないところです
かね。メソッドが増えないので。
あとは dir が close されるとその dir を含む Pathname が使え
なくなることかな。それはまぁそういうものだということで。
なお、openat 等がない環境については、renameat と linkat を除
けば、fchdir と GVL があればそれなりにどうにかなるのではない
かと思います。(fchdir で一時的にカレントディレクトリを変えて
してシステムコールを発行する。GVL により他のスレッドが chdir
する可能性がなければ、これは安全なはずです)
--
[田中 哲][たなか あきら][Tanaka Akira]