diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-06-13 09:42:40 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-06-13 09:42:40 +0000 |
commit | 9ee0cafbfe7a94a7b6a9d0e7f2dbf7c7fd229757 (patch) | |
tree | 6bf09f98a1fdc4f538a37d9d12b7ce602c63b0a6 /io.c | |
parent | 97f8593cf8af3b44e170fee5aca9b0a521cd3ffd (diff) |
2000-06-13
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@750 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 28 |
1 files changed, 24 insertions, 4 deletions
@@ -498,6 +498,10 @@ io_fread(ptr, len, f) c = getc(f); TRAP_END; if (c == EOF) { + if (ferror(f)) { + if (errno == EINTR) continue; + rb_sys_fail(0); + } *ptr = '\0'; break; } @@ -624,7 +628,10 @@ rb_io_gets_internal(argc, argv, io) c = getc(f); TRAP_END; if (c == EOF) { - if (ferror(f) && errno == EINTR) continue; + if (ferror(f)) { + if (errno == EINTR) continue; + rb_sys_fail(fptr->path); + } break; } if ((*bp++ = c) == newline) break; @@ -711,7 +718,10 @@ rb_io_gets(io) c = getc(f); TRAP_END; if (c == EOF) { - if (ferror(f) && errno == EINTR) continue; + if (ferror(f)) { + if (errno == EINTR) continue; + rb_sys_fail(fptr->path); + } break; } if ((*bp++ = c) == '\n') break; @@ -865,7 +875,13 @@ rb_io_each_byte(io) TRAP_BEG; c = getc(f); TRAP_END; - if (c == EOF) break; + if (c == EOF) { + if (ferror(f)) { + if (errno == EINTR) continue; + rb_sys_fail(fptr->path); + } + break; + } rb_yield(INT2FIX(c & 0xff)); } if (ferror(f)) rb_sys_fail(fptr->path); @@ -884,13 +900,17 @@ rb_io_getc(io) rb_io_check_readable(fptr); f = fptr->f; + retry: READ_CHECK(f); TRAP_BEG; c = getc(f); TRAP_END; if (c == EOF) { - if (ferror(f)) rb_sys_fail(fptr->path); + if (ferror(f)) { + if (errno == EINTR) goto retry; + rb_sys_fail(fptr->path); + } return Qnil; } return INT2FIX(c & 0xff); |