[PATCH] sync: support the -d and -f flags and take files as arguments
Denys Vlasenko
vda.linux at googlemail.com
Tue Jul 21 17:52:04 UTC 2015
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 <ari at tuxera.com> wrote:
> 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
>
>
>
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
More information about the busybox
mailing list