From: Benoit Daloze <redmine@...>
Date: 2011-03-14T04:21:45+09:00
Subject: [ruby-core:35493] [Ruby 1.9 - Bug #4500][Open] warning: implicit declaration of function 'fdatasync' for OS X


Issue #4500 has been reported by Benoit Daloze.

----------------------------------------
Bug #4500: warning: implicit declaration of function 'fdatasync' for OS X
http://redmine.ruby-lang.org/issues/4500

Author: Benoit Daloze
Status: Open
Priority: Normal
Assignee: 
Category: build
Target version: 1.9.x
ruby -v: ruby 1.9.3dev (2011-03-01 trunk 31001) [x86_64-darwin10.6.0]


While compiling ruby, this warning appears on OS X:

compiling io.c
io.c: In function 'rb_io_fdatasync':
io.c:1433: warning: implicit declaration of function 'fdatasync'

This is a regression caused by the revert (r30821) of r30725: configure.in: Mac OS X wrongly reports it has fdatasync(3).

While fdatasync is defined, there is no header for it.
Apparently, it works as expected:

 fh = File.open('test.txt', 'w')
 fh.write('DATA')
 fh.fdatasync # if this line is commented, nothing is written to the file
 exit!

But I think we should not trust functions without prototype.
So I propose the following patch, which also document the behavior of IO#fdatasync accordingly to r30762.

 diff --git a/configure.in b/configure.in
 index 01e59f9..8a4e97e 100644
 --- a/configure.in
 +++ b/configure.in
 @@ -940,6 +940,7 @@ AS_CASE(["$target_os"],
  		fi
  		ac_cv_type_getgroups=gid_t # getgroups() on Rosetta fills garbage
  		ac_cv_lib_crypt_crypt=no
 +		ac_cv_func_fdatasync=no # Mac OS X wrongly reports it has fdatasync()
                  AC_CACHE_CHECK(for broken crypt with 8bit chars, rb_cv_broken_crypt,
                      [AC_TRY_RUN([
  #include <stdio.h>
 diff --git a/io.c b/io.c
 index 064d1a2..e5241b3 100644
 --- a/io.c
 +++ b/io.c
 @@ -1414,8 +1414,8 @@ rb_io_fsync(VALUE io)
   *
   *  Immediately writes all buffered data in <em>ios</em> to disk.
   *
 - *  <code>NotImplementedError</code> is raised
 - *  if the underlying operating system does not support <em>fdatasync(2)</em>.
 + *  If the underlying operating system does not support <em>fdatasync(2)</em>,
 + *  <code>IO#fsync</code> is called instead (which might raise a <code>NotImplementedError</code>).
   */
  
  static VALUE



-- 
http://redmine.ruby-lang.org