From 49b84e8f5a4619788d85fef9b289154776ab6a29 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Mon, 9 Dec 2013 23:37:15 +0100 Subject: settings: Vendor from OUI helper function --- lib/pin.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'lib/pin.c') diff --git a/lib/pin.c b/lib/pin.c index 390b4971..74e6c87c 100644 --- a/lib/pin.c +++ b/lib/pin.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -36,6 +37,54 @@ #define PIN_CODE_DB "pin-code-database.xml" #define MAX_DIGITS_PIN_PREFIX "max:" +char * +oui_to_vendor (const char *oui) +{ + struct udev *udev; + struct udev_hwdb *hwdb; + struct udev_list_entry *list, *l; + char *modalias; + char *vendor = NULL; + + if (oui == NULL || + strlen (oui) < 8) + return NULL; + + udev = udev_new (); + if (udev == NULL) + goto bail; + + hwdb = udev_hwdb_new (udev); + if (hwdb == NULL) + goto bail; + + modalias = g_strdup_printf ("OUI:%c%c%c%c%c%c", + g_ascii_toupper (oui[0]), + g_ascii_toupper (oui[1]), + g_ascii_toupper (oui[3]), + g_ascii_toupper (oui[4]), + g_ascii_toupper (oui[6]), + g_ascii_toupper (oui[7])); + + list = udev_hwdb_get_properties_list_entry (hwdb, modalias, 0); + + udev_list_entry_foreach (l, list) { + const char *name = udev_list_entry_get_name (l); + + if (g_strcmp0 (name, "ID_OUI_FROM_DATABASE") == 0) { + vendor = g_strdup (udev_list_entry_get_value (l)); + break; + } + } + +bail: + g_clear_pointer (&modalias, g_free); + g_clear_pointer (&hwdb, udev_hwdb_unref); + g_clear_pointer (&udev, udev_unref); + + return vendor; +} + #define TYPE_IS(x, r) { \ if (g_str_equal(type, x)) return r; \ } -- cgit v1.2.1