X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=extras%2Fvolume_id%2Fvol_id.c;h=a50560c097a8b8de03d068f21d1695fe2470a4f7;hp=2b487d0b3c51f635862a094ac8c56d46020dd5e0;hb=4dfe61c9668a0f6528de14ec413fce06be0b575c;hpb=d4f687c013a18010fdc2ddf937fad064343e635a diff --git a/extras/volume_id/vol_id.c b/extras/volume_id/vol_id.c index 2b487d0b3..a50560c09 100644 --- a/extras/volume_id/vol_id.c +++ b/extras/volume_id/vol_id.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include "../../udev/udev.h" @@ -65,38 +66,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) @@ -138,7 +107,10 @@ int main(int argc, char *argv[]) struct volume_id *vid = NULL; char label_safe[256]; char label_enc[256]; + char uuid_safe[256]; char uuid_enc[256]; + char type_enc[256]; + char type_version_enc[256]; uint64_t size = 0; int skip_raid = 0; int probe_all = 0; @@ -244,7 +216,7 @@ 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); + info(udev_ctx, "BLKGETSIZE64=%" PRIu64 " (%" PRIu64 "GB)\n", size, size >> 30); } /* try to drop all privileges before reading disk content */ @@ -270,7 +242,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; } @@ -284,22 +257,26 @@ 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)); + + 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)); + volume_id_encode_string(type_version, type_version_enc, sizeof(type_version_enc)); + switch (print) { case PRINT_EXPORT: printf("ID_FS_USAGE=%s\n", usage); - printf("ID_FS_TYPE=%s\n", type); - printf("ID_FS_VERSION=%s\n", type_version); - printf("ID_FS_UUID=%s\n", uuid); + printf("ID_FS_TYPE=%s\n", type_enc); + 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); - printf("ID_FS_LABEL=%s\n", label); + printf("ID_FS_LABEL=%s\n", label_safe); printf("ID_FS_LABEL_ENC=%s\n", label_enc); - printf("ID_FS_LABEL_SAFE=%s\n", label_safe); break; case PRINT_TYPE: printf("%s\n", type);