[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