Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/gnu/usr.sbin/mdsetimage add the -x option to extract the fil...



details:   https://anonhg.NetBSD.org/src/rev/ab168598e776
branches:  trunk
changeset: 537056:ab168598e776
user:      dbj <dbj%NetBSD.org@localhost>
date:      Thu Sep 26 10:40:59 2002 +0000

description:
add the -x option to extract the filesystem image from the kernel

diffstat:

 gnu/usr.sbin/mdsetimage/mdsetimage.8 |  13 +++++-
 gnu/usr.sbin/mdsetimage/mdsetimage.c |  78 ++++++++++++++++++++++++-----------
 2 files changed, 66 insertions(+), 25 deletions(-)

diffs (181 lines):

diff -r 7df85cfebc03 -r ab168598e776 gnu/usr.sbin/mdsetimage/mdsetimage.8
--- a/gnu/usr.sbin/mdsetimage/mdsetimage.8      Thu Sep 26 08:49:34 2002 +0000
+++ b/gnu/usr.sbin/mdsetimage/mdsetimage.8      Thu Sep 26 10:40:59 2002 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: mdsetimage.8,v 1.3 2002/02/23 17:01:20 wiz Exp $
+.\"    $NetBSD: mdsetimage.8,v 1.4 2002/09/26 10:40:59 dbj Exp $
 .\"
 .\" Copyright (c) 1996 Christopher G. Demetriou
 .\" All rights reserved.
@@ -38,6 +38,7 @@
 .Op Fl b Ar bfdname
 .Op Fl s
 .Op Fl v
+.Op Fl x
 .Ar kernel
 .Ar image
 .Sh DESCRIPTION
@@ -69,6 +70,16 @@
 .Nm
 will print out status information as
 it is copying the image.
+.Pp
+If the
+.Fl x
+flag is given,
+.Nm
+will extract the disk image from
+.Ar kernel
+into the file
+.Ar image .
+This is the opposite of the default behavior.
 .Sh SEE ALSO
 .Xr md 4 ,
 .Xr mdconfig 8
diff -r 7df85cfebc03 -r ab168598e776 gnu/usr.sbin/mdsetimage/mdsetimage.c
--- a/gnu/usr.sbin/mdsetimage/mdsetimage.c      Thu Sep 26 08:49:34 2002 +0000
+++ b/gnu/usr.sbin/mdsetimage/mdsetimage.c      Thu Sep 26 10:40:59 2002 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mdsetimage.c,v 1.7 2002/09/13 15:29:08 thorpej Exp $ */
+/* $NetBSD: mdsetimage.c,v 1.8 2002/09/26 10:40:59 dbj Exp $ */
 /* from: NetBSD: mdsetimage.c,v 1.15 2001/03/21 23:46:48 cgd Exp $ */
 
 /*
@@ -38,7 +38,7 @@
 #endif /* not lint */
 
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: mdsetimage.c,v 1.7 2002/09/13 15:29:08 thorpej Exp $");
+__RCSID("$NetBSD: mdsetimage.c,v 1.8 2002/09/26 10:40:59 dbj Exp $");
 #endif /* not lint */
 
 #if HAVE_CONFIG_H
@@ -78,6 +78,7 @@
 static int     find_md_root __P((bfd *, struct symbols symbols[]));
 
 int    verbose;
+int    extract;
 int    setsize;
 
 static const char *progname;
@@ -103,7 +104,7 @@
 
        setprogname(argv[0]);
 
