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