summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-02-15 14:37:52 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-02-15 14:37:52 +0000
commit76678bb526a8a4e6d4af3dffb1ebe6da6d5f9ccf (patch)
tree4f53de829bfb53aa67d6bbff8a31303f747709d3 /io.c
parent9dbffb49fa69da2252028c8c9fbf0f5ad8c1c320 (diff)
* io.c: check lseek error by errno. NetBSD 4.0.1 may return -1 as
a file position of tty. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26674 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/io.c b/io.c
index d92e104da7..9983e17801 100644
--- a/io.c
+++ b/io.c
@@ -312,8 +312,9 @@ io_unread(rb_io_t *fptr)
if (fptr->rbuf_len == 0 || fptr->mode & FMODE_DUPLEX)
return;
/* xxx: target position may be negative if buffer is filled by ungetc */
+ errno = 0;
r = lseek(fptr->fd, -fptr->rbuf_len, SEEK_CUR);
- if (r < 0) {
+ if (r < 0 && errno) {
if (errno == ESPIPE)
fptr->mode |= FMODE_DUPLEX;
return;
@@ -369,7 +370,7 @@ flush_before_seek(rb_io_t *fptr)
#define io_set_eof(fptr) (void)(((fptr)->mode & FMODE_TTY) && ((fptr)->mode |= FMODE_EOF))
#define io_unset_eof(fptr) (fptr->mode &= ~FMODE_EOF)
-#define io_seek(fptr, ofs, whence) (io_unset_eof(fptr), lseek(flush_before_seek(fptr)->fd, ofs, whence))
+#define io_seek(fptr, ofs, whence) (errno = 0, io_unset_eof(fptr), lseek(flush_before_seek(fptr)->fd, ofs, whence))
#define io_tell(fptr) lseek(flush_before_seek(fptr)->fd, 0, SEEK_CUR)
#ifndef SEEK_CUR
@@ -1120,7 +1121,7 @@ rb_io_set_pos(VALUE io, VALUE offset)
pos = NUM2OFFT(offset);
GetOpenFile(io, fptr);
pos = io_seek(fptr, pos, SEEK_SET);
- if (pos < 0) rb_sys_fail_path(fptr->pathv);
+ if (pos < 0 && errno) rb_sys_fail_path(fptr->pathv);
return OFFT2NUM(pos);
}
@@ -1147,7 +1148,7 @@ rb_io_rewind(VALUE io)
rb_io_t *fptr;
GetOpenFile(io, fptr);
- if (io_seek(fptr, 0L, 0) < 0) rb_sys_fail_path(fptr->pathv);
+ if (io_seek(fptr, 0L, 0) < 0 && errno) rb_sys_fail_path(fptr->pathv);
if (io == ARGF.current_file) {
ARGF.lineno -= fptr->lineno;
}
@@ -3746,8 +3747,9 @@ rb_io_sysseek(int argc, VALUE *argv, VALUE io)
if ((fptr->mode & FMODE_WRITABLE) && fptr->wbuf_len) {
rb_warn("sysseek for buffered IO");
}
+ errno = 0;
pos = lseek(fptr->fd, pos, whence);
- if (pos == -1) rb_sys_fail_path(fptr->pathv);
+ if (pos == -1 && errno) rb_sys_fail_path(fptr->pathv);
return OFFT2NUM(pos);
}
@@ -5715,10 +5717,10 @@ io_reopen(VALUE io, VALUE nfile)
}
rb_thread_fd_close(fd);
if ((orig->mode & FMODE_READABLE) && pos >= 0) {
- if (io_seek(fptr, pos, SEEK_SET) < 0) {
+ if (io_seek(fptr, pos, SEEK_SET) < 0 && errno) {
rb_sys_fail_path(fptr->pathv);
}
- if (io_seek(orig, pos, SEEK_SET) < 0) {
+ if (io_seek(orig, pos, SEEK_SET) < 0 && errno) {
rb_sys_fail_path(orig->pathv);
}
}
@@ -8028,8 +8030,9 @@ nogvl_copy_stream_sendfile(struct copy_stream_struct *stp)
if (use_pread)
copy_length = src_stat.st_size - src_offset;
else {
+ errno = 0;
off_t cur = lseek(stp->src_fd, 0, SEEK_CUR);
- if (cur == (off_t)-1) {
+ if (cur == (off_t)-1 && errno) {
stp->syserr = "lseek";
stp->error_no = errno;
return -1;
@@ -8161,8 +8164,9 @@ nogvl_copy_stream_read_write(struct copy_stream_struct *stp)
if (use_pread && stp->close_src) {
off_t r;
+ errno = 0;
r = lseek(stp->src_fd, src_offset, SEEK_SET);
- if (r == (off_t)-1) {
+ if (r == (off_t)-1 && errno) {
stp->syserr = "lseek";
stp->error_no = errno;
return;