1 #include "compat-util.h"
3 static struct fa_advice
{
7 { "normal", POSIX_FADV_NORMAL
},
8 { "sequential", POSIX_FADV_SEQUENTIAL
},
9 { "random", POSIX_FADV_RANDOM
},
10 { "noreuse", POSIX_FADV_NOREUSE
},
11 { "willneed", POSIX_FADV_WILLNEED
},
12 { "dontneed" , POSIX_FADV_DONTNEED
}
15 static int usage(const char * argv0
)
20 "Usage: %s [-a ADVICE] [-o OFFSET] "
21 "[-l LENGTH] FILE...\n", argv0
);
22 fprintf(stderr
, "\nPossible values for advice:\n");
23 for (i
= 0; i
< ARRAY_SIZE(advice_table
); ++i
)
24 fprintf(stderr
, "\t%s\n", advice_table
[i
].name
);
29 static void apply_fadvise(const char *path
, off_t offset
, off_t len
, int advice
)
33 if ((fd
= open(path
, O_RDONLY
|O_NOATIME
)) < 0) {
34 fprintf(stderr
, "%s: open(): %s\n", path
, strerror(errno
));
39 /* for compatibility with kernels < 2.6.6 */
42 if (fstat(fd
, &sb
) < 0) {
43 fprintf(stderr
, "%s: fstat(%d): %s\n",
44 path
, fd
, strerror(errno
));
50 if (posix_fadvise(fd
, offset
, len
, advice
) < 0)
53 "offset=%lu,len=%lu,advice=%d): %s\n",
55 (unsigned long)offset
,
57 advice
, strerror(errno
));
63 int main(int argc
, char * const argv
[])
67 int advice
= POSIX_FADV_NORMAL
;
71 while ((opt
= getopt(argc
, argv
, "o:l:a:h")) != -1) {
78 offset
= cstr_to_off_t(optarg
, &err
, 10);
79 if (*err
|| offset
< 0) {
80 fprintf(stderr
, "offset must be >= 0\n");
85 len
= cstr_to_off_t(optarg
, &err
, 10);
86 if (*err
|| len
< 0) {
87 fprintf(stderr
, "length must be >= 0\n");
92 for (i
= 0; i
< ARRAY_SIZE(advice_table
); ++i
) {
93 if (strcmp(advice_table
[i
].name
, optarg
))
95 advice
= advice_table
[i
].nr
;
98 if (i
< ARRAY_SIZE(advice_table
))
100 fprintf(stderr
, "advice '%s' not understood\n", optarg
);
103 return usage(argv
[0]);
108 return usage(argv
[0]);
110 for (; argi
< argc
; ++argi
)
111 apply_fadvise(argv
[argi
], offset
, len
, advice
);