Issue #4500 has been updated by Motohiro KOSAKI.

Status changed from Open to Assigned
Assignee set to Motohiro KOSAKI

To be honest, I'm not sure Apple's system function support policy. But I'm sure your suggestions were right in past. Then, I'll commit this proposal as is.

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

Author: Benoit Daloze
Status: Assigned
Priority: Normal
Assignee: Motohiro KOSAKI
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