Feature #11258
closedadd 'x' mode character for O_EXCL
Added by cremno (cremno phobia) over 10 years ago. Updated about 7 years ago.
Description
I just saw #11253 which contains:
But some modes has only integer form like O_CLOEXEC, O_EXCL.
However C11 added x
to open a file for exclusive access. It's also supported by Python.
http://port70.net/~nsz/c/c11/n1570.html#7.21.5.3p5
https://docs.python.org/3.3/library/functions.html#open
Files
excl_mode_v1.diff (3.46 KB) excl_mode_v1.diff | cremno (cremno phobia), 06/16/2015 06:47 PM | ||
excl_mode_v2.diff (4.41 KB) excl_mode_v2.diff | cremno (cremno phobia), 07/29/2015 06:35 PM |
Updated by cremno (cremno phobia) over 10 years ago
Actions
#1
[ruby-core:69616]
- File excl_mode_v1.diff excl_mode_v1.diff added
Here is a preliminary patch that passes make test-all
(except for some RubyGems/SSL tests) on a glibc-based Linux (but I think some less common code might not work anymore on Windows and other platforms that don't implement x
but validate the mode string). Also rb_io_oflags_modestr()
didn't differentiate between w+
and r+
before - was that intended?
Updated by normalperson (Eric Wong) over 10 years ago
Actions
#2
[ruby-core:69617]
cremno@mail.ru wrote:
Issue #11258 has been updated by cremno phobia.
File excl_mode_v1.diff added
Here is a preliminary patch that passes
make test-all
(except for
some RubyGems/SSL tests) on a glibc-based Linux (but I think some less
common code might not work anymore on Windows and other platforms that
don't implementx
but validate the mode string).
Haven't tested, but I like this feature for consistency with glibc
and Python.
Also
rb_io_oflags_modestr()
didn't differentiate betweenw+
andr+
before - was that intended?
I hope not, but it may also be too late to change without breaking
existing code and causing major data loss...
Updated by normalperson (Eric Wong) over 10 years ago
Actions
#3
[ruby-core:69618]
Eric Wong normalperson@yhbt.net wrote:
cremno@mail.ru wrote:
Also
rb_io_oflags_modestr()
didn't differentiate betweenw+
andr+
before - was that intended?I hope not, but it may also be too late to change without breaking
existing code and causing major data loss...
Scratch that. I misremembered what rb_io_oflags_modestr did :x
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
Actions
#4
[ruby-core:69627]
+#define MODE_BINARY_EXCL(a,b,c,d) \ + ((oflags & O_EXCL) ? MODE_BINARY(d, c) : MODE_BINARY(b, a))
'a', 'b' and 'c', 'd' are inverted?
Updated by matz (Yukihiro Matsumoto) about 10 years ago
Actions
#5
[ruby-core:70144]
It looks good to me.
Matz.
Updated by cremno (cremno phobia) about 10 years ago
Actions
#6
[ruby-core:70174]
- File excl_mode_v2.diff excl_mode_v2.diff added
Nobuyoshi Nakada wrote:
+#define MODE_BINARY_EXCL(a,b,c,d) \ + ((oflags & O_EXCL) ? MODE_BINARY(d, c) : MODE_BINARY(b, a))
'a', 'b' and 'c', 'd' are inverted?
Yes, MODE_BINARY confused me (it uses it arguments in reverse order). I think MODE_BINARY_EXCL
is a bad idea anyway. In V2 an ArgumentError is raised by rb_io_oflags_modestr()
when O_EXCL
is set. This also affects the related flags: File::EXCL
feature. $stdout.reopen('stdout', 'w', flags: File::EXCL)
does now raise as it should since freopen()
might not support x
which could cause the truncation of an existing file! That might not be the best solution though.
V2 also contains documentation and a news entry.
Updated by shyouhei (Shyouhei Urabe) about 8 years ago
Actions
#7
- Has duplicate Feature #14007: open mode 'x' to raise error if file exists added
Updated by ko1 (Koichi Sasada) about 7 years ago
Actions
#8
[ruby-core:88363]
- Assignee set to znz (Kazuhiro NISHIYAMA)
Updated by znz (Kazuhiro NISHIYAMA) about 7 years ago
Actions
#9
- Status changed from Open to Closed
Applied in changeset trunk|r64245.
add 'x' mode character for O_EXCL
[Feature #11258]
Patch by cremno (cremno phobia)