fsdbutil.c revision 23854
1251876Speter/* $NetBSD: fsdbutil.c,v 1.2 1995/10/08 23:18:12 thorpej Exp $ */ 2251876Speter 3251876Speter/* 4251876Speter * Copyright (c) 1995 John T. Kohl 5251876Speter * All rights reserved. 6251876Speter * 7251876Speter * Redistribution and use in source and binary forms, with or without 8251876Speter * modification, are permitted provided that the following conditions 9251876Speter * are met: 10251876Speter * 1. Redistributions of source code must retain the above copyright 11251876Speter * notice, this list of conditions and the following disclaimer. 12251876Speter * 2. Redistributions in binary form must reproduce the above copyright 13251876Speter * notice, this list of conditions and the following disclaimer in the 14251876Speter * documentation and/or other materials provided with the distribution. 15251876Speter * 3. The name of the author may not be used to endorse or promote products 16251876Speter * derived from this software without specific prior written permission. 17251876Speter * 18251876Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR 19251876Speter * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20251876Speter * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21251876Speter * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 22251876Speter * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23251876Speter * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24251876Speter * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25251876Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 26251876Speter * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 27251876Speter * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28251876Speter * POSSIBILITY OF SUCH DAMAGE. 29251876Speter */ 30251876Speter 31251876Speter#ifndef lint 32251876Speterstatic char rcsid[] = "$Id: fsdbutil.c,v 1.5 1997/03/13 12:44:53 peter Exp $"; 33251876Speter#endif /* not lint */ 34251876Speter 35251876Speter#include <sys/types.h> 36251876Speter#include <sys/stat.h> 37251876Speter#include <sys/param.h> 38251876Speter#include <sys/time.h> 39251876Speter#include <sys/mount.h> 40251876Speter#include <ctype.h> 41251876Speter#include <fcntl.h> 42251876Speter#include <grp.h> 43251876Speter#include <pwd.h> 44251876Speter#include <stdio.h> 45251876Speter#include <stdlib.h> 46251876Speter#include <string.h> 47251876Speter#include <unistd.h> 48251876Speter 49251876Speter#include <ufs/ufs/dinode.h> 50251876Speter#include <ufs/ffs/fs.h> 51251876Speter 52251876Speter#include "fsdb.h" 53251876Speter#include "fsck.h" 54251876Speter 55251876Speterchar ** 56251876Spetercrack(line, argc) 57251876Speter char *line; 58251876Speter int *argc; 59251876Speter{ 60251876Speter static char *argv[8]; 61251876Speter int i; 62251876Speter char *p, *val; 63251876Speter for (p = line, i = 0; p != NULL && i < 8; i++) { 64251876Speter while ((val = strsep(&p, " \t\n")) != NULL && *val == '\0') 65251876Speter /**/; 66251876Speter if (val) 67251876Speter argv[i] = val; 68251876Speter else 69251876Speter break; 70251876Speter } 71251876Speter *argc = i; 72251876Speter return argv; 73251876Speter} 74251876Speter 75251876Speterint 76251876Speterargcount(cmdp, argc, argv) 77251876Speter struct cmdtable *cmdp; 78251876Speter int argc; 79251876Speter char *argv[]; 80251876Speter{ 81251876Speter if (cmdp->minargc == cmdp->maxargc) 82251876Speter warnx("command `%s' takes %u arguments", cmdp->cmd, cmdp->minargc-1); 83251876Speter else 84251876Speter warnx("command `%s' takes from %u to %u arguments", 85251876Speter cmdp->cmd, cmdp->minargc-1, cmdp->maxargc-1); 86251876Speter 87251876Speter warnx("usage: %s: %s", cmdp->cmd, cmdp->helptxt); 88251876Speter return 1; 89251876Speter} 90251876Speter 91251876Spetervoid 92251876Speterprintstat(cp, inum, dp) 93251876Speter const char *cp; 94251876Speter ino_t inum; 95251876Speter struct dinode *dp; 96251876Speter{ 97251876Speter struct group *grp; 98251876Speter struct passwd *pw; 99251876Speter char *p; 100251876Speter time_t t; 101251876Speter 102251876Speter printf("%s: ", cp); 103251876Speter switch (dp->di_mode & IFMT) { 104251876Speter case IFDIR: 105251876Speter puts("directory"); 106251876Speter break; 107251876Speter case IFREG: 108251876Speter puts("regular file"); 109251876Speter break; 110251876Speter case IFBLK: 111251876Speter printf("block special (%d,%d)", 112251876Speter major(dp->di_rdev), minor(dp->di_rdev)); 113251876Speter break; 114251876Speter case IFCHR: 115251876Speter printf("character special (%d,%d)", 116251876Speter major(dp->di_rdev), minor(dp->di_rdev)); 117251876Speter break; 118251876Speter case IFLNK: 119251876Speter fputs("symlink",stdout); 120251876Speter if (dp->di_size > 0 && dp->di_size < MAXSYMLINKLEN && 121251876Speter dp->di_blocks == 0) 122251876Speter printf(" to `%.*s'\n", (int) dp->di_size, (char *)dp->di_shortlink); 123251876Speter else 124251876Speter putchar('\n'); 125251876Speter break; 126251876Speter case IFSOCK: 127251876Speter puts("socket"); 128251876Speter break; 129251876Speter case IFIFO: 130251876Speter puts("fifo"); 131251876Speter break; 132251876Speter } 133251876Speter printf("I=%lu MODE=%o SIZE=%qu", inum, dp->di_mode, dp->di_size); 134251876Speter t = dp->di_mtime; 135251876Speter p = ctime(&t); 136251876Speter printf("\n\tMTIME=%15.15s %4.4s [%d nsec]", &p[4], &p[20], 137251876Speter dp->di_mtimensec); 138251876Speter t = dp->di_ctime; 139251876Speter p = ctime(&t); 140251876Speter printf("\n\tCTIME=%15.15s %4.4s [%d nsec]", &p[4], &p[20], 141251876Speter dp->di_ctimensec); 142251876Speter t = dp->di_atime; 143251876Speter p = ctime(&t); 144251876Speter printf("\n\tATIME=%15.15s %4.4s [%d nsec]\n", &p[4], &p[20], 145251876Speter dp->di_atimensec); 146251876Speter 147251876Speter if (pw = getpwuid(dp->di_uid)) 148251876Speter printf("OWNER=%s ", pw->pw_name); 149251876Speter else 150251876Speter printf("OWNUID=%u ", dp->di_uid); 151251876Speter if (grp = getgrgid(dp->di_gid)) 152251876Speter printf("GRP=%s ", grp->gr_name); 153251876Speter else 154251876Speter printf("GID=%u ", dp->di_gid); 155251876Speter 156251876Speter printf("LINKCNT=%hd FLAGS=%#x BLKCNT=%x GEN=%x\n", dp->di_nlink, dp->di_flags, 157251876Speter dp->di_blocks, dp->di_gen); 158251876Speter} 159251876Speter 160251876Speterint 161251876Spetercheckactive() 162251876Speter{ 163251876Speter if (!curinode) { 164251876Speter warnx("no current inode\n"); 165251876Speter return 0; 166251876Speter } 167251876Speter return 1; 168251876Speter} 169251876Speter 170251876Speterint 171251876Spetercheckactivedir() 172251876Speter{ 173251876Speter if (!curinode) { 174251876Speter warnx("no current inode\n"); 175251876Speter return 0; 176251876Speter } 177251876Speter if ((curinode->di_mode & IFMT) != IFDIR) { 178251876Speter warnx("inode %d not a directory", curinum); 179251876Speter return 0; 180251876Speter } 181251876Speter return 1; 182251876Speter} 183251876Speter 184251876Speterint 185251876Speterprintactive() 186251876Speter{ 187251876Speter if (!checkactive()) 188251876Speter return 1; 189251876Speter switch (curinode->di_mode & IFMT) { 190251876Speter case IFDIR: 191251876Speter case IFREG: 192251876Speter case IFBLK: 193251876Speter case IFCHR: 194251876Speter case IFLNK: 195251876Speter case IFSOCK: 196251876Speter case IFIFO: 197251876Speter printstat("current inode", curinum, curinode); 198251876Speter break; 199251876Speter case 0: 200251876Speter printf("current inode %d: unallocated inode\n", curinum); 201251876Speter break; 202251876Speter default: 203251876Speter printf("current inode %d: screwy itype 0%o (mode 0%o)?\n", 204251876Speter curinum, curinode->di_mode & IFMT, curinode->di_mode); 205251876Speter break; 206251876Speter } 207251876Speter return 0; 208251876Speter} 209251876Speter