1 /* vi: set sw=4 ts=4: */
3 * Mini sync implementation for busybox
5 * Copyright (C) 1995, 1996 by Bruce Perens <bruce@pixar.com>.
6 * Copyright (C) 2015 by Ari Sundholm <ari@tuxera.com>
8 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
11 //config: bool "sync (4 kb)"
14 //config: sync is used to flush filesystem buffers.
15 //config:config FEATURE_SYNC_FANCY
16 //config: bool "Enable -d and -f flags (requires syncfs(2) in libc)"
18 //config: depends on SYNC
20 //config: sync -d FILE... executes fdatasync() on each FILE.
21 //config: sync -f FILE... executes syncfs() on each FILE.
23 // APPLET_NOFORK:name main location suid_type help
24 //applet:IF_SYNC(APPLET_NOFORK(sync, sync, BB_DIR_BIN, BB_SUID_DROP, sync))
26 //kbuild:lib-$(CONFIG_SYNC) += sync.o
28 /* BB_AUDIT SUSv3 N/A -- Matches GNU behavior. */
30 //usage:#define sync_trivial_usage
31 //usage: ""IF_FEATURE_SYNC_FANCY("[-df] [FILE]...")
32 //usage:#define sync_full_usage "\n\n"
33 //usage: IF_NOT_FEATURE_SYNC_FANCY(
34 //usage: "Write all buffered blocks to disk"
36 //usage: IF_FEATURE_SYNC_FANCY(
37 //usage: "Write all buffered blocks (in FILEs) to disk"
38 //usage: "\n -d Avoid syncing metadata"
39 //usage: "\n -f Sync filesystems underlying FILEs"
44 /* This is a NOFORK applet. Be very careful! */
46 #if ENABLE_FEATURE_SYNC_FANCY || ENABLE_FSYNC
47 static int sync_common(int opts
, char **argv
)
51 OPT_DATASYNC
= (1 << 0),
52 OPT_SYNCFS
= (1 << 1),
57 /* GNU "sync FILE" uses O_NONBLOCK open */
58 int fd
= open_or_warn(*argv
, /*O_NOATIME |*/ O_NOCTTY
| O_RDONLY
| O_NONBLOCK
);
59 /* open(NOATIME) can only be used by owner or root, don't use NOATIME here */
65 # if ENABLE_FEATURE_SYNC_FANCY
66 if (opts
& OPT_SYNCFS
) {
68 * syncfs is documented to only fail with EBADF,
69 * which can't happen here. So, no error checks.
74 if (((opts
& OPT_DATASYNC
) ? fdatasync(fd
) : fsync(fd
)) != 0) {
75 bb_simple_perror_msg(*argv
);
88 int sync_main(int argc
, char **argv
) MAIN_EXTERNALLY_VISIBLE
;
89 int sync_main(int argc UNUSED_PARAM
, char **argv
IF_NOT_DESKTOP(UNUSED_PARAM
))
91 # if !ENABLE_FEATURE_SYNC_FANCY
92 /* coreutils-6.9 compat */
93 bb_warn_ignoring_args(argv
[1]);
97 unsigned opts
= getopt32(argv
, "^" "df" "\0" "d--f:f--d");
103 return sync_common(opts
, argv
);
109 * Mini fsync implementation for busybox
111 * Copyright (C) 2008 Nokia Corporation. All rights reserved.
113 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
115 //config:config FSYNC
116 //config: bool "fsync (3.8 kb)"
119 //config: fsync is used to flush file-related cached blocks to disk.
121 // APPLET_NOFORK:name main location suid_type help
122 //applet:IF_FSYNC(APPLET_NOFORK(fsync, fsync, BB_DIR_BIN, BB_SUID_DROP, fsync))
124 //kbuild:lib-$(CONFIG_FSYNC) += sync.o
126 //usage:#define fsync_trivial_usage
127 //usage: "[-d] FILE..."
128 //usage:#define fsync_full_usage "\n\n"
129 //usage: "Write all buffered blocks in FILEs to disk\n"
130 //usage: "\n -d Avoid syncing metadata"
133 int fsync_main(int argc
, char **argv
) MAIN_EXTERNALLY_VISIBLE
;
134 int fsync_main(int argc UNUSED_PARAM
, char **argv
)
136 int opts
= getopt32(argv
, "^" "d" "\0" "-1"/*min 1 arg*/);
138 return sync_common(opts
, argv
);