From 87d35aadd9d2874910b7b34e0724b0eef50df84f Mon Sep 17 00:00:00 2001 From: Juli Mallett Date: Sun, 19 Jan 2003 10:25:11 +0000 Subject: Add support to marshal a filesystem to a newfs(8) command that could be used to create it. A small number of options are not marshalled as they are things it would be dumb to spit out, as they are used by internal computations, and newfs may change them, or they may not be directly apparent. --- sbin/dumpfs/dumpfs.c | 99 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 83 insertions(+), 16 deletions(-) (limited to 'sbin/dumpfs/dumpfs.c') diff --git a/sbin/dumpfs/dumpfs.c b/sbin/dumpfs/dumpfs.c index af721ec43c57..0db6420d98b4 100644 --- a/sbin/dumpfs/dumpfs.c +++ b/sbin/dumpfs/dumpfs.c @@ -69,6 +69,7 @@ static const char rcsid[] = #include #include #include +#include #include #include #include @@ -80,26 +81,47 @@ struct uufsd disk; int dumpfs(const char *); int dumpcg(void); +int marshal(const char *); void pbits(void *, int); +void ufserr(const char *); void usage(void) __dead2; int main(int argc, char *argv[]) { - int eval; + const char *name; + int ch, domarshal, eval; - eval = 0; + domarshal = eval = 0; - while (getopt(argc, argv, "") != -1) - usage(); + while ((ch = getopt(argc, argv, "m")) != -1) { + switch (ch) { + case 'm': + domarshal = 1; + break; + case '?': + default: + usage(); + } + } argc -= optind; argv += optind; if (argc < 1) usage(); - while (*argv != NULL) - eval |= dumpfs(*argv++); + while ((name = *argv++) != NULL) { + if (ufs_disk_fillout(&disk, name) == -1) { + ufserr(name); + eval |= 1; + continue; + } + if (domarshal) + eval |= marshal(name); + else + eval |= dumpfs(name); + ufs_disk_close(&disk); + } exit(eval); } @@ -110,9 +132,6 @@ dumpfs(const char *name) int64_t fssize; int i; - if (ufs_disk_fillout(&disk, name) == -1) - goto err; - switch (disk.d_ufs) { case 2: fssize = afs.fs_size; @@ -231,14 +250,9 @@ dumpfs(const char *name) if (i == -1 || dumpcg()) goto err; } - ufs_disk_close(&disk); return (0); -err: if (disk.d_error != NULL) - warnx("%s: %s", name, disk.d_error); - else if (errno) - warn("%s", name); - ufs_disk_close(&disk); +err: ufserr(name); return (1); } @@ -302,6 +316,50 @@ dumpcg(void) return (0); } +int +marshal(const char *name) +{ + struct fs *fs; + + fs = &disk.d_fs; + + printf("# newfs command for %s (%s)\n", name, disk.d_name); + printf("newfs "); + printf("-O %d ", disk.d_ufs); + if (fs->fs_flags & FS_DOSOFTDEP) + printf("-U "); + printf("-a %d ", fs->fs_maxcontig); + printf("-b %d ", fs->fs_bsize); + /* -c is dumb */ + printf("-d %d ", fs->fs_maxbsize); + printf("-e %d ", fs->fs_maxbpg); + printf("-f %d ", fs->fs_fsize); + printf("-g %d ", fs->fs_avgfilesize); + printf("-h %d ", fs->fs_avgfpdir); + /* -i is dumb */ + /* -j..l unimplemented */ + printf("-m %d ", fs->fs_minfree); + /* -n unimplemented */ + printf("-o "); + switch (fs->fs_optim) { + case FS_OPTSPACE: + printf("space "); + break; + case FS_OPTTIME: + printf("time "); + break; + default: + printf("unknown "); + break; + } + /* -p..r unimplemented */ + printf("-s %jd ", (intmax_t)fs->fs_size); + printf("%s ", disk.d_name); + printf("\n"); + + return 0; +} + void pbits(void *vp, int max) { @@ -324,9 +382,18 @@ pbits(void *vp, int max) printf("\n"); } +void +ufserr(const char *name) +{ + if (disk.d_error != NULL) + warnx("%s: %s", name, disk.d_error); + else if (errno) + warn("%s", name); +} + void usage(void) { - (void)fprintf(stderr, "usage: dumpfs filesys | device\n"); + (void)fprintf(stderr, "usage: dumpfs [-m] filesys | device\n"); exit(1); } -- cgit v1.2.3