-       while ((ch = getopt(argc, argv, "b:sv")) != -1)
+       while ((ch = getopt(argc, argv, "b:svx")) != -1)
                switch (ch) {
                case 'b':
                        bfdname = optarg;
@@ -114,6 +115,9 @@
                case 'v':
                        verbose = 1;
                        break;
+               case 'x':
+                       extract = 1;
+                       break;
                case '?':
                default:
                        usage();
@@ -126,8 +130,13 @@
        kfile = argv[0];
        fsfile = argv[1];
 
-       if ((kfd = open(kfile, O_RDWR, 0))  == -1)
-               err(1, "open %s", kfile);
+       if (extract) {
+               if ((kfd = open(kfile, O_RDONLY, 0))  == -1)
+                       err(1, "open %s", kfile);
+       } else {
+               if ((kfd = open(kfile, O_RDWR, 0))  == -1)
+                       err(1, "open %s", kfile);
+       }
 
        bfd_init();
        if ((abfd = bfd_fdopenr(kfile, bfdname, kfd)) == NULL) {
@@ -161,45 +170,66 @@
 
        munmap(mappedkfile, ksb.st_size);
 
-       if ((fsfd = open(fsfile, O_RDONLY, 0)) == -1)
-               err(1, "open %s", fsfile);
-       if (fstat(fsfd, &fssb) == -1)
-               err(1, "fstat %s", fsfile);
-       if (fssb.st_size != (size_t)fssb.st_size)
-               errx(1, "fs image is too big");
-       if (fssb.st_size > md_root_size)
-               errx(1, "fs image (%lld bytes) too big for buffer (%lu bytes)",
-                   (long long)fssb.st_size, (unsigned long)md_root_size);
+       if (extract) {
+               if ((fsfd = open(fsfile, O_WRONLY|O_CREAT, 0777)) == -1)
+                       err(1, "open %s", fsfile);
+               left_to_copy = md_root_size;
+       } else {
+               if ((fsfd = open(fsfile, O_RDONLY, 0)) == -1)
+                       err(1, "open %s", fsfile);
+               if (fstat(fsfd, &fssb) == -1)
+                       err(1, "fstat %s", fsfile);
+               if (fssb.st_size != (size_t)fssb.st_size)
+                       errx(1, "fs image is too big");
+               if (fssb.st_size > md_root_size)
+                       errx(1, "fs image (%lld bytes) too big for buffer (%lu bytes)",
+                           (long long)fssb.st_size, (unsigned long)md_root_size);
+               left_to_copy = fssb.st_size;
+       }
 
        if (verbose)
-               fprintf(stderr, "copying image from %s into %s\n", fsfile,
-                   kfile);
+               fprintf(stderr, "copying image %s %s %s\n", fsfile,
+                   (extract ? "from" : "into"), kfile);
 
-       left_to_copy = fssb.st_size;
        if (lseek(kfd, md_root_offset, SEEK_SET) != md_root_offset)
                err(1, "seek %s", kfile);
        while (left_to_copy > 0) {
                char buf[CHUNKSIZE];
                ssize_t todo;
+               int rfd;
+               int wfd;
+               const char *rfile;
+               const char *wfile;
+               if (extract) {
+                       rfd = kfd;
+                       rfile = kfile;
+                       wfd = fsfd;
+                       wfile = fsfile;
+               } else {
+                       rfd = fsfd;
+                       rfile = fsfile;
+                       wfd = kfd;
+                       wfile = kfile;
+               }
 
                todo = (left_to_copy > CHUNKSIZE) ? CHUNKSIZE : left_to_copy;
-               if ((rv = read(fsfd, buf, todo)) != todo) {
+               if ((rv = read(rfd, buf, todo)) != todo) {
                        if (rv == -1)
-                               err(1, "read %s", fsfile);
+                               err(1, "read %s", rfile);
                        else
-                               errx(1, "unexpected EOF reading %s", fsfile);
+                               errx(1, "unexpected EOF reading %s", rfile);
                }
-               if ((rv = write(kfd, buf, todo)) != todo) {
+               if ((rv = write(wfd, buf, todo)) != todo) {
                        if (rv == -1)
-                               err(1, "write %s", kfile);
+                               err(1, "write %s", wfile);
                        else
-                               errx(1, "short write writing %s", kfile);
+                               errx(1, "short write writing %s", wfile);
                }
                left_to_copy -= todo;
        }
        if (verbose)
                fprintf(stderr, "done copying image\n");
-       if (setsize) {
+       if (setsize && !extract) {
                char buf[sizeof(uint32_t)];
 
                if (verbose)



Home | Main Index | Thread Index | Old Index