diff -pruN busybox-1.2.1/include/applets.h busybox-1.2.1-readahead/include/applets.h --- busybox-1.2.1/include/applets.h 2006-07-01 00:42:10.000000000 +0200 +++ busybox-1.2.1-readahead/include/applets.h 2006-08-19 17:08:25.000000000 +0200 @@ -222,6 +222,7 @@ USE_READLINK(APPLET(readlink, _BB_DIR_US USE_READPROFILE(APPLET(readprofile, _BB_DIR_USR_SBIN, _BB_SUID_NEVER)) USE_REALPATH(APPLET(realpath, _BB_DIR_USR_BIN, _BB_SUID_NEVER)) USE_HALT(APPLET_ODDNAME(reboot, halt, _BB_DIR_SBIN, _BB_SUID_NEVER, reboot)) +USE_READAHEAD(APPLET(readahead, _BB_DIR_USR_BIN, _BB_SUID_NEVER)) USE_RENICE(APPLET(renice, _BB_DIR_USR_BIN, _BB_SUID_NEVER)) USE_RESET(APPLET(reset, _BB_DIR_USR_BIN, _BB_SUID_NEVER)) USE_RM(APPLET(rm, _BB_DIR_BIN, _BB_SUID_NEVER)) diff -pruN busybox-1.2.1/include/usage.h busybox-1.2.1-readahead/include/usage.h --- busybox-1.2.1/include/usage.h 2006-07-01 00:42:10.000000000 +0200 +++ busybox-1.2.1-readahead/include/usage.h 2006-08-19 17:16:36.000000000 +0200 @@ -2369,6 +2369,12 @@ USE_FEATURE_MDEV_CONFIG( \ "\t-s\tSet the system date and time (default)\n" \ "\t-p\tPrint the date and time" +#define readahead_trivial_usage \ + "[FILE]..." +#define readahead_full_usage \ + "Preloads FILE(s) in RAM cache so that subsequent reads for those" \ + "files do not block on disk I/O." + #ifdef CONFIG_FEATURE_READLINK_FOLLOW #define USAGE_READLINK_FOLLOW(a) a #else diff -pruN busybox-1.2.1/miscutils/Config.in busybox-1.2.1-readahead/miscutils/Config.in --- busybox-1.2.1/miscutils/Config.in 2006-07-01 00:42:09.000000000 +0200 +++ busybox-1.2.1-readahead/miscutils/Config.in 2006-08-19 18:09:57.000000000 +0200 @@ -277,6 +277,25 @@ config CONFIG_MT to advance or rewind a tape past a specified number of archive files on the tape. +config CONFIG_READAHEAD + bool "readahead" + default n + help + Preload the given list of files in RAM cache so that subsequent + reads on these files will not block on disk I/O. + + This applet just calls the readahead(2) system call on each file. + + It is mainly useful in system startup scripts to preload files + or executables a little while before they are used. + When used at the right time, in particular when a CPU bound + process is running, it can significantly speed up system startup. + This requires good knowledge of your system. + + As readahead(2) blocks until each file has been read, + it is best to run this applet in a background job + or through a script running in parallel. + config CONFIG_RUNLEVEL bool "runlevel" default n diff -pruN busybox-1.2.1/miscutils/conftest.c busybox-1.2.1-readahead/miscutils/conftest.c --- busybox-1.2.1/miscutils/conftest.c 1970-01-01 01:00:00.000000000 +0100 +++ busybox-1.2.1-readahead/miscutils/conftest.c 2006-08-19 16:48:13.000000000 +0200 @@ -0,0 +1 @@ +int i; diff -pruN busybox-1.2.1/miscutils/Makefile.in busybox-1.2.1-readahead/miscutils/Makefile.in --- busybox-1.2.1/miscutils/Makefile.in 2006-07-01 00:42:09.000000000 +0200 +++ busybox-1.2.1-readahead/miscutils/Makefile.in 2006-08-19 16:24:58.000000000 +0200 @@ -24,6 +24,7 @@ MISCUTILS-${CONFIG_LESS} += less. MISCUTILS-$(CONFIG_MAKEDEVS) += makedevs.o MISCUTILS-$(CONFIG_MOUNTPOINT) += mountpoint.o MISCUTILS-$(CONFIG_MT) += mt.o +MISCUTILS-$(CONFIG_READAHEAD) += readahead.o MISCUTILS-$(CONFIG_RUNLEVEL) += runlevel.o MISCUTILS-$(CONFIG_RX) += rx.o MISCUTILS-$(CONFIG_SETSID) += setsid.o diff -pruN busybox-1.2.1/miscutils/readahead.c busybox-1.2.1-readahead/miscutils/readahead.c --- busybox-1.2.1/miscutils/readahead.c 1970-01-01 01:00:00.000000000 +0100 +++ busybox-1.2.1-readahead/miscutils/readahead.c 2006-08-19 18:16:15.000000000 +0200 @@ -0,0 +1,39 @@ +/* vi: set sw=4 ts=4: */ +/* + * readahead implementation for busybox + * + * Preloads the given files in RAM, to reduce access time. + * Does this by calling the readahead(2) system call. + * + * Copyright (C) 2006 Michael Opdenacker + * + * Licensed under GPLv2 or later, see file License in this tarball for details. + */ + +#include "busybox.h" + +int readahead_main(int argc, char **argv) +{ + FILE *f; + struct stat stat_buf; + int retval = EXIT_SUCCESS; + + if (argc == 1) + bb_show_usage(); + + argv++; + + do { + if ((f = bb_wfopen(*argv, "r")) != NULL) { + xstat(*argv, &stat_buf); + int r = readahead (fileno(f), (off64_t)0, (size_t)stat_buf.st_size); + fclose(f); + if (r >= 0) { + continue; + } + } + retval = EXIT_FAILURE; + } while (*++argv); + + return retval; +}