aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coreutils/fsync.c62
-rw-r--r--coreutils/sync.c80
2 files changed, 61 insertions, 81 deletions
diff --git a/coreutils/fsync.c b/coreutils/fsync.c
deleted file mode 100644
index 216cbcf41..000000000
--- a/coreutils/fsync.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * 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) += fsync.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"
-
-#include "libbb.h"
-
-/* This is a NOFORK applet. Be very careful! */
-
-int fsync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int fsync_main(int argc UNUSED_PARAM, char **argv)
-{
- int ret;
- int opts;
-
- opts = getopt32(argv, "d"); /* fdatasync */
- argv += optind;
- if (!*argv) {
- bb_show_usage();
- }
-
- ret = EXIT_SUCCESS;
- 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 */
-
- if (fd < 0) {
- ret = EXIT_FAILURE;
- goto next;
- }
- if ((opts ? fdatasync(fd) : fsync(fd)) != 0) {
- bb_simple_perror_msg(*argv);
- ret = EXIT_FAILURE;
- }
- close(fd);
- next:
- argv++;
- } while (*argv);
-
- return ret;
-}
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