Bug #4500
closedwarning: implicit declaration of function 'fdatasync' for OS X
Description
=begin
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 ios to disk.
-
-
NotImplementedError
is raised
-
-
- if the underlying operating system does not support fdatasync(2).
-
- If the underlying operating system does not support fdatasync(2),
-
-
IO#fsync
is called instead (which might raise aNotImplementedError
).
*/
-
static VALUE
=end
Updated by kosaki (Motohiro KOSAKI) over 13 years ago
- Status changed from Open to Assigned
- Assignee set to kosaki (Motohiro KOSAKI)
=begin
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.
=end
Updated by kosaki (Motohiro KOSAKI) over 13 years ago
- Status changed from Assigned to Closed
=begin
=end