Forum: Ruby-core New method File.openat()

F1d6cc2b735bfd82c8773172da2aeab9?d=identicon&s=25 Nobuyoshi Nakada (nobu)
on 2014-08-29 10:45
(Received via mailing list)
Issue #10181 has been updated by Nobuyoshi Nakada.


I don't think it is possible to emulate `openat` family by FD in user
space.
So adding `rb_cloexec_open2()` is a bad idea, IMHO, not only its name.

----------------------------------------
Feature #10181: New method File.openat()
https://bugs.ruby-lang.org/issues/10181#change-48548

* Author: Technorama Ltd.
* Status: Open
* Priority: Normal
* Assignee:
* Category:
* Target version:
----------------------------------------
The purpose of the openat() function is to enable opening files in
directories other than the current working directory without exposure to
race conditions. Any part of the path of a file could be changed in
parallel to a call to open(), resulting in unspecified behavior. By
opening a file descriptor for the target directory and using the
openat() function it can be guaranteed that the opened file is located
relative to the desired directory.

openat() is part of POSIX.1-2008.

Compatibility:
  Linux kernel >= 2.6.16
  FreeBSD >= 7.0
  OpenBSD >= 5.0
  NetBSD >= 6.1.4
  MacOS/X no

Pull request: https://github.com/ruby/ruby/pull/706
18813f71506ebad74179bf8c5a136696?d=identicon&s=25 Eric Wong (Guest)
on 2014-08-29 10:54
(Received via mailing list)
nobu@ruby-lang.org wrote:
> I don't think it is possible to emulate `openat` family by FD in user space.
> So adding `rb_cloexec_open2()` is a bad idea, IMHO, not only its name.

Right, we cannot emulate `openat`; this needs kernel support.

Also, File.new(dir) may not be portable enough for non-Linux.  I think
this should be based on Dir class instead (using Dir.open(dir), as
discussed with Joel).
This topic is locked and can not be replied to.