diff options
author | Ron Yorston <rmy@pobox.com> | 2018-02-21 09:58:22 +0000 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2018-02-21 09:58:22 +0000 |
commit | 5b5cb69bf3e16e4170d4206621682a12d441c87f (patch) | |
tree | e17c977154aa2e0a54dd1acef5c8d6a8ada72624 | |
parent | a1401e340043ac2829757be5c5f546d0ce7eadc7 (diff) | |
download | busybox-w32-5b5cb69bf3e16e4170d4206621682a12d441c87f.tar.gz busybox-w32-5b5cb69bf3e16e4170d4206621682a12d441c87f.tar.bz2 busybox-w32-5b5cb69bf3e16e4170d4206621682a12d441c87f.zip |
win32: import fsync(2) implementation from gnulib
-rw-r--r-- | include/mingw.h | 2 | ||||
-rw-r--r-- | include/platform.h | 1 | ||||
-rw-r--r-- | win32/Kbuild | 1 | ||||
-rw-r--r-- | win32/fsync.c | 75 |
4 files changed, 78 insertions, 1 deletions
diff --git a/include/mingw.h b/include/mingw.h index 6f69913d6..a59ce6fc4 100644 --- a/include/mingw.h +++ b/include/mingw.h | |||
@@ -390,7 +390,7 @@ NOIMPL(getsid,pid_t pid UNUSED_PARAM); | |||
390 | IMPL(getuid,int,DEFAULT_UID,void); | 390 | IMPL(getuid,int,DEFAULT_UID,void); |
391 | int getlogin_r(char *buf, size_t len); | 391 | int getlogin_r(char *buf, size_t len); |
392 | int fcntl(int fd, int cmd, ...); | 392 | int fcntl(int fd, int cmd, ...); |
393 | IMPL(fsync,int,0,int fd UNUSED_PARAM); | 393 | int fsync(int fd); |
394 | int kill(pid_t pid, int sig); | 394 | int kill(pid_t pid, int sig); |
395 | int link(const char *oldpath, const char *newpath); | 395 | int link(const char *oldpath, const char *newpath); |
396 | NOIMPL(mknod,const char *name UNUSED_PARAM, mode_t mode UNUSED_PARAM, dev_t device UNUSED_PARAM); | 396 | NOIMPL(mknod,const char *name UNUSED_PARAM, mode_t mode UNUSED_PARAM, dev_t device UNUSED_PARAM); |
diff --git a/include/platform.h b/include/platform.h index cc22f4fc9..ee13e1b1e 100644 --- a/include/platform.h +++ b/include/platform.h | |||
@@ -442,6 +442,7 @@ typedef unsigned smalluint; | |||
442 | #endif | 442 | #endif |
443 | 443 | ||
444 | #if ENABLE_PLATFORM_MINGW32 | 444 | #if ENABLE_PLATFORM_MINGW32 |
445 | # undef HAVE_FDATASYNC | ||
445 | # undef HAVE_DPRINTF | 446 | # undef HAVE_DPRINTF |
446 | # undef HAVE_GETLINE | 447 | # undef HAVE_GETLINE |
447 | # undef HAVE_MEMRCHR | 448 | # undef HAVE_MEMRCHR |
diff --git a/win32/Kbuild b/win32/Kbuild index b2b43b290..8248c994f 100644 --- a/win32/Kbuild +++ b/win32/Kbuild | |||
@@ -6,6 +6,7 @@ lib-y:= | |||
6 | 6 | ||
7 | lib-$(CONFIG_PLATFORM_MINGW32) += env.o | 7 | lib-$(CONFIG_PLATFORM_MINGW32) += env.o |
8 | lib-$(CONFIG_PLATFORM_MINGW32) += fnmatch.o | 8 | lib-$(CONFIG_PLATFORM_MINGW32) += fnmatch.o |
9 | lib-$(CONFIG_PLATFORM_MINGW32) += fsync.o | ||
9 | lib-$(CONFIG_PLATFORM_MINGW32) += ioctl.o | 10 | lib-$(CONFIG_PLATFORM_MINGW32) += ioctl.o |
10 | lib-$(CONFIG_PLATFORM_MINGW32) += mingw.o | 11 | lib-$(CONFIG_PLATFORM_MINGW32) += mingw.o |
11 | lib-$(CONFIG_PLATFORM_MINGW32) += process.o | 12 | lib-$(CONFIG_PLATFORM_MINGW32) += process.o |
diff --git a/win32/fsync.c b/win32/fsync.c new file mode 100644 index 000000000..6ab44d434 --- /dev/null +++ b/win32/fsync.c | |||
@@ -0,0 +1,75 @@ | |||
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 | https://www.sqlite.org/src/finfo?name=src/os_win.c | ||
6 | https://www.sqlite.org/copyright.html | ||
7 | |||
8 | Written by Richard W.M. Jones <rjones.at.redhat.com> | ||
9 | |||
10 | Copyright (C) 2008-2018 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 Lesser General Public | ||
14 | License as published by the Free Software Foundation; either | ||
15 | version 2.1 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 | Lesser 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 <https://www.gnu.org/licenses/>. */ | ||
24 | |||
25 | #include "libbb.h" | ||
26 | #include <unistd.h> | ||
27 | |||
28 | /* FlushFileBuffers */ | ||
29 | # define WIN32_LEAN_AND_MEAN | ||
30 | # include <windows.h> | ||
31 | |||
32 | # include <errno.h> | ||
33 | |||
34 | /* Get _get_osfhandle. */ | ||
35 | # include <io.h> | ||
36 | |||
37 | int | ||
38 | fsync (int fd) | ||
39 | { | ||
40 | HANDLE h = (HANDLE) _get_osfhandle (fd); | ||
41 | DWORD err; | ||
42 | |||
43 | if (h == INVALID_HANDLE_VALUE) | ||
44 | { | ||
45 | errno = EBADF; | ||
46 | return -1; | ||
47 | } | ||
48 | |||
49 | if (!FlushFileBuffers (h)) | ||
50 | { | ||
51 | /* Translate some Windows errors into rough approximations of Unix | ||
52 | * errors. MSDN is useless as usual - in this case it doesn't | ||
53 | * document the full range of errors. | ||
54 | */ | ||
55 | err = GetLastError (); | ||
56 | switch (err) | ||
57 | { | ||
58 | case ERROR_ACCESS_DENIED: | ||
59 | /* For a read-only handle, fsync should succeed, even though we have | ||
60 | no way to sync the access-time changes. */ | ||
61 | return 0; | ||
62 | |||
63 | /* eg. Trying to fsync a tty. */ | ||
64 | case ERROR_INVALID_HANDLE: | ||
65 | errno = EINVAL; | ||
66 | break; | ||
67 | |||
68 | default: | ||
69 | errno = EIO; | ||
70 | } | ||
71 | return -1; | ||
72 | } | ||
73 | |||
74 | return 0; | ||
75 | } | ||