busybox/coreutils/fsync.c
<<
>>
Prefs
   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