fsync,sync: merge into one source module
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 2 Apr 2019 12:54:56 +0000 (14:54 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 2 Apr 2019 12:55:29 +0000 (14:55 +0200)
With FEATURE_SYNC_FANCY not set:

function                                             old     new   delta
fsync_main                                           130     123      -7

With FEATURE_SYNC_FANCY set, should be much larger code size savings.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/fsync.c [deleted file]
coreutils/sync.c

diff --git a/coreutils/fsync.c b/coreutils/fsync.c
deleted file mode 100644 (file)
index 216cbcf..0000000
+++ /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;
-}
index e60e553a34dee15bdb0dfd6a6374cbb5f7d5f028..ea328a54c5141e3c44ad482bcf109a2684b99701 100644 (file)
 
 /* 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