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
Like 0
Like 0 Like 0 Like 0 Like 0 Like 0 Like 0 Like 0