xref: /minix3/minix/usr.sbin/diskctl/diskctl.c (revision c175cce5e69cf55dc873ae398aa016b661530b6c)
1*c175cce5SDavid van Moolenbroek /* diskctl - control disk device driver parameters - by D.C. van Moolenbroek */
2*c175cce5SDavid van Moolenbroek #include <stdlib.h>
3*c175cce5SDavid van Moolenbroek #include <stdio.h>
4*c175cce5SDavid van Moolenbroek #include <string.h>
5*c175cce5SDavid van Moolenbroek #include <sys/ioctl.h>
6*c175cce5SDavid van Moolenbroek #include <unistd.h>
7*c175cce5SDavid van Moolenbroek #include <fcntl.h>
8*c175cce5SDavid van Moolenbroek 
9*c175cce5SDavid van Moolenbroek static void __dead
usage(void)10*c175cce5SDavid van Moolenbroek usage(void)
11*c175cce5SDavid van Moolenbroek {
12*c175cce5SDavid van Moolenbroek 	fprintf(stderr,
13*c175cce5SDavid van Moolenbroek 	    "usage: %s <device> <command> [args]\n"
14*c175cce5SDavid van Moolenbroek 	    "\n"
15*c175cce5SDavid van Moolenbroek 	    "supported commands:\n"
16*c175cce5SDavid van Moolenbroek 	    "  getwcache           return write cache status\n"
17*c175cce5SDavid van Moolenbroek 	    "  setwcache [on|off]  set write cache status\n"
18*c175cce5SDavid van Moolenbroek 	    "  flush               flush write cache\n",
19*c175cce5SDavid van Moolenbroek 	    getprogname());
20*c175cce5SDavid van Moolenbroek 
21*c175cce5SDavid van Moolenbroek 	exit(EXIT_FAILURE);
22*c175cce5SDavid van Moolenbroek }
23*c175cce5SDavid van Moolenbroek 
24*c175cce5SDavid van Moolenbroek static int
open_dev(const char * dev,int flags)25*c175cce5SDavid van Moolenbroek open_dev(const char * dev, int flags)
26*c175cce5SDavid van Moolenbroek {
27*c175cce5SDavid van Moolenbroek 	int fd;
28*c175cce5SDavid van Moolenbroek 
29*c175cce5SDavid van Moolenbroek 	fd = open(dev, flags);
30*c175cce5SDavid van Moolenbroek 
31*c175cce5SDavid van Moolenbroek 	if (fd < 0) {
32*c175cce5SDavid van Moolenbroek 		perror("open");
33*c175cce5SDavid van Moolenbroek 
34*c175cce5SDavid van Moolenbroek 		exit(EXIT_FAILURE);
35*c175cce5SDavid van Moolenbroek 	}
36*c175cce5SDavid van Moolenbroek 
37*c175cce5SDavid van Moolenbroek 	return fd;
38*c175cce5SDavid van Moolenbroek }
39*c175cce5SDavid van Moolenbroek 
40*c175cce5SDavid van Moolenbroek int
main(int argc,char ** argv)41*c175cce5SDavid van Moolenbroek main(int argc, char ** argv)
42*c175cce5SDavid van Moolenbroek {
43*c175cce5SDavid van Moolenbroek 	int fd, val;
44*c175cce5SDavid van Moolenbroek 
45*c175cce5SDavid van Moolenbroek 	setprogname(argv[0]);
46*c175cce5SDavid van Moolenbroek 
47*c175cce5SDavid van Moolenbroek 	if (argc < 3) usage();
48*c175cce5SDavid van Moolenbroek 
49*c175cce5SDavid van Moolenbroek 	if (!strcasecmp(argv[2], "getwcache")) {
50*c175cce5SDavid van Moolenbroek 		if (argc != 3) usage();
51*c175cce5SDavid van Moolenbroek 
52*c175cce5SDavid van Moolenbroek 		fd = open_dev(argv[1], O_RDONLY);
53*c175cce5SDavid van Moolenbroek 
54*c175cce5SDavid van Moolenbroek 		if (ioctl(fd, DIOCGETWC, &val) != 0) {
55*c175cce5SDavid van Moolenbroek 			perror("ioctl");
56*c175cce5SDavid van Moolenbroek 
57*c175cce5SDavid van Moolenbroek 			return EXIT_FAILURE;
58*c175cce5SDavid van Moolenbroek 		}
59*c175cce5SDavid van Moolenbroek 
60*c175cce5SDavid van Moolenbroek 		close(fd);
61*c175cce5SDavid van Moolenbroek 
62*c175cce5SDavid van Moolenbroek 		printf("write cache is %s\n", val ? "on" : "off");
63*c175cce5SDavid van Moolenbroek 
64*c175cce5SDavid van Moolenbroek 	} else if (!strcasecmp(argv[2], "setwcache")) {
65*c175cce5SDavid van Moolenbroek 		if (argc != 4) usage();
66*c175cce5SDavid van Moolenbroek 
67*c175cce5SDavid van Moolenbroek 		if (!strcasecmp(argv[3], "on"))
68*c175cce5SDavid van Moolenbroek 			val = 1;
69*c175cce5SDavid van Moolenbroek 		else if (!strcasecmp(argv[3], "off"))
70*c175cce5SDavid van Moolenbroek 			val = 0;
71*c175cce5SDavid van Moolenbroek 		else
72*c175cce5SDavid van Moolenbroek 			usage();
73*c175cce5SDavid van Moolenbroek 
74*c175cce5SDavid van Moolenbroek 		fd = open_dev(argv[1], O_WRONLY);
75*c175cce5SDavid van Moolenbroek 
76*c175cce5SDavid van Moolenbroek 		if (ioctl(fd, DIOCSETWC, &val) != 0) {
77*c175cce5SDavid van Moolenbroek 			perror("ioctl");
78*c175cce5SDavid van Moolenbroek 
79*c175cce5SDavid van Moolenbroek 			return EXIT_FAILURE;
80*c175cce5SDavid van Moolenbroek 		}
81*c175cce5SDavid van Moolenbroek 
82*c175cce5SDavid van Moolenbroek 		close(fd);
83*c175cce5SDavid van Moolenbroek 
84*c175cce5SDavid van Moolenbroek 		printf("write cache %sabled\n", val ? "en" : "dis");
85*c175cce5SDavid van Moolenbroek 
86*c175cce5SDavid van Moolenbroek 	} else if (!strcasecmp(argv[2], "flush")) {
87*c175cce5SDavid van Moolenbroek 		if (argc != 3) usage();
88*c175cce5SDavid van Moolenbroek 
89*c175cce5SDavid van Moolenbroek 		fd = open_dev(argv[1], O_WRONLY);
90*c175cce5SDavid van Moolenbroek 
91*c175cce5SDavid van Moolenbroek 		if (ioctl(fd, DIOCFLUSH, NULL) != 0) {
92*c175cce5SDavid van Moolenbroek 			perror("ioctl");
93*c175cce5SDavid van Moolenbroek 
94*c175cce5SDavid van Moolenbroek 			return EXIT_FAILURE;
95*c175cce5SDavid van Moolenbroek 		}
96*c175cce5SDavid van Moolenbroek 
97*c175cce5SDavid van Moolenbroek 		close(fd);
98*c175cce5SDavid van Moolenbroek 
99*c175cce5SDavid van Moolenbroek 		printf("write cache flushed\n");
100*c175cce5SDavid van Moolenbroek 
101*c175cce5SDavid van Moolenbroek 	} else
102*c175cce5SDavid van Moolenbroek 		usage();
103*c175cce5SDavid van Moolenbroek 
104*c175cce5SDavid van Moolenbroek 	return EXIT_SUCCESS;
105*c175cce5SDavid van Moolenbroek }
106