aboutsummaryrefslogtreecommitdiff
path: root/coreutils/sync.c
diff options
context:
space:
mode:
Diffstat (limited to 'coreutils/sync.c')
-rw-r--r--coreutils/sync.c80
1 files changed, 61 insertions, 19 deletions
diff --git a/coreutils/sync.c b/coreutils/sync.c
index e60e553a3..ea328a54c 100644
--- a/coreutils/sync.c
+++ b/coreutils/sync.c
@@ -43,32 +43,17 @@
/* This is a NOFORK applet. Be very careful! */
-int sync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
+#if ENABLE_FEATURE_SYNC_FANCY || ENABLE_FSYNC
+static int sync_common(int opts, char **argv)
{
-#if !ENABLE_FEATURE_SYNC_FANCY
- /* coreutils-6.9 compat */
- bb_warn_ignoring_args(argv[1]);
- sync();
- return EXIT_SUCCESS;
-#else
- unsigned opts;
int ret;
-
enum {
OPT_DATASYNC = (1 << 0),
OPT_SYNCFS = (1 << 1),
};
- opts = getopt32(argv, "^" "df" "\0" "d--f:f--d");
- argv += optind;
-
- /* Handle the no-argument case. */
- if (!argv[0])
- sync();
-
ret = EXIT_SUCCESS;
- while (*argv) {
+ do {
/* GNU "sync FILE" uses O_NONBLOCK open */
int fd = open_or_warn(*argv, /*O_NOATIME |*/ O_NOCTTY | O_RDONLY | O_NONBLOCK);
/* open(NOATIME) can only be used by owner or root, don't use NOATIME here */
@@ -77,6 +62,7 @@ int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
ret = EXIT_FAILURE;
goto next;
}
+# if ENABLE_FEATURE_SYNC_FANCY
if (opts & OPT_SYNCFS) {
/*
* syncfs is documented to only fail with EBADF,
@@ -84,6 +70,7 @@ int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
*/
syncfs(fd);
} else
+# endif
if (((opts & OPT_DATASYNC) ? fdatasync(fd) : fsync(fd)) != 0) {
bb_simple_perror_msg(*argv);
ret = EXIT_FAILURE;
@@ -91,8 +78,63 @@ int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
close(fd);
next:
argv++;
- }
+ } while (*argv);
return ret;
+}
+#endif
+
+#if ENABLE_SYNC
+int sync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
+{
+# if !ENABLE_FEATURE_SYNC_FANCY
+ /* coreutils-6.9 compat */
+ bb_warn_ignoring_args(argv[1]);
+ sync();
+ return EXIT_SUCCESS;
+# else
+ unsigned opts = getopt32(argv, "^" "df" "\0" "d--f:f--d");
+ argv += optind;
+ if (!argv[0]) {
+ sync();
+ return EXIT_SUCCESS;
+ }
+ return sync_common(opts, argv);
+# endif
+}
#endif
+
+/*
+ * Mini fsync implementation for busybox
+ *
+ * Copyright (C) 2008 Nokia Corporation. All rights reserved.
+ *
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
+ */
+//config:config FSYNC
+//config: bool "fsync (3.6 kb)"
+//config: default y
+//config: help
+//config: fsync is used to flush file-related cached blocks to disk.
+
+// APPLET_NOFORK:name main location suid_type help
+//applet:IF_FSYNC(APPLET_NOFORK(fsync, fsync, BB_DIR_BIN, BB_SUID_DROP, fsync))
+
+//kbuild:lib-$(CONFIG_FSYNC) += sync.o
+
+//usage:#define fsync_trivial_usage
+//usage: "[-d] FILE..."
+//usage:#define fsync_full_usage "\n\n"
+//usage: "Write all buffered blocks in FILEs to disk\n"
+//usage: "\n -d Avoid syncing metadata"
+
+#if ENABLE_FSYNC
+int fsync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int fsync_main(int argc UNUSED_PARAM, char **argv)
+{
+ int opts = getopt32(argv, "^" "d" "\0" "-1"/*min 1 arg*/);
+ argv += optind;
+ return sync_common(opts, argv);
}
+#endif