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 369eb8ec95SAlfred Perlstein #include <sys/param.h> 3739bb6d1eSPeter Wemm #include <ctype.h> 380227048aSPhilippe Charnier #include <err.h> 3939bb6d1eSPeter Wemm #include <grp.h> 4039bb6d1eSPeter Wemm #include <pwd.h> 4139bb6d1eSPeter Wemm #include <string.h> 420227048aSPhilippe Charnier #include <time.h> 4339bb6d1eSPeter Wemm 4439bb6d1eSPeter Wemm #include <ufs/ufs/dinode.h> 459eb8ec95SAlfred Perlstein #include <ufs/ffs/fs.h> 4639bb6d1eSPeter Wemm 4739bb6d1eSPeter Wemm #include "fsdb.h" 4839bb6d1eSPeter Wemm #include "fsck.h" 4939bb6d1eSPeter Wemm 5039bb6d1eSPeter Wemm char ** 5139bb6d1eSPeter Wemm crack(line, argc) 5239bb6d1eSPeter Wemm char *line; 5339bb6d1eSPeter Wemm int *argc; 5439bb6d1eSPeter Wemm { 5539bb6d1eSPeter Wemm static char *argv[8]; 5639bb6d1eSPeter Wemm int i; 5739bb6d1eSPeter Wemm char *p, *val; 5839bb6d1eSPeter Wemm for (p = line, i = 0; p != NULL && i < 8; i++) { 5939bb6d1eSPeter Wemm while ((val = strsep(&p, " \t\n")) != NULL && *val == '\0') 6039bb6d1eSPeter Wemm /**/; 6139bb6d1eSPeter Wemm if (val) 6239bb6d1eSPeter Wemm argv[i] = val; 6339bb6d1eSPeter Wemm else 6439bb6d1eSPeter Wemm break; 6539bb6d1eSPeter Wemm } 6639bb6d1eSPeter Wemm *argc = i; 6739bb6d1eSPeter Wemm return argv; 6839bb6d1eSPeter Wemm } 6939bb6d1eSPeter Wemm 708660ce22SBrian Feldman char ** 718660ce22SBrian Feldman recrack(line, argc, argc_max) 728660ce22SBrian Feldman char *line; 738660ce22SBrian Feldman int *argc; 748660ce22SBrian Feldman int argc_max; 758660ce22SBrian Feldman { 768660ce22SBrian Feldman static char *argv[8]; 778660ce22SBrian Feldman int i; 788660ce22SBrian Feldman char *p, *val; 798660ce22SBrian Feldman for (p = line, i = 0; p != NULL && i < 8 && i < argc_max - 1; i++) { 808660ce22SBrian Feldman while ((val = strsep(&p, " \t\n")) != NULL && *val == '\0') 818660ce22SBrian Feldman /**/; 828660ce22SBrian Feldman if (val) 838660ce22SBrian Feldman argv[i] = val; 848660ce22SBrian Feldman else 858660ce22SBrian Feldman break; 868660ce22SBrian Feldman } 878660ce22SBrian Feldman argv[i] = argv[i - 1] + strlen(argv[i - 1]) + 1; 888660ce22SBrian Feldman argv[i][strcspn(argv[i], "\n")] = '\0'; 898660ce22SBrian Feldman *argc = i + 1; 908660ce22SBrian Feldman printf("returning with argc %u\n", *argc); 918660ce22SBrian Feldman return argv; 928660ce22SBrian Feldman } 938660ce22SBrian Feldman 9439bb6d1eSPeter Wemm int 9539bb6d1eSPeter Wemm argcount(cmdp, argc, argv) 9639bb6d1eSPeter Wemm struct cmdtable *cmdp; 9739bb6d1eSPeter Wemm int argc; 9839bb6d1eSPeter Wemm char *argv[]; 9939bb6d1eSPeter Wemm { 10039bb6d1eSPeter Wemm if (cmdp->minargc == cmdp->maxargc) 1018660ce22SBrian Feldman warnx("command `%s' takes %u arguments, got %u", cmdp->cmd, 1028660ce22SBrian Feldman cmdp->minargc-1, argc); 10339bb6d1eSPeter Wemm else 10439bb6d1eSPeter Wemm warnx("command `%s' takes from %u to %u arguments", 10539bb6d1eSPeter Wemm cmdp->cmd, cmdp->minargc-1, cmdp->maxargc-1); 10639bb6d1eSPeter Wemm 10739bb6d1eSPeter Wemm warnx("usage: %s: %s", cmdp->cmd, cmdp->helptxt); 10839bb6d1eSPeter Wemm return 1; 10939bb6d1eSPeter Wemm } 11039bb6d1eSPeter Wemm 11139bb6d1eSPeter Wemm void 11239bb6d1eSPeter Wemm printstat(cp, inum, dp) 11339bb6d1eSPeter Wemm const char *cp; 11439bb6d1eSPeter Wemm ino_t inum; 11539bb6d1eSPeter Wemm struct dinode *dp; 11639bb6d1eSPeter Wemm { 11739bb6d1eSPeter Wemm struct group *grp; 11839bb6d1eSPeter Wemm struct passwd *pw; 11939bb6d1eSPeter Wemm char *p; 120962cf4d3SBruce Evans time_t t; 12139bb6d1eSPeter Wemm 12239bb6d1eSPeter Wemm printf("%s: ", cp); 12339bb6d1eSPeter Wemm switch (dp->di_mode & IFMT) { 12439bb6d1eSPeter Wemm case IFDIR: 12539bb6d1eSPeter Wemm puts("directory"); 12639bb6d1eSPeter Wemm break; 12739bb6d1eSPeter Wemm case IFREG: 12839bb6d1eSPeter Wemm puts("regular file"); 12939bb6d1eSPeter Wemm break; 13039bb6d1eSPeter Wemm case IFBLK: 13139bb6d1eSPeter Wemm printf("block special (%d,%d)", 13239bb6d1eSPeter Wemm major(dp->di_rdev), minor(dp->di_rdev)); 13339bb6d1eSPeter Wemm break; 13439bb6d1eSPeter Wemm case IFCHR: 13539bb6d1eSPeter Wemm printf("character special (%d,%d)", 13639bb6d1eSPeter Wemm major(dp->di_rdev), minor(dp->di_rdev)); 13739bb6d1eSPeter Wemm break; 13839bb6d1eSPeter Wemm case IFLNK: 13939bb6d1eSPeter Wemm fputs("symlink",stdout); 14039bb6d1eSPeter Wemm if (dp->di_size > 0 && dp->di_size < MAXSYMLINKLEN && 14139bb6d1eSPeter Wemm dp->di_blocks == 0) 14239bb6d1eSPeter Wemm printf(" to `%.*s'\n", (int) dp->di_size, (char *)dp->di_shortlink); 14339bb6d1eSPeter Wemm else 14439bb6d1eSPeter Wemm putchar('\n'); 14539bb6d1eSPeter Wemm break; 14639bb6d1eSPeter Wemm case IFSOCK: 14739bb6d1eSPeter Wemm puts("socket"); 14839bb6d1eSPeter Wemm break; 14939bb6d1eSPeter Wemm case IFIFO: 15039bb6d1eSPeter Wemm puts("fifo"); 15139bb6d1eSPeter Wemm break; 15239bb6d1eSPeter Wemm } 1537abda51bSBruce Evans printf("I=%lu MODE=%o SIZE=%qu", (u_long)inum, dp->di_mode, dp->di_size); 154962cf4d3SBruce Evans t = dp->di_mtime; 155962cf4d3SBruce Evans p = ctime(&t); 15639bb6d1eSPeter Wemm printf("\n\tMTIME=%15.15s %4.4s [%d nsec]", &p[4], &p[20], 15776863c51SPeter Wemm dp->di_mtimensec); 158962cf4d3SBruce Evans t = dp->di_ctime; 159962cf4d3SBruce Evans p = ctime(&t); 16039bb6d1eSPeter Wemm printf("\n\tCTIME=%15.15s %4.4s [%d nsec]", &p[4], &p[20], 16176863c51SPeter Wemm dp->di_ctimensec); 162962cf4d3SBruce Evans t = dp->di_atime; 163962cf4d3SBruce Evans p = ctime(&t); 16439bb6d1eSPeter Wemm printf("\n\tATIME=%15.15s %4.4s [%d nsec]\n", &p[4], &p[20], 16576863c51SPeter Wemm dp->di_atimensec); 16639bb6d1eSPeter Wemm 1670227048aSPhilippe Charnier if ((pw = getpwuid(dp->di_uid))) 16839bb6d1eSPeter Wemm printf("OWNER=%s ", pw->pw_name); 16939bb6d1eSPeter Wemm else 17039bb6d1eSPeter Wemm printf("OWNUID=%u ", dp->di_uid); 1710227048aSPhilippe Charnier if ((grp = getgrgid(dp->di_gid))) 17239bb6d1eSPeter Wemm printf("GRP=%s ", grp->gr_name); 17339bb6d1eSPeter Wemm else 17439bb6d1eSPeter Wemm printf("GID=%u ", dp->di_gid); 17539bb6d1eSPeter Wemm 17639bb6d1eSPeter Wemm printf("LINKCNT=%hd FLAGS=%#x BLKCNT=%x GEN=%x\n", dp->di_nlink, dp->di_flags, 17739bb6d1eSPeter Wemm dp->di_blocks, dp->di_gen); 17839bb6d1eSPeter Wemm } 17939bb6d1eSPeter Wemm 18039bb6d1eSPeter Wemm int 18139bb6d1eSPeter Wemm checkactive() 18239bb6d1eSPeter Wemm { 18339bb6d1eSPeter Wemm if (!curinode) { 18439bb6d1eSPeter Wemm warnx("no current inode\n"); 18539bb6d1eSPeter Wemm return 0; 18639bb6d1eSPeter Wemm } 18739bb6d1eSPeter Wemm return 1; 18839bb6d1eSPeter Wemm } 18939bb6d1eSPeter Wemm 19039bb6d1eSPeter Wemm int 19139bb6d1eSPeter Wemm checkactivedir() 19239bb6d1eSPeter Wemm { 19339bb6d1eSPeter Wemm if (!curinode) { 19439bb6d1eSPeter Wemm warnx("no current inode\n"); 19539bb6d1eSPeter Wemm return 0; 19639bb6d1eSPeter Wemm } 19739bb6d1eSPeter Wemm if ((curinode->di_mode & IFMT) != IFDIR) { 19839bb6d1eSPeter Wemm warnx("inode %d not a directory", curinum); 19939bb6d1eSPeter Wemm return 0; 20039bb6d1eSPeter Wemm } 20139bb6d1eSPeter Wemm return 1; 20239bb6d1eSPeter Wemm } 20339bb6d1eSPeter Wemm 20439bb6d1eSPeter Wemm int 20539bb6d1eSPeter Wemm printactive() 20639bb6d1eSPeter Wemm { 20739bb6d1eSPeter Wemm if (!checkactive()) 20839bb6d1eSPeter Wemm return 1; 20939bb6d1eSPeter Wemm switch (curinode->di_mode & IFMT) { 21039bb6d1eSPeter Wemm case IFDIR: 21139bb6d1eSPeter Wemm case IFREG: 21239bb6d1eSPeter Wemm case IFBLK: 21339bb6d1eSPeter Wemm case IFCHR: 21439bb6d1eSPeter Wemm case IFLNK: 21539bb6d1eSPeter Wemm case IFSOCK: 21639bb6d1eSPeter Wemm case IFIFO: 21739bb6d1eSPeter Wemm printstat("current inode", curinum, curinode); 21839bb6d1eSPeter Wemm break; 21939bb6d1eSPeter Wemm case 0: 22039bb6d1eSPeter Wemm printf("current inode %d: unallocated inode\n", curinum); 22139bb6d1eSPeter Wemm break; 22239bb6d1eSPeter Wemm default: 22339bb6d1eSPeter Wemm printf("current inode %d: screwy itype 0%o (mode 0%o)?\n", 22439bb6d1eSPeter Wemm curinum, curinode->di_mode & IFMT, curinode->di_mode); 22539bb6d1eSPeter Wemm break; 22639bb6d1eSPeter Wemm } 22739bb6d1eSPeter Wemm return 0; 22839bb6d1eSPeter Wemm } 229