summaryrefslogtreecommitdiff
path: root/dontneed.c
blob: 29b25d84401f27d2b9560358e60f168ea3527eb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <fcntl.h>  // posix_fadvise
#include <errno.h>  // errno
#include <string.h> // strerror
#include <stdio.h>  // fprintf
#include <unistd.h> // open,close

int usage(char progname[]) {
	fprintf(stderr, "Usage: %s <path>...\n", progname);
	fprintf(stderr, " Calls posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED) on each <path>\n\n");
	fprintf(stderr, " Tip: you may find all cached files from rootfs with the costly one-liner:\n");
	fprintf(stderr, " # find / -mount -type f -print0 | xargs -r0 fincore | grep -vE '^ *0B' | sort -hr | uniq | less\n");
	return 1;
}

int main(int argc, char** argv) {
	int i, fd, advise_errno, errors=0;
	if ( argc < 2 ) return usage(argv[0]);
	for (i=1; i<argc; i++) {
		fd = open(argv[i], O_RDONLY);
		if ( fd == -1 ) {
			fprintf(stderr, "Can't open '%s': %s\n", argv[i], strerror(errno));
			errors++; continue;
		}
		advise_errno = posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED);
		if ( advise_errno != 0 ) {
			fprintf(stderr, "Can't posix_fadvise '%s' (%i): %s\n", argv[i], advise_errno, strerror(errno));
			errors++; //don't forget to close(fd) anyway
		}
		close(fd);
	}
	return (errors != 0);
}