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