/* * $Id: frags.c,v 1.1 2015/01/05 04:36:07 grog Exp $ * * Show fragmentation of files on command line. */ #include #include #include #include #include #include #include #include #include struct stat stats; off_t blocksize = 1024; /* may be overridden by BLOCKSIZE */ char *BLOCKSIZE; /* text from getenv */ #define ST_BLOCKSIZE 512 /* struct stat's concept of blocks */ int main (int argc, char *argv []) { int i = 1; /* index in argv */ if (argc == 1) /* no args */ { fprintf (stderr, "Usage: %s files\n", argv [0]); return 1; } if (strcmp (argv [1], "-b")) /* ignore BLOCKSIZE */ { if (BLOCKSIZE = getenv ("BLOCKSIZE")) { if (! (blocksize = atol (BLOCKSIZE))) { blocksize = 1024; fprintf (stderr, "Invalid BLOCKSIZE: %s, assuming %ld\n", BLOCKSIZE, blocksize ); } } } else i = 2; /* start at second parm */ for (; i < argc; i++) { if (stat (argv [i], &stats) < 0) fprintf (stderr, "Can't stat %s: %s (%d)\n", argv [i], strerror (errno), errno ); else { if (stats.st_size) printf ("%-80s%8ld %8ld %3ld%%\n", argv [i], (long) (stats.st_size + blocksize - 1) / blocksize, /* EOF */ (stats.st_blocks * ST_BLOCKSIZE + blocksize - 1) / blocksize, /* number of blocks */ stats.st_blocks * ST_BLOCKSIZE * 100 / stats.st_size ); /* Percantage full */ else /* empty file, can't do % */ printf ("%-80s%8ld %8ld\n", argv [i], (long) (stats.st_size + blocksize - 1) / blocksize, /* EOF */ (stats.st_blocks * ST_BLOCKSIZE + blocksize - 1) / blocksize ); /* number of blocks */ } } return 0; }