ubi_tools: a bit smaller applet resolution code
[oweals/busybox.git] / miscutils / readahead.c
index 647eb312159338471cd67369642016282874c491..972302a187d0d5ede77aac29a9900a59333b35c7 100644 (file)
@@ -7,26 +7,59 @@
  *
  * Copyright (C) 2006  Michael Opdenacker <michael@free-electrons.com>
  *
- * 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.
+
+//applet:IF_READAHEAD(APPLET(readahead, BB_DIR_USR_SBIN, BB_SUID_DROP))
+
+//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, char **argv)
+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 = fopen_or_warn(*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;
        }