forked from pool/util-linux
66 lines
1.4 KiB
Diff
66 lines
1.4 KiB
Diff
--- disk-utils/raw.c
|
|
+++ disk-utils/raw.c
|
|
@@ -100,7 +100,7 @@
|
|
}
|
|
|
|
/*
|
|
- * It's a bind or a single query. Either way we need a raw device.
|
|
+ * It's a bind or a single query.
|
|
*/
|
|
|
|
if (optind >= argc)
|
|
@@ -108,27 +108,38 @@
|
|
raw_name = argv[optind++];
|
|
|
|
err = stat(raw_name, &statbuf);
|
|
- if (err) {
|
|
+ if (err && do_query) {
|
|
fprintf (stderr, "Cannot locate raw device '%s' (%s)\n",
|
|
raw_name, strerror(errno));
|
|
exit(2);
|
|
}
|
|
|
|
- if (!S_ISCHR(statbuf.st_mode)) {
|
|
- fprintf (stderr, "raw device '%s' is not a character dev\n",
|
|
- raw_name);
|
|
- exit(2);
|
|
- }
|
|
- if (major(statbuf.st_rdev) != RAW_MAJOR) {
|
|
- fprintf (stderr, "Device '%s' is not a raw dev\n",
|
|
- raw_name);
|
|
- exit(2);
|
|
- }
|
|
-
|
|
- raw_minor = minor(statbuf.st_rdev);
|
|
+ if (!err) {
|
|
+ if (!S_ISCHR(statbuf.st_mode)) {
|
|
+ fprintf (stderr, "raw device '%s' is not a character dev\n",
|
|
+ raw_name);
|
|
+ exit(2);
|
|
+ }
|
|
+ if (major(statbuf.st_rdev) != RAW_MAJOR) {
|
|
+ fprintf (stderr, "Device '%s' is not a raw dev\n",
|
|
+ raw_name);
|
|
+ exit(2);
|
|
+ }
|
|
|
|
- if (do_query)
|
|
- return query(raw_minor, 0);
|
|
+ raw_minor = minor(statbuf.st_rdev);
|
|
+ if (do_query)
|
|
+ return query(raw_minor, 0);
|
|
+ } else {
|
|
+ char *p;
|
|
+ p = strrchr(raw_name, '/');
|
|
+ if (p) {
|
|
+ p = strpbrk(p, "0123456789");
|
|
+ if (p)
|
|
+ raw_minor = atoi(p);
|
|
+ }
|
|
+ if (!p)
|
|
+ raw_minor = -1;
|
|
+ }
|
|
|
|
/*
|
|
* It's not a query, so we still have some parsing to do. Have
|