xref: /freebsd/sbin/mdconfig/mdconfig.c (revision 70d586c091f4e0f2c27e1b183310da49bbbc185b)
170d586c0SPoul-Henning Kamp /*
270d586c0SPoul-Henning Kamp  * ----------------------------------------------------------------------------
370d586c0SPoul-Henning Kamp  * "THE BEER-WARE LICENSE" (Revision 42):
470d586c0SPoul-Henning Kamp  * <phk@FreeBSD.ORG> wrote this file.  As long as you retain this notice you
570d586c0SPoul-Henning Kamp  * can do whatever you want with this stuff. If we meet some day, and you think
670d586c0SPoul-Henning Kamp  * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
770d586c0SPoul-Henning Kamp  * ----------------------------------------------------------------------------
870d586c0SPoul-Henning Kamp  *
970d586c0SPoul-Henning Kamp  * $FreeBSD$
1070d586c0SPoul-Henning Kamp  *
1170d586c0SPoul-Henning Kamp  */
1270d586c0SPoul-Henning Kamp 
1370d586c0SPoul-Henning Kamp #include <stdio.h>
1470d586c0SPoul-Henning Kamp #include <stdlib.h>
1570d586c0SPoul-Henning Kamp #include <fcntl.h>
1670d586c0SPoul-Henning Kamp #include <unistd.h>
1770d586c0SPoul-Henning Kamp #include <string.h>
1870d586c0SPoul-Henning Kamp #include <err.h>
1970d586c0SPoul-Henning Kamp #include <sys/ioctl.h>
2070d586c0SPoul-Henning Kamp #include <sys/param.h>
2170d586c0SPoul-Henning Kamp #include <sys/mdioctl.h>
2270d586c0SPoul-Henning Kamp 
2370d586c0SPoul-Henning Kamp struct md_ioctl mdio;
2470d586c0SPoul-Henning Kamp 
2570d586c0SPoul-Henning Kamp enum {UNSET, ATTACH, DETACH} action = UNSET;
2670d586c0SPoul-Henning Kamp 
2770d586c0SPoul-Henning Kamp int
2870d586c0SPoul-Henning Kamp main(int argc, char **argv)
2970d586c0SPoul-Henning Kamp {
3070d586c0SPoul-Henning Kamp 	int ch, fd, i;
3170d586c0SPoul-Henning Kamp 
3270d586c0SPoul-Henning Kamp 	mdio.md_options = MD_CLUSTER | MD_AUTOUNIT;
3370d586c0SPoul-Henning Kamp 
3470d586c0SPoul-Henning Kamp 	for (;;) {
3570d586c0SPoul-Henning Kamp 		ch = getopt(argc, argv, "adf:o:s:t:u:");
3670d586c0SPoul-Henning Kamp 		if (ch == -1)
3770d586c0SPoul-Henning Kamp 			break;
3870d586c0SPoul-Henning Kamp 		switch (ch) {
3970d586c0SPoul-Henning Kamp 		case 'a':
4070d586c0SPoul-Henning Kamp 			action = ATTACH;
4170d586c0SPoul-Henning Kamp 			break;
4270d586c0SPoul-Henning Kamp 		case 'd':
4370d586c0SPoul-Henning Kamp 			action = DETACH;
4470d586c0SPoul-Henning Kamp 			break;
4570d586c0SPoul-Henning Kamp 		case 'f':
4670d586c0SPoul-Henning Kamp 			strncpy(mdio.md_file, optarg, sizeof(mdio.md_file) - 1);
4770d586c0SPoul-Henning Kamp 			break;
4870d586c0SPoul-Henning Kamp 		case 'o':
4970d586c0SPoul-Henning Kamp 			if (!strcmp(optarg, "cluster"))
5070d586c0SPoul-Henning Kamp 				mdio.md_options |= MD_CLUSTER;
5170d586c0SPoul-Henning Kamp 			else if (!strcmp(optarg, "nocluster"))
5270d586c0SPoul-Henning Kamp 				mdio.md_options &= ~MD_CLUSTER;
5370d586c0SPoul-Henning Kamp 			else if (!strcmp(optarg, "reserve"))
5470d586c0SPoul-Henning Kamp 				mdio.md_options |= MD_RESERVE;
5570d586c0SPoul-Henning Kamp 			else if (!strcmp(optarg, "noreserve"))
5670d586c0SPoul-Henning Kamp 				mdio.md_options &= ~MD_RESERVE;
5770d586c0SPoul-Henning Kamp 			else if (!strcmp(optarg, "autounit"))
5870d586c0SPoul-Henning Kamp 				mdio.md_options |= MD_AUTOUNIT;
5970d586c0SPoul-Henning Kamp 			else if (!strcmp(optarg, "noautounit"))
6070d586c0SPoul-Henning Kamp 				mdio.md_options &= ~MD_AUTOUNIT;
6170d586c0SPoul-Henning Kamp 			else
6270d586c0SPoul-Henning Kamp 				errx(1, "Unknown option.");
6370d586c0SPoul-Henning Kamp 			break;
6470d586c0SPoul-Henning Kamp 		case 's':
6570d586c0SPoul-Henning Kamp 			mdio.md_size = strtoul(optarg, NULL, 0);
6670d586c0SPoul-Henning Kamp 			break;
6770d586c0SPoul-Henning Kamp 		case 't':
6870d586c0SPoul-Henning Kamp 			if (!strcmp(optarg, "malloc"))
6970d586c0SPoul-Henning Kamp 				mdio.md_type = MD_MALLOC;
7070d586c0SPoul-Henning Kamp 			else if (!strcmp(optarg, "preload"))
7170d586c0SPoul-Henning Kamp 				mdio.md_type = MD_PRELOAD;
7270d586c0SPoul-Henning Kamp 			else if (!strcmp(optarg, "vnode"))
7370d586c0SPoul-Henning Kamp 				mdio.md_type = MD_VNODE;
7470d586c0SPoul-Henning Kamp 			else if (!strcmp(optarg, "swap"))
7570d586c0SPoul-Henning Kamp 				mdio.md_type = MD_SWAP;
7670d586c0SPoul-Henning Kamp 			else
7770d586c0SPoul-Henning Kamp 				errx(1, "Unknown type.");
7870d586c0SPoul-Henning Kamp 			break;
7970d586c0SPoul-Henning Kamp 		case 'u':
8070d586c0SPoul-Henning Kamp 			mdio.md_unit = strtoul(optarg, NULL, 0);
8170d586c0SPoul-Henning Kamp 			mdio.md_options &= ~MD_AUTOUNIT;
8270d586c0SPoul-Henning Kamp 			break;
8370d586c0SPoul-Henning Kamp 		default:
8470d586c0SPoul-Henning Kamp 			errx(1, "Usage: %s [-ad] [-f file] [-o option] [-s size] [-t type ] [-u unit].", argv[0]);
8570d586c0SPoul-Henning Kamp 		}
8670d586c0SPoul-Henning Kamp 	}
8770d586c0SPoul-Henning Kamp 
8870d586c0SPoul-Henning Kamp 	fd = open("/dev/mdctl", O_RDWR, 0);
8970d586c0SPoul-Henning Kamp 	if (fd < 0)
9070d586c0SPoul-Henning Kamp 		err(1, "/dev/mdctl");
9170d586c0SPoul-Henning Kamp 	if (action == ATTACH)
9270d586c0SPoul-Henning Kamp 		i = ioctl(fd, MDIOCATTACH, &mdio);
9370d586c0SPoul-Henning Kamp 	else if (action == DETACH)
9470d586c0SPoul-Henning Kamp 		i = ioctl(fd, MDIOCDETACH, &mdio);
9570d586c0SPoul-Henning Kamp 	else
9670d586c0SPoul-Henning Kamp 		errx(1, "Neither -a(ttach) nor -d(etach) options present.");
9770d586c0SPoul-Henning Kamp 	if (i < 0)
9870d586c0SPoul-Henning Kamp 		err(1, "ioctl(/dev/mdctl)");
9970d586c0SPoul-Henning Kamp 	return (0);
10070d586c0SPoul-Henning Kamp }
10170d586c0SPoul-Henning Kamp 
102