This project is closed and read-only.
Backport #2559 ยป io-write-fix.diff
| io.c | ||
|---|---|---|
|
{
|
||
|
long len, n, r, l, offset = 0;
|
||
|
FILE *f = GetWriteFile(fptr);
|
||
|
#if BSD_STDIO
|
||
|
off_t cur_offset;
|
||
|
#endif
|
||
|
len = RSTRING(str)->len;
|
||
|
if ((n = len) <= 0) return n;
|
||
| ... | ... | |
|
r = write(fileno(f), RSTRING(str)->ptr+offset, l);
|
||
|
TRAP_END;
|
||
|
#if BSD_STDIO
|
||
|
fseeko(f, lseek(fileno(f), (off_t)0, SEEK_CUR), SEEK_SET);
|
||
|
if (r > 0) {
|
||
|
cur_offset = lseek(fileno(f), (off_t)0, SEEK_CUR);
|
||
|
if (cur_offset != -1) {
|
||
|
if (fseeko(f, cur_offset, SEEK_SET) == -1)
|
||
|
/* Raise fseeko's error. */
|
||
|
r = -1;
|
||
|
}
|
||
|
else if (errno != ESPIPE) {
|
||
|
/* Raise lseek's error. */
|
||
|
r = -1;
|
||
|
}
|
||
|
/* else if (errno == ESPIPE) ignore error */
|
||
|
}
|
||
|
#endif
|
||
|
if (r == n) return len;
|
||
|
if (0 <= r) {
|
||
| test/io/test_write.rb | ||
|---|---|---|
|
require 'test/unit'
|
||
|
class TestIOWrite < Test::Unit::TestCase
|
||
|
def test_write
|
||
|
a, b = IO.pipe
|
||
|
begin
|
||
|
a.close
|
||
|
assert_raises(Errno::EPIPE) do
|
||
|
b.write("hi")
|
||
|
end
|
||
|
ensure
|
||
|
a.close if !a.closed?
|
||
|
b.close if !b.closed?
|
||
|
end
|
||
|
end
|
||
|
end
|
||