diff --git a/ChangeLog b/ChangeLog index 5f79bff095..e1b33691ce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sat Jan 11 01:44:16 2003 Nobuyoshi Nakada + + * configure.in (RUBY_CHECK_IO_NEED): added more tests. + + * io.c (rb_io_check_readable): seek after synchronized write. + Fri Jan 10 01:23:45 2003 Nobuyoshi Nakada * misc/ruby-mode.el (ruby-font-lock-syntactic-keywords): syntax diff --git a/configure.in b/configure.in index c9cc32cc0a..a4a86010a0 100644 --- a/configure.in +++ b/configure.in @@ -265,15 +265,11 @@ darwin*) LIBS="-lobjc $LIBS";; human*) ac_cv_func_getpgrp_void=yes;; beos*) ;; cygwin*) rb_cv_have_daylight=no - rb_cv_need_io_seek_between_rw=no - rb_cv_need_io_flush_before_seek=no ac_cv_var_tzname=no ac_cv_func__setjmp=no ac_cv_func_setitimer=no ;; mingw*) LIBS="-lwsock32 $LIBS" - rb_cv_need_io_seek_between_rw=yes - rb_cv_need_io_flush_before_seek=no ac_cv_header_a_out_h=no ac_cv_header_pwd_h=no ac_cv_header_utime_h=no @@ -576,6 +572,7 @@ AC_DEFUN(RUBY_CHECK_IO_NEED, char *fn = "conftest.dat"; char *wombat = "wombat\n"; char *koara = "koara\n"; +char *kangaroo = "kangaroo\n"; int main() { @@ -589,32 +586,36 @@ int main() if (!fgets(buf, BUFSIZ, f) || strcmp(buf, wombat)) goto fail; reset_rw(f); fputs(koara, f); + fputs(kangaroo, f); do_seek(f, SEEK_SET); if (!fgets(buf, BUFSIZ, f) || strcmp(buf, wombat)) goto fail; if (!fgets(buf, BUFSIZ, f) || strcmp(buf, koara)) goto fail; + if (!fgets(buf, BUFSIZ, f) || strcmp(buf, kangaroo)) goto fail; + do_seek(f, SEEK_SET); + if (!fgets(buf, BUFSIZ, f) || strcmp(buf, wombat)) goto fail; + reset_rw(f); + fputc('X', f); + reset_rw(f); + if (!fgets(buf, BUFSIZ, f) || strcmp(buf, koara+1)) goto fail; + if (!fgets(buf, BUFSIZ, f) || strcmp(buf, kangaroo)) goto fail; + do_seek(f, SEEK_SET); + if (!fgets(buf, BUFSIZ, f) || strcmp(buf, wombat)) goto fail; + if (!fgets(buf, BUFSIZ, f) || buf[0] != 'X' || strcmp(buf+1, koara+1)) goto fail; + if (!fgets(buf, BUFSIZ, f) || strcmp(buf, kangaroo)) goto fail; r = 0; fail: fclose(f); unlink(fn); return r; } -], [$2]=no, [$2]=yes, [$2]=yes)])]) -RUBY_CHECK_IO_NEED(seek between R/W, rb_cv_need_io_seek_between_rw) -RUBY_CHECK_IO_NEED(flush before seek, rb_cv_need_io_flush_before_seek) -check_to_do_something_else=no +], [$2]=no, [$2]=yes, [$2]=[$3])])]) +RUBY_CHECK_IO_NEED(seek between R/W, rb_cv_need_io_seek_between_rw, yes) if test "$rb_cv_need_io_seek_between_rw" = yes; then AC_DEFINE(NEED_IO_SEEK_BETWEEN_RW, 1) - check_to_do_something_else=yes fi +RUBY_CHECK_IO_NEED(flush before seek, rb_cv_need_io_flush_before_seek, no) if test "$rb_cv_need_io_flush_before_seek" = yes; then AC_DEFINE(NEED_IO_FLUSH_BEFORE_SEEK, 1) - check_to_do_something_else=yes -fi -if test "$cross_compiling" = no -a "$check_to_do_something_else" = yes; then - RUBY_CHECK_IO_NEED(do something else, unexpected_stdio_behavior) - if test "$unexpected_stdio_behavior" = yes; then - AC_MSG_ERROR([unexpected stdio behavior]) - fi fi dnl default value for $KANJI diff --git a/io.c b/io.c index 4ac72c9af3..737776d915 100644 --- a/io.c +++ b/io.c @@ -213,6 +213,8 @@ flush_before_seek(fptr) # define SEEK_END 2 #endif +#define FMODE_SYNCWRITE (FMODE_SYNC|FMODE_WRITABLE) + void rb_io_check_readable(fptr) OpenFile *fptr; @@ -221,7 +223,9 @@ rb_io_check_readable(fptr) rb_raise(rb_eIOError, "not opened for reading"); } #if NEED_IO_SEEK_BETWEEN_RW - if ((fptr->mode & FMODE_WBUF) && !fptr->f2) { + if (((fptr->mode & FMODE_WBUF) || + (fptr->mode & (FMODE_SYNCWRITE|FMODE_RBUF)) == FMODE_SYNCWRITE) && + !fptr->f2) { io_seek(fptr, 0, SEEK_CUR); } fptr->mode |= FMODE_RBUF;