1
0
Files
irix-657m-src/eoe/cmd/efs/tools/dino.c
2022-09-29 17:59:04 +03:00

139 lines
3.3 KiB
C

/*
* Dump an inode out. This is not meant as a complete diagnostic tool, just
* something handy to look at inodes.
*
* Written by: Kipp Hickman
*
* $Source: /proj/irix6.5.7m/isms/eoe/cmd/efs/tools/RCS/dino.c,v $
* $Revision: 1.4 $
* $Date: 1997/06/03 20:58:06 $
*/
#include "efs.h"
char *progname;
int fs_fd;
struct efs *fs;
union {
struct efs fs;
char data[BBTOB(BTOBB(sizeof(struct efs)))];
} sblock;
main(argc, argv)
int argc;
char *argv[];
{
efs_ino_t inum;
register struct efs_dinode *di;
register extent *ex;
register int i;
progname = argv[0];
if (argc != 3) {
fprintf(stderr, "usage: %s special inumber\n", progname);
exit(-1);
}
if ((fs_fd = open(argv[1], O_RDONLY)) < 0) {
fprintf(stderr, "%s: can't open %s\n", progname, argv[1]);
exit(-1);
}
fs = &sblock.fs;
if (efs_mount()) {
fprintf(stderr, "%s: %s is not an extent filesystem\n",
progname, argv[1]);
exit(-1);
}
inum = atoi(argv[2]);
if ((inum < EFS_ROOTINO) ||
(inum > fs->fs_ipcg * fs->fs_ncg)) {
fprintf(stderr, "%s: inode number %d is not valid\n",
progname, inum);
exit(-1);
}
di = efs_iget(inum);
printf("inode %d at disk block %d offset %d\n",
inum, EFS_ITOBB(fs, inum),
EFS_ITOO(fs, inum) * sizeof(struct efs_dinode));
printf("mode=%07o nlink=%d uid=%d gid=%d size=%d\n",
di->di_mode, di->di_nlink, di->di_uid,
di->di_gid, di->di_size);
printf("atime=%s", ctime(&di->di_atime));
printf("mtime=%s", ctime(&di->di_mtime));
printf("ctime=%s", ctime(&di->di_ctime));
printf("gen=%d numextents=%d vers=%d dev=%x\n",
di->di_gen, di->di_numextents, di->di_version,
di->di_u.di_dev);
if (di->di_numextents > EFS_DIRECTEXTENTS)
dumpindir(di);
else
if (di->di_numextents) {
printf("Extent Magic # Disk Block Length Offset Cg\n");
ex = &di->di_u.di_extents[0];
for (i = 0; i < di->di_numextents; i++, ex++) {
printf("%6d %6d %12d %6d %6d %4d\n",
i, ex->ex_magic, ex->ex_bn,
ex->ex_length,
ex->ex_offset,
EFS_BBTOCG(fs, ex->ex_bn));
}
}
}
/*
* Print out indirect extent information
*/
dumpindir(di)
register struct efs_dinode *di;
{
register struct extent *ex;
register int i, j, k;
char buf[BBSIZE];
int left;
char header = 0;
long bn;
left = di->di_numextents;
for (i = 0; i < di->di_u.di_extents[0].ex_offset; i++) {
printf("Indirect extent #%d: mag=%d bn=%d len=%d\n",
i,
di->di_u.di_extents[i].ex_magic,
di->di_u.di_extents[i].ex_bn,
di->di_u.di_extents[i].ex_length);
}
for (i = 0; i < di->di_u.di_extents[0].ex_offset; i++) {
bn = di->di_u.di_extents[i].ex_bn;
for (j = 0; j < di->di_u.di_extents[i].ex_length; j++, bn++) {
lseek(fs_fd, BBTOB(bn), 0);
if (read(fs_fd, buf, BBSIZE) != BBSIZE)
error();
ex = (extent *) buf;
for (k = 0; k < BBSIZE / sizeof(extent); k++, ex++) {
if (!header) {
printf("Extent Magic # Disk Block Length Offset Cg\n");
header = 1;
}
printf("%6d %6d %12d %6d %6d %4d\n",
(j * BBSIZE / sizeof(extent)) + k,
ex->ex_magic,
ex->ex_bn,
ex->ex_length,
ex->ex_offset, EFS_BBTOCG(fs, ex->ex_bn));
if (--left == 0)
return;
}
}
}
}
error()
{
int old_errno;
old_errno = errno;
fprintf(stderr, "%s: i/o error\n", progname);
errno = old_errno;
perror(progname);
exit(-1);
}