[PATCH] sync: support the -d and -f flags and take files as arguments
Ari Sundholm
ari at tuxera.com
Mon Jul 20 16:55:55 UTC 2015
From: Ari Sundholm <ari at tuxera.com>
This brings busybox in line with modern coreutils sync.
function old new delta
sync_main 19 214 +195
.rodata 155261 155373 +112
packed_usage 30228 30270 +42
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 349/0) Total: 349 bytes
Signed-off-by: Ari Sundholm <ari at tuxera.com>
---
coreutils/Config.src | 6 ----
coreutils/sync.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++----
2 files changed, 81 insertions(+), 12 deletions(-)
diff --git a/coreutils/Config.src b/coreutils/Config.src
index 1ec3a0a..02155d2 100644
--- a/coreutils/Config.src
+++ b/coreutils/Config.src
@@ -571,12 +571,6 @@ config SUM
help
checksum and count the blocks in a file
-config SYNC
- bool "sync"
- default y
- help
- sync is used to flush filesystem buffers.
-
config TAC
bool "tac"
default y
diff --git a/coreutils/sync.c b/coreutils/sync.c
index 7d98a1e..c5fdc5e 100644
--- a/coreutils/sync.c
+++ b/coreutils/sync.c
@@ -3,16 +3,40 @@
* Mini sync implementation for busybox
*
* Copyright (C) 1995, 1996 by Bruce Perens <bruce at pixar.com>.
+ * Copyright (C) 2015 by Ari Sundholm <ari at tuxera.com>
*
* Licensed under GPLv2 or later, see file LICENSE in this source tree.
*/
/* BB_AUDIT SUSv3 N/A -- Matches GNU behavior. */
+//config:config SYNC
+//config: bool "sync"
+//config: default y
+//config: help
+//config: sync is used to flush filesystem buffers.
+//config:config FEATURE_SYNC_SYNCFS
+//config: bool "Enable the use of syncfs(2)"
+//config: default y
+//config: depends on SYNC
+//config: help
+//config: Enables the sync applet to use syncfs(2) to offer the additional
+//config: -f flag, which allows for synchronizing the filesystems underlying
+//config: a set of files.
//usage:#define sync_trivial_usage
-//usage: ""
+//usage: "[-d"
+//usage: IF_FEATURE_SYNC_SYNCFS(
+//usage: "|-f"
+//usage: )
+//usage: "] [FILE ...]"
//usage:#define sync_full_usage "\n\n"
-//usage: "Write all buffered blocks to disk"
+//usage: "Write all buffered blocks in FILEs or all filesystems to disk"
+//usage: "\n -d Avoid syncing metadata"
+//usage: IF_FEATURE_SYNC_SYNCFS(
+//usage: "\n -f Sync underlying filesystem"
+//usage: )
+//usage:
+
#include "libbb.h"
@@ -21,10 +45,61 @@
int sync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
{
- /* coreutils-6.9 compat */
- bb_warn_ignoring_args(argv[1]);
+ unsigned opts;
+ int ret = EXIT_SUCCESS;
+
+ enum {
+ OPT_DATASYNC = (1 << 0),
+#if ENABLE_FEATURE_SYNC_SYNCFS
+ OPT_SYNCFS = (1 << 1),
+#endif
+ };
+
+ opt_complementary =
+#if ENABLE_FEATURE_SYNC_SYNCFS
+ "d--f:f--d:d--d:f--f";
+#else
+ "d--d";
+#endif
+ opts = getopt32(argv,
+ "d"
+#if ENABLE_FEATURE_SYNC_SYNCFS
+ "f"
+#endif
+ );
+
+ argv += optind;
+
+ /* Handle the no-argument case. */
+ if (!*argv && !(opts & OPT_DATASYNC)
+#if ENABLE_FEATURE_SYNC_SYNCFS
+ && !(opts & OPT_SYNCFS)
+#endif
+ )
+ sync();
+
+ while (*argv) {
+ int fd = open(*argv, O_RDONLY);
- sync();
+ if (fd < 0) {
+ bb_perror_msg("%s: open", *argv);
+ ret = EXIT_FAILURE;
+ } else {
+ if (opts & OPT_DATASYNC && fdatasync(fd) < 0) {
+ bb_perror_msg("%s: fdatasync", *argv);
+ ret = EXIT_FAILURE;
+#if ENABLE_FEATURE_SYNC_SYNCFS
+ } else if (opts & OPT_SYNCFS && syncfs(fd) < 0) {
+ bb_perror_msg("%s: syncfs", *argv);
+ ret = EXIT_FAILURE;
+#endif
+ } else if (fsync(fd) < 0) {
+ bb_perror_msg("%s: fsync", *argv);
+ ret = EXIT_FAILURE;
+ }
+ }
+ ++argv;
+ }
- return EXIT_SUCCESS;
+ return ret;
}
--
1.9.1
More information about the busybox
mailing list