fsync,sync: merge into one source module
With FEATURE_SYNC_FANCY not set: function old new delta fsync_main 130 123 -7 With FEATURE_SYNC_FANCY set, should be much larger code size savings. Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
		@@ -1,62 +0,0 @@
 | 
			
		||||
/* vi: set sw=4 ts=4: */
 | 
			
		||||
/*
 | 
			
		||||
 * Mini fsync implementation for busybox
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2008 Nokia Corporation. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
 | 
			
		||||
 */
 | 
			
		||||
//config:config FSYNC
 | 
			
		||||
//config:	bool "fsync (3.6 kb)"
 | 
			
		||||
//config:	default y
 | 
			
		||||
//config:	help
 | 
			
		||||
//config:	fsync is used to flush file-related cached blocks to disk.
 | 
			
		||||
 | 
			
		||||
//                APPLET_NOFORK:name   main   location    suid_type     help
 | 
			
		||||
//applet:IF_FSYNC(APPLET_NOFORK(fsync, fsync, BB_DIR_BIN, BB_SUID_DROP, fsync))
 | 
			
		||||
 | 
			
		||||
//kbuild:lib-$(CONFIG_FSYNC) += fsync.o
 | 
			
		||||
 | 
			
		||||
//usage:#define fsync_trivial_usage
 | 
			
		||||
//usage:       "[-d] FILE..."
 | 
			
		||||
//usage:#define fsync_full_usage "\n\n"
 | 
			
		||||
//usage:       "Write all buffered blocks in FILEs to disk\n"
 | 
			
		||||
//usage:     "\n	-d	Avoid syncing metadata"
 | 
			
		||||
 | 
			
		||||
#include "libbb.h"
 | 
			
		||||
 | 
			
		||||
/* This is a NOFORK applet. Be very careful! */
 | 
			
		||||
 | 
			
		||||
int fsync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 | 
			
		||||
