ruby-changes:15374
From: nobu <ko1@a...>
Date: Fri, 9 Apr 2010 01:28:35 +0900 (JST)
Subject: [ruby-changes:15374] Ruby:r27265 (trunk): * io.c (internal_{read,write}_func, rb_{read,write}_internal):
nobu 2010-04-09 01:27:42 +0900 (Fri, 09 Apr 2010) New Revision: 27265 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=27265 Log: * io.c (internal_{read,write}_func, rb_{read,write}_internal): preserve errno. a patch from Takehiro Kubo in [ruby-core:29340]. [ruby-core:28924] Modified files: trunk/ChangeLog trunk/io.c Index: ChangeLog =================================================================== --- ChangeLog (revision 27264) +++ ChangeLog (revision 27265) @@ -1,3 +1,9 @@ +Fri Apr 9 01:26:54 2010 Nobuyoshi Nakada <nobu@r...> + + * 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@t...> * lib/irb/completion.rb (CompletionProc): calling the method "methods" Index: io.c =================================================================== --- io.c (revision 27264) +++ io.c (revision 27265) @@ -530,6 +530,7 @@ struct io_internal_struct { int fd; + int saved_errno; void *buf; size_t capa; }; @@ -538,36 +539,48 @@ 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 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/