diff options
author | Denys Vlasenko | 2015-07-21 19:50:48 +0200 |
---|---|---|
committer | Denys Vlasenko | 2015-07-21 19:50:48 +0200 |
commit | 35ae2ccb40924efcd0fd0c873cc9e56c58851222 (patch) | |
tree | 75f32dc79e063940ee1ea59a9d8cb1a215f1959e /coreutils | |
parent | ce193f809b32368796a3aacf2ac8ba277f4c102a (diff) | |
download | busybox-35ae2ccb40924efcd0fd0c873cc9e56c58851222.zip busybox-35ae2ccb40924efcd0fd0c873cc9e56c58851222.tar.gz |
sync: add support for -d -f FILE
Based on the patch by Ari Sundholm <ari@tuxera.com>
function old new delta
sync_main 20 163 +143
packed_usage 30653 30673 +20
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 163/0) Total: 163 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/Config.src | 6 | ||||
-rw-r--r-- | coreutils/Kbuild.src | 1 | ||||
-rw-r--r-- | coreutils/sync.c | 78 |
3 files changed, 75 insertions, 10 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/Kbuild.src b/coreutils/Kbuild.src index ec4ef7d..4ec075a 100644 --- a/coreutils/Kbuild.src +++ b/coreutils/Kbuild.src @@ -68,7 +68,6 @@ lib-$(CONFIG_SORT) += sort.o lib-$(CONFIG_STAT) += stat.o lib-$(CONFIG_STTY) += stty.o lib-$(CONFIG_SUM) += sum.o -lib-$(CONFIG_SYNC) += sync.o lib-$(CONFIG_TAC) += tac.o lib-$(CONFIG_TEE) += tee.o lib-$(CONFIG_TRUE) += true.o diff --git a/coreutils/sync.c b/coreutils/sync.c index 7d98a1e..974e904 100644 --- a/coreutils/sync.c +++ b/coreutils/sync.c @@ -3,16 +3,39 @@ * Mini sync implementation for busybox * * Copyright (C) 1995, 1996 by Bruce Perens <bruce@pixar.com>. + * Copyright (C) 2015 by Ari Sundholm <ari@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_FANCY +//config: bool "Enable -d and -f flags (requres syncfs(2) in libc)" +//config: default y +//config: depends on SYNC +//config: help +//config: sync -d FILE... executes fdatasync() on each FILE. +//config: sync -f FILE... executes syncfs() on each FILE. + +//kbuild:lib-$(CONFIG_SYNC) += sync.o +//applet:IF_SYNC(APPLET_NOFORK(sync, sync, BB_DIR_BIN, BB_SUID_DROP, sync)) //usage:#define sync_trivial_usage -//usage: "" +//usage: ""IF_FEATURE_SYNC_FANCY("[-df] [FILE]...") //usage:#define sync_full_usage "\n\n" +//usage: IF_NOT_FEATURE_SYNC_FANCY( //usage: "Write all buffered blocks to disk" +//usage: ) +//usage: IF_FEATURE_SYNC_FANCY( +//usage: "Write all buffered blocks (in FILEs) to disk" +//usage: "\n -d Avoid syncing metadata" +//usage: "\n -f Sync filesystems underlying FILEs" +//usage: ) #include "libbb.h" @@ -21,10 +44,59 @@ 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; + int ret = EXIT_SUCCESS; + + enum { + OPT_DATASYNC = (1 << 0), + OPT_SYNCFS = (1 << 1), + }; + + opt_complementary = "d--f:f--d"; + opts = getopt32(argv, "df"); + argv += optind; + + /* Handle the no-argument case. */ + if (!argv[0]) + sync(); + + while (*argv) { + int fd = open_or_warn(*argv, O_RDONLY); + + if (fd < 0) { + ret = EXIT_FAILURE; + goto next; + } + if (opts & OPT_DATASYNC) { + if (fdatasync(fd)) + goto err; + goto do_close; + } + if (opts & OPT_SYNCFS) { + /* + * syncfs is documented to only fail with EBADF, + * which can't happen here. So, no error checks. + */ + syncfs(fd); + goto do_close; + } + if (fsync(fd)) { + err: + bb_simple_perror_msg(*argv); + ret = EXIT_FAILURE; + } + do_close: + close(fd); + next: + ++argv; + } + + return ret; +#endif } |