]>
git.ipfire.org Git - thirdparty/util-linux.git/blob - disk-utils/raw.c
2 * raw.c: User mode tool to bind and query raw character devices.
4 * Stephen Tweedie, 1999, 2000
6 * This file may be redistributed under the terms of the GNU General
7 * Public License, version 2.
9 * Copyright Red Hat Software, 1999, 2000
18 #include <sys/fcntl.h>
20 #include <sys/ioctl.h>
21 #include <sys/sysmacros.h>
22 #include <linux/raw.h>
23 #include <linux/major.h>
26 #define RAWCTLDEV "/dev/raw"
27 #define RAWDEVDIR "/dev/"
29 #define RAWCTLDEV "/dev/rawctl"
30 #define RAWDEVDIR "/dev/raw/"
41 void open_raw_ctl(void);
42 int query(int minor
, int quiet
);
43 int bind (int minor
, int block_major
, int block_minor
);
46 static void usage(int err
)
50 " %s " RAWDEVDIR
"rawN <major> <minor>\n"
51 " %s " RAWDEVDIR
"rawN /dev/<blockdev>\n"
52 " %s -q " RAWDEVDIR
"rawN\n"
54 progname
, progname
, progname
, progname
);
59 int main(int argc
, char *argv
[])
65 int block_major
, block_minor
;
72 while ((c
= getopt(argc
, argv
, "ahq")) != EOF
) {
88 * Check for, and open, the master raw device, /dev/raw
102 * It's a bind or a single query. Either way we need a raw device.
107 raw_name
= argv
[optind
++];
109 err
= stat(raw_name
, &statbuf
);
111 fprintf (stderr
, "Cannot locate raw device '%s' (%s)\n",
112 raw_name
, strerror(errno
));
116 if (!S_ISCHR(statbuf
.st_mode
)) {
117 fprintf (stderr
, "raw device '%s' is not a character dev\n",
121 if (major(statbuf
.st_rdev
) != RAW_MAJOR
) {
122 fprintf (stderr
, "Device '%s' is not a raw dev\n",
127 raw_minor
= minor(statbuf
.st_rdev
);
130 return query(raw_minor
, 0);
133 * It's not a query, so we still have some parsing to do. Have
134 * we been given a block device filename or a major/minor pair?
137 switch (argc
- optind
) {
139 block_name
= argv
[optind
];
140 err
= stat(block_name
, &statbuf
);
143 "Cannot locate block device '%s' (%s)\n",
144 block_name
, strerror(errno
));
148 if (!S_ISBLK(statbuf
.st_mode
)) {
149 fprintf (stderr
, "Device '%s' is not a block dev\n",
154 block_major
= major(statbuf
.st_rdev
);
155 block_minor
= minor(statbuf
.st_rdev
);
159 block_major
= strtol(argv
[optind
], 0, 0);
160 block_minor
= strtol(argv
[optind
+1], 0, 0);
164 block_major
= block_minor
= 0; /* just to keep gcc happy */
168 return bind(raw_minor
, block_major
, block_minor
);
174 void open_raw_ctl(void)
176 master_fd
= open(RAWCTLDEV
, O_RDWR
, 0);
179 "Cannot open master raw device '" RAWCTLDEV
"' (%s)\n",
185 int query(int minor
, int quiet
)
187 struct raw_config_request rq
;
190 rq
.raw_minor
= minor
;
191 err
= ioctl(master_fd
, RAW_GETBIND
, &rq
);
193 if (quiet
&& errno
== ENODEV
)
196 "Error querying raw device (%s)\n",
200 if (quiet
&& !rq
.block_major
&& !rq
.block_minor
)
202 printf (RAWDEVDIR
"raw%d: bound to major %d, minor %d\n",
203 minor
, (int) rq
.block_major
, (int) rq
.block_minor
);
207 int bind(int minor
, int block_major
, int block_minor
)
209 struct raw_config_request rq
;
212 rq
.raw_minor
= minor
;
213 rq
.block_major
= block_major
;
214 rq
.block_minor
= block_minor
;
215 err
= ioctl(master_fd
, RAW_SETBIND
, &rq
);
218 "Error setting raw device (%s)\n",
222 printf (RAWDEVDIR
"raw%d: bound to major %d, minor %d\n",
223 raw_minor
, (int) rq
.block_major
, (int) rq
.block_minor
);