summaryrefslogtreecommitdiff
path: root/coreutils/fsync.c (plain)
blob: 596a2bcaf3cddf699df59e1daf9112892256fafa
1/* vi: set sw=4 ts=4: */
2/*
3 * Mini fsync implementation for busybox
4 *
5 * Copyright (C) 2008 Nokia Corporation. All rights reserved.
6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
8 */
9//config:config FSYNC
10//config: bool "fsync"
11//config: default y
12//config: help
13//config: fsync is used to flush file-related cached blocks to disk.
14
15//applet:IF_FSYNC(APPLET_NOFORK(fsync, fsync, BB_DIR_BIN, BB_SUID_DROP, fsync))
16
17//kbuild:lib-$(CONFIG_FSYNC) += fsync.o
18
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"
23//usage: "\n -d Avoid syncing metadata"
24
25#include "libbb.h"
26#ifndef O_NOATIME
27# define O_NOATIME 0
28#endif
29
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 {
46 int fd = open_or_warn(*argv, O_NOATIME | O_NOCTTY | O_RDONLY);
47
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}
61