int fsync_main(int argc UNUSED_PARAM, char **argv)
 | 
			
		||||
{
 | 
			
		||||
	int ret;
 | 
			
		||||
	int opts;
 | 
			
		||||
 | 
			
		||||
	opts = getopt32(argv, "d"); /* fdatasync */
 | 
			
		||||
	argv += optind;
 | 
			
		||||
	if (!*argv) {
 | 
			
		||||
		bb_show_usage();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ret = EXIT_SUCCESS;
 | 
			
		||||
	do {
 | 
			
		||||
		/* GNU "sync FILE" uses O_NONBLOCK open */
 | 
			
		||||
		int fd = open_or_warn(*argv, /*O_NOATIME |*/ O_NOCTTY | O_RDONLY | O_NONBLOCK);
 | 
			
		||||
		/* open(NOATIME) can only be used by owner or root, don't use NOATIME here */
 | 
			
		||||
 | 
			
		||||
		if (fd < 0) {
 | 
			
		||||
			ret = EXIT_FAILURE;
 | 
			
		||||
			goto next;
 | 
			
		||||
		}
 | 
			
		||||
		if ((opts ? fdatasync(fd) : fsync(fd)) != 0) {
 | 
			
		||||
			bb_simple_perror_msg(*argv);
 | 
			
		||||
			ret = EXIT_FAILURE;
 | 
			
		||||
		}
 | 
			
		||||
		close(fd);
 | 
			
		||||
 next:
 | 
			
		||||
		argv++;
 | 
			
		||||
	} while (*argv);
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
@@ -43,32 +43,17 @@
 | 
			
		||||
 | 
			
		||||
/* This is a NOFORK applet. Be very careful! */
 | 
			
		||||
 | 
			
		||||
int sync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 | 
			
		||||
int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
 | 
			
		||||
#if ENABLE_FEATURE_SYNC_FANCY || ENABLE_FSYNC
 | 
			
		||||
static int sync_common(int opts, char **argv)
 | 
			
		||||
{
 | 
			
		||||
#if !ENABLE_FEATURE_SYNC_FANCY
 | 
			
		||||
	/* coreutils-6.9 compat */
 | 
			
		||||
	bb_warn_ignoring_args(argv[1]);
 | 
			
		||||
	sync();
 | 
			
		||||
	return EXIT_SUCCESS;
 | 
			
		||||
#else
 | 
			
		||||
	unsigned opts;
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	enum {
 | 
			
		||||
		OPT_DATASYNC = (1 << 0),
 | 
			
		||||
		OPT_SYNCFS   = (1 << 1),
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	opts = getopt32(argv, "^" "df" "\0" "d--f:f--d");
 | 
			
		||||
	argv += optind;
 | 
			
		||||
 | 
			
		||||
	/* Handle the no-argument case. */
 | 
			
		||||
	if (!argv[0])
 | 
			
		||||
		sync();
 | 
			
		||||
 | 
			
		||||
	ret = EXIT_SUCCESS;
 | 
			
		||||
	while (*argv) {
 | 
			
		||||
	do {
 | 
			
		||||
		/* GNU "sync FILE" uses O_NONBLOCK open */
 | 
			
		||||
		int fd = open_or_warn(*argv, /*O_NOATIME |*/ O_NOCTTY | O_RDONLY | O_NONBLOCK);
 | 
			
		||||
		/* open(NOATIME) can only be used by owner or root, don't use NOATIME here */
 | 
			
		||||
@@ -77,6 +62,7 @@ int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
 | 
			
		||||
			ret = EXIT_FAILURE;
 | 
			
		||||
			goto next;
 | 
			
		||||
		}
 | 
			
		||||
# if ENABLE_FEATURE_SYNC_FANCY
 | 
			
		||||
		if (opts & OPT_SYNCFS) {
 | 
			
		||||
			/*
 | 
			
		||||
			 * syncfs is documented to only fail with EBADF,
 | 
			
		||||
@@ -84,6 +70,7 @@ int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
 | 
			
		||||
			 */
 | 
			
		||||
			syncfs(fd);
 | 
			
		||||
		} else
 | 
			
		||||
# endif
 | 
			
		||||
		if (((opts & OPT_DATASYNC) ? fdatasync(fd) : fsync(fd)) != 0) {
 | 
			
		||||
			bb_simple_perror_msg(*argv);
 | 
			
		||||
			ret = EXIT_FAILURE;
 | 
			
		||||
@@ -91,8 +78,63 @@ int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
 | 
			
		||||
		close(fd);
 | 
			
		||||
 next:
 | 
			
		||||
		argv++;
 | 
			
		||||
	}
 | 
			
		||||
	} while (*argv);
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if ENABLE_SYNC
 | 
			
		||||
int sync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 | 
			
		||||
int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
 | 
			
		||||
{
 | 
			
		||||
# if !ENABLE_FEATURE_SYNC_FANCY
 | 
			
		||||
	/* coreutils-6.9 compat */
 | 
			
		||||
	bb_warn_ignoring_args(argv[1]);
 | 
			
		||||
	sync();
 | 
			
		||||
	return EXIT_SUCCESS;
 | 
			
		||||
# else
 | 
			
		||||
	unsigned opts = getopt32(argv, "^" "df" "\0" "d--f:f--d");
 | 
			
		||||
	argv += optind;
 | 
			
		||||
	if (!argv[0]) {
 | 
			
		||||
		sync();
 | 
			
		||||
		return EXIT_SUCCESS;
 | 
			
		||||
	}
 | 
			
		||||
	return sync_common(opts, argv);
 | 
			
		||||
# endif
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mini fsync implementation for busybox
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2008 Nokia Corporation. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
 | 
			
		||||
 */
 | 
			
		||||
//config:config FSYNC
 | 
			
		||||
//config:	bool "fsync (3.6 kb)"
 | 
			
		||||
//config:	default y
 | 
			
		||||
//config:	help
 | 
			
		||||
//config:	fsync is used to flush file-related cached blocks to disk.
 | 
			
		||||
 | 
			
		||||
//                APPLET_NOFORK:name   main   location    suid_type     help
 | 
			
		||||
//applet:IF_FSYNC(APPLET_NOFORK(fsync, fsync, BB_DIR_BIN, BB_SUID_DROP, fsync))
 | 
			
		||||
 | 
			
		||||
//kbuild:lib-$(CONFIG_FSYNC) += sync.o
 | 
			
		||||
 | 
			
		||||
//usage:#define fsync_trivial_usage
 | 
			
		||||
//usage:       "[-d] FILE..."
 | 
			
		||||
//usage:#define fsync_full_usage "\n\n"
 | 
			
		||||
//usage:       "Write all buffered blocks in FILEs to disk\n"
 | 
			
		||||
//usage:     "\n	-d	Avoid syncing metadata"
 | 
			
		||||
 | 
			
		||||
#if ENABLE_FSYNC
 | 
			
		||||
int fsync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 | 
			
		||||
int fsync_main(int argc UNUSED_PARAM, char **argv)
 | 
			
		||||
{
 | 
			
		||||
	int opts = getopt32(argv, "^" "d" "\0" "-1"/*min 1 arg*/);
 | 
			
		||||
	argv += optind;
 | 
			
		||||
	return sync_common(opts, argv);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user