X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=miscutils%2Freadahead.c;h=972302a187d0d5ede77aac29a9900a59333b35c7;hb=115e0a719950f8f716f73d5e36e9483df9dbbf1e;hp=49cd7fd09da42a67b52856c39ad51c2682bc4f13;hpb=9213a9e0f2d8fd638ecd02e2628d96dd5c7d233e;p=oweals%2Fbusybox.git diff --git a/miscutils/readahead.c b/miscutils/readahead.c index 49cd7fd09..972302a18 100644 --- a/miscutils/readahead.c +++ b/miscutils/readahead.c @@ -7,25 +7,59 @@ * * Copyright (C) 2006 Michael Opdenacker * - * Licensed under GPLv2 or later, see file License in this tarball for details. + * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ +//config:config READAHEAD +//config: bool "readahead (2 kb)" +//config: default y +//config: depends on LFS +//config: select PLATFORM_LINUX +//config: help +//config: Preload the files listed on the command line into RAM cache so that +//config: subsequent reads on these files will not block on disk I/O. +//config: +//config: This applet just calls the readahead(2) system call on each file. +//config: It is mainly useful in system startup scripts to preload files +//config: or executables before they are used. When used at the right time +//config: (in particular when a CPU bound process is running) it can +//config: significantly speed up system startup. +//config: +//config: As readahead(2) blocks until each file has been read, it is best to +//config: run this applet as a background job. -#include "busybox.h" +//applet:IF_READAHEAD(APPLET(readahead, BB_DIR_USR_SBIN, BB_SUID_DROP)) -int readahead_main(int argc, char **argv) +//kbuild:lib-$(CONFIG_READAHEAD) += readahead.o + +//usage:#define readahead_trivial_usage +//usage: "[FILE]..." +//usage:#define readahead_full_usage "\n\n" +//usage: "Preload FILEs to RAM" + +#include "libbb.h" + +int readahead_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int readahead_main(int argc UNUSED_PARAM, char **argv) { - FILE *f; int retval = EXIT_SUCCESS; - if (argc == 1) bb_show_usage(); + if (!argv[1]) { + bb_show_usage(); + } while (*++argv) { - if ((f = bb_wfopen(*argv, "r")) != NULL) { - int r, fd=fileno(f); + int fd = open_or_warn(*argv, O_RDONLY); + if (fd >= 0) { + off_t len; + int r; - r = readahead(fd, 0, fdlength(fd)); - fclose(f); - if (r >= 0) continue; + /* fdlength was reported to be unreliable - use seek */ + len = xlseek(fd, 0, SEEK_END); + xlseek(fd, 0, SEEK_SET); + r = readahead(fd, 0, len); + close(fd); + if (r >= 0) + continue; } retval = EXIT_FAILURE; }