xref: /freebsd/sbin/fsdb/fsdbutil.c (revision 8660ce229c04f3553fbeaa4ea10dfe9bf384ad93)
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