chiark / gitweb /
update TODO
[elogind.git] / extras / volume_id / vol_id.c
index a50560c097a8b8de03d068f21d1695fe2470a4f7..3e44c3b069794b81a1e61338c98eef0fa7671bf3 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>
 
@@ -109,6 +110,7 @@ int main(int argc, char *argv[])
        char label_enc[256];
        char uuid_safe[256];
        char uuid_enc[256];
+       char uuid_sub_enc[256];
        char type_enc[256];
        char type_version_enc[256];
        uint64_t size = 0;
@@ -117,7 +119,7 @@ int main(int argc, char *argv[])
        uint64_t offset = 0;
        const char *node;
        int fd;
-       const char *label, *uuid, *type, *type_version, *usage;
+       const char *label, *uuid, *uuid_sub, *type, *type_version, *usage;
        int retval;
        int rc = 0;
 
@@ -214,9 +216,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 */
@@ -252,7 +262,8 @@ int main(int argc, char *argv[])
            !volume_id_get_usage(vid, &usage) ||
            !volume_id_get_type(vid, &type) ||
            !volume_id_get_type_version(vid, &type_version) ||
-           !volume_id_get_uuid(vid, &uuid)) {
+           !volume_id_get_uuid(vid, &uuid) ||
+           !volume_id_get_uuid_sub(vid, &uuid_sub)) {
                rc = 4;
                goto exit;
        }
@@ -265,6 +276,8 @@ int main(int argc, char *argv[])
        udev_util_replace_chars(uuid_safe, UDEV_ALLOWED_CHARS_INPUT);
        volume_id_encode_string(uuid, uuid_enc, sizeof(uuid_enc));
 
+       volume_id_encode_string(uuid_sub, uuid_sub_enc, sizeof(uuid_sub_enc));
+
        volume_id_encode_string(type, type_enc, sizeof(type_enc));
        volume_id_encode_string(type_version, type_version_enc, sizeof(type_version_enc));
 
@@ -275,6 +288,8 @@ int main(int argc, char *argv[])
                printf("ID_FS_VERSION=%s\n", type_version_enc);
                printf("ID_FS_UUID=%s\n", uuid_safe);
                printf("ID_FS_UUID_ENC=%s\n", uuid_enc);
+               if (uuid_sub_enc[0] != '\0')
+                       printf("ID_FS_UUID_SUB_ENC=%s\n", uuid_sub_enc);
                printf("ID_FS_LABEL=%s\n", label_safe);
                printf("ID_FS_LABEL_ENC=%s\n", label_enc);
                break;