static void print_udev_format(const char *name, const char *value, size_t sz) { char enc[265], safe[256]; *safe = *enc = '\0'; if (!strcmp(name, "TYPE") || !strcmp(name, "VERSION")) { blkid_encode_string(value, enc, sizeof(enc)); printf("ID_FS_%s=%s\n", name, enc); } else if (!strcmp(name, "UUID") || !strcmp(name, "LABEL") || !strcmp(name, "UUID_SUB")) { blkid_safe_string(value, safe, sizeof(safe)); printf("ID_FS_%s=%s\n", name, safe); blkid_encode_string(value, enc, sizeof(enc)); printf("ID_FS_%s_ENC=%s\n", name, enc); } else if (!strcmp(name, "PTTYPE")) printf("ID_PART_TABLE_TYPE=%s\n", value); /* TODO: ID_PART_ENTRY_{UUID,NAME,FLAG} */ else printf("ID_FS_%s=%s\n", name, value); }
static void print_parsable(struct wipe_desc *wp, int line) { char enc[256]; if (!line) printf("# offset,uuid,label,type\n"); printf("0x%jx,", wp->offset); if (wp->uuid) { blkid_encode_string(wp->uuid, enc, sizeof(enc)); printf("%s,", enc); } else fputc(',', stdout); if (wp->label) { blkid_encode_string(wp->label, enc, sizeof(enc)); printf("%s,", enc); } else fputc(',', stdout); blkid_encode_string(wp->type, enc, sizeof(enc)); printf("%s\n", enc); }
static void print_property(struct udev_device *dev, bool test, const char *name, const char *value) { char s[265]; s[0] = '\0'; if (streq(name, "TYPE")) { udev_builtin_add_property(dev, test, "ID_FS_TYPE", value); } else if (streq(name, "USAGE")) { udev_builtin_add_property(dev, test, "ID_FS_USAGE", value); } else if (streq(name, "VERSION")) { udev_builtin_add_property(dev, test, "ID_FS_VERSION", value); } else if (streq(name, "UUID")) { blkid_safe_string(value, s, sizeof(s)); udev_builtin_add_property(dev, test, "ID_FS_UUID", s); blkid_encode_string(value, s, sizeof(s)); udev_builtin_add_property(dev, test, "ID_FS_UUID_ENC", s); } else if (streq(name, "UUID_SUB")) { blkid_safe_string(value, s, sizeof(s)); udev_builtin_add_property(dev, test, "ID_FS_UUID_SUB", s); blkid_encode_string(value, s, sizeof(s)); udev_builtin_add_property(dev, test, "ID_FS_UUID_SUB_ENC", s); } else if (streq(name, "LABEL")) { blkid_safe_string(value, s, sizeof(s)); udev_builtin_add_property(dev, test, "ID_FS_LABEL", s); blkid_encode_string(value, s, sizeof(s)); udev_builtin_add_property(dev, test, "ID_FS_LABEL_ENC", s); } else if (streq(name, "PTTYPE")) { udev_builtin_add_property(dev, test, "ID_PART_TABLE_TYPE", value); } else if (streq(name, "PART_ENTRY_NAME")) { blkid_encode_string(value, s, sizeof(s)); udev_builtin_add_property(dev, test, "ID_PART_ENTRY_NAME", s); } else if (streq(name, "PART_ENTRY_TYPE")) { blkid_encode_string(value, s, sizeof(s)); udev_builtin_add_property(dev, test, "ID_PART_ENTRY_TYPE", s); } else if (startswith(name, "PART_ENTRY_")) { util_strscpyl(s, sizeof(s), "ID_", name, NULL); udev_builtin_add_property(dev, test, s, value); } }
static void print_udev_format(const char *name, const char *value) { char enc[265], safe[256]; size_t namelen = strlen(name); *safe = *enc = '\0'; if (!strcmp(name, "TYPE") || !strcmp(name, "VERSION")) { blkid_encode_string(value, enc, sizeof(enc)); printf("ID_FS_%s=%s\n", name, enc); } else if (!strcmp(name, "UUID") || !strcmp(name, "LABEL") || !strcmp(name, "UUID_SUB")) { blkid_safe_string(value, safe, sizeof(safe)); printf("ID_FS_%s=%s\n", name, safe); blkid_encode_string(value, enc, sizeof(enc)); printf("ID_FS_%s_ENC=%s\n", name, enc); } else if (!strcmp(name, "PTUUID")) { printf("ID_PART_TABLE_UUID=%s\n", value); } else if (!strcmp(name, "PTTYPE")) { printf("ID_PART_TABLE_TYPE=%s\n", value); } else if (!strcmp(name, "PART_ENTRY_NAME") || !strcmp(name, "PART_ENTRY_TYPE")) { blkid_encode_string(value, enc, sizeof(enc)); printf("ID_%s=%s\n", name, enc); } else if (!strncmp(name, "PART_ENTRY_", 11)) printf("ID_%s=%s\n", name, value); else if (namelen >= 15 && ( !strcmp(name + (namelen - 12), "_SECTOR_SIZE") || !strcmp(name + (namelen - 8), "_IO_SIZE") || !strcmp(name, "ALIGNMENT_OFFSET"))) printf("ID_IOLIMIT_%s=%s\n", name, value); else printf("ID_FS_%s=%s\n", name, value); }
/* * Compose and print ID_FS_AMBIVALENT for udev */ static int print_udev_ambivalent(blkid_probe pr) { char *val = NULL; size_t valsz = 0; int count = 0, rc = -1; while (!blkid_do_probe(pr)) { const char *usage = NULL, *type = NULL, *version = NULL; char enc[256]; blkid_probe_lookup_value(pr, "USAGE", &usage, NULL); blkid_probe_lookup_value(pr, "TYPE", &type, NULL); blkid_probe_lookup_value(pr, "VERSION", &version, NULL); if (!usage || !type) continue; blkid_encode_string(usage, enc, sizeof(enc)); if (append_str(&val, &valsz, enc, ":")) goto done; blkid_encode_string(type, enc, sizeof(enc)); if (append_str(&val, &valsz, enc, version ? ":" : " ")) goto done; if (version) { blkid_encode_string(version, enc, sizeof(enc)); if (append_str(&val, &valsz, enc, " ")) goto done; } count++; } if (count > 1) { *(val + valsz - 1) = '\0'; /* rem tailing whitespace */ printf("ID_FS_AMBIVALEN=%s\n", val); rc = 0; } done: free(val); return rc; }
static char *evaluate_by_udev(const char *token, const char *value, int uevent) { char dev[PATH_MAX]; char *path = NULL; size_t len; struct stat st; DBG(EVALUATE, ul_debug("evaluating by udev %s=%s", token, value)); if (!strcmp(token, "UUID")) strcpy(dev, _PATH_DEV_BYUUID "/"); else if (!strcmp(token, "LABEL")) strcpy(dev, _PATH_DEV_BYLABEL "/"); else if (!strcmp(token, "PARTLABEL")) strcpy(dev, _PATH_DEV_BYPARTLABEL "/"); else if (!strcmp(token, "PARTUUID")) strcpy(dev, _PATH_DEV_BYPARTUUID "/"); else { DBG(EVALUATE, ul_debug("unsupported token %s", token)); return NULL; /* unsupported tag */ } len = strlen(dev); if (blkid_encode_string(value, &dev[len], sizeof(dev) - len) != 0) return NULL; DBG(EVALUATE, ul_debug("expected udev link: %s", dev)); if (stat(dev, &st)) goto failed; /* link or device does not exist */ if (!S_ISBLK(st.st_mode)) return NULL; path = canonicalize_path(dev); if (!path) return NULL; #ifdef CONFIG_BLKID_VERIFY_UDEV if (verify_tag(path, token, value)) goto failed; #endif return path; failed: DBG(EVALUATE, ul_debug("failed to evaluate by udev")); if (uevent && path) blkid_send_uevent(path, "change"); free(path); return NULL; }
static char * evaluate_spec(const char *spec) { char *tag, *value; size_t len; char *p; char *ret, *retp; tag = strdup(spec); if (!tag) return NULL; value = strchr(tag, '='); if (!value) return tag; *value++ = '\0'; if (*value == '"' || *value == '\'') { char c = *value++; p = strrchr(value, c); if (!p) { errno = -EINVAL; return NULL; } *p = '\0'; } len = 4 * strlen(value); ret = malloc(DEV_PREFIX_LEN + strlen(tag) + 1 + len + 1); retp = stpcpy(ret, DEV_PREFIX); for (p = tag; *p; ++p) *retp++ = tolower(*p); *retp++ = '/'; blkid_encode_string(value, retp, len + 1); free(tag); return ret; }