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