Feature #11258
closedadd 'x' mode character for O_EXCL
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
Updated by cremno (cremno phobia) almost 10 years ago
- 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) almost 10 years ago
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) almost 10 years ago
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) almost 10 years ago
+#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) over 9 years ago
It looks good to me.
Matz.
Updated by cremno (cremno phobia) over 9 years ago
- 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) over 7 years ago
- Has duplicate Feature #14007: open mode 'x' to raise error if file exists added
Updated by ko1 (Koichi Sasada) over 6 years ago
- Assignee set to znz (Kazuhiro NISHIYAMA)
Updated by znz (Kazuhiro NISHIYAMA) over 6 years ago
- 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)