Feature #13743
closed
Support linking of files opened with O_TMPFILE
Added by Glass_saga (Masaki Matsushita) over 7 years ago.
Updated over 7 years ago.
Description
This patch enables linking of files opened with O_TMPFILE into file system.
Users can make a temporary file persistent as named file.
File.open(".", IO::WRONLY|IO::TMPFILE) do |f|
f.write("content")
f.chmod(0600)
File.link(f, "file_name") # make temporary file persistent
end
Files
Extension of File.link
, but not File#link
?
glass.saga@gmail.com wrote:
Feature #13743: Support linking of files opened with O_TMPFILE
https://bugs.ruby-lang.org/issues/13743
I like this feature.
patch.diff (2.44 KB)
+ if (!NIL_P(tmp) && from_fptr && from_fptr->fd >= 0) { /* when 'from' is an IO and opened */
+ char from_path[PATH_MAX];
+
+ rb_io_flush(from);
+ FilePathValue(to);
+ to = rb_str_encode_ospath(to);
+ snprintf(from_path, PATH_MAX, "/proc/self/fd/%d", from_fptr->fd);
However, PATH_MAX
(4096 on Linux) is excessive use of stack.
Since fd
is an int, we can safely set a smaller size.
Also, I'm not sure why rb_io_flush
needs to be called, here.
Thanks.
normalperson (Eric Wong) wrote:
However, PATH_MAX
(4096 on Linux) is excessive use of stack.
Since fd
is an int, we can safely set a smaller size.
static const char self_fd[] = "/proc/self/fd/%d";
char from_path[sizeof(self_fd) - 2 + DECIMAL_SIZE_OF_BITS(sizeof(int))];
I feel this is too Linux and environment specific.
For example, it depends /proc/fd.
I think that it is better to provide linkat(2) directly.
(Extend File.link or add File.linkat.)
- Status changed from Open to Rejected
This API is pretty simple but only works on Linux. I am not positive to add platform-specific features to the language core. I'd rather recommend considering making it a gem.
Matz.
Also available in: Atom
PDF
Like0
Like0Like0Like0Like0Like0Like0Like0