Implement a -r option to fsdb(8), ``read/only''.

This commit is contained in:
Joerg Wunsch 1997-04-15 09:02:48 +00:00
parent 992b8e3ad2
commit 36b8baa315
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=24956
3 changed files with 63 additions and 45 deletions

View File

@ -26,7 +26,7 @@
.\" ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.\" $Id$
.\" $Id: fsdb.8,v 1.6 1997/02/22 14:32:25 peter Exp $
.\"
.Dd September 14, 1995
.Dt FSDB 8
@ -38,6 +38,7 @@
.Nm
.Op Fl d
.Op Fl f
.Op Fl r
.Ar fsname
.Sh DESCRIPTION
.Nm
@ -66,6 +67,11 @@ code).
The
.Fl f
option is left for historical reasons and has no meaning.
.Pp
Option
.Fl r
opens the filesystem read/only, and disables all commands that would
write to it.
.Sh COMMANDS
Besides the built-in
.Xr libedit 3

View File

@ -29,7 +29,7 @@
*/
#ifndef lint
static char rcsid[] = "$Id$";
static char rcsid[] = "$Id: fsdb.c,v 1.7 1997/03/13 12:44:51 peter Exp $";
#endif /* not lint */
#include <sys/types.h>
@ -63,10 +63,11 @@ int cmdloop __P((void));
void
usage()
{
errx(1, "usage: %s [-d] -f <fsname>", __progname);
errx(1, "usage: %s [-d] [-r] -f <fsname>", __progname);
}
int returntosingle = 0;
char nflag = 0;
/*
* We suck in lots of fsck code, and just pick & choose the stuff we want.
@ -83,7 +84,7 @@ main(argc, argv)
char *fsys = NULL;
struct stat stb;
while (-1 != (ch = getopt(argc, argv, "f:d"))) {
while (-1 != (ch = getopt(argc, argv, "f:dr"))) {
switch (ch) {
case 'f':
fsys = optarg;
@ -91,6 +92,9 @@ main(argc, argv)
case 'd':
debug++;
break;
case 'r':
nflag++; /* "no" in fsck, readonly for us */
break;
default:
usage();
}
@ -106,15 +110,17 @@ main(argc, argv)
if (!setup(fsys))
errx(1, "cannot set up file system `%s'", fsys);
printf("Editing file system `%s'\nLast Mounted on %s\n", fsys,
sblock.fs_fsmnt);
printf("%s file system `%s'\nLast Mounted on %s\n",
nflag? "Examining": "Editing", fsys, sblock.fs_fsmnt);
rval = cmdloop();
sblock.fs_clean = 0; /* mark it dirty */
sbdirty();
ckfini(0);
printf("*** FILE SYSTEM MARKED DIRTY\n");
printf("*** BE SURE TO RUN FSCK TO CLEAN UP ANY DAMAGE\n");
printf("*** IF IT WAS MOUNTED, RE-MOUNT WITH -u -o reload\n");
if (!nflag) {
sblock.fs_clean = 0; /* mark it dirty */
sbdirty();
ckfini(0);
printf("*** FILE SYSTEM MARKED DIRTY\n");
printf("*** BE SURE TO RUN FSCK TO CLEAN UP ANY DAMAGE\n");
printf("*** IF IT WAS MOUNTED, RE-MOUNT WITH -u -o reload\n");
}
exit(rval);
}
@ -150,37 +156,37 @@ CMDFUNC(chinum); /* Change inode # of dirent */
CMDFUNC(chname); /* Change dirname of dirent */
struct cmdtable cmds[] = {
{ "help", "Print out help", 1, 1, helpfn },
{ "?", "Print out help", 1, 1, helpfn },
{ "inode", "Set active inode to INUM", 2, 2, focus },
{ "clri", "Clear inode INUM", 2, 2, zapi },
{ "lookup", "Set active inode by looking up NAME", 2, 2, focusname },
{ "cd", "Set active inode by looking up NAME", 2, 2, focusname },
{ "back", "Go to previous active inode", 1, 1, back },
{ "active", "Print active inode", 1, 1, active },
{ "print", "Print active inode", 1, 1, active },
{ "uplink", "Increment link count", 1, 1, uplink },
{ "downlink", "Decrement link count", 1, 1, downlink },
{ "linkcount", "Set link count to COUNT", 2, 2, linkcount },
{ "ls", "List current inode as directory", 1, 1, ls },
{ "rm", "Remove NAME from current inode directory", 2, 2, rm },
{ "del", "Remove NAME from current inode directory", 2, 2, rm },
{ "ln", "Hardlink INO into current inode directory as NAME", 3, 3, ln },
{ "chinum", "Change dir entry number INDEX to INUM", 3, 3, chinum },
{ "chname", "Change dir entry number INDEX to NAME", 3, 3, chname },
{ "chtype", "Change type of current inode to TYPE", 2, 2, newtype },
{ "chmod", "Change mode of current inode to MODE", 2, 2, chmode },
{ "chlen", "Change length of current inode to LENGTH", 2, 2, chlen },
{ "chown", "Change owner of current inode to OWNER", 2, 2, chowner },
{ "chgrp", "Change group of current inode to GROUP", 2, 2, chgroup },
{ "chflags", "Change flags of current inode to FLAGS", 2, 2, chaflags },
{ "chgen", "Change generation number of current inode to GEN", 2, 2, chgen },
{ "mtime", "Change mtime of current inode to MTIME", 2, 2, chmtime },
{ "ctime", "Change ctime of current inode to CTIME", 2, 2, chctime },
{ "atime", "Change atime of current inode to ATIME", 2, 2, chatime },
{ "quit", "Exit", 1, 1, quit },
{ "q", "Exit", 1, 1, quit },
{ "exit", "Exit", 1, 1, quit },
{ "help", "Print out help", 1, 1, FL_RO, helpfn },
{ "?", "Print out help", 1, 1, FL_RO, helpfn },
{ "inode", "Set active inode to INUM", 2, 2, FL_RO, focus },
{ "clri", "Clear inode INUM", 2, 2, FL_WR, zapi },
{ "lookup", "Set active inode by looking up NAME", 2, 2, FL_RO, focusname },
{ "cd", "Set active inode by looking up NAME", 2, 2, FL_RO, focusname },
{ "back", "Go to previous active inode", 1, 1, FL_RO, back },
{ "active", "Print active inode", 1, 1, FL_RO, active },
{ "print", "Print active inode", 1, 1, FL_RO, active },
{ "uplink", "Increment link count", 1, 1, FL_WR, uplink },
{ "downlink", "Decrement link count", 1, 1, FL_WR, downlink },
{ "linkcount", "Set link count to COUNT", 2, 2, FL_WR, linkcount },
{ "ls", "List current inode as directory", 1, 1, FL_RO, ls },
{ "rm", "Remove NAME from current inode directory", 2, 2, FL_WR, rm },
{ "del", "Remove NAME from current inode directory", 2, 2, FL_WR, rm },
{ "ln", "Hardlink INO into current inode directory as NAME", 3, 3, FL_WR, ln },
{ "chinum", "Change dir entry number INDEX to INUM", 3, 3, FL_WR, chinum },
{ "chname", "Change dir entry number INDEX to NAME", 3, 3, FL_WR, chname },
{ "chtype", "Change type of current inode to TYPE", 2, 2, FL_WR, newtype },
{ "chmod", "Change mode of current inode to MODE", 2, 2, FL_WR, chmode },
{ "chlen", "Change length of current inode to LENGTH", 2, 2, FL_WR, chlen },
{ "chown", "Change owner of current inode to OWNER", 2, 2, FL_WR, chowner },
{ "chgrp", "Change group of current inode to GROUP", 2, 2, FL_WR, chgroup },
{ "chflags", "Change flags of current inode to FLAGS", 2, 2, FL_WR, chaflags },
{ "chgen", "Change generation number of current inode to GEN", 2, 2, FL_WR, chgen },
{ "mtime", "Change mtime of current inode to MTIME", 2, 2, FL_WR, chmtime },
{ "ctime", "Change ctime of current inode to CTIME", 2, 2, FL_WR, chctime },
{ "atime", "Change atime of current inode to ATIME", 2, 2, FL_WR, chatime },
{ "quit", "Exit", 1, 1, FL_RO, quit },
{ "q", "Exit", 1, 1, FL_RO, quit },
{ "exit", "Exit", 1, 1, FL_RO, quit },
{ NULL, 0, 0, 0 },
};
@ -253,7 +259,10 @@ cmdloop()
known = 0;
for (cmdp = cmds; cmdp->cmd; cmdp++) {
if (!strcmp(cmdp->cmd, cmd_argv[0])) {
if (cmd_argc >= cmdp->minargc &&
if ((cmdp->flags & FL_WR) == FL_WR && nflag)
warnx("`%s' requires write access", cmd_argv[0]),
rval = 1;
else if (cmd_argc >= cmdp->minargc &&
cmd_argc <= cmdp->maxargc)
rval = (*cmdp->handler)(cmd_argc, cmd_argv);
else

View File

@ -27,7 +27,7 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* $Id$
* $Id: fsdb.h,v 1.2 1997/03/13 12:44:52 peter Exp $
*/
extern int bread __P((int fd, char *buf, daddr_t blk, long size));
@ -45,6 +45,9 @@ struct cmdtable {
const char *helptxt;
unsigned int minargc;
unsigned int maxargc;
unsigned int flags;
#define FL_RO 0x0000 /* for symmetry */
#define FL_WR 0x0001 /* wants to write */
int (*handler) __P((int argc, char *argv[]));
};
extern struct dinode *curinode;