diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2015-07-21 19:50:48 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2015-07-21 19:50:48 +0200 |
| commit | 35ae2ccb40924efcd0fd0c873cc9e56c58851222 (patch) | |
| tree | 75f32dc79e063940ee1ea59a9d8cb1a215f1959e /coreutils | |
| parent | ce193f809b32368796a3aacf2ac8ba277f4c102a (diff) | |
| download | busybox-w32-35ae2ccb40924efcd0fd0c873cc9e56c58851222.tar.gz busybox-w32-35ae2ccb40924efcd0fd0c873cc9e56c58851222.tar.bz2 busybox-w32-35ae2ccb40924efcd0fd0c873cc9e56c58851222.zip | |
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 1ec3a0a99..02155d220 100644 --- a/coreutils/Config.src +++ b/coreutils/Config.src | |||
| @@ -571,12 +571,6 @@ config SUM | |||
| 571 | help | 571 | help |
| 572 | checksum and count the blocks in a file | 572 | checksum and count the blocks in a file |
| 573 | 573 | ||
| 574 | config SYNC | ||
| 575 | bool "sync" | ||
| 576 | default y | ||
| 577 | help | ||
| 578 | sync is used to flush filesystem buffers. | ||
| 579 | |||
| 580 | config TAC | 574 | config TAC |
| 581 | bool "tac" | 575 | bool "tac" |
| 582 | default y | 576 | default y |
diff --git a/coreutils/Kbuild.src b/coreutils/Kbuild.src index ec4ef7df2..4ec075ac6 100644 --- a/coreutils/Kbuild.src +++ b/coreutils/Kbuild.src | |||
| @@ -68,7 +68,6 @@ lib-$(CONFIG_SORT) += sort.o | |||
| 68 | lib-$(CONFIG_STAT) += stat.o | 68 | lib-$(CONFIG_STAT) += stat.o |
| 69 | lib-$(CONFIG_STTY) += stty.o | 69 | lib-$(CONFIG_STTY) += stty.o |
| 70 | lib-$(CONFIG_SUM) += sum.o | 70 | lib-$(CONFIG_SUM) += sum.o |
| 71 | lib-$(CONFIG_SYNC) += sync.o | ||
| 72 | lib-$(CONFIG_TAC) += tac.o | 71 | lib-$(CONFIG_TAC) += tac.o |
| 73 | lib-$(CONFIG_TEE) += tee.o | 72 | lib-$(CONFIG_TEE) += tee.o |
| 74 | lib-$(CONFIG_TRUE) += true.o | 73 | lib-$(CONFIG_TRUE) += true.o |
diff --git a/coreutils/sync.c b/coreutils/sync.c index 7d98a1e30..974e90452 100644 --- a/coreutils/sync.c +++ b/coreutils/sync.c | |||
| @@ -3,16 +3,39 @@ | |||
| 3 | * Mini sync implementation for busybox | 3 | * Mini sync implementation for busybox |
| 4 | * | 4 | * |
| 5 | * Copyright (C) 1995, 1996 by Bruce Perens <bruce@pixar.com>. | 5 | * Copyright (C) 1995, 1996 by Bruce Perens <bruce@pixar.com>. |
| 6 | * Copyright (C) 2015 by Ari Sundholm <ari@tuxera.com> | ||
| 6 | * | 7 | * |
| 7 | * Licensed under GPLv2 or later, see file LICENSE in this source tree. | 8 | * Licensed under GPLv2 or later, see file LICENSE in this source tree. |
| 8 | */ | 9 | */ |
| 9 | 10 | ||
| 10 | /* BB_AUDIT SUSv3 N/A -- Matches GNU behavior. */ | 11 | /* BB_AUDIT SUSv3 N/A -- Matches GNU behavior. */ |
| 12 | //config:config SYNC | ||
| 13 | //config: bool "sync" | ||
| 14 | //config: default y | ||
| 15 | //config: help | ||
| 16 | //config: sync is used to flush filesystem buffers. | ||
| 17 | //config:config FEATURE_SYNC_FANCY | ||
| 18 | //config: bool "Enable -d and -f flags (requres syncfs(2) in libc)" | ||
| 19 | //config: default y | ||
| 20 | //config: depends on SYNC | ||
| 21 | //config: help | ||
| 22 | //config: sync -d FILE... executes fdatasync() on each FILE. | ||
| 23 | //config: sync -f FILE... executes syncfs() on each FILE. | ||
| 24 | |||
| 25 | //kbuild:lib-$(CONFIG_SYNC) += sync.o | ||
| 26 | //applet:IF_SYNC(APPLET_NOFORK(sync, sync, BB_DIR_BIN, BB_SUID_DROP, sync)) | ||
| 11 | 27 | ||
| 12 | //usage:#define sync_trivial_usage | 28 | //usage:#define sync_trivial_usage |
| 13 | //usage: "" | 29 | //usage: ""IF_FEATURE_SYNC_FANCY("[-df] [FILE]...") |
| 14 | //usage:#define sync_full_usage "\n\n" | 30 | //usage:#define sync_full_usage "\n\n" |
| 31 | //usage: IF_NOT_FEATURE_SYNC_FANCY( | ||
| 15 | //usage: "Write all buffered blocks to disk" | 32 | //usage: "Write all buffered blocks to disk" |
| 33 | //usage: ) | ||
| 34 | //usage: IF_FEATURE_SYNC_FANCY( | ||
| 35 | //usage: "Write all buffered blocks (in FILEs) to disk" | ||
| 36 | //usage: "\n -d Avoid syncing metadata" | ||
| 37 | //usage: "\n -f Sync filesystems underlying FILEs" | ||
| 38 | //usage: ) | ||
| 16 | 39 | ||
| 17 | #include "libbb.h" | 40 | #include "libbb.h" |
| 18 | 41 | ||
| @@ -21,10 +44,59 @@ | |||
| 21 | int sync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 44 | int sync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 22 | int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM)) | 45 | int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM)) |
| 23 | { | 46 | { |
| 47 | #if !ENABLE_FEATURE_SYNC_FANCY | ||
| 24 | /* coreutils-6.9 compat */ | 48 | /* coreutils-6.9 compat */ |
| 25 | bb_warn_ignoring_args(argv[1]); | 49 | bb_warn_ignoring_args(argv[1]); |
| 26 | |||
| 27 | sync(); | 50 | sync(); |
| 28 | |||
| 29 | return EXIT_SUCCESS; | 51 | return EXIT_SUCCESS; |
| 52 | #else | ||
| 53 | unsigned opts; | ||
| 54 | int ret = EXIT_SUCCESS; | ||
| 55 | |||
| 56 | enum { | ||
| 57 | OPT_DATASYNC = (1 << 0), | ||
| 58 | OPT_SYNCFS = (1 << 1), | ||
| 59 | }; | ||
| 60 | |||
| 61 | opt_complementary = "d--f:f--d"; | ||
| 62 | opts = getopt32(argv, "df"); | ||
| 63 | argv += optind; | ||
| 64 | |||
| 65 | /* Handle the no-argument case. */ | ||
| 66 | if (!argv[0]) | ||
| 67 | sync(); | ||
| 68 | |||
| 69 | while (*argv) { | ||
| 70 | int fd = open_or_warn(*argv, O_RDONLY); | ||
| 71 | |||
| 72 | if (fd < 0) { | ||
| 73 | ret = EXIT_FAILURE; | ||
| 74 | goto next; | ||
| 75 | } | ||
| 76 | if (opts & OPT_DATASYNC) { | ||
| 77 | if (fdatasync(fd)) | ||
| 78 | goto err; | ||
| 79 | goto do_close; | ||
| 80 | } | ||
| 81 | if (opts & OPT_SYNCFS) { | ||
| 82 | /* | ||
| 83 | * syncfs is documented to only fail with EBADF, | ||
| 84 | * which can't happen here. So, no error checks. | ||
| 85 | */ | ||
| 86 | syncfs(fd); | ||
| 87 | goto do_close; | ||
| 88 | } | ||
| 89 | if (fsync(fd)) { | ||
| 90 | err: | ||
| 91 | bb_simple_perror_msg(*argv); | ||
| 92 | ret = EXIT_FAILURE; | ||
| 93 | } | ||
| 94 | do_close: | ||
| 95 | close(fd); | ||
| 96 | next: | ||
| 97 | ++argv; | ||
| 98 | } | ||
| 99 | |||
| 100 | return ret; | ||
| 101 | #endif | ||
| 30 | } | 102 | } |
