diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2008-10-01 13:54:44 +0100 |
---|---|---|
committer | Jim Meyering <meyering@redhat.com> | 2008-10-02 08:44:44 +0200 |
commit | 9d7e96c82c2a70aa5a32d07b76cdd94f0f0e4388 (patch) | |
tree | d04f7fdfcd16d4750af1f919b80232a466912ddb /lib/fsync.c | |
parent | 2e8e1818ae1146febd313585a8d767c3892dae03 (diff) | |
download | gnulib-9d7e96c82c2a70aa5a32d07b76cdd94f0f0e4388.tar.gz |
fsync: new module
* lib/fsync.c: New file.
* m4/fsync.m4: New file.
* modules/fsync: New file.
* modules/fsync-tests: New file.
* tests/test-fsync.c: New file.
* modules/unistd: Substitute GNULIB_FSYNC and HAVE_FSYNC.
* m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Define and AC_SUBST
both GNULIB_FSYNC and HAVE_FSYNC.
* lib/unistd.in.h (@GNULIB_FSYNC@): Add a block for fsync.
* MODULES.html.sh (posix_functions): Add fsync.
* doc/posix-functions/fsync.texi: Update.
Diffstat (limited to 'lib/fsync.c')
-rw-r--r-- | lib/fsync.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/lib/fsync.c b/lib/fsync.c new file mode 100644 index 0000000000..4a0fe0f94c --- /dev/null +++ b/lib/fsync.c @@ -0,0 +1,78 @@ +/* Emulate fsync on platforms that lack it, primarily Windows and + cross-compilers like MinGW. + + This is derived from sqlite3 sources. + http://www.sqlite.org/cvstrac/rlog?f=sqlite/src/os_win.c + http://www.sqlite.org/copyright.html + + Written by Richard W.M. Jones <rjones.at.redhat.com> + + Copyright (C) 2008 Free Software Foundation, Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include <unistd.h> + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +/* _get_osfhandle */ +#include <io.h> + +/* FlushFileBuffers */ +#define WIN32_LEAN_AND_MEAN +#include <windows.h> + +#include <errno.h> + +int +fsync (int fd) +{ + HANDLE h = (HANDLE) _get_osfhandle (fd); + DWORD err; + + if (h == INVALID_HANDLE_VALUE) + { + errno = EBADF; + return -1; + } + + if (!FlushFileBuffers (h)) + { + /* Translate some Windows errors into rough approximations of Unix + * errors. MSDN is useless as usual - in this case it doesn't + * document the full range of errors. + */ + err = GetLastError (); + switch (err) + { + /* eg. Trying to fsync a tty. */ + case ERROR_INVALID_HANDLE: + errno = EINVAL; + break; + + default: + errno = EIO; + } + return -1; + } + + return 0; +} + +#else /* !Windows */ + +#error "This platform lacks fsync function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib." + +#endif /* !Windows */ |