139bb6d1eSPeter Wemm /* $NetBSD: fsdbutil.c,v 1.2 1995/10/08 23:18:12 thorpej Exp $ */ 239bb6d1eSPeter Wemm 339bb6d1eSPeter Wemm /* 439bb6d1eSPeter Wemm * Copyright (c) 1995 John T. Kohl 539bb6d1eSPeter Wemm * All rights reserved. 639bb6d1eSPeter Wemm * 739bb6d1eSPeter Wemm * Redistribution and use in source and binary forms, with or without 839bb6d1eSPeter Wemm * modification, are permitted provided that the following conditions 939bb6d1eSPeter Wemm * are met: 1039bb6d1eSPeter Wemm * 1. Redistributions of source code must retain the above copyright 1139bb6d1eSPeter Wemm * notice, this list of conditions and the following disclaimer. 1239bb6d1eSPeter Wemm * 2. Redistributions in binary form must reproduce the above copyright 1339bb6d1eSPeter Wemm * notice, this list of conditions and the following disclaimer in the 1439bb6d1eSPeter Wemm * documentation and/or other materials provided with the distribution. 1539bb6d1eSPeter Wemm * 3. The name of the author may not be used to endorse or promote products 1639bb6d1eSPeter Wemm * derived from this software without specific prior written permission. 1739bb6d1eSPeter Wemm * 1839bb6d1eSPeter Wemm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR 1939bb6d1eSPeter Wemm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 2039bb6d1eSPeter Wemm * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 2139bb6d1eSPeter Wemm * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 2239bb6d1eSPeter Wemm * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 2339bb6d1eSPeter Wemm * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 2439bb6d1eSPeter Wemm * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2539bb6d1eSPeter Wemm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 2639bb6d1eSPeter Wemm * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 2739bb6d1eSPeter Wemm * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2839bb6d1eSPeter Wemm * POSSIBILITY OF SUCH DAMAGE. 2939bb6d1eSPeter Wemm */ 3039bb6d1eSPeter Wemm 3139bb6d1eSPeter Wemm #ifndef lint 320227048aSPhilippe Charnier static const char rcsid[] = 337f3dea24SPeter Wemm "$FreeBSD$"; 3439bb6d1eSPeter Wemm #endif /* not lint */ 3539bb6d1eSPeter Wemm 3639bb6d1eSPeter Wemm #include <sys/types.h> 379eb8ec95SAlfred Perlstein #include <sys/param.h> 3839bb6d1eSPeter Wemm #include <ctype.h> 390227048aSPhilippe Charnier #include <err.h> 4039bb6d1eSPeter Wemm #include <grp.h> 4139bb6d1eSPeter Wemm #include <pwd.h> 4239bb6d1eSPeter Wemm #include <string.h> 430227048aSPhilippe Charnier #include <time.h> 4439bb6d1eSPeter Wemm 4539bb6d1eSPeter Wemm #include <ufs/ufs/dinode.h> 469eb8ec95SAlfred Perlstein #include <ufs/ffs/fs.h> 4739bb6d1eSPeter Wemm 4839bb6d1eSPeter Wemm #include "fsdb.h" 4939bb6d1eSPeter Wemm #include "fsck.h" 5039bb6d1eSPeter Wemm 5139bb6d1eSPeter Wemm char ** 5239bb6d1eSPeter Wemm crack(line, argc) 5339bb6d1eSPeter Wemm char *line; 5439bb6d1eSPeter Wemm int *argc; 5539bb6d1eSPeter Wemm { 5639bb6d1eSPeter Wemm static char *argv[8]; 5739bb6d1eSPeter Wemm int i; 5839bb6d1eSPeter Wemm char *p, *val; 5939bb6d1eSPeter Wemm for (p = line, i = 0; p != NULL && i < 8; i++) { 6039bb6d1eSPeter Wemm while ((val = strsep(&p, " \t\n")) != NULL && *val == '\0') 6139bb6d1eSPeter Wemm /**/; 6239bb6d1eSPeter Wemm if (val) 6339bb6d1eSPeter Wemm argv[i] = val; 6439bb6d1eSPeter Wemm else 6539bb6d1eSPeter Wemm break; 6639bb6d1eSPeter Wemm } 6739bb6d1eSPeter Wemm *argc = i; 6839bb6d1eSPeter Wemm return argv; 6939bb6d1eSPeter Wemm } 7039bb6d1eSPeter Wemm 7139bb6d1eSPeter Wemm int 7239bb6d1eSPeter Wemm argcount(cmdp, argc, argv) 7339bb6d1eSPeter Wemm struct cmdtable *cmdp; 7439bb6d1eSPeter Wemm int argc; 7539bb6d1eSPeter Wemm char *argv[]; 7639bb6d1eSPeter Wemm { 7739bb6d1eSPeter Wemm if (cmdp->minargc == cmdp->maxargc) 7839bb6d1eSPeter Wemm warnx("command `%s' takes %u arguments", cmdp->cmd, cmdp->minargc-1); 7939bb6d1eSPeter Wemm else 8039bb6d1eSPeter Wemm warnx("command `%s' takes from %u to %u arguments", 8139bb6d1eSPeter Wemm cmdp->cmd, cmdp->minargc-1, cmdp->maxargc-1); 8239bb6d1eSPeter Wemm 8339bb6d1eSPeter Wemm warnx("usage: %s: %s", cmdp->cmd, cmdp->helptxt); 8439bb6d1eSPeter Wemm return 1; 8539bb6d1eSPeter Wemm } 8639bb6d1eSPeter Wemm 8739bb6d1eSPeter Wemm void 8839bb6d1eSPeter Wemm printstat(cp, inum, dp) 8939bb6d1eSPeter Wemm const char *cp; 9039bb6d1eSPeter Wemm ino_t inum; 9139bb6d1eSPeter Wemm struct dinode *dp; 9239bb6d1eSPeter Wemm { 9339bb6d1eSPeter Wemm struct group *grp; 9439bb6d1eSPeter Wemm struct passwd *pw; 9539bb6d1eSPeter Wemm char *p; 96962cf4d3SBruce Evans time_t t; 9739bb6d1eSPeter Wemm 9839bb6d1eSPeter Wemm printf("%s: ", cp); 9939bb6d1eSPeter Wemm switch (dp->di_mode & IFMT) { 10039bb6d1eSPeter Wemm case IFDIR: 10139bb6d1eSPeter Wemm puts("directory"); 10239bb6d1eSPeter Wemm break; 10339bb6d1eSPeter Wemm case IFREG: 10439bb6d1eSPeter Wemm puts("regular file"); 10539bb6d1eSPeter Wemm break; 10639bb6d1eSPeter Wemm case IFBLK: 10739bb6d1eSPeter Wemm printf("block special (%d,%d)", 10839bb6d1eSPeter Wemm major(dp->di_rdev), minor(dp->di_rdev)); 10939bb6d1eSPeter Wemm break; 11039bb6d1eSPeter Wemm case IFCHR: 11139bb6d1eSPeter Wemm printf("character special (%d,%d)", 11239bb6d1eSPeter Wemm major(dp->di_rdev), minor(dp->di_rdev)); 11339bb6d1eSPeter Wemm break; 11439bb6d1eSPeter Wemm case IFLNK: 11539bb6d1eSPeter Wemm fputs("symlink",stdout); 11639bb6d1eSPeter Wemm if (dp->di_size > 0 && dp->di_size < MAXSYMLINKLEN && 11739bb6d1eSPeter Wemm dp->di_blocks == 0) 11839bb6d1eSPeter Wemm printf(" to `%.*s'\n", (int) dp->di_size, (char *)dp->di_shortlink); 11939bb6d1eSPeter Wemm else 12039bb6d1eSPeter Wemm putchar('\n'); 12139bb6d1eSPeter Wemm break; 12239bb6d1eSPeter Wemm case IFSOCK: 12339bb6d1eSPeter Wemm puts("socket"); 12439bb6d1eSPeter Wemm break; 12539bb6d1eSPeter Wemm case IFIFO: 12639bb6d1eSPeter Wemm puts("fifo"); 12739bb6d1eSPeter Wemm break; 12839bb6d1eSPeter Wemm } 1297abda51bSBruce Evans printf("I=%lu MODE=%o SIZE=%qu", (u_long)inum, dp->di_mode, dp->di_size); 130962cf4d3SBruce Evans t = dp->di_mtime; 131962cf4d3SBruce Evans p = ctime(&t); 13239bb6d1eSPeter Wemm printf("\n\tMTIME=%15.15s %4.4s [%d nsec]", &p[4], &p[20], 13376863c51SPeter Wemm dp->di_mtimensec); 134962cf4d3SBruce Evans t = dp->di_ctime; 135962cf4d3SBruce Evans p = ctime(&t); 13639bb6d1eSPeter Wemm printf("\n\tCTIME=%15.15s %4.4s [%d nsec]", &p[4], &p[20], 13776863c51SPeter Wemm dp->di_ctimensec); 138962cf4d3SBruce Evans t = dp->di_atime; 139962cf4d3SBruce Evans p = ctime(&t); 14039bb6d1eSPeter Wemm printf("\n\tATIME=%15.15s %4.4s [%d nsec]\n", &p[4], &p[20], 14176863c51SPeter Wemm dp->di_atimensec); 14239bb6d1eSPeter Wemm 1430227048aSPhilippe Charnier if ((pw = getpwuid(dp->di_uid))) 14439bb6d1eSPeter Wemm printf("OWNER=%s ", pw->pw_name); 14539bb6d1eSPeter Wemm else 14639bb6d1eSPeter Wemm printf("OWNUID=%u ", dp->di_uid); 1470227048aSPhilippe Charnier if ((grp = getgrgid(dp->di_gid))) 14839bb6d1eSPeter Wemm printf("GRP=%s ", grp->gr_name); 14939bb6d1eSPeter Wemm else 15039bb6d1eSPeter Wemm printf("GID=%u ", dp->di_gid); 15139bb6d1eSPeter Wemm 15239bb6d1eSPeter Wemm printf("LINKCNT=%hd FLAGS=%#x BLKCNT=%x GEN=%x\n", dp->di_nlink, dp->di_flags, 15339bb6d1eSPeter Wemm dp->di_blocks, dp->di_gen); 15439bb6d1eSPeter Wemm } 15539bb6d1eSPeter Wemm 15639bb6d1eSPeter Wemm int 15739bb6d1eSPeter Wemm checkactive() 15839bb6d1eSPeter Wemm { 15939bb6d1eSPeter Wemm if (!curinode) { 16039bb6d1eSPeter Wemm warnx("no current inode\n"); 16139bb6d1eSPeter Wemm return 0; 16239bb6d1eSPeter Wemm } 16339bb6d1eSPeter Wemm return 1; 16439bb6d1eSPeter Wemm } 16539bb6d1eSPeter Wemm 16639bb6d1eSPeter Wemm int 16739bb6d1eSPeter Wemm checkactivedir() 16839bb6d1eSPeter Wemm { 16939bb6d1eSPeter Wemm if (!curinode) { 17039bb6d1eSPeter Wemm warnx("no current inode\n"); 17139bb6d1eSPeter Wemm return 0; 17239bb6d1eSPeter Wemm } 17339bb6d1eSPeter Wemm if ((curinode->di_mode & IFMT) != IFDIR) { 17439bb6d1eSPeter Wemm warnx("inode %d not a directory", curinum); 17539bb6d1eSPeter Wemm return 0; 17639bb6d1eSPeter Wemm } 17739bb6d1eSPeter Wemm return 1; 17839bb6d1eSPeter Wemm } 17939bb6d1eSPeter Wemm 18039bb6d1eSPeter Wemm int 18139bb6d1eSPeter Wemm printactive() 18239bb6d1eSPeter Wemm { 18339bb6d1eSPeter Wemm if (!checkactive()) 18439bb6d1eSPeter Wemm return 1; 18539bb6d1eSPeter Wemm switch (curinode->di_mode & IFMT) { 18639bb6d1eSPeter Wemm case IFDIR: 18739bb6d1eSPeter Wemm case IFREG: 18839bb6d1eSPeter Wemm case IFBLK: 18939bb6d1eSPeter Wemm case IFCHR: 19039bb6d1eSPeter Wemm case IFLNK: 19139bb6d1eSPeter Wemm case IFSOCK: 19239bb6d1eSPeter Wemm case IFIFO: 19339bb6d1eSPeter Wemm printstat("current inode", curinum, curinode); 19439bb6d1eSPeter Wemm break; 19539bb6d1eSPeter Wemm case 0: 19639bb6d1eSPeter Wemm printf("current inode %d: unallocated inode\n", curinum); 19739bb6d1eSPeter Wemm break; 19839bb6d1eSPeter Wemm default: 19939bb6d1eSPeter Wemm printf("current inode %d: screwy itype 0%o (mode 0%o)?\n", 20039bb6d1eSPeter Wemm curinum, curinode->di_mode & IFMT, curinode->di_mode); 20139bb6d1eSPeter Wemm break; 20239bb6d1eSPeter Wemm } 20339bb6d1eSPeter Wemm return 0; 20439bb6d1eSPeter Wemm } 205