I reworked it so that these additions are optional,
and applied the result.

Thanks!

On Mon, Jul 20, 2015 at 6:55 PM, Ari Sundholm <[email protected]> wrote:
> From: Ari Sundholm <[email protected]>
>
> 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 <[email protected]>
> ---
>  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 <[email protected]>.
> + * Copyright (C) 2015 by Ari Sundholm <[email protected]>
>   *
>   * 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
>
>
>
> _______________________________________________
> busybox mailing list
> [email protected]
> http://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to