Somewhere around the 473rd time I mistyped "mdconfig file" instead of

"mdconfig -f file", I decided that it would be easier to make mdconfig
DWIM than to teach my fingers to type the correct command line.

MFC after:	3 weeks
This commit is contained in:
Dag-Erling Smørgrav 2011-04-29 22:40:11 +00:00
parent 85ee63c923
commit 6c49c6cff2
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=221232
2 changed files with 49 additions and 20 deletions

View File

@ -68,6 +68,8 @@
.Op Fl n .Op Fl n
.Op Fl v .Op Fl v
.Op Fl u Ar unit .Op Fl u Ar unit
.Nm
.Ar file
.Sh DESCRIPTION .Sh DESCRIPTION
The The
.Nm .Nm
@ -185,6 +187,15 @@ Request a specific unit number for the
.Xr md 4 .Xr md 4
device instead of automatic allocation. device instead of automatic allocation.
.El .El
.Pp
The last form,
.Nm
.Ar file ,
is provided for convenience as an abbreviation of
.Nm
.Fl a
.Fl t Ar vnode
.Fl f Ar file .
.Sh EXAMPLES .Sh EXAMPLES
To create a 4 megabyte To create a 4 megabyte
.Xr malloc 9 .Xr malloc 9

View File

@ -38,6 +38,7 @@ static enum {UNSET, ATTACH, DETACH, LIST} action = UNSET;
static int nflag; static int nflag;
static void usage(void); static void usage(void);
static void md_set_file(const char *);
static int md_find(char *, const char *); static int md_find(char *, const char *);
static int md_query(char *name); static int md_query(char *name);
static int md_list(char *units, int opt); static int md_list(char *units, int opt);
@ -59,7 +60,8 @@ usage(void)
" [-s size] [-S sectorsize] [-u unit]\n" " [-s size] [-S sectorsize] [-u unit]\n"
" [-x sectors/track] [-y heads/cylinder]\n" " [-x sectors/track] [-y heads/cylinder]\n"
" mdconfig -d -u unit [-o [no]force]\n" " mdconfig -d -u unit [-o [no]force]\n"
" mdconfig -l [-v] [-n] [-u unit]\n"); " mdconfig -l [-v] [-n] [-u unit]\n"
" mdconfig file\n");
fprintf(stderr, "\t\ttype = {malloc, preload, vnode, swap}\n"); fprintf(stderr, "\t\ttype = {malloc, preload, vnode, swap}\n");
fprintf(stderr, "\t\toption = {cluster, compress, reserve}\n"); fprintf(stderr, "\t\toption = {cluster, compress, reserve}\n");
fprintf(stderr, "\t\tsize = %%d (512 byte blocks), %%db (B),\n"); fprintf(stderr, "\t\tsize = %%d (512 byte blocks), %%db (B),\n");
@ -82,10 +84,7 @@ main(int argc, char **argv)
err(1, "could not allocate memory"); err(1, "could not allocate memory");
vflag = 0; vflag = 0;
bzero(mdio.md_file, PATH_MAX); bzero(mdio.md_file, PATH_MAX);
for (;;) { while ((ch = getopt(argc, argv, "ab:df:lno:s:S:t:u:vx:y:")) != -1) {
ch = getopt(argc, argv, "ab:df:lno:s:S:t:u:vx:y:");
if (ch == -1)
break;
switch (ch) { switch (ch) {
case 'a': case 'a':
if (cmdline != 0) if (cmdline != 0)
@ -143,21 +142,7 @@ main(int argc, char **argv)
} }
if (cmdline != 2) if (cmdline != 2)
usage(); usage();
if (realpath(optarg, mdio.md_file) == NULL) { md_set_file(optarg);
err(1, "could not find full path for %s",
optarg);
}
fd = open(mdio.md_file, O_RDONLY);
if (fd < 0)
err(1, "could not open %s", optarg);
else if (mdio.md_mediasize == 0) {
struct stat sb;
if (fstat(fd, &sb) == -1)
err(1, "could not stat %s", optarg);
mdio.md_mediasize = sb.st_size;
}
close(fd);
break; break;
case 'o': case 'o':
if (action == DETACH) { if (action == DETACH) {
@ -267,6 +252,19 @@ main(int argc, char **argv)
usage(); usage();
} }
} }
argc -= optind;
argv += optind;
if (action == UNSET) {
if (argc != 1)
usage();
action = ATTACH;
mdio.md_type = MD_VNODE;
mdio.md_options = MD_CLUSTER | MD_AUTOUNIT | MD_COMPRESS;
cmdline = 2;
md_set_file(*argv);
}
mdio.md_version = MDIOVERSION; mdio.md_version = MDIOVERSION;
if (!kld_isloaded("g_md") && kld_load("geom_md") == -1) if (!kld_isloaded("g_md") && kld_load("geom_md") == -1)
@ -322,6 +320,26 @@ main(int argc, char **argv)
return (0); return (0);
} }
static void
md_set_file(const char *fn)
{
struct stat sb;
int fd;
if (realpath(fn, mdio.md_file) == NULL)
err(1, "could not find full path for %s", fn);
fd = open(mdio.md_file, O_RDONLY);
if (fd < 0)
err(1, "could not open %s", fn);
if (fstat(fd, &sb) == -1)
err(1, "could not stat %s", fn);
if (!S_ISREG(sb.st_mode))
errx(1, "%s is not a regular file", fn);
if (mdio.md_mediasize == 0)
mdio.md_mediasize = sb.st_size;
close(fd);
}
/* /*
* Lists md(4) disks. Is used also as a query routine, since it handles XML * Lists md(4) disks. Is used also as a query routine, since it handles XML
* interface. 'units' can be NULL for listing memory disks. It might be * interface. 'units' can be NULL for listing memory disks. It might be