device: Set disconnect timer to zero for fast disconnection
[platform/upstream/bluez.git] / monitor / hwdb.c
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
12 #ifdef HAVE_CONFIG_H
13 #include <config.h>
14 #endif
15
16 #include <stdio.h>
17 #include <string.h>
18
19 #include "hwdb.h"
20
21 #ifdef HAVE_UDEV_HWDB_NEW
22 #include <libudev.h>
23
24 bool hwdb_get_vendor_model(const char *modalias, char **vendor, char **model)
25 {
26         struct udev *udev;
27         struct udev_hwdb *hwdb;
28         struct udev_list_entry *head, *entry;
29         bool result;
30
31         udev = udev_new();
32         if (!udev)
33                 return false;
34
35         hwdb = udev_hwdb_new(udev);
36         if (!hwdb) {
37                 result = false;
38                 goto done;
39         }
40
41         *vendor = NULL;
42         *model = NULL;
43
44         head = udev_hwdb_get_properties_list_entry(hwdb, modalias, 0);
45
46         udev_list_entry_foreach(entry, head) {
47                 const char *name = udev_list_entry_get_name(entry);
48
49                 if (!name)
50                         continue;
51
52                 if (!*vendor && !strcmp(name, "ID_VENDOR_FROM_DATABASE"))
53                         *vendor = strdup(udev_list_entry_get_value(entry));
54                 else if (!*model && !strcmp(name, "ID_MODEL_FROM_DATABASE"))
55                         *model = strdup(udev_list_entry_get_value(entry));
56         }
57
58         hwdb = udev_hwdb_unref(hwdb);
59
60         result = true;
61
62 done:
63         udev = udev_unref(udev);
64
65         return result;
66 }
67
68 bool hwdb_get_company(const uint8_t *bdaddr, char **company)
69 {
70         struct udev *udev;
71         struct udev_hwdb *hwdb;
72         struct udev_list_entry *head, *entry;
73         char modalias[11];
74         bool result;
75
76         if (!bdaddr[2] && !bdaddr[1] && !bdaddr[0])
77                 return false;
78
79         sprintf(modalias, "OUI:%2.2X%2.2X%2.2X",
80                                 bdaddr[5], bdaddr[4], bdaddr[3]);
81
82         udev = udev_new();
83         if (!udev)
84                 return false;
85
86         hwdb = udev_hwdb_new(udev);
87         if (!hwdb) {
88                 result = false;
89                 goto done;
90         }
91
92         *company = NULL;
93
94         head = udev_hwdb_get_properties_list_entry(hwdb, modalias, 0);
95
96         udev_list_entry_foreach(entry, head) {
97                 const char *name = udev_list_entry_get_name(entry);
98
99                 if (name && !strcmp(name, "ID_OUI_FROM_DATABASE")) {
100                         *company = strdup(udev_list_entry_get_value(entry));
101                         break;
102                 }
103         }
104
105         hwdb = udev_hwdb_unref(hwdb);
106
107         result = true;
108
109 done:
110         udev = udev_unref(udev);
111
112         return result;
113 }
114 #else
115 bool hwdb_get_vendor_model(const char *modalias, char **vendor, char **model)
116 {
117         return false;
118 }
119
120 bool hwdb_get_company(const uint8_t *bdaddr, char **company)
121 {
122         return false;
123 }
124 #endif