chiark / gitweb /
rules: add persistent /dev/serial/{by-id,by-path} rules
[elogind.git] / extras / volume_id / vol_id.c
index df47501a6bee079f0289ba4f03057f09cb13994f..889bd3483da174b13f8dac46b55a2cb332720bea 100644 (file)
@@ -31,6 +31,7 @@
 #include <grp.h>
 #include <getopt.h>
 #include <fcntl.h>
+#include <sys/stat.h>
 #include <inttypes.h>
 #include <sys/ioctl.h>
 
@@ -214,9 +215,17 @@ int main(int argc, char *argv[])
        }
 
        if (size == 0) {
-               if (ioctl(fd, BLKGETSIZE64, &size) != 0)
-                       size = 0;
-               info(udev_ctx, "BLKGETSIZE64=%" PRIu64 " (%" PRIu64 "GB)\n", size, size >> 30);
+               if (ioctl(fd, BLKGETSIZE64, &size) == 0) {
+                       info(udev_ctx, "BLKGETSIZE64=%" PRIu64 " (%" PRIu64 "GB)\n", size, size >> 30);
+               } else {
+                       struct stat statbuf;
+
+                       if (fstat(fd, &statbuf) == 0 && S_ISREG(statbuf.st_mode))
+                               size = statbuf.st_size;
+                       else
+                               size = 0;
+                       info(udev_ctx, "stat=%" PRIu64 " (%" PRIu64 "GB)\n", size, size >> 30);
+               }
        }
 
        /* try to drop all privileges before reading disk content */
@@ -242,7 +251,8 @@ int main(int argc, char *argv[])
        else
                retval = volume_id_probe_all(vid, offset, size);
        if (retval != 0) {
-               fprintf(stderr, "%s: unknown volume type\n", node);
+               fprintf(stderr, "unknown or non-unique volume type "
+                               "(--probe-all lists possibly conflicting types)\n");
                rc = 4;
                goto exit;
        }