mincore: byte offsets should be shown in hex
[pcu.git] / mincore.c
blobff0edc3994e3870798870f5fe27ca067d6673c51
1 #include "compat-util.h"
3 static void mincore_stats(const char *path, off_t offset, off_t len)
5 char *map;
6 unsigned char *vec;
7 size_t vec_len;
8 size_t map_len;
9 off_t map_offset;
10 int fd;
11 size_t i;
12 static const char *fmt = sizeof(void *) == 8 ?
13 "%s: %016lx %x\n": "%s: %08lx %x\n";
15 if ((fd = open(path, O_RDONLY|O_NOATIME)) < 0) {
16 fprintf(stderr, "%s: open(): %s\n", path, strerror(errno));
17 return;
20 if (!len) {
21 struct stat sb;
23 if (fstat(fd, &sb) < 0) {
24 fprintf(stderr, "%s: fstat(%d): %s\n",
25 path, fd, strerror(errno));
26 goto err_close;
28 len = sb.st_size;
31 vec_len = (len + page_size() - 1) / page_size();
32 if (!(vec = malloc(vec_len))) {
33 fprintf(stderr, "%s: malloc(%lu): %s\n",
34 path, (unsigned long)vec_len, strerror(errno));
35 goto err_close;
38 map_len = PAGE_ALIGN(len);
39 map_offset = PAGE_ALIGN_DOWN(offset);
41 map = mmap(NULL, map_len, PROT_READ, MAP_SHARED, fd, map_offset);
42 if (!map) {
43 fprintf(stderr, "%s: mmap(%lu): %s\n",
44 path, (unsigned long)vec_len, strerror(errno));
45 goto err_free;
48 if (mincore(map, map_len, vec) < 0) {
49 fprintf(stderr, "%s: mincore(%lu): %s\n",
50 path, (unsigned long)vec_len, strerror(errno));
51 goto err_munmap;
54 for (i = 0; i < vec_len; ++i)
55 printf(fmt, path,
56 (unsigned long)(page_size() * i) + map_offset,
57 vec[i]);
58 err_munmap:
59 munmap(map, map_len);
60 err_free:
61 free(vec);
62 err_close:
63 close(fd);
66 int main(int argc, char * const argv[])
68 off_t offset = 0;
69 off_t len = 0;
70 int argi = 1;
71 int opt;
73 while ((opt = getopt(argc, argv, "o:l:")) != -1) {
74 char *err;
76 argi += 2;
77 switch(opt) {
78 case 'o':
79 offset = strtol(optarg, &err, 10);
80 if (*err || offset < 0) {
81 fprintf(stderr, "offset must be >= 0\n");
82 return 1;
84 break;
85 case 'l':
86 len = strtol(optarg, &err, 10);
87 if (*err || len < 0) {
88 fprintf(stderr, "length must be >= 0\n");
89 return 1;
91 break;
92 default:
93 fprintf(stderr,
94 "Usage: %s [-o offset] "
95 "[-l length] <files>\n", argv[0]);
96 return 1;
100 for (; argi < argc; ++argi)
101 mincore_stats(argv[argi], offset, len);
102 return 0;