From 5b615c70eb68177075bf033384499a2eb4b765e6 Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 20 Dec 2002 09:29:41 +0000 Subject: * io.c (rb_io_fwrite): separated from io_write(). * marshal.c (w_byten): use rb_io_fwrite() to support non-blocking IO, and added error check. * rubyio.h: prototypes; rb_io_fwrite git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3191 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 9 +++++++++ io.c | 56 +++++++++++++++++++++++++++++++++----------------------- marshal.c | 3 ++- rubyio.h | 1 + 4 files changed, 45 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index 11c9ad6708..c8732e1a08 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Fri Dec 20 18:29:04 2002 Nobuyoshi Nakada + + * io.c (rb_io_fwrite): separated from io_write(). + + * marshal.c (w_byten): use rb_io_fwrite() to support non-blocking + IO, and added error check. + + * rubyio.h: prototypes; rb_io_fwrite + Fri Dec 20 17:40:59 2002 Yukihiro Matsumoto * object.c (Init_Object): should not remove Class#allocate. diff --git a/io.c b/io.c index 8987fd3057..043a66552b 100644 --- a/io.c +++ b/io.c @@ -363,14 +363,43 @@ rb_io_wait_writable(f) } /* writing functions */ +long +rb_io_fwrite(ptr, len, f) + const char *ptr; + long len; + FILE *f; +{ + long n, r; + + if ((n = len) <= 0) return n; +#ifdef __human68k__ + do { + if (fputc(*ptr++, f) == EOF) { + if (ferror(f)) return -1L; + break; + } + } while (--n > 0); +#else + while (ptr += (r = fwrite(ptr, 1, n, f)), (n -= r) > 0) { + if (ferror(f)) { + if (rb_io_wait_writable(fileno(f))) { + clearerr(f); + continue; + } + return -1L; + } + } +#endif + return len - n; +} + static VALUE io_write(io, str) VALUE io, str; { OpenFile *fptr; FILE *f; - long n, r; - register char *ptr; + long n; rb_secure(4); if (TYPE(str) != T_STRING) @@ -386,27 +415,8 @@ io_write(io, str) rb_io_check_writable(fptr); f = GetWriteFile(fptr); - ptr = RSTRING(str)->ptr; - n = RSTRING(str)->len; -#ifdef __human68k__ - do { - if (fputc(*ptr++, f) == EOF) { - if (ferror(f)) rb_sys_fail(fptr->path); - break; - } - } while (--n > 0); -#else - while (ptr += (r = fwrite(ptr, 1, n, f)), (n -= r) > 0) { - if (ferror(f)) { - if (rb_io_wait_writable(fileno(f))) { - clearerr(f); - continue; - } - rb_sys_fail(fptr->path); - } - } -#endif - n = ptr - RSTRING(str)->ptr; + n = rb_io_fwrite(RSTRING(str)->ptr, RSTRING(str)->len, f); + if (n == -1L) rb_sys_fail(fptr->path); if (fptr->mode & FMODE_SYNC) { io_fflush(f, fptr); } diff --git a/marshal.c b/marshal.c index 25d08ac471..e90879a35d 100644 --- a/marshal.c +++ b/marshal.c @@ -102,7 +102,8 @@ w_byten(s, n, arg) struct dump_arg *arg; { if (arg->fp) { - fwrite(s, 1, n, arg->fp); + if (rb_io_fwrite(s, n, arg->fp) < 0) + rb_sys_fail(0); } else { VALUE buf = arg->str; diff --git a/rubyio.h b/rubyio.h index 377a66b719..a456fff1c5 100644 --- a/rubyio.h +++ b/rubyio.h @@ -59,6 +59,7 @@ FILE *rb_fopen _((const char*, const char*)); FILE *rb_fdopen _((int, const char*)); int rb_getc _((FILE*)); long rb_io_fread _((char *, long, FILE *)); +long rb_io_fwrite _((const char *, long, FILE *)); int rb_io_mode_flags _((const char*)); void rb_io_check_writable _((OpenFile*)); void rb_io_check_readable _((OpenFile*)); -- cgit v1.2.3