#include <ufs/ffs/fs.h>
#include <err.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <libufs.h>
void prtblknos(struct fs *fs, union dinode *dp);
struct uufsd disk;
int
main(int argc, char *argv[])
{
union dinodep dp;
struct fs *fs;
struct stat sb;
struct statfs sfb;
char *xargv[4];
char ibuf[64];
char *fsname, *filename;
ino_t inonum;
filename = NULL;
if (argc == 2) {
filename = argv[1];
if (lstat(filename, &sb) != 0)
err(1, "stat(%s)", filename);
if (statfs(filename, &sfb) != 0)
err(1, "statfs(%s)", filename);
xargv[0] = argv[0];
xargv[1] = sfb.f_mntfromname;
sprintf(ibuf, "%jd", (intmax_t)sb.st_ino);
xargv[2] = ibuf;
xargv[3] = NULL;
argv = xargv;
argc = 3;
}
if (argc < 3) {
(void)fprintf(stderr, "%s\n%s\n",
"usage: prtblknos filename",
" prtblknos filesystem inode ...");
exit(1);
}
fsname = *++argv;
if (ufs_disk_fillout_blank(&disk, fsname) == -1 ||
sbfind(&disk, 0) == -1)
err(1, "Cannot access file system superblock on %s", fsname);
fs = (struct fs *)&disk.d_sbunion.d_sb;
while (*++argv) {
if ((inonum = atoi(*argv)) <= 0 ||
inonum >= (ino_t)fs->fs_ipg * fs->fs_ncg)
warnx("%s is not a valid inode number", *argv);
if (filename == NULL)
(void)printf("inode #%jd: ", (intmax_t)inonum);
else
(void)printf("%s (inode #%jd): ", filename,
(intmax_t)inonum);
if (getinode(&disk, &dp, inonum) < 0)
warn("Read of inode %jd on %s failed: %s",
(intmax_t)inonum, fsname, disk.d_error);
prtblknos(fs, (union dinode *)dp.dp1);
}
exit(0);
}