blob: 5e77e2c16265540b005f8f10ed9760b7b1c267b8 [file] [log] [blame]
Denys Vlasenko14f6f0a2009-06-18 08:20:02 +02001/* vi: set sw=4 ts=4: */
2/*
3 * Mini fsync implementation for busybox
4 *
5 * Copyright (C) 2008 Nokia Corporation. All rights reserved.
6 *
Denys Vlasenko0ef64bd2010-08-16 20:14:46 +02007 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
Denys Vlasenko14f6f0a2009-06-18 08:20:02 +02008 */
Denys Vlasenkoaf3f4202016-11-23 14:46:56 +01009//config:config FSYNC
Denys Vlasenko4eed2c62017-07-18 22:01:24 +020010//config: bool "fsync (3.7 kb)"
Denys Vlasenkoaf3f4202016-11-23 14:46:56 +010011//config: default y
12//config: help
Denys Vlasenko72089cf2017-07-21 09:50:55 +020013//config: fsync is used to flush file-related cached blocks to disk.
Denys Vlasenkoaf3f4202016-11-23 14:46:56 +010014
15//applet:IF_FSYNC(APPLET_NOFORK(fsync, fsync, BB_DIR_BIN, BB_SUID_DROP, fsync))
16
17//kbuild:lib-$(CONFIG_FSYNC) += fsync.o
Pere Orga34425382011-03-31 14:43:25 +020018
19//usage:#define fsync_trivial_usage
20//usage: "[-d] FILE..."
21//usage:#define fsync_full_usage "\n\n"
22//usage: "Write files' buffered blocks to disk\n"
Pere Orga34425382011-03-31 14:43:25 +020023//usage: "\n -d Avoid syncing metadata"
24
Denys Vlasenko14f6f0a2009-06-18 08:20:02 +020025#include "libbb.h"
Denys Vlasenko10544a82010-02-09 00:26:10 +010026#ifndef O_NOATIME
27# define O_NOATIME 0
28#endif
Denys Vlasenko14f6f0a2009-06-18 08:20:02 +020029
30/* This is a NOFORK applet. Be very careful! */
31
32int fsync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
33int fsync_main(int argc UNUSED_PARAM, char **argv)
34{
35 int status;
36 int opts;
37
38 opts = getopt32(argv, "d"); /* fdatasync */
39 argv += optind;
40 if (!*argv) {
41 bb_show_usage();
42 }
43
44 status = EXIT_SUCCESS;
45 do {
Denys Vlasenkobec58882010-10-20 13:21:22 +020046 int fd = open_or_warn(*argv, O_NOATIME | O_NOCTTY | O_RDONLY);
Denys Vlasenko14f6f0a2009-06-18 08:20:02 +020047
48 if (fd == -1) {
49 status = EXIT_FAILURE;
50 continue;
51 }
52 if ((opts ? fdatasync(fd) : fsync(fd))) {
53 //status = EXIT_FAILURE; - do we want this?
54 bb_simple_perror_msg(*argv);
55 }
56 close(fd);
57 } while (*++argv);
58
59 return status;
60}