chiark / gitweb /
man: fix typos
[elogind.git] / extras / volume_id / vol_id.c
index b153bc54101668f0039f0531d82cf0459b7c0564..889bd3483da174b13f8dac46b55a2cb332720bea 100644 (file)
@@ -31,6 +31,8 @@
 #include <grp.h>
 #include <getopt.h>
 #include <fcntl.h>
+#include <sys/stat.h>
+#include <inttypes.h>
 #include <sys/ioctl.h>
 
 #include "../../udev/udev.h"
@@ -65,38 +67,6 @@ static void vid_log(int priority, const char *file, int line, const char *format
        return;
 }
 
-static void set_str(char *to, const char *from, size_t count)
-{
-       size_t i, j, len;
-
-       /* strip trailing whitespace */
-       len = strnlen(from, count);
-       while (len && isspace(from[len-1]))
-               len--;
-
-       /* strip leading whitespace */
-       i = 0;
-       while (isspace(from[i]) && (i < len))
-               i++;
-
-       j = 0;
-       while (i < len) {
-               /* substitute multiple whitespace */
-               if (isspace(from[i])) {
-                       while (isspace(from[i]))
-                               i++;
-                       to[j++] = '_';
-               }
-               /* skip chars */
-               if (from[i] == '/') {
-                       i++;
-                       continue;
-               }
-               to[j++] = from[i++];
-       }
-       to[j] = '\0';
-}
-
 static int all_probers(volume_id_probe_fn_t probe_fn,
                       struct volume_id *id, uint64_t off, uint64_t size,
                       void *data)
@@ -245,9 +215,17 @@ int main(int argc, char *argv[])
        }
 
        if (size == 0) {
-               if (ioctl(fd, BLKGETSIZE64, &size) != 0)
-                       size = 0;
-               info(udev_ctx, "BLKGETSIZE64=%llu (%lluGB)\n", (unsigned long long)size, (unsigned long long)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 */
@@ -273,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;
        }
@@ -287,12 +266,12 @@ int main(int argc, char *argv[])
                goto exit;
        }
 
-       set_str(label_safe, label, sizeof(label_safe));
-       util_replace_chars(label_safe, ALLOWED_CHARS_INPUT);
+       udev_util_replace_whitespace(label, label_safe, sizeof(label_safe));
+       udev_util_replace_chars(label_safe, UDEV_ALLOWED_CHARS_INPUT);
        volume_id_encode_string(label, label_enc, sizeof(label_enc));
 
-       set_str(uuid_safe, uuid, sizeof(uuid_safe));
-       util_replace_chars(uuid_safe, ALLOWED_CHARS_INPUT);
+       udev_util_replace_whitespace(uuid, uuid_safe, sizeof(uuid_safe));
+       udev_util_replace_chars(uuid_safe, UDEV_ALLOWED_CHARS_INPUT);
        volume_id_encode_string(uuid, uuid_enc, sizeof(uuid_enc));
 
        volume_id_encode_string(type, type_enc, sizeof(type_enc));