/*
* Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/fs.h>
#include <errno.h>
int main(int argc, char **argv)
{
int fd;
int block;
int first_block;
int last_block;
int totals_block;
int fragments;
int i;
int n;
for (n = 1; n < argc; n++) {
if (argc < 2) {
printf
("Used to see file maps \nUsage: %s filename1 [[..[filename2]...filename(N-1)] filenameN]\n",
argv[0]);
return 0;
}
fd = open(argv[n], O_RDONLY);
if (fd == -1) {
perror("open failed");
continue;
}
// printf ("file %s occupies blocks: \n", argv[1]);
// printf ("START\tEND\tCOUNT\n");
i = 0;
block = 0;
first_block = 0;
last_block = 0;
fragments = 0;
totals_block = 0;
while (ioctl(fd, FIBMAP, &block) == 0) {
if (first_block == 0) {
last_block = block - 1;
first_block = block;
}
if (block != last_block + 1) {
// printf ("%d\t%d\t%d\n",first_block,last_block,last_block-first_block+1);
totals_block += last_block - first_block + 1;
fragments++;
first_block = block;
last_block = block;
} else {
last_block++;
}
if (!block) {
//printf ("Fragments: %d\tBlocks: %d\n",fragments,totals_block);
//printf ("%d:%d\t",fragments,totals_block);
//if (fragments == 1) printf(".",totals_block);
//else printf("%d_",fragments,totals_block);
printf("%d\n", fragments);
break;
}
i++;
block = i;
}
if (errno) {
perror("FIBMAP failed");
}
close(fd);
// printf ("\n");
}
return 0;
}