Add a '-l' flag and a 'L' command to interactive mode to list all known

file system types.  (Similar to what fdisk does for partition types.)

Closes PR bin/12954.
This commit is contained in:
jmmv 2006-11-26 16:16:31 +00:00
parent e2e52f2716
commit 91af0d68b1
4 changed files with 133 additions and 11 deletions

View File

@ -1,4 +1,4 @@
.\" $NetBSD: disklabel.8,v 1.59 2006/02/04 20:10:53 wiz Exp $
.\" $NetBSD: disklabel.8,v 1.60 2006/11/26 16:16:31 jmmv Exp $
.\"
.\" Copyright (c) 1987, 1988, 1991, 1993
.\" The Regents of the University of California. All rights reserved.
@ -32,7 +32,7 @@
.\"
.\" @(#)disklabel.8 8.2 (Berkeley) 4/19/94
.\"
.Dd January 29, 2006
.Dd November 26, 2006
.Dt DISKLABEL 8
.Os
.Sh NAME
@ -69,6 +69,9 @@
.Nm
.Op Fl NW
.Ar disk
.\" disklabel -l: list all know file system types
.Nm
.Fl l
.Sh DESCRIPTION
.Nm
can be used to install, examine, or modify the label on a disk drive or pack.
@ -76,10 +79,11 @@ When writing the label, it can be used to change the drive identification,
the disk partitions on the drive, or to replace a damaged label.
.Pp
The
.Fl e , i , R , w , N ,
.Fl e , i , l , R , w , N ,
and
.Fl W
options determine the basic operation, if none are specified the label
options determine the basic operation.
If none are specified the label
is displayed.
.Bl -tag -width flag
.It Fl e
@ -93,6 +97,9 @@ is undefined, then
is used.
.It Fl i
Interactively update the existing label and write it back to the disk.
.It Fl l
Show all known file system types (those that can be specified along a
partition within the label) and exit.
.It Fl R
Write (restore) a label by reading it from
.Ar protofile .

View File

@ -1,4 +1,4 @@
/* $NetBSD: extern.h,v 1.9 2005/10/19 21:22:21 dsl Exp $ */
/* $NetBSD: extern.h,v 1.10 2006/11/26 16:16:31 jmmv Exp $ */
/*
* Copyright (c) 1997 Christos Zoulas. All rights reserved.
@ -35,6 +35,7 @@ void showinfo(FILE *, struct disklabel *, const char *);
void showpartitions(FILE *, struct disklabel *, int);
void showpartition(FILE *, struct disklabel *, int, int);
void interact(struct disklabel *, int);
int list_fs_types(void);
extern char specname[];
extern int Cflag;

View File

@ -1,4 +1,4 @@
/* $NetBSD: interact.c,v 1.29 2006/03/18 12:48:35 dsl Exp $ */
/* $NetBSD: interact.c,v 1.30 2006/11/26 16:16:31 jmmv Exp $ */
/*
* Copyright (c) 1997 Christos Zoulas. All rights reserved.
@ -35,7 +35,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: interact.c,v 1.29 2006/03/18 12:48:35 dsl Exp $");
__RCSID("$NetBSD: interact.c,v 1.30 2006/11/26 16:16:31 jmmv Exp $");
#endif /* lint */
#include <sys/param.h>
@ -66,6 +66,7 @@ static void cmd_part(struct disklabel *, char *, int);
static void cmd_label(struct disklabel *, char *, int);
static void cmd_round(struct disklabel *, char *, int);
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 alphacmp(const void *, const void *);
@ -85,6 +86,7 @@ static struct cmds {
{ "C", cmd_chain, "make partitions contiguous" },
{ "E", cmd_printall, "print disk label and current partition table"},
{ "I", cmd_info, "change label information" },
{ "L", cmd_listfstypes,"list all known file system types" },
{ "N", cmd_name, "name the label" },
{ "P", cmd_print, "print current partition table" },
{ "Q", NULL, "quit" },
@ -579,6 +581,14 @@ cmd_label(struct disklabel *lp, char *s, int fd)
}
static void
cmd_listfstypes(struct disklabel *lp, char *s, int fd)
{
(void)list_fs_types();
}
static int
runcmd(struct disklabel *lp, char *line, int fd)
{

View File

@ -1,4 +1,40 @@
/* $NetBSD: main.c,v 1.12 2006/06/25 21:32:39 christos Exp $ */
/* $NetBSD: main.c,v 1.13 2006/11/26 16:16:31 jmmv Exp $ */
/*
* Copyright (c) 2006 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Julio M. Merino Vidal.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Copyright (c) 1987, 1993
@ -47,7 +83,7 @@ __COPYRIGHT("@(#) Copyright (c) 1987, 1993\n\
static char sccsid[] = "@(#)disklabel.c 8.4 (Berkeley) 5/4/95";
/* from static char sccsid[] = "@(#)disklabel.c 1.2 (Symmetric) 11/28/85"; */
#else
__RCSID("$NetBSD: main.c,v 1.12 2006/06/25 21:32:39 christos Exp $");
__RCSID("$NetBSD: main.c,v 1.13 2006/11/26 16:16:31 jmmv Exp $");
#endif
#endif /* not lint */
@ -123,6 +159,7 @@ static int tflag; /* Format output as disktab */
int Cflag; /* CHS format output */
static int Dflag; /* Delete old labels (use with write) */
static int Iflag; /* Read/write direct, but default if absent */
static int lflag; /* List all known file system types and exit */
static int mflag; /* Expect disk to contain an MBR */
static int verbose;
static int read_all; /* set if op = READ && Aflag */
@ -143,6 +180,7 @@ static char *skip(char *);
static char *word(char *);
static int getasciilabel(FILE *, struct disklabel *);
static void usage(void);
static int qsort_strcmp(const void *, const void *);
static int getulong(const char *, char, char **,
unsigned long *, unsigned long);
#define GETNUM32(a, v) getulong(a, '\0', NULL, v, UINT32_MAX)
@ -221,7 +259,7 @@ main(int argc, char *argv[])
#endif
error = 0;
while ((ch = getopt(argc, argv, "ABCDFINRWb:ef:imrs:tvw")) != -1) {
while ((ch = getopt(argc, argv, "ABCDFINRWb:ef:ilmrs:tvw")) != -1) {
old_op = op;
switch (ch) {
case 'A': /* Action all labels */
@ -262,6 +300,9 @@ main(int argc, char *argv[])
case 'i': /* Edit using built-in editor */
op = INTERACT;
break;
case 'l': /* List all known file system types and exit */
lflag = 1;
break;
case 'm': /* Expect disk to have an MBR */
mflag ^= 1;
break;
@ -287,6 +328,9 @@ main(int argc, char *argv[])
argc -= optind;
argv += optind;
if (lflag)
exit(list_fs_types() ? EXIT_SUCCESS : EXIT_FAILURE);
if (op == UNSPEC)
op = Dflag ? DELETE : READ;
@ -1568,8 +1612,10 @@ getasciilabel(FILE *f, struct disklabel *lp)
} else
v = FSMAXTYPES;
if ((unsigned)v >= FSMAXTYPES) {
warnx("line %d: warning, unknown filesystem type: %s",
warnx("line %d: warning, unknown file system type: %s",
lineno, cp);
warnx("tip: use -l to see all valid file system "
"types");
v = FS_UNUSED;
}
pp->p_fstype = v;
@ -1736,6 +1782,7 @@ usage(void)
{ "-D [-v] disk", "(to delete existing label(s))" },
{ "-R [-DFrv] disk protofile", "(to restore label)" },
{ "[-NW] disk", "(to write disable/enable label)" },
{ "-l", "(to show all known file system types)" },
{ NULL, NULL }
};
int i;
@ -1770,3 +1817,60 @@ getulong(const char *str, char sep, char **epp, unsigned long *ul,
return 0;
}
/*
* This is a wrapper over the standard strcmp function to be used with
* qsort on an array of pointers to strings.
*/
static int
qsort_strcmp(const void *v1, const void *v2)
{
const char *const *sp1 = (const char *const *)v1;
const char *const *sp2 = (const char *const *)v2;
return strcmp(*sp1, *sp2);
}
/*
* Prints all know file system types for a partition.
* Returns 1 on success, 0 on failure.
*/
int
list_fs_types(void)
{
int ret;
size_t nelems;
nelems = 0;
{
const char *const *namep;
namep = fstypenames;
while (*namep++ != NULL)
nelems++;
}
ret = 1;
if (nelems > 0) {
const char **list;
size_t i;
list = (const char **)malloc(sizeof(char *) * nelems);
if (list == NULL) {
warnx("sorry, could not allocate memory for list");
ret = 0;
} else {
for (i = 0; i < nelems; i++)
list[i] = fstypenames[i];
qsort(list, nelems, sizeof(char *), qsort_strcmp);
for (i = 0; i < nelems; i++)
(void)printf("%s\n", list[i]);
free(list);
}
}
return ret;
}