source: MondoRescue/branches/3.3/mindi-busybox/coreutils/sync.c@ 3906

Last change on this file since 3906 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

File size: 2.4 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*
3 * Mini sync implementation for busybox
4 *
5 * Copyright (C) 1995, 1996 by Bruce Perens <bruce@pixar.com>.
6 * Copyright (C) 2015 by Ari Sundholm <ari@tuxera.com>
7 *
8 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
9 */
10
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))
27
28//usage:#define sync_trivial_usage
29//usage: ""IF_FEATURE_SYNC_FANCY("[-df] [FILE]...")
30//usage:#define sync_full_usage "\n\n"
31//usage: IF_NOT_FEATURE_SYNC_FANCY(
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: )
39
40#include "libbb.h"
41
42/* This is a NOFORK applet. Be very careful! */
43
44int sync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
45int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
46{
47#if !ENABLE_FEATURE_SYNC_FANCY
48 /* coreutils-6.9 compat */
49 bb_warn_ignoring_args(argv[1]);
50 sync();
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
102}
Note: See TracBrowser for help on using the repository browser.