+int get_uuid(char *path, char *uuid, int uuidlen, char *u)
+{
+ /* extract hex digits from uuidstr and compose a uuid
+ * of the given length (max 16), xoring bytes to make
+ * a smaller uuid. Then compare with uuid
+ */
+ int i = 0;
+ const char *val;
+
+ if (path) {
+ static blkid_cache cache = NULL;
+ struct stat stb;
+ char *devname;
+ blkid_tag_iterate iter;
+ blkid_dev dev;
+ const char *type;
+ if (cache == NULL)
+ blkid_get_cache(&cache, NULL);
+
+ blkid_probe_all_new(cache);
+
+ if (stat(path, &stb) != 0)
+ return 0;
+ devname = blkid_devno_to_devname(stb.st_dev);
+ if (!devname)
+ return 0;
+ dev = blkid_get_dev(cache, devname, BLKID_DEV_NORMAL);
+ free(devname);
+ if (!dev)
+ return 0;
+ iter = blkid_tag_iterate_begin(dev);
+ if (!iter)
+ return 0;
+ while (blkid_tag_next(iter, &type, &val) == 0)
+ if (strcmp(type, "UUID") == 0)
+ break;
+ blkid_tag_iterate_end(iter);
+ if (!type)
+ return 0;
+ } else {
+ val = uuid;
+ }
+
+ memset(u, 0, uuidlen);
+ for ( ; *val ; val++) {
+ char c = *val;
+ if (!isxdigit(c))
+ continue;
+ if (isalpha(c)) {
+ if (isupper(c))
+ c = c - 'A' + 10;
+ else
+ c = c - 'a' + 10;
+ } else
+ c = c - '0' + 0;
+ if ((i&1) == 0)
+ c <<= 4;
+ u[i/2] ^= c;
+ i++;
+ if (i == uuidlen*2)
+ i = 0;
+ }
+ return 1;
+}
+
+