Module Name: src Committed By: christos Date: Tue Jan 15 23:52:48 UTC 2013
Modified Files: src/sbin/disklabel: interact.c Log Message: - simplify getinput. - add adjust command. To generate a diff of this commit: cvs rdiff -u -r1.35 -r1.36 src/sbin/disklabel/interact.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sbin/disklabel/interact.c diff -u src/sbin/disklabel/interact.c:1.35 src/sbin/disklabel/interact.c:1.36 --- src/sbin/disklabel/interact.c:1.35 Thu Jan 6 16:39:01 2011 +++ src/sbin/disklabel/interact.c Tue Jan 15 18:52:48 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: interact.c,v 1.35 2011/01/06 21:39:01 apb Exp $ */ +/* $NetBSD: interact.c,v 1.36 2013/01/15 23:52:48 christos Exp $ */ /* * Copyright (c) 1997 Christos Zoulas. All rights reserved. @@ -30,7 +30,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: interact.c,v 1.35 2011/01/06 21:39:01 apb Exp $"); +__RCSID("$NetBSD: interact.c,v 1.36 2013/01/15 23:52:48 christos Exp $"); #endif /* lint */ #include <sys/param.h> @@ -40,7 +40,9 @@ __RCSID("$NetBSD: interact.c,v 1.35 2011 #include <err.h> #include <stdio.h> #include <string.h> +#include <stdarg.h> #include <stdlib.h> +#include <sys/ioctl.h> #if HAVE_NBTOOL_CONFIG_H #define getmaxpartitions() MAXPARTITIONS @@ -53,6 +55,7 @@ __RCSID("$NetBSD: interact.c,v 1.35 2011 #include "extern.h" static void cmd_help(struct disklabel *, char *, int); +static void cmd_adjust(struct disklabel *, char *, int); static void cmd_chain(struct disklabel *, char *, int); static void cmd_print(struct disklabel *, char *, int); static void cmd_printall(struct disklabel *, char *, int); @@ -63,7 +66,7 @@ static void cmd_round(struct disklabel * static void cmd_name(struct disklabel *, char *, int); static void cmd_listfstypes(struct disklabel *, char *, int); static int runcmd(struct disklabel *, char *, int); -static int getinput(const char *, const char *, const char *, char *); +static int getinput(char *, const char *, ...) __printflike(2, 3); static int alphacmp(const void *, const void *); static void defnum(struct disklabel *, char *, uint32_t); static void dumpnames(const char *, const char * const *, size_t); @@ -78,6 +81,7 @@ static struct cmds { const char *help; } cmds[] = { { "?", cmd_help, "print this menu" }, + { "A", cmd_adjust, "adjust the label size to the max disk size" }, { "C", cmd_chain, "make partitions contiguous" }, { "E", cmd_printall, "print disk label and current partition table"}, { "I", cmd_info, "change label information" }, @@ -91,7 +95,6 @@ static struct cmds { }; - static void cmd_help(struct disklabel *lp, char *s, int fd) { @@ -105,13 +108,39 @@ cmd_help(struct disklabel *lp, char *s, static void +cmd_adjust(struct disklabel *lp, char *s, int fd) +{ + struct disklabel dl; + + if (ioctl(fd, DIOCGDEFLABEL, &dl) == -1) { + warn("Cannot get default label"); + return; + } + + if (dl.d_secperunit != lp->d_secperunit) { + char line[BUFSIZ]; + int i = getinput(line, "Adjust disklabel sector from %" PRIu32 + " to %" PRIu32 " [n]? ", lp->d_secperunit, dl.d_secperunit); + if (i <= 0) + return; + if (line[0] != 'Y' && line[0] != 'y') + return; + lp->d_secperunit = dl.d_secperunit; + return; + } + + printf("Already at %" PRIu32 " sectors\n", dl.d_secperunit); + return; +} + +static void cmd_chain(struct disklabel *lp, char *s, int fd) { int i; char line[BUFSIZ]; - i = getinput(":", "Automatically adjust partitions", - chaining ? "yes" : "no", line); + i = getinput(line, "Automatically adjust partitions [%s]? ", + chaining ? "yes" : "no"); if (i <= 0) return; @@ -150,7 +179,6 @@ static void cmd_info(struct disklabel *lp, char *s, int fd) { char line[BUFSIZ]; - char def[BUFSIZ]; int v, i; u_int32_t u; @@ -162,8 +190,7 @@ cmd_info(struct disklabel *lp, char *s, i = lp->d_type; if (i < 0 || i >= DKMAXTYPES) i = 0; - snprintf(def, sizeof(def), "%s", dktypenames[i]); - i = getinput(":", "Disk type [?]", def, line); + i = getinput(line, "Disk type [%s]: ", dktypenames[i]); if (i == -1) return; else if (i == 0) @@ -190,9 +217,8 @@ cmd_info(struct disklabel *lp, char *s, } /* d_typename */ - snprintf(def, sizeof(def), "%.*s", + i = getinput(line, "Disk name [%.*s]: ", (int) sizeof(lp->d_typename), lp->d_typename); - i = getinput(":", "Disk name", def, line); if (i == -1) return; else if (i == 1) @@ -203,8 +229,8 @@ cmd_info(struct disklabel *lp, char *s, /* d_npartitions */ for (;;) { - snprintf(def, sizeof(def), "%" PRIu16, lp->d_npartitions); - i = getinput(":", "Number of partitions", def, line); + i = getinput(line, "Number of partitions [%" PRIu16 "]: ", + lp->d_npartitions); if (i == -1) return; else if (i == 0) @@ -219,8 +245,8 @@ cmd_info(struct disklabel *lp, char *s, /* d_secsize */ for (;;) { - snprintf(def, sizeof(def), "%" PRIu32, lp->d_secsize); - i = getinput(":", "Sector size (bytes)", def, line); + i = getinput(line, "Sector size (bytes) [%" PRIu32 "]: ", + lp->d_secsize); if (i == -1) return; else if (i == 0) @@ -235,8 +261,8 @@ cmd_info(struct disklabel *lp, char *s, /* d_nsectors */ for (;;) { - snprintf(def, sizeof(def), "%" PRIu32, lp->d_nsectors); - i = getinput(":", "Number of sectors per track", def, line); + i = getinput(line, "Number of sectors per track [%" PRIu32 + "]: ", lp->d_nsectors); if (i == -1) return; else if (i == 0) @@ -251,8 +277,8 @@ cmd_info(struct disklabel *lp, char *s, /* d_ntracks */ for (;;) { - snprintf(def, sizeof(def), "%" PRIu32, lp->d_ntracks); - i = getinput(":", "Number of tracks per cylinder", def, line); + i = getinput(line, "Number of tracks per cylinder [%" PRIu32 + "]: ", lp->d_ntracks); if (i == -1) return; else if (i == 0) @@ -267,8 +293,8 @@ cmd_info(struct disklabel *lp, char *s, /* d_secpercyl */ for (;;) { - snprintf(def, sizeof(def), "%" PRIu32, lp->d_secpercyl); - i = getinput(":", "Number of sectors/cylinder", def, line); + i = getinput(line, "Number of sectors/cylinder [%" PRIu32 "]: ", + lp->d_secpercyl); if (i == -1) return; else if (i == 0) @@ -284,8 +310,8 @@ cmd_info(struct disklabel *lp, char *s, /* d_ncylinders */ for (;;) { - snprintf(def, sizeof(def), "%" PRIu32, lp->d_ncylinders); - i = getinput(":", "Total number of cylinders", def, line); + i = getinput(line, "Total number of cylinders [%" PRIu32 "]: ", + lp->d_ncylinders); if (i == -1) return; else if (i == 0) @@ -300,8 +326,8 @@ cmd_info(struct disklabel *lp, char *s, /* d_secperunit */ for (;;) { - snprintf(def, sizeof(def), "%" PRIu32, lp->d_secperunit); - i = getinput(":", "Total number of sectors", def, line); + i = getinput(line, "Total number of sectors [%" PRIu32 "]: ", + lp->d_secperunit); if (i == -1) return; else if (i == 0) @@ -318,8 +344,8 @@ cmd_info(struct disklabel *lp, char *s, /* d_interleave */ for (;;) { - snprintf(def, sizeof(def), "%" PRIu16, lp->d_interleave); - i = getinput(":", "Hardware sectors interleave", def, line); + i = getinput(line, "Hardware sectors interleave [%" PRIu16 + "]: ", lp->d_interleave); if (i == -1) return; else if (i == 0) @@ -334,8 +360,8 @@ cmd_info(struct disklabel *lp, char *s, /* d_trackskew */ for (;;) { - snprintf(def, sizeof(def), "%" PRIu16, lp->d_trackskew); - i = getinput(":", "Sector 0 skew, per track", def, line); + i = getinput(line, "Sector 0 skew, per track [%" PRIu16 "]: ", + lp->d_trackskew); if (i == -1) return; else if (i == 0) @@ -350,8 +376,8 @@ cmd_info(struct disklabel *lp, char *s, /* d_cylskew */ for (;;) { - snprintf(def, sizeof(def), "%" PRIu16, lp->d_cylskew); - i = getinput(":", "Sector 0 skew, per cylinder", def, line); + i = getinput(line, "Sector 0 skew, per cylinder [%" PRIu16 + "]: ", lp->d_cylskew); if (i == -1) return; else if (i == 0) @@ -366,8 +392,8 @@ cmd_info(struct disklabel *lp, char *s, /* d_headswitch */ for (;;) { - snprintf(def, sizeof(def), "%" PRIu32, lp->d_headswitch); - i = getinput(":", "Head switch time (usec)", def, line); + i = getinput(line, "Head switch time (usec) [%" PRIu32 "]: ", + lp->d_headswitch); if (i == -1) return; else if (i == 0) @@ -382,8 +408,8 @@ cmd_info(struct disklabel *lp, char *s, /* d_trkseek */ for (;;) { - snprintf(def, sizeof(def), "%" PRIu32, lp->d_trkseek); - i = getinput(":", "Track seek time (usec)", def, line); + i = getinput(line, "Track seek time (usec) [%" PRIu32 "]:", + lp->d_trkseek); if (i == -1) return; else if (i == 0) @@ -402,12 +428,10 @@ static void cmd_name(struct disklabel *lp, char *s, int fd) { char line[BUFSIZ]; - char def[BUFSIZ]; int i; - snprintf(def, sizeof(def), "%.*s", + i = getinput(line, "Label name [%.*s]: ", (int) sizeof(lp->d_packname), lp->d_packname); - i = getinput(":", "Label name", def, line); if (i <= 0) return; (void) strncpy(lp->d_packname, line, sizeof(lp->d_packname)); @@ -420,7 +444,8 @@ cmd_round(struct disklabel *lp, char *s, int i; char line[BUFSIZ]; - i = getinput(":", "Rounding", rounding ? "cylinders" : "sectors", line); + i = getinput(line, "Rounding [%s]: ", rounding ? "cylinders" : + "sectors"); if (i <= 0) return; @@ -461,8 +486,7 @@ cmd_part(struct disklabel *lp, char *s, i = p->p_fstype; if (i < 0 || i >= FSMAXTYPES) i = 0; - snprintf(def, sizeof(def), "%s", fstypenames[i]); - i = getinput(":", "Filesystem type [?]", def, line); + i = getinput(line, "Filesystem type [%s]: ", fstypenames[i]); if (i == -1) return; else if (i == 0) @@ -484,9 +508,8 @@ cmd_part(struct disklabel *lp, char *s, } for (;;) { defnum(lp, def, p->p_offset); - i = getinput(":", - "Start offset ('x' to start after partition 'x')", - def, line); + i = getinput(line, "Start offset ('x' to start after partition" + " 'x') [%s]: ", def); if (i == -1) return; else if (i == 0) @@ -518,8 +541,8 @@ cmd_part(struct disklabel *lp, char *s, } for (;;) { defnum(lp, def, p->p_size); - i = getinput(":", "Partition size ('$' for all remaining)", - def, line); + i = getinput(line, "Partition size ('$' for all remaining) " + "[%s]: ", def); if (i == -1) return; else if (i == 0) @@ -561,7 +584,7 @@ cmd_label(struct disklabel *lp, char *s, char line[BUFSIZ]; int i; - i = getinput("?", "Label disk", "n", line); + i = getinput(line, "Label disk [n]?"); if (i <= 0 || (*line != 'y' && *line != 'Y') ) return; @@ -611,21 +634,19 @@ runcmd(struct disklabel *lp, char *line, static int -getinput(const char *sep, const char *prompt, const char *def, char *line) +getinput(char *line, const char *prompt, ...) { for (;;) { - printf("%s", prompt); - if (def) - printf(" [%s]", def); - printf("%s ", sep); + va_list ap; + va_start(ap, prompt); + vprintf(prompt, ap); + va_end(ap); if (fgets(line, BUFSIZ, stdin) == NULL) return -1; - if (line[0] == '\n' || line[0] == '\0') { - if (def) - return 0; - } + if (line[0] == '\n' || line[0] == '\0') + return 0; else { char *p; @@ -780,8 +801,11 @@ interact(struct disklabel *lp, int fd) puts("Enter '?' for help"); for (;;) { - if (getinput(">", "partition", NULL, line) == -1) + int i = getinput(line, "partition>"); + if (i == -1) return; + if (i == 0) + continue; if (runcmd(lp, line, fd) == -1) return; }