10e3f58b6SKirk McKusick /* 20e3f58b6SKirk McKusick * Copyright (c) 1998, 2003, 2013, 2018 Marshall Kirk McKusick. 30e3f58b6SKirk McKusick * All Rights Reserved. 40e3f58b6SKirk McKusick * 50e3f58b6SKirk McKusick * Redistribution and use in source and binary forms, with or without 60e3f58b6SKirk McKusick * modification, are permitted provided that the following conditions 70e3f58b6SKirk McKusick * are met: 80e3f58b6SKirk McKusick * 1. Redistributions of source code must retain the above copyright 90e3f58b6SKirk McKusick * notice, this list of conditions and the following disclaimer. 100e3f58b6SKirk McKusick * 2. Redistributions in binary form must reproduce the above copyright 110e3f58b6SKirk McKusick * notice, this list of conditions and the following disclaimer in the 120e3f58b6SKirk McKusick * documentation and/or other materials provided with the distribution. 130e3f58b6SKirk McKusick * 140e3f58b6SKirk McKusick * THIS SOFTWARE IS PROVIDED BY MARSHALL KIRK MCKUSICK ``AS IS'' AND 150e3f58b6SKirk McKusick * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 160e3f58b6SKirk McKusick * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 170e3f58b6SKirk McKusick * ARE DISCLAIMED. IN NO EVENT SHALL MARSHALL KIRK MCKUSICK BE LIABLE 180e3f58b6SKirk McKusick * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 190e3f58b6SKirk McKusick * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 200e3f58b6SKirk McKusick * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 210e3f58b6SKirk McKusick * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 220e3f58b6SKirk McKusick * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 230e3f58b6SKirk McKusick * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 240e3f58b6SKirk McKusick * SUCH DAMAGE. 250e3f58b6SKirk McKusick * 260e3f58b6SKirk McKusick * $FreeBSD$ 270e3f58b6SKirk McKusick */ 280e3f58b6SKirk McKusick 290e3f58b6SKirk McKusick #include <ufs/ffs/fs.h> 300e3f58b6SKirk McKusick 310e3f58b6SKirk McKusick #include <err.h> 320e3f58b6SKirk McKusick #include <stdlib.h> 330e3f58b6SKirk McKusick #include <stdio.h> 34c343fa81SKirk McKusick #include <sys/stat.h> 350e3f58b6SKirk McKusick #include <libufs.h> 360e3f58b6SKirk McKusick 370e3f58b6SKirk McKusick union dinode { 380e3f58b6SKirk McKusick struct ufs1_dinode *dp1; 390e3f58b6SKirk McKusick struct ufs2_dinode *dp2; 400e3f58b6SKirk McKusick }; 410e3f58b6SKirk McKusick 4268d7185bSKirk McKusick void prtblknos(struct fs *fs, union dinode *dp); 4368d7185bSKirk McKusick 4468d7185bSKirk McKusick struct uufsd disk; 450e3f58b6SKirk McKusick 460e3f58b6SKirk McKusick int 470e3f58b6SKirk McKusick main(argc, argv) 480e3f58b6SKirk McKusick int argc; 490e3f58b6SKirk McKusick char *argv[]; 500e3f58b6SKirk McKusick { 519fc5d538SKirk McKusick union dinodep dp; 520e3f58b6SKirk McKusick struct fs *fs; 53c343fa81SKirk McKusick struct stat sb; 54c343fa81SKirk McKusick struct statfs sfb; 55c343fa81SKirk McKusick char *xargv[4]; 56c343fa81SKirk McKusick char ibuf[64]; 57d3009da8SKirk McKusick char *fsname, *filename; 58d3009da8SKirk McKusick ino_t inonum; 590e3f58b6SKirk McKusick 60d3009da8SKirk McKusick filename = NULL; 61c343fa81SKirk McKusick if (argc == 2) { 62d3009da8SKirk McKusick filename = argv[1]; 63d3009da8SKirk McKusick if (lstat(filename, &sb) != 0) 64d3009da8SKirk McKusick err(1, "stat(%s)", filename); 65d3009da8SKirk McKusick if (statfs(filename, &sfb) != 0) 66d3009da8SKirk McKusick err(1, "statfs(%s)", filename); 67c343fa81SKirk McKusick xargv[0] = argv[0]; 68c343fa81SKirk McKusick xargv[1] = sfb.f_mntfromname; 69c343fa81SKirk McKusick sprintf(ibuf, "%jd", (intmax_t)sb.st_ino); 70c343fa81SKirk McKusick xargv[2] = ibuf; 71c343fa81SKirk McKusick xargv[3] = NULL; 72c343fa81SKirk McKusick argv = xargv; 73c343fa81SKirk McKusick argc = 3; 74c343fa81SKirk McKusick } 750e3f58b6SKirk McKusick if (argc < 3) { 76c343fa81SKirk McKusick (void)fprintf(stderr, "%s\n%s\n", 77c343fa81SKirk McKusick "usage: prtblknos filename", 78c343fa81SKirk McKusick " prtblknos filesystem inode ..."); 790e3f58b6SKirk McKusick exit(1); 800e3f58b6SKirk McKusick } 810e3f58b6SKirk McKusick 820e3f58b6SKirk McKusick fsname = *++argv; 830e3f58b6SKirk McKusick 840e3f58b6SKirk McKusick /* get the superblock. */ 85*e6886616SKirk McKusick if (ufs_disk_fillout_blank(&disk, fsname) == -1 || 86*e6886616SKirk McKusick sbfind(&disk, 0) == -1) 87c343fa81SKirk McKusick err(1, "Cannot access file system superblock on %s", fsname); 880e3f58b6SKirk McKusick fs = (struct fs *)&disk.d_sb; 890e3f58b6SKirk McKusick 900e3f58b6SKirk McKusick /* remaining arguments are inode numbers. */ 910e3f58b6SKirk McKusick while (*++argv) { 920e3f58b6SKirk McKusick /* get the inode number. */ 930e3f58b6SKirk McKusick if ((inonum = atoi(*argv)) <= 0 || 94d3009da8SKirk McKusick inonum >= (ino_t)fs->fs_ipg * fs->fs_ncg) 95c343fa81SKirk McKusick warnx("%s is not a valid inode number", *argv); 96d3009da8SKirk McKusick if (filename == NULL) 97d3009da8SKirk McKusick (void)printf("inode #%jd: ", (intmax_t)inonum); 98d3009da8SKirk McKusick else 99d3009da8SKirk McKusick (void)printf("%s (inode #%jd): ", filename, 100d3009da8SKirk McKusick (intmax_t)inonum); 1010e3f58b6SKirk McKusick 102*e6886616SKirk McKusick if (getinode(&disk, &dp, inonum) < 0) 1039fc5d538SKirk McKusick warn("Read of inode %jd on %s failed: %s", 1049fc5d538SKirk McKusick (intmax_t)inonum, fsname, disk.d_error); 1050e3f58b6SKirk McKusick 10668d7185bSKirk McKusick prtblknos(fs, (union dinode *)dp.dp1); 1070e3f58b6SKirk McKusick } 1080e3f58b6SKirk McKusick exit(0); 1090e3f58b6SKirk McKusick } 110