- if (node->prefix_off) {
- uint8_t c;
-
- for (; (c = trie_string(trie, node->prefix_off)[p]); p++) {
- if (c == '*' || c == '?' || c == '[') {
- trie_fnmatch_f(trie, node, p, &buf, search + i + p, cb);
- return;
- }
- if (c != search[i + p])
- return;
- }
- i += p;
- }
-
- child = node_lookup_f(trie, node, '*');
- if (child) {
- linebuf_add_char(&buf, '*');
- trie_fnmatch_f(trie, child, 0, &buf, search + i, cb);
- linebuf_rem_char(&buf);
- }
-
- child = node_lookup_f(trie, node, '?');
- if (child) {
- linebuf_add_char(&buf, '?');
- trie_fnmatch_f(trie, child, 0, &buf, search + i, cb);
- linebuf_rem_char(&buf);
- }
-
- child = node_lookup_f(trie, node, '[');
- if (child) {
- linebuf_add_char(&buf, '[');
- trie_fnmatch_f(trie, child, 0, &buf, search + i, cb);
- linebuf_rem_char(&buf);
- }
-
- if (search[i] == '\0') {
- size_t n;
-
- for (n = 0; n < node->values_count; n++)
- cb(trie, trie_string(trie, trie_node_values(trie, node)[n].key_off),
- trie_string(trie, trie_node_values(trie, node)[n].value_off));
- return;
- }
-
- child = node_lookup_f(trie, node, search[i]);
- node = child;
- i++;
- }
-}
-
-static void value_cb(struct trie_f *trie, const char *key, const char *value) {
- /* TODO: add sub-matches (+) against DMI data */
- if (key[0] == ' ')
- udev_builtin_add_property(trie->dev, trie->test, key + 1, value);
+ v = udev_device_get_sysattr_value(dev, "idVendor");
+ if (!v)
+ return NULL;
+ p = udev_device_get_sysattr_value(dev, "idProduct");
+ if (!p)
+ return NULL;
+ vn = strtol(v, NULL, 16);
+ if (vn <= 0)
+ return NULL;
+ pn = strtol(p, NULL, 16);
+ if (pn <= 0)
+ return NULL;
+ snprintf(s, size, "usb:v%04Xp%04X*", vn, pn);
+ return s;