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 (3.6 kb)" 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