hwdb.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. // SPDX-License-Identifier: LGPL-2.1-or-later
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2011-2014 Intel Corporation
  7. * Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
  8. *
  9. *
  10. */
  11. #ifdef HAVE_CONFIG_H
  12. #include <config.h>
  13. #endif
  14. #define _GNU_SOURCE
  15. #include <stdio.h>
  16. #include <string.h>
  17. #include "hwdb.h"
  18. #ifdef HAVE_UDEV_HWDB_NEW
  19. #include <libudev.h>
  20. bool hwdb_get_vendor_model(const char *modalias, char **vendor, char **model)
  21. {
  22. struct udev *udev;
  23. struct udev_hwdb *hwdb;
  24. struct udev_list_entry *head, *entry;
  25. bool result;
  26. udev = udev_new();
  27. if (!udev)
  28. return false;
  29. hwdb = udev_hwdb_new(udev);
  30. if (!hwdb) {
  31. result = false;
  32. goto done;
  33. }
  34. *vendor = NULL;
  35. *model = NULL;
  36. head = udev_hwdb_get_properties_list_entry(hwdb, modalias, 0);
  37. udev_list_entry_foreach(entry, head) {
  38. const char *name = udev_list_entry_get_name(entry);
  39. if (!name)
  40. continue;
  41. if (!*vendor && !strcmp(name, "ID_VENDOR_FROM_DATABASE"))
  42. *vendor = strdup(udev_list_entry_get_value(entry));
  43. else if (!*model && !strcmp(name, "ID_MODEL_FROM_DATABASE"))
  44. *model = strdup(udev_list_entry_get_value(entry));
  45. }
  46. hwdb = udev_hwdb_unref(hwdb);
  47. result = true;
  48. done:
  49. udev = udev_unref(udev);
  50. return result;
  51. }
  52. bool hwdb_get_company(const uint8_t *bdaddr, char **company)
  53. {
  54. struct udev *udev;
  55. struct udev_hwdb *hwdb;
  56. struct udev_list_entry *head, *entry;
  57. char modalias[11];
  58. bool result;
  59. if (!bdaddr[2] && !bdaddr[1] && !bdaddr[0])
  60. return false;
  61. sprintf(modalias, "OUI:%2.2X%2.2X%2.2X",
  62. bdaddr[5], bdaddr[4], bdaddr[3]);
  63. udev = udev_new();
  64. if (!udev)
  65. return false;
  66. hwdb = udev_hwdb_new(udev);
  67. if (!hwdb) {
  68. result = false;
  69. goto done;
  70. }
  71. *company = NULL;
  72. head = udev_hwdb_get_properties_list_entry(hwdb, modalias, 0);
  73. udev_list_entry_foreach(entry, head) {
  74. const char *name = udev_list_entry_get_name(entry);
  75. if (name && !strcmp(name, "ID_OUI_FROM_DATABASE")) {
  76. *company = strdup(udev_list_entry_get_value(entry));
  77. break;
  78. }
  79. }
  80. hwdb = udev_hwdb_unref(hwdb);
  81. result = true;
  82. done:
  83. udev = udev_unref(udev);
  84. return result;
  85. }
  86. #else
  87. bool hwdb_get_vendor_model(const char *modalias, char **vendor, char **model)
  88. {
  89. return false;
  90. }
  91. bool hwdb_get_company(const uint8_t *bdaddr, char **company)
  92. {
  93. return false;
  94. }
  95. #endif