Enhance reading of saved ascii labels (-R) to process mountpoint
authorkrw <krw@openbsd.org>
Mon, 5 May 2014 16:33:34 +0000 (16:33 +0000)
committerkrw <krw@openbsd.org>
Mon, 5 May 2014 16:33:34 +0000 (16:33 +0000)
information if present. Can be used with -F/-f options to create
an fstab from the saved label.

ok otto@

sbin/disklabel/disklabel.8
sbin/disklabel/disklabel.c

index 85c87b4..ce80ccc 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $OpenBSD: disklabel.8,v 1.108 2013/08/14 08:39:30 jmc Exp $
+.\"    $OpenBSD: disklabel.8,v 1.109 2014/05/05 16:33:34 krw Exp $
 .\"    $NetBSD: disklabel.8,v 1.9 1995/03/18 14:54:38 cgd Exp $
 .\"
 .\" Copyright (c) 1987, 1988, 1991, 1993
@@ -33,7 +33,7 @@
 .\"
 .\"    @(#)disklabel.8 8.2 (Berkeley) 4/19/94
 .\"
-.Dd $Mdocdate: August 14 2013 $
+.Dd $Mdocdate: May 5 2014 $
 .Dt DISKLABEL 8
 .Os
 .Sh NAME
@@ -61,6 +61,7 @@
 .Nm disklabel
 .Fl R
 .Op Fl nv
+.Op Fl F Ns | Ns Fl f Ar file
 .Ar disk Ar protofile
 .Pp
 .Nm disklabel
@@ -79,6 +80,7 @@
 .Fl BR
 .Op Fl nv
 .Op Fl b Ar boot1
+.Op Fl F Ns | Ns Fl f Ar file
 .Ar disk Ar protofile
 .Op Ar disktype
 .Sh DESCRIPTION
@@ -158,9 +160,10 @@ The entries will be written using disklabel UIDs.
 The
 .Fl F
 flag is only valid when used in conjunction with the
+.Fl A ,
 .Fl E
 or
-.Fl A
+.Fl R
 flags.
 If
 .Ar file
index a567876..e3daa53 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: disklabel.c,v 1.194 2014/04/23 11:49:25 otto Exp $    */
+/*     $OpenBSD: disklabel.c,v 1.195 2014/05/05 16:33:34 krw Exp $     */
 
 /*
  * Copyright (c) 1987, 1993
@@ -210,7 +210,8 @@ main(int argc, char *argv[])
                op = READ;
 #endif
 
-       if (argc < 1 || (fstabfile && !(op == EDITOR || aflag)))
+       if (argc < 1 || (fstabfile && !(op == EDITOR || op == RESTORE ||
+                   aflag)))
                usage();
 
        dkname = argv[0];
@@ -256,8 +257,14 @@ main(int argc, char *argv[])
                        err(4, "%s", argv[1]);
                error = getasciilabel(t, lp);
                bzero(lp->d_uid, sizeof(lp->d_uid));
-               if (error == 0)
+               if (error == 0) {
                        error = writelabel(f, bootarea, lp);
+                       if (error == 0) {
+                               if (ioctl(f, DIOCGDINFO, &lab) < 0)
+                                       err(4, "ioctl DIOCGDINFO");
+                               mpsave(&lab);
+                       }
+               }
                fclose(t);
                break;
        case WRITE:
@@ -1008,18 +1015,37 @@ getasciilabel(FILE *f, struct disklabel *lp)
        char **cpp, *cp;
        const char *errstr;
        struct partition *pp;
-       char *tp, *s, line[BUFSIZ];
+       char *mp, *tp, *s, line[BUFSIZ];
+       char **omountpoints = NULL;
        int lineno = 0, errors = 0;
        u_int32_t v, fsize;
        u_int64_t lv;
+       unsigned int part;
 
        lp->d_version = 1;
        lp->d_bbsize = BBSIZE;                          /* XXX */
        lp->d_sbsize = SBSIZE;                          /* XXX */
+
+       if (!(omountpoints = calloc(MAXPARTITIONS, sizeof(char *))))
+               errx(4, "out of memory");
+
+       mpcopy(omountpoints, mountpoints);
+       for (part = 0; part < MAXPARTITIONS; part++) {
+               free(mountpoints[part]);
+               mountpoints[part] = NULL;
+       }
+       
        while (fgets(line, sizeof(line), f)) {
                lineno++;
-               if ((cp = strpbrk(line, "#\r\n")))
+               mp = NULL;
+               if ((cp = strpbrk(line, "\r\n")))
+                       *cp = '\0';
+               if ((cp = strpbrk(line, "#"))) {
                        *cp = '\0';
+                       mp = skip(cp+1);
+                       if (mp && *mp != '/')
+                               mp = NULL;
+               }
                cp = skip(line);
                if (cp == NULL)
                        continue;
@@ -1250,6 +1276,8 @@ getasciilabel(FILE *f, struct disklabel *lp)
                        default:
                                break;
                        }
+                       if (mp)
+                               mountpoints[part] = strdup(mp);
                        continue;
                }
                warnx("line %d: unknown field: %s", lineno, cp);
@@ -1258,6 +1286,11 @@ getasciilabel(FILE *f, struct disklabel *lp)
                ;
        }
        errors += checklabel(lp);
+
+       if (errors > 0)
+               mpcopy(mountpoints, omountpoints);
+       mpfree(omountpoints);
+       
        return (errors > 0);
 }
 
@@ -1443,7 +1476,7 @@ usage(void)
            "       disklabel -E [-Acdnv] [-F|-f file] disk\t\t(simple editor)"
            "\n");
        fprintf(stderr,
-           "       disklabel -R [-nv] disk protofile\t\t(restore)\n\n");
+           "       disklabel -R [-nv] [-F|-f file] disk protofile\t\t(restore)\n\n");
 #if NUMBOOT > 0
        fprintf(stderr,
            "       disklabel -B  [-nv] [-b boot1] disk [disktype]\t\t(boot)\n");
@@ -1451,7 +1484,7 @@ usage(void)
            "       disklabel -Bw [-nv] [-b boot1] disk disktype [packid]\t"
            "(boot+write)\n");
        fprintf(stderr,
-           "       disklabel -BR [-nv] [-b boot1] disk protofile\t\t"
+           "       disklabel -BR [-nv] [-F|-f file ] [-b boot1] disk protofile\t\t"
            "(boot+restore)\n\n");
 #endif
        fprintf(stderr,