fsdbutil.c revision 12048
112048Speter/* $NetBSD: fsdbutil.c,v 1.2 1995/10/08 23:18:12 thorpej Exp $ */ 212048Speter 312048Speter/* 412048Speter * Copyright (c) 1995 John T. Kohl 512048Speter * All rights reserved. 612048Speter * 712048Speter * Redistribution and use in source and binary forms, with or without 812048Speter * modification, are permitted provided that the following conditions 912048Speter * are met: 1012048Speter * 1. Redistributions of source code must retain the above copyright 1112048Speter * notice, this list of conditions and the following disclaimer. 1212048Speter * 2. Redistributions in binary form must reproduce the above copyright 1312048Speter * notice, this list of conditions and the following disclaimer in the 1412048Speter * documentation and/or other materials provided with the distribution. 1512048Speter * 3. The name of the author may not be used to endorse or promote products 1612048Speter * derived from this software without specific prior written permission. 1712048Speter * 1812048Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR 1912048Speter * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 2012048Speter * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 2112048Speter * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 2212048Speter * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 2312048Speter * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 2412048Speter * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2512048Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 2612048Speter * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 2712048Speter * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2812048Speter * POSSIBILITY OF SUCH DAMAGE. 2912048Speter */ 3012048Speter 3112048Speter#ifndef lint 3212048Speterstatic char rcsid[] = "$NetBSD: fsdbutil.c,v 1.2 1995/10/08 23:18:12 thorpej Exp $"; 3312048Speter#endif /* not lint */ 3412048Speter 3512048Speter#include <sys/types.h> 3612048Speter#include <sys/stat.h> 3712048Speter#include <sys/param.h> 3812048Speter#include <sys/time.h> 3912048Speter#include <sys/mount.h> 4012048Speter#include <ctype.h> 4112048Speter#include <fcntl.h> 4212048Speter#include <grp.h> 4312048Speter#include <pwd.h> 4412048Speter#include <stdio.h> 4512048Speter#include <stdlib.h> 4612048Speter#include <string.h> 4712048Speter#include <unistd.h> 4812048Speter 4912048Speter#include <ufs/ufs/dinode.h> 5012048Speter#include <ufs/ffs/fs.h> 5112048Speter 5212048Speter#include "fsdb.h" 5312048Speter#include "fsck.h" 5412048Speter 5512048Speterchar ** 5612048Spetercrack(line, argc) 5712048Speter char *line; 5812048Speter int *argc; 5912048Speter{ 6012048Speter static char *argv[8]; 6112048Speter int i; 6212048Speter char *p, *val; 6312048Speter for (p = line, i = 0; p != NULL && i < 8; i++) { 6412048Speter while ((val = strsep(&p, " \t\n")) != NULL && *val == '\0') 6512048Speter /**/; 6612048Speter if (val) 6712048Speter argv[i] = val; 6812048Speter else 6912048Speter break; 7012048Speter } 7112048Speter *argc = i; 7212048Speter return argv; 7312048Speter} 7412048Speter 7512048Speterint 7612048Speterargcount(cmdp, argc, argv) 7712048Speter struct cmdtable *cmdp; 7812048Speter int argc; 7912048Speter char *argv[]; 8012048Speter{ 8112048Speter if (cmdp->minargc == cmdp->maxargc) 8212048Speter warnx("command `%s' takes %u arguments", cmdp->cmd, cmdp->minargc-1); 8312048Speter else 8412048Speter warnx("command `%s' takes from %u to %u arguments", 8512048Speter cmdp->cmd, cmdp->minargc-1, cmdp->maxargc-1); 8612048Speter 8712048Speter warnx("usage: %s: %s", cmdp->cmd, cmdp->helptxt); 8812048Speter return 1; 8912048Speter} 9012048Speter 9112048Spetervoid 9212048Speterprintstat(cp, inum, dp) 9312048Speter const char *cp; 9412048Speter ino_t inum; 9512048Speter struct dinode *dp; 9612048Speter{ 9712048Speter struct group *grp; 9812048Speter struct passwd *pw; 9912048Speter char *p; 10012048Speter 10112048Speter printf("%s: ", cp); 10212048Speter switch (dp->di_mode & IFMT) { 10312048Speter case IFDIR: 10412048Speter puts("directory"); 10512048Speter break; 10612048Speter case IFREG: 10712048Speter puts("regular file"); 10812048Speter break; 10912048Speter case IFBLK: 11012048Speter printf("block special (%d,%d)", 11112048Speter major(dp->di_rdev), minor(dp->di_rdev)); 11212048Speter break; 11312048Speter case IFCHR: 11412048Speter printf("character special (%d,%d)", 11512048Speter major(dp->di_rdev), minor(dp->di_rdev)); 11612048Speter break; 11712048Speter case IFLNK: 11812048Speter fputs("symlink",stdout); 11912048Speter if (dp->di_size > 0 && dp->di_size < MAXSYMLINKLEN && 12012048Speter dp->di_blocks == 0) 12112048Speter printf(" to `%.*s'\n", (int) dp->di_size, (char *)dp->di_shortlink); 12212048Speter else 12312048Speter putchar('\n'); 12412048Speter break; 12512048Speter case IFSOCK: 12612048Speter puts("socket"); 12712048Speter break; 12812048Speter case IFIFO: 12912048Speter puts("fifo"); 13012048Speter break; 13112048Speter } 13212048Speter printf("I=%lu MODE=%o SIZE=%qu", inum, dp->di_mode, dp->di_size); 13312048Speter p = ctime(&dp->di_mtime); 13412048Speter printf("\n\tMTIME=%15.15s %4.4s [%d nsec]", &p[4], &p[20], 13512048Speter dp->di_mtimensec); 13612048Speter p = ctime(&dp->di_ctime); 13712048Speter printf("\n\tCTIME=%15.15s %4.4s [%d nsec]", &p[4], &p[20], 13812048Speter dp->di_ctimensec); 13912048Speter p = ctime(&dp->di_atime); 14012048Speter printf("\n\tATIME=%15.15s %4.4s [%d nsec]\n", &p[4], &p[20], 14112048Speter dp->di_atimensec); 14212048Speter 14312048Speter if (pw = getpwuid(dp->di_uid)) 14412048Speter printf("OWNER=%s ", pw->pw_name); 14512048Speter else 14612048Speter printf("OWNUID=%u ", dp->di_uid); 14712048Speter if (grp = getgrgid(dp->di_gid)) 14812048Speter printf("GRP=%s ", grp->gr_name); 14912048Speter else 15012048Speter printf("GID=%u ", dp->di_gid); 15112048Speter 15212048Speter printf("LINKCNT=%hd FLAGS=%#x BLKCNT=%x GEN=%x\n", dp->di_nlink, dp->di_flags, 15312048Speter dp->di_blocks, dp->di_gen); 15412048Speter} 15512048Speter 15612048Speterint 15712048Spetercheckactive() 15812048Speter{ 15912048Speter if (!curinode) { 16012048Speter warnx("no current inode\n"); 16112048Speter return 0; 16212048Speter } 16312048Speter return 1; 16412048Speter} 16512048Speter 16612048Speterint 16712048Spetercheckactivedir() 16812048Speter{ 16912048Speter if (!curinode) { 17012048Speter warnx("no current inode\n"); 17112048Speter return 0; 17212048Speter } 17312048Speter if ((curinode->di_mode & IFMT) != IFDIR) { 17412048Speter warnx("inode %d not a directory", curinum); 17512048Speter return 0; 17612048Speter } 17712048Speter return 1; 17812048Speter} 17912048Speter 18012048Speterint 18112048Speterprintactive() 18212048Speter{ 18312048Speter if (!checkactive()) 18412048Speter return 1; 18512048Speter switch (curinode->di_mode & IFMT) { 18612048Speter case IFDIR: 18712048Speter case IFREG: 18812048Speter case IFBLK: 18912048Speter case IFCHR: 19012048Speter case IFLNK: 19112048Speter case IFSOCK: 19212048Speter case IFIFO: 19312048Speter printstat("current inode", curinum, curinode); 19412048Speter break; 19512048Speter case 0: 19612048Speter printf("current inode %d: unallocated inode\n", curinum); 19712048Speter break; 19812048Speter default: 19912048Speter printf("current inode %d: screwy itype 0%o (mode 0%o)?\n", 20012048Speter curinum, curinode->di_mode & IFMT, curinode->di_mode); 20112048Speter break; 20212048Speter } 20312048Speter return 0; 20412048Speter} 205