Commit | Line | Data |
---|---|---|
47d7532e PE |
1 | /* Emulate fsync on platforms that lack it, primarily Windows and |
2 | cross-compilers like MinGW. | |
3 | ||
4 | This is derived from sqlite3 sources. | |
5 | http://www.sqlite.org/cvstrac/rlog?f=sqlite/src/os_win.c | |
6 | http://www.sqlite.org/copyright.html | |
7 | ||
8 | Written by Richard W.M. Jones <rjones.at.redhat.com> | |
9 | ||
10 | Copyright (C) 2008-2013 Free Software Foundation, Inc. | |
11 | ||
12 | This library is free software; you can redistribute it and/or | |
13 | modify it under the terms of the GNU General Public | |
14 | License as published by the Free Software Foundation; either | |
15 | version 3 of the License, or (at your option) any later version. | |
16 | ||
17 | This library is distributed in the hope that it will be useful, | |
18 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
20 | General Public License for more details. | |
21 | ||
22 | You should have received a copy of the GNU General Public License | |
23 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
24 | ||
25 | #include <config.h> | |
26 | #include <unistd.h> | |
27 | ||
28 | #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | |
29 | ||
30 | /* FlushFileBuffers */ | |
31 | # define WIN32_LEAN_AND_MEAN | |
32 | # include <windows.h> | |
33 | ||
34 | # include <errno.h> | |
35 | ||
36 | /* Get _get_osfhandle. */ | |
37 | # include "msvc-nothrow.h" | |
38 | ||
39 | int | |
40 | fsync (int fd) | |
41 | { | |
42 | HANDLE h = (HANDLE) _get_osfhandle (fd); | |
43 | DWORD err; | |
44 | ||
45 | if (h == INVALID_HANDLE_VALUE) | |
46 | { | |
47 | errno = EBADF; | |
48 | return -1; | |
49 | } | |
50 | ||
51 | if (!FlushFileBuffers (h)) | |
52 | { | |
53 | /* Translate some Windows errors into rough approximations of Unix | |
54 | * errors. MSDN is useless as usual - in this case it doesn't | |
55 | * document the full range of errors. | |
56 | */ | |
57 | err = GetLastError (); | |
58 | switch (err) | |
59 | { | |
60 | case ERROR_ACCESS_DENIED: | |
61 | /* For a read-only handle, fsync should succeed, even though we have | |
62 | no way to sync the access-time changes. */ | |
63 | return 0; | |
64 | ||
65 | /* eg. Trying to fsync a tty. */ | |
66 | case ERROR_INVALID_HANDLE: | |
67 | errno = EINVAL; | |
68 | break; | |
69 | ||
70 | default: | |
71 | errno = EIO; | |
72 | } | |
73 | return -1; | |
74 | } | |
75 | ||
76 | return 0; | |
77 | } | |
78 | ||
79 | #else /* !Windows */ | |
80 | ||
81 | # error "This platform lacks fsync function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib." | |
82 | ||
83 | #endif /* !Windows */ |