summaryrefslogtreecommitdiffstats
path: root/hcid/device.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2006-02-11 12:14:49 +0000
committerMarcel Holtmann <marcel@holtmann.org>2006-02-11 12:14:49 +0000
commit6a3ea0f9f9aa9dd550f9f2af4a36639961846643 (patch)
treea08ed7c97f9773c8389cf3b27d76919868328131 /hcid/device.c
parent2fa395ac7d4bd9d0108194c375bf69839f4d62ec (diff)
Implement local device name and remote alias functions
Diffstat (limited to 'hcid/device.c')
-rw-r--r--hcid/device.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/hcid/device.c b/hcid/device.c
index 71d97dbd..feb9be12 100644
--- a/hcid/device.c
+++ b/hcid/device.c
@@ -32,12 +32,14 @@
#include <syslog.h>
#include <string.h>
#include <sys/time.h>
+#include <sys/stat.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
+#include "textfile.h"
#include "oui.h"
#define MAX_DEVICES 16
@@ -74,6 +76,8 @@ struct hci_dev {
uint16_t lmp_subver;
uint16_t manufacturer;
+ uint8_t name[248];
+
struct hci_peer *peers;
struct hci_conn *conns;
};
@@ -265,3 +269,95 @@ int get_device_company(uint16_t dev_id, char *company, size_t size)
return err;
}
+
+int get_device_name(uint16_t dev_id, char *name, size_t size)
+{
+ char tmp[249];
+ int dd;
+
+ ASSERT_DEV_ID;
+
+ memset(tmp, 0, sizeof(tmp));
+
+ dd = hci_open_dev(dev_id);
+ if (dd < 0) {
+ err("Can't open device hci%d",
+ dev_id, strerror(errno), errno);
+ return -errno;
+ }
+
+ if (hci_read_local_name(dd, sizeof(tmp), tmp, 2000) < 0) {
+ err("Can't read name for hci%d: %s (%d)",
+ dev_id, strerror(errno), errno);
+ return -errno;
+ }
+
+ hci_close_dev(dd);
+
+ memcpy(devices[dev_id].name, tmp, 248);
+
+ return snprintf(name, size, "%s", tmp);
+}
+
+int set_device_name(uint16_t dev_id, const char *name)
+{
+ int dd;
+
+ ASSERT_DEV_ID;
+
+ dd = hci_open_dev(dev_id);
+ if (dd < 0) {
+ err("Can't open device hci%d",
+ dev_id, strerror(errno), errno);
+ return -errno;
+ }
+
+ if (hci_write_local_name(dd, name, 5000) < 0) {
+ err("Can't read name for hci%d: %s (%d)",
+ dev_id, strerror(errno), errno);
+ return -errno;
+ }
+
+ hci_close_dev(dd);
+
+ return 0;
+}
+
+int get_device_alias(uint16_t dev_id, const bdaddr_t *bdaddr, char *alias, size_t size)
+{
+ char filename[PATH_MAX + 1], addr[18], *tmp;
+ int err;
+
+ ASSERT_DEV_ID;
+
+ ba2str(&devices[dev_id].bdaddr, addr);
+ snprintf(filename, PATH_MAX, "%s/%s/aliases", STORAGEDIR, addr);
+
+ ba2str(bdaddr, addr);
+
+ tmp = textfile_get(filename, addr);
+ if (!tmp)
+ return -ENXIO;
+
+ err = snprintf(alias, size, "%s", tmp);
+
+ free(tmp);
+
+ return err;
+}
+
+int set_device_alias(uint16_t dev_id, const bdaddr_t *bdaddr, const char *alias)
+{
+ char filename[PATH_MAX + 1], addr[18];
+
+ ASSERT_DEV_ID;
+
+ ba2str(&devices[dev_id].bdaddr, addr);
+ snprintf(filename, PATH_MAX, "%s/%s/aliases", STORAGEDIR, addr);
+
+ create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+
+ ba2str(bdaddr, addr);
+
+ return textfile_put(filename, addr, alias);
+}