aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2021-06-07 16:18:56 +0100
committerRon Yorston <rmy@pobox.com>2021-06-07 16:18:56 +0100
commitcfac1da2aaccaf45a669b0a53c82a32c8231827c (patch)
tree89a19cd3d661d0234e07b55ce7f7718559cc7ad8
parentabe872e2a0342357a5608342cb2892e94027b3e7 (diff)
downloadbusybox-w32-cfac1da2aaccaf45a669b0a53c82a32c8231827c.tar.gz
busybox-w32-cfac1da2aaccaf45a669b0a53c82a32c8231827c.tar.bz2
busybox-w32-cfac1da2aaccaf45a669b0a53c82a32c8231827c.zip
win32: partial implementation of sync(2)
Provide a partial implementation of sync(2), so sync(1) can actually do something in some circumstances: - Only logical drives are handled. - Flushing buffers requires administrative privileges. If run as a normal user nothing will happen.
-rw-r--r--include/mingw.h3
-rw-r--r--win32/mingw.c23
2 files changed, 25 insertions, 1 deletions
diff --git a/include/mingw.h b/include/mingw.h
index 49e792b69..c4849215b 100644
--- a/include/mingw.h
+++ b/include/mingw.h
@@ -471,7 +471,6 @@ NOIMPL(setuid,uid_t gid UNUSED_PARAM);
471NOIMPL(seteuid,uid_t gid UNUSED_PARAM); 471NOIMPL(seteuid,uid_t gid UNUSED_PARAM);
472unsigned int sleep(unsigned int seconds); 472unsigned int sleep(unsigned int seconds);
473int symlink(const char *target, const char *linkpath); 473int symlink(const char *target, const char *linkpath);
474static inline void sync(void) { sleep(2); }
475long sysconf(int name); 474long sysconf(int name);
476IMPL(getpagesize,int,4096,void); 475IMPL(getpagesize,int,4096,void);
477NOIMPL(ttyname_r,int fd UNUSED_PARAM, char *buf UNUSED_PARAM, int sz UNUSED_PARAM); 476NOIMPL(ttyname_r,int fd UNUSED_PARAM, char *buf UNUSED_PARAM, int sz UNUSED_PARAM);
@@ -479,6 +478,7 @@ int mingw_unlink(const char *pathname);
479pid_t vfork(void); 478pid_t vfork(void);
480int mingw_access(const char *name, int mode); 479int mingw_access(const char *name, int mode);
481int mingw_rmdir(const char *name); 480int mingw_rmdir(const char *name);
481void mingw_sync(void);
482int mingw_isatty(int fd); 482int mingw_isatty(int fd);
483 483
484#define dup2 mingw_dup2 484#define dup2 mingw_dup2
@@ -488,6 +488,7 @@ int mingw_isatty(int fd);
488#define close mingw_close 488#define close mingw_close
489#define unlink mingw_unlink 489#define unlink mingw_unlink
490#define rmdir mingw_rmdir 490#define rmdir mingw_rmdir
491#define sync mingw_sync
491#undef lseek 492#undef lseek
492#define lseek mingw_lseek 493#define lseek mingw_lseek
493 494
diff --git a/win32/mingw.c b/win32/mingw.c
index 3183cd78e..a65a0a6d1 100644
--- a/win32/mingw.c
+++ b/win32/mingw.c
@@ -1666,6 +1666,29 @@ int mingw_rmdir(const char *path)
1666 return rmdir(path); 1666 return rmdir(path);
1667} 1667}
1668 1668
1669void mingw_sync(void)
1670{
1671 HANDLE h;
1672 FILE *mnt;
1673 struct mntent *entry;
1674 char name[] = "\\\\.\\C:";
1675
1676 mnt = setmntent(bb_path_mtab_file, "r");
1677 if (mnt) {
1678 while ((entry=getmntent(mnt)) != NULL) {
1679 name[4] = entry->mnt_dir[0];
1680 h = CreateFile(name, GENERIC_READ | GENERIC_WRITE,
1681 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
1682 OPEN_EXISTING, 0, NULL);
1683 if (h != INVALID_HANDLE_VALUE) {
1684 FlushFileBuffers(h);
1685 CloseHandle(h);
1686 }
1687 }
1688 endmntent(mnt);
1689 }
1690}
1691
1669#define NUMEXT 5 1692#define NUMEXT 5
1670static const char win_suffix[NUMEXT][4] = { "sh", "com", "exe", "bat", "cmd" }; 1693static const char win_suffix[NUMEXT][4] = { "sh", "com", "exe", "bat", "cmd" };
1671 1694