diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-04-08 16:27:42 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-04-08 16:27:42 +0000 |
commit | 92de2ed517cea4524579092ce7962a879d33a7e9 (patch) | |
tree | 214fca324ada1218d9d364d5e8af3613ecd4bdd8 | |
parent | f6b46f0779e0a720cd4d199cf88a451310ceccc5 (diff) | |
download | ruby-92de2ed517cea4524579092ce7962a879d33a7e9.tar.gz |
* io.c (internal_{read,write}_func, rb_{read,write}_internal):
preserve errno. a patch from Takehiro Kubo in [ruby-core:29340].
[ruby-core:28924]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27265 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | io.c | 21 |
2 files changed, 23 insertions, 4 deletions
@@ -1,3 +1,9 @@ +Fri Apr 9 01:26:54 2010 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * io.c (internal_{read,write}_func, rb_{read,write}_internal): + preserve errno. a patch from Takehiro Kubo in [ruby-core:29340]. + [ruby-core:28924] + Fri Apr 9 01:12:07 2010 Yusuke Endoh <mame@tsg.ne.jp> * lib/irb/completion.rb (CompletionProc): calling the method "methods" @@ -530,6 +530,7 @@ wsplit_p(rb_io_t *fptr) struct io_internal_struct { int fd; + int saved_errno; void *buf; size_t capa; }; @@ -538,36 +539,48 @@ static VALUE internal_read_func(void *ptr) { struct io_internal_struct *iis = (struct io_internal_struct*)ptr; - return read(iis->fd, iis->buf, iis->capa); + ssize_t ret = read(iis->fd, iis->buf, iis->capa); + iis->saved_errno = errno; + return (VALUE)ret; } static VALUE internal_write_func(void *ptr) { struct io_internal_struct *iis = (struct io_internal_struct*)ptr; - return write(iis->fd, iis->buf, iis->capa); + ssize_t ret = write(iis->fd, iis->buf, iis->capa); + iis->saved_errno = errno; + return (VALUE)ret; } static ssize_t rb_read_internal(int fd, void *buf, size_t count) { struct io_internal_struct iis; + ssize_t ret; + iis.fd = fd; iis.buf = buf; iis.capa = count; - return (ssize_t)rb_thread_blocking_region(internal_read_func, &iis, RUBY_UBF_IO, 0); + ret = (ssize_t)rb_thread_blocking_region(internal_read_func, &iis, RUBY_UBF_IO, 0); + errno = iis.saved_errno; + return ret; } static ssize_t rb_write_internal(int fd, void *buf, size_t count) { struct io_internal_struct iis; + ssize_t ret; + iis.fd = fd; iis.buf = buf; iis.capa = count; - return (ssize_t)rb_thread_blocking_region(internal_write_func, &iis, RUBY_UBF_IO, 0); + ret = (ssize_t)rb_thread_blocking_region(internal_write_func, &iis, RUBY_UBF_IO, 0); + errno = iis.saved_errno; + return ret; } static long |