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