diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2008-09-02 02:28:33 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2008-09-02 02:28:33 +0200 |
commit | 0c05dd3dc5a18d64734a9f091d5285612e41107b (patch) | |
tree | 57de979b0fdef6c07329d0aae06235730a2fb4cb | |
parent | 4f946e36897fc67a28a56fb3102994da6857a038 (diff) | |
parent | 3f498e694e39756890db475f1f1edb528b378ee2 (diff) |
Merge branch 'for-upstream' of git://gitorious.org/bluez/cktakahasis-clone
-rw-r--r-- | doc/network-api.txt | 34 | ||||
-rw-r--r-- | network/Makefile.am | 2 | ||||
-rw-r--r-- | network/common.c | 20 | ||||
-rw-r--r-- | network/common.h | 4 | ||||
-rw-r--r-- | network/connection.c | 8 | ||||
-rw-r--r-- | network/manager.c | 14 | ||||
-rw-r--r-- | network/manager.h | 6 | ||||
-rw-r--r-- | network/network-api.txt | 199 | ||||
-rw-r--r-- | network/server.c | 14 | ||||
-rwxr-xr-x | network/test-network | 37 | ||||
-rw-r--r-- | src/adapter.c | 61 | ||||
-rw-r--r-- | src/hcid.h | 59 | ||||
-rw-r--r-- | src/main.c | 304 | ||||
-rw-r--r-- | src/storage.c | 8 | ||||
-rw-r--r-- | src/storage.h | 4 |
15 files changed, 170 insertions, 604 deletions
diff --git a/doc/network-api.txt b/doc/network-api.txt index a59c8972..85171711 100644 --- a/doc/network-api.txt +++ b/doc/network-api.txt @@ -36,3 +36,37 @@ Methods string Connect(string uuid) Signals void Connected(string device, string uuid) void Disconnected(string device) + + +Network Hub/Peer/Router hierarchy +================= + +Service org.bluez +Interface org.bluez.network.{Hub, Peer, Router} +Object path /org/bluez/{hci0,hci1,...} + +Methods dict GetProperties() + + Returns all properties for the GN/PANU/NAP server. See the + properties section for available properties. + + void SetProperty(string name, variant value) + + Changes the value of the specified property. Only + properties that are listed a read-write are changeable. + On success this will emit a PropertyChanged signal. + + Possible Errors: org.bluez.Error.DoesNotExist + org.bluez.Error.InvalidArguments + +Properties string Name[readwrite] + + The Bluetooth network server name. + + boolean Enable[readwrite] + + Indicates if the server is Enabled/Disabled. + + string Uuid[readonly] + + The Bluetooth network server UUID 128 identification. diff --git a/network/Makefile.am b/network/Makefile.am index 71291d93..5966a619 100644 --- a/network/Makefile.am +++ b/network/Makefile.am @@ -19,6 +19,6 @@ AM_CFLAGS = @BLUEZ_CFLAGS@ @DBUS_CFLAGS@ @GLIB_CFLAGS@ @GDBUS_CFLAGS@ INCLUDES = -I$(top_srcdir)/common -I$(top_srcdir)/src -EXTRA_DIST = network.conf network-api.txt test-network +EXTRA_DIST = network.conf MAINTAINERCLEANFILES = Makefile.in diff --git a/network/common.c b/network/common.c index 151e4810..980486fc 100644 --- a/network/common.c +++ b/network/common.c @@ -32,7 +32,6 @@ #include <sys/param.h> #include <sys/ioctl.h> #include <sys/socket.h> -#include <sys/stat.h> #include <sys/wait.h> #include <net/if.h> @@ -44,7 +43,6 @@ #include "logging.h" #include "common.h" -#include "textfile.h" static int ctl; static GSList *pids; @@ -372,21 +370,3 @@ done: return 0; } - -int read_remote_name(bdaddr_t *src, bdaddr_t *dst, char *buf, size_t size) -{ - char filename[PATH_MAX + 1], addr[18], *str; - - ba2str(src, addr); - create_name(filename, PATH_MAX, STORAGEDIR, addr, "names"); - - ba2str(dst, addr); - str = textfile_get(filename, addr); - if (!str) - return -ENOENT; - - snprintf(buf, size, "%s", str); - free(str); - - return 0; -} diff --git a/network/common.h b/network/common.h index cc154471..78d0d769 100644 --- a/network/common.h +++ b/network/common.h @@ -21,8 +21,6 @@ * */ -#define MAX_PATH_LENGTH 64 /* D-Bus path */ - #define PANU_UUID "00001115-0000-1000-8000-00805f9b34fb" #define NAP_UUID "00001116-0000-1000-8000-00805f9b34fb" #define GN_UUID "00001117-0000-1000-8000-00805f9b34fb" @@ -41,5 +39,3 @@ int bnep_kill_all_connections(void); int bnep_connadd(int sk, uint16_t role, char *dev); int bnep_if_up(const char *devname, uint16_t id); int bnep_if_down(const char *devname); - -int read_remote_name(bdaddr_t *src, bdaddr_t *dst, char *buf, size_t size); diff --git a/network/connection.c b/network/connection.c index c61eb49c..16d3e383 100644 --- a/network/connection.c +++ b/network/connection.c @@ -28,29 +28,21 @@ #include <stdio.h> #include <errno.h> #include <unistd.h> -#include <sys/stat.h> -#include <sys/param.h> #include <netinet/in.h> #include <bluetooth/bluetooth.h> #include <bluetooth/hci.h> -#include <bluetooth/hci_lib.h> -#include <bluetooth/l2cap.h> #include <bluetooth/bnep.h> #include <bluetooth/sdp.h> #include <glib.h> #include <gdbus.h> -#include "../src/dbus-common.h" - #include "logging.h" -#include "textfile.h" #include "glib-helper.h" #include "error.h" #include "common.h" -#include "connection.h" #define NETWORK_PEER_INTERFACE "org.bluez.network.Peer" diff --git a/network/manager.c b/network/manager.c index 7cbf8220..8067b821 100644 --- a/network/manager.c +++ b/network/manager.c @@ -25,34 +25,24 @@ #include <config.h> #endif -#include <errno.h> -#include <ctype.h> -#include <dirent.h> - -#include <sys/stat.h> - #include <bluetooth/bluetooth.h> #include <bluetooth/hci.h> #include <bluetooth/hci_lib.h> #include <bluetooth/bnep.h> #include <bluetooth/sdp.h> -#include <bluetooth/sdp_lib.h> #include <glib.h> #include <gdbus.h> #include "logging.h" -#include "textfile.h" -#include "glib-helper.h" #include "adapter.h" #include "device.h" -#include "error.h" #include "bridge.h" #include "manager.h" #include "common.h" - -#define MAX_NAME_SIZE 256 +#include "connection.h" +#include "server.h" static struct network_conf *conf = NULL;/* Network service configuration */ diff --git a/network/manager.h b/network/manager.h index 9b16c2a3..455b0963 100644 --- a/network/manager.h +++ b/network/manager.h @@ -21,12 +21,6 @@ * */ -#include "connection.h" -#include "server.h" - -#define MAX_PATH_LENGTH 64 /* D-Bus path */ -#define NETWORK_PATH "/org/bluez/network" - struct network_conf { gboolean connection_enabled; gboolean server_enabled; diff --git a/network/network-api.txt b/network/network-api.txt deleted file mode 100644 index 2d46abfd..00000000 --- a/network/network-api.txt +++ /dev/null @@ -1,199 +0,0 @@ -Bluetooth network service API description -***************************************** - -Copyright (C) 2006-2007 Marcel Holtmann <marcel@holtmann.org> - - -Network Manager hierarchy -========================= - -Interface org.bluez.network.Manager -Object path /org/bluez/network - -Methods array{string} ListServers() - - Returns an array of available network devices paths. - Currently only NAP and GN are supported. - - string FindServer(string pattern) - - Returns server path. - - Possible errors: org.bluez.Error.DoesNotExist - org.bluez.Error.Failed - - string CreateConnection(string address, string uuid) - - Creates a network connection object(NAP or GN). - - Possible errors: org.bluez.Error.AlreadyExists - org.bluez.Error.NotSupported - org.bluez.Error.ConnectionAttemptFailed - org.bluez.Error.Failed - - void RemoveConnection(string path) - - Removes a network connection object for a given path. - - Possible errors: org.bluez.Error.DoesNotExist - org.bluez.Error.Failed - - array{string} ListConnections() - - Returns an array of available network connections paths. - - string FindConnection(string pattern) - - Returns connection path. - - Possible errors: org.bluez.Error.DoesNotExist - org.bluez.Error.Failed - - string LastConnection() - - Returns last connected connection path, if none is connected - fallback to last created connection. - - Possible errors: org.bluez.Error.DoesNotExist - - string DefaultConnection() - - Returns default connection path. - - Possible errors: org.bluez.Error.DoesNotExist - - string ChangeDefaultConnection(string pattern) - - Changes default connection path. - - Possible errors: org.bluez.Error.DoesNotExist - -Signals void ConnectionCreated(string path) - - void ConnectionRemoved(string path) - - void DefaultConnectionChanged(string path) - - -Network Server hierarchy (experimental) -======================================= - -Interface org.bluez.network.Server -Object path /org/bluez/network/{gn, nap, panu} - -Methods string GetUUID() - - Returns the UUID-128 string representation of - the server. - - void Enable() - - Enable server and updates service record. - - Possible errors: org.bluez.Error.AlreadyExists - org.bluez.Error.Failed - - void Disable() - - Disable server and remove service record. - - Possible errors: org.bluez.Error.Failed - - bool IsEnabled() - - Returns the server status. - - void SetName(string name) - - Sets the name attribute. - - string GetName() - - Returns the service name. - - void SetAddressRange(string start, string end) - - TBD - - void SetRouting(string interface) - - TBD - - dict GetInfo() - - Returns the server properties. - -Signals void Enabled() - - void Disabled() - - -Network Connection hierarchy (experimental) -=========================================== - -Interface org.bluez.network.Connection -Object path /org/bluez/network/connection* - -Methods string GetAdapter() - - Returns the Bluetooth address of the adapter. - - string GetAddress() - - Returns the Bluetooth address of the ending point. - - string GetUUID() - - Returns the uuid 128 string representation of - the connected service. - - string GetName() - - Returns the string representation of connected host. - - Possible errors: org.bluez.Error.Failed - - string GetDescription() - - Returns the string description of connected host. - - Possible errors: org.bluez.Error.Failed - - string GetInterface() - - Returns the string network interface. - - Possible errors: org.bluez.Error.Failed - - string Connect() - - Connects to host and return the network interface - created. - - Possible errors: org.bluez.Error.ConnectionAttemptFailed - org.bluez.Error.Failed - - void CancelConnect() - - Abort connection attempt in case of errors or - timeouts in the client. - - Possible errors: org.bluez.Error.Failed - - void Disconnect() - - Disconnects to host. - - Possible errors: org.bluez.Error.Failed - - bool IsConnected() - - Returns the connection status. - - dict GetInfo() - - Returns the connection properties. - -Signals void Connected() - - void Disconnected() diff --git a/network/server.c b/network/server.c index 3fa99d25..00e8f0aa 100644 --- a/network/server.c +++ b/network/server.c @@ -29,18 +29,13 @@ #include <unistd.h> #include <stdlib.h> #include <errno.h> -#include <sys/stat.h> -#include <sys/param.h> -#include <net/if.h> #include <bluetooth/bluetooth.h> #include <bluetooth/hci.h> -#include <bluetooth/hci_lib.h> #include <bluetooth/bnep.h> #include <bluetooth/l2cap.h> #include <bluetooth/sdp.h> #include <bluetooth/sdp_lib.h> - #include <netinet/in.h> #include <glib.h> @@ -51,19 +46,16 @@ #include "logging.h" #include "error.h" -#include "textfile.h" #include "sdpd.h" #include "glib-helper.h" +#include "bridge.h" +#include "common.h" + #define NETWORK_PEER_INTERFACE "org.bluez.network.Peer" #define NETWORK_HUB_INTERFACE "org.bluez.network.Hub" #define NETWORK_ROUTER_INTERFACE "org.bluez.network.Router" #define SETUP_TIMEOUT 1000 -#define MAX_SETUP_ATTEMPTS 3 - -#include "bridge.h" -#include "common.h" -#include "manager.h" /* Pending Authorization */ struct setup_session { diff --git a/network/test-network b/network/test-network deleted file mode 100755 index f428c25f..00000000 --- a/network/test-network +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/python - -import dbus - -bus = dbus.SystemBus() - -manager = dbus.Interface(bus.get_object('org.bluez', '/org/bluez'), - 'org.bluez.Manager') - -conn = manager.ActivateService('network') - -network = dbus.Interface(bus.get_object(conn, '/org/bluez/network'), - 'org.bluez.network.Manager') - -try: - nap = dbus.Interface(bus.get_object(conn, network.FindServer('nap')), - 'org.bluez.network.Server') -except: - pass - -try: - gn = dbus.Interface(bus.get_object(conn, network.FindServer('gn')), - 'org.bluez.network.Server') -except: - pass - -try: - panu = dbus.Interface(bus.get_object(conn, network.FindServer('panu')), - 'org.bluez.network.Server') -except: - pass - -try: - client = dbus.Interface(bus.get_object(conn, network.LastConnection()), - 'org.bluez.network.Connection') -except: - pass diff --git a/src/adapter.c b/src/adapter.c index 18b03313..a22112c8 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -457,8 +457,8 @@ static DBusMessage *set_mode(DBusConnection *conn, DBusMessage *msg, return no_such_adapter(msg); if (!adapter->up && - (hcid.offmode == HCID_OFFMODE_NOSCAN || - (hcid.offmode == HCID_OFFMODE_DEVDOWN && + (main_opts.offmode == HCID_OFFMODE_NOSCAN || + (main_opts.offmode == HCID_OFFMODE_DEVDOWN && scan_enable != SCAN_DISABLED))) { /* Start HCI device */ if (ioctl(dd, HCIDEVUP, adapter->dev_id) == 0) @@ -475,7 +475,7 @@ static DBusMessage *set_mode(DBusConnection *conn, DBusMessage *msg, } if (adapter->up && scan_enable == SCAN_DISABLED && - hcid.offmode == HCID_OFFMODE_DEVDOWN) { + main_opts.offmode == HCID_OFFMODE_DEVDOWN) { if (ioctl(dd, HCIDEVDOWN, adapter->dev_id) < 0) { hci_close_dev(dd); return failed_strerror(msg, errno); @@ -1375,7 +1375,7 @@ static DBusMessage *adapter_discover_devices(DBusConnection *conn, if ((adapter->state & STD_INQUIRY) || (adapter->state & PERIODIC_INQUIRY)) goto done; - if (default_device.inqmode) + if (main_opts.inqmode) err = start_inquiry(adapter); else err = start_periodic_inquiry(adapter); @@ -2389,22 +2389,61 @@ static void load_drivers(struct adapter *adapter) } } +static int get_discoverable_timeout(const char *src) +{ + int timeout; + + if (read_discoverable_timeout(src, &timeout) == 0) + return timeout; + + return main_opts.discovto; +} + static void adapter_up(struct adapter *adapter, int dd) { struct hci_conn_list_req *cl = NULL; struct hci_conn_info *ci; - const char *mode; + const char *pmode; + char mode[14]; int i; adapter->up = 1; - adapter->discov_timeout = get_discoverable_timeout(adapter->dev_id); + adapter->discov_timeout = get_discoverable_timeout(adapter->address); adapter->state = DISCOVER_TYPE_NONE; - adapter->scan_mode = get_startup_scan(adapter->dev_id); + /* Set scan mode */ + if (read_device_mode(adapter->address, mode, sizeof(mode)) == 0) { + if (!strcmp(mode, "off") && main_opts.offmode == HCID_OFFMODE_NOSCAN) { + adapter->mode = MODE_OFF; + adapter->scan_mode= SCAN_DISABLED; + } else if (!strcmp(mode, "connectable")) { + adapter->mode = MODE_CONNECTABLE; + adapter->scan_mode = SCAN_PAGE; + } else if (!strcmp(mode, "discoverable")) { + /* Set discoverable only if timeout is 0 */ + if (adapter->discov_timeout == 0) { + adapter->mode = MODE_DISCOVERABLE; + adapter->scan_mode = SCAN_PAGE | SCAN_INQUIRY; + } else { + adapter->mode = MODE_CONNECTABLE; + adapter->scan_mode = SCAN_PAGE; + } + } else if (!strcmp(mode, "limited")) { + /* Set discoverable only if timeout is 0 */ + if (adapter->discov_timeout == 0) { + adapter->mode = MODE_LIMITED; + adapter->scan_mode = SCAN_PAGE | SCAN_INQUIRY; + } else { + adapter->mode = MODE_CONNECTABLE; + adapter->scan_mode = SCAN_PAGE; + + } + } + } + hci_send_cmd(dd, OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE, 1, &adapter->scan_mode); - adapter->mode = get_startup_mode(adapter->dev_id); if (adapter->mode == MODE_LIMITED) set_limited_discoverable(dd, adapter->dev.class, TRUE); @@ -2426,11 +2465,11 @@ static void adapter_up(struct adapter *adapter, int dd) } g_free(cl); - mode = mode2str(adapter->mode); + pmode = mode2str(adapter->mode); dbus_connection_emit_property_changed(connection, adapter->path, ADAPTER_INTERFACE, "Mode", - DBUS_TYPE_STRING, &mode); + DBUS_TYPE_STRING, &pmode); load_drivers(adapter); load_devices(adapter); @@ -2896,7 +2935,7 @@ void adapter_set_state(struct adapter *adapter, int state) if (adapter->scheduler_id) goto done; } else if (adapter->disc_sessions && adapter->state & STD_INQUIRY) { - adapter->scheduler_id = g_timeout_add(default_device.inqmode * 1000, + adapter->scheduler_id = g_timeout_add(main_opts.inqmode * 1000, (GSourceFunc) start_inquiry, adapter); goto done; } @@ -23,8 +23,6 @@ * */ -#define HCID_DEFAULT_DISCOVERABLE_TIMEOUT 180 /* 3 minutes */ - /* When all services should trust a remote device */ #define GLOBAL_TRUST "[all]" @@ -44,49 +42,32 @@ #define MODE_LIMITED 0x03 #define MODE_UNKNOWN 0xff -struct device_opts { - unsigned long flags; - char *name; - uint32_t class; - uint16_t voice; - uint8_t inqmode; - uint16_t pageto; - uint16_t pkt_type; - uint16_t link_mode; - uint16_t link_policy; - uint8_t scan; - uint8_t mode; - uint32_t discovto; -}; - -extern struct device_opts default_device; - -struct device_list { - char *ref; /* HCI device or Bluetooth address */ - struct device_list *next; - struct device_opts opts; -}; - -struct hcid_opts { - char host_name[40]; - int auto_init; - int offmode; - char deviceid[15]; +#define HCID_OFFMODE_DEVDOWN 0 +#define HCID_OFFMODE_NOSCAN 1 - int sock; +struct main_opts { + char host_name[40]; + unsigned long flags; + char *name; + uint32_t class; + uint16_t pageto; + uint32_t discovto; + uint16_t link_mode; + uint16_t link_policy; + + int offmode; + uint8_t scan; + uint8_t mode; + uint8_t inqmode; + char deviceid[15]; /* FIXME: */ + + int sock; }; -extern struct hcid_opts hcid; +extern struct main_opts main_opts; void hci_req_queue_remove(int dev_id, bdaddr_t *dba); -#define HCID_OFFMODE_DEVDOWN 0 -#define HCID_OFFMODE_NOSCAN 1 - -uint8_t get_startup_scan(int hdev); -uint8_t get_startup_mode(int hdev); -int get_discoverable_timeout(int dev_id); - void start_security_manager(int hdev); void stop_security_manager(int hdev); @@ -59,6 +59,8 @@ #include "manager.h" #include "storage.h" +#define HCID_DEFAULT_DISCOVERABLE_TIMEOUT 180 /* 3 minutes */ + enum { HCID_SET_NAME, HCID_SET_CLASS, @@ -68,9 +70,8 @@ enum { HCID_SET_LP, }; -struct hcid_opts hcid; -struct device_opts default_device; -static struct device_list *device_list = NULL; +struct main_opts main_opts; + static int child_pipe[2]; static GKeyFile *load_config(const char *file) @@ -112,7 +113,7 @@ static void parse_config(GKeyFile *config) } else { debug("offmode=%s", str); if (g_str_equal(str, "DevDown")) - hcid.offmode = HCID_OFFMODE_DEVDOWN; + main_opts.offmode = HCID_OFFMODE_DEVDOWN; g_free(str); } @@ -125,8 +126,8 @@ static void parse_config(GKeyFile *config) err = NULL; } else { debug("discovto=%d", val); - default_device.discovto = val; - default_device.flags |= 1 << HCID_SET_DISCOVTO; + main_opts.discovto = val; + main_opts.flags |= 1 << HCID_SET_DISCOVTO; } val = g_key_file_get_integer(config, "General", @@ -138,8 +139,8 @@ static void parse_config(GKeyFile *config) err = NULL; } else { debug("pageto=%d", val); - default_device.pageto = val; - default_device.flags |= 1 << HCID_SET_PAGETO; + main_opts.pageto = val; + main_opts.flags |= 1 << HCID_SET_PAGETO; } str = g_key_file_get_string(config, "General", @@ -150,9 +151,9 @@ static void parse_config(GKeyFile *config) err = NULL; } else { debug("name=%s", str); - g_free(default_device.name); - default_device.name = g_strdup(str); - default_device.flags |= 1 << HCID_SET_NAME; + g_free(main_opts.name); + main_opts.name = g_strdup(str); + main_opts.flags |= 1 << HCID_SET_NAME; g_free(str); } @@ -164,8 +165,8 @@ static void parse_config(GKeyFile *config) err = NULL; } else { debug("class=%s", str); - default_device.class = strtol(str, NULL, 16); - default_device.flags |= 1 << HCID_SET_CLASS; + main_opts.class = strtol(str, NULL, 16); + main_opts.flags |= 1 << HCID_SET_CLASS; g_free(str); } @@ -178,172 +179,15 @@ static void parse_config(GKeyFile *config) err = NULL; } else { debug("inqmode=%d", val); - default_device.inqmode = val; + main_opts.inqmode = val; } - default_device.link_mode = HCI_LM_ACCEPT; - default_device.flags |= (1 << HCID_SET_LM); + main_opts.link_mode = HCI_LM_ACCEPT; + main_opts.flags |= (1 << HCID_SET_LM); - default_device.link_policy = HCI_LP_RSWITCH | HCI_LP_SNIFF | + main_opts.link_policy = HCI_LP_RSWITCH | HCI_LP_SNIFF | HCI_LP_HOLD | HCI_LP_PARK; - default_device.flags |= (1 << HCID_SET_LP); -} - -static inline void init_device_defaults(struct device_opts *device_opts) -{ - memset(device_opts, 0, sizeof(*device_opts)); - device_opts->scan = SCAN_PAGE; - device_opts->mode = MODE_CONNECTABLE; - device_opts->name = g_strdup("BlueZ"); - device_opts->discovto = HCID_DEFAULT_DISCOVERABLE_TIMEOUT; -} - -static void free_device_opts(void) -{ - struct device_list *device, *next; - - g_free(default_device.name); - - for (device = device_list; device; device = next) { - g_free(device->ref); - g_free(device->opts.name); - next = device->next; - g_free(device); - } - - device_list = NULL; -} - -static inline struct device_opts *find_device_opts(char *ref) -{ - struct device_list *device; - - for (device = device_list; device; device = device->next) - if (!strcmp(ref, device->ref)) - return &device->opts; - - return NULL; -} - -static struct device_opts *get_device_opts(int hdev) -{ - struct device_opts *device_opts = NULL; - struct hci_dev_info di; - - /* First try to get BD_ADDR based settings ... */ - if (hci_devinfo(hdev, &di) == 0) { - char addr[18]; - ba2str(&di.bdaddr, addr); - device_opts = find_device_opts(addr); - } - - /* ... then try HCI based settings ... */ - if (!device_opts) { - char ref[8]; - snprintf(ref, sizeof(ref) - 1, "hci%d", hdev); - device_opts = find_device_opts(ref); - } - - /* ... and last use the default settings. */ - if (!device_opts) - device_opts = &default_device; - - return device_opts; -} - -static struct device_opts *get_opts(int hdev) -{ - struct device_opts *device_opts = NULL; - struct hci_dev_info di; - char addr[18]; - int sock; - - if (hdev < 0) - return NULL; - - sock = hci_open_dev(hdev); - if (sock < 0) - goto no_address; - - if (hci_devinfo(hdev, &di) < 0) { - close(sock); - goto no_address; - } - - close(sock); - - ba2str(&di.bdaddr, addr); - device_opts = find_device_opts(addr); - -no_address: - if (!device_opts) { - char ref[8]; - snprintf(ref, sizeof(ref) - 1, "hci%d", hdev); - device_opts = find_device_opts(ref); - } - - if (!device_opts) - device_opts = &default_device; - - return device_opts; -} - -uint8_t get_startup_scan(int hdev) -{ - struct device_opts *device_opts = get_opts(hdev); - if (!device_opts) - return SCAN_DISABLED; - - return device_opts->scan; -} - -uint8_t get_startup_mode(int hdev) -{ - struct device_opts *device_opts = get_opts(hdev); - if (!device_opts) - return MODE_OFF; - - return device_opts->mode; -} - -int get_discoverable_timeout(int hdev) -{ - struct device_opts *device_opts = NULL; - struct hci_dev_info di; - char addr[18]; - int sock, timeout; - - if (hdev < 0) - return HCID_DEFAULT_DISCOVERABLE_TIMEOUT; - - sock = hci_open_dev(hdev); - if (sock < 0) - goto no_address; - - if (hci_devinfo(hdev, &di) < 0) { - close(sock); - goto no_address; - } - - close(sock); - - if (read_discoverable_timeout(&di.bdaddr, &timeout) == 0) - return timeout; - - ba2str(&di.bdaddr, addr); - device_opts = find_device_opts(addr); - -no_address: - if (!device_opts) { - char ref[8]; - snprintf(ref, sizeof(ref) - 1, "hci%d", hdev); - device_opts = find_device_opts(ref); - } - - if (!device_opts) - device_opts = &default_device; - - return device_opts->discovto; + main_opts.flags |= (1 << HCID_SET_LP); } static void update_service_classes(const bdaddr_t *bdaddr, uint8_t value) @@ -427,7 +271,7 @@ static char *expand_name(char *dst, int size, char *str, int dev_id) break; case 'h': - opt = hcid.host_name; + opt = main_opts.host_name; break; case '%': @@ -488,53 +332,16 @@ static void at_child_exit(void) static void configure_device(int dev_id) { - struct device_opts *device_opts; struct hci_dev_req dr; struct hci_dev_info di; - char mode[14]; int dd; - device_opts = get_device_opts(dev_id); - if (hci_devinfo(dev_id, &di) < 0) return; if (hci_test_bit(HCI_RAW, &di.flags)) return; - /* Set default discoverable timeout if not set */ - if (!(device_opts->flags & (1 << HCID_SET_DISCOVTO))) - device_opts->discovto = HCID_DEFAULT_DISCOVERABLE_TIMEOUT; - - /* Set scan mode */ - if (read_device_mode(&di.bdaddr, mode, sizeof(mode)) == 0) { - if (!strcmp(mode, "off") && hcid.offmode == HCID_OFFMODE_NOSCAN) { - device_opts->mode = MODE_OFF; - device_opts->scan = SCAN_DISABLED; - } else if (!strcmp(mode, "connectable")) { - device_opts->mode = MODE_CONNECTABLE; - device_opts->scan = SCAN_PAGE; - } else if (!strcmp(mode, "discoverable")) { - /* Set discoverable only if timeout is 0 */ - if (!get_discoverable_timeout(dev_id)) { - device_opts->scan = SCAN_PAGE | SCAN_INQUIRY; - device_opts->mode = MODE_DISCOVERABLE; - } else { - device_opts->scan = SCAN_PAGE; - device_opts->mode = MODE_CONNECTABLE; - } - } else if (!strcmp(mode, "limited")) { - /* Set discoverable only if timeout is 0 */ - if (!get_discoverable_timeout(dev_id)) { - device_opts->scan = SCAN_PAGE | SCAN_INQUIRY; - device_opts->mode = MODE_LIMITED; - } else { - device_opts->scan = SCAN_PAGE; - device_opts->mode = MODE_CONNECTABLE; - } - } - } - /* Do configuration in the separate process */ switch (fork()) { case 0: @@ -558,8 +365,8 @@ static void configure_device(int dev_id) dr.dev_id = dev_id; /* Set link mode */ - if ((device_opts->flags & (1 << HCID_SET_LM))) { - dr.dev_opt = device_opts->link_mode; + if ((main_opts.flags & (1 << HCID_SET_LM))) { + dr.dev_opt = main_opts.link_mode; if (ioctl(dd, HCISETLINKMODE, (unsigned long) &dr) < 0) { error("Can't set link mode on hci%d: %s (%d)", dev_id, strerror(errno), errno); @@ -567,8 +374,8 @@ static void configure_device(int dev_id) } /* Set link policy */ - if ((device_opts->flags & (1 << HCID_SET_LP))) { - dr.dev_opt = device_opts->link_policy; + if ((main_opts.flags & (1 << HCID_SET_LP))) { + dr.dev_opt = main_opts.link_policy; if (ioctl(dd, HCISETLINKPOL, (unsigned long) &dr) < 0) { error("Can't set link policy on hci%d: %s (%d)", dev_id, strerror(errno), errno); @@ -576,29 +383,29 @@ static void configure_device(int dev_id) } /* Set device name */ - if ((device_opts->flags & (1 << HCID_SET_NAME)) && device_opts->name) { + if ((main_opts.flags & (1 << HCID_SET_NAME)) && main_opts.name) { change_local_name_cp cp; memset(cp.name, 0, sizeof(cp.name)); expand_name((char *) cp.name, sizeof(cp.name), - device_opts->name, dev_id); + main_opts.name, dev_id); hci_send_cmd(dd, OGF_HOST_CTL, OCF_CHANGE_LOCAL_NAME, CHANGE_LOCAL_NAME_CP_SIZE, &cp); } /* Set device class */ - if ((device_opts->flags & (1 << HCID_SET_CLASS))) { + if ((main_opts.flags & (1 << HCID_SET_CLASS))) { write_class_of_dev_cp cp; uint32_t class; uint8_t cls[3]; if (read_local_class(&di.bdaddr, cls) < 0) { - class = htobl(device_opts->class); + class = htobl(main_opts.class); cls[2] = get_service_classes(&di.bdaddr); memcpy(cp.dev_class, &class, 3); } else { - if (!(device_opts->scan & SCAN_INQUIRY)) + if (!(main_opts.scan & SCAN_INQUIRY)) cls[1] &= 0xdf; /* Clear discoverable bit */ cls[2] = get_service_classes(&di.bdaddr); memcpy(cp.dev_class, cls, 3); @@ -609,10 +416,10 @@ static void configure_device(int dev_id) } /* Set page timeout */ - if ((device_opts->flags & (1 << HCID_SET_PAGETO))) { + if ((main_opts.flags & (1 << HCID_SET_PAGETO))) { write_page_timeout_cp cp; - cp.timeout = htobs(device_opts->pageto); + cp.timeout = htobs(main_opts.pageto); hci_send_cmd(dd, OGF_HOST_CTL, OCF_WRITE_PAGE_TIMEOUT, WRITE_PAGE_TIMEOUT_CP_SIZE, &cp); } @@ -657,10 +464,11 @@ static void init_device(int dev_id) if (hci_test_bit(HCI_RAW, &di.flags)) goto done; - if (hcid.offmode == HCID_OFFMODE_DEVDOWN) { - char mode[16]; + if (main_opts.offmode == HCID_OFFMODE_DEVDOWN) { + char mode[16], src[18]; - if (read_device_mode(&di.bdaddr, mode, sizeof(mode)) == 0 && + ba2str(&di.bdaddr, src); + if (read_device_mode(src, mode, sizeof(mode)) == 0 && strcmp(mode, "off") == 0) { ioctl(dd, HCIDEVDOWN, dev_id); goto done; @@ -680,8 +488,7 @@ static void device_devreg_setup(int dev_id) { struct hci_dev_info di; - if (hcid.auto_init) - init_device(dev_id); + init_device(dev_id); if (hci_devinfo(dev_id, &di) < 0) return; @@ -692,8 +499,8 @@ static void device_devreg_setup(int dev_id) static void device_devup_setup(int dev_id) { - if (hcid.auto_init) - configure_device(dev_id); + configure_device(dev_id); + manager_start_adapter(dev_id); start_security_manager(dev_id); } @@ -734,9 +541,16 @@ static void init_all_devices(int ctl) static void init_defaults(void) { - hcid.auto_init = 1; - - init_device_defaults(&default_device); + /* Default HCId settings */ + memset(&main_opts, 0, sizeof(main_opts)); + main_opts.offmode = HCID_OFFMODE_NOSCAN; + main_opts.scan = SCAN_PAGE; + main_opts.mode = MODE_CONNECTABLE; + main_opts.name = g_strdup("BlueZ"); + main_opts.discovto = HCID_DEFAULT_DISCOVERABLE_TIMEOUT; + + if (gethostname(main_opts.host_name, sizeof(main_opts.host_name) - 1) < 0) + strcpy(main_opts.host_name, "noname"); } static inline void device_event(GIOChannel *chan, evt_stack_internal *si) @@ -843,14 +657,6 @@ int main(int argc, char *argv[]) uint16_t mtu = 0; GKeyFile *config; - /* Default HCId settings */ - memset(&hcid, 0, sizeof(hcid)); - hcid.auto_init = 1; - hcid.offmode = HCID_OFFMODE_NOSCAN; - - if (gethostname(hcid.host_name, sizeof(hcid.host_name) - 1) < 0) - strcpy(hcid.host_name, "noname"); - init_defaults(); context = g_option_context_new(NULL); @@ -896,7 +702,7 @@ int main(int argc, char *argv[]) } /* Create and bind HCI socket */ - if ((hcid.sock = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)) < 0) { + if ((main_opts.sock = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)) < 0) { error("Can't open HCI socket: %s (%d)", strerror(errno), errno); exit(1); @@ -906,7 +712,7 @@ int main(int argc, char *argv[]) hci_filter_clear(&flt); hci_filter_set_ptype(HCI_EVENT_PKT, &flt); hci_filter_set_event(EVT_STACK_INTERNAL, &flt); - if (setsockopt(hcid.sock, SOL_HCI, HCI_FILTER, &flt, sizeof(flt)) < 0) { + if (setsockopt(main_opts.sock, SOL_HCI, HCI_FILTER, &flt, sizeof(flt)) < 0) { error("Can't set filter: %s (%d)", strerror(errno), errno); exit(1); @@ -914,7 +720,7 @@ int main(int argc, char *argv[]) addr.hci_family = AF_BLUETOOTH; addr.hci_dev = HCI_DEV_NONE; - if (bind(hcid.sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + if (bind(main_opts.sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { error("Can't bind HCI socket: %s (%d)", strerror(errno), errno); exit(1); @@ -943,7 +749,7 @@ int main(int argc, char *argv[]) exit(1); } - start_sdp_server(mtu, hcid.deviceid, SDP_SERVER_COMPAT); + start_sdp_server(mtu, main_opts.deviceid, SDP_SERVER_COMPAT); set_service_classes_callback(update_service_classes); /* Loading plugins has to be done after D-Bus has been setup since @@ -954,7 +760,7 @@ int main(int argc, char *argv[]) event_loop = g_main_loop_new(NULL, FALSE); - ctl_io = g_io_channel_unix_new(hcid.sock); + ctl_io = g_io_channel_unix_new(main_opts.sock); g_io_channel_set_close_on_unref(ctl_io, TRUE); g_io_add_watch(ctl_io, G_IO_IN, io_stack_event, NULL); @@ -962,7 +768,7 @@ int main(int argc, char *argv[]) g_io_channel_unref(ctl_io); /* Initialize already connected devices */ - init_all_devices(hcid.sock); + init_all_devices(main_opts.sock); g_main_loop_run(event_loop); @@ -972,8 +778,6 @@ int main(int argc, char *argv[]) stop_sdp_server(); - free_device_opts(); - agent_exit(); hcid_dbus_exit(); diff --git a/src/storage.c b/src/storage.c index f85dbb53..c2450ba2 100644 --- a/src/storage.c +++ b/src/storage.c @@ -97,11 +97,11 @@ int write_discoverable_timeout(bdaddr_t *bdaddr, int timeout) return textfile_put(filename, "discovto", str); } -int read_discoverable_timeout(bdaddr_t *bdaddr, int *timeout) +int read_discoverable_timeout(const char *src, int *timeout) { char filename[PATH_MAX + 1], *str; - create_filename(filename, PATH_MAX, bdaddr, "config"); + create_name(filename, PATH_MAX, STORAGEDIR, src, "config"); str = textfile_get(filename, "discovto"); if (!str) @@ -131,11 +131,11 @@ int write_device_mode(bdaddr_t *bdaddr, const char *mode) return textfile_put(filename, "mode", mode); } -int read_device_mode(bdaddr_t *bdaddr, char *mode, int length) +int read_device_mode(const char *src, char *mode, int length) { char filename[PATH_MAX + 1], *str; - create_filename(filename, PATH_MAX, bdaddr, "config"); + create_name(filename, PATH_MAX, STORAGEDIR, src, "config"); str = textfile_get(filename, "mode"); if (!str) diff --git a/src/storage.h b/src/storage.h index 8a06d4e3..7f89ef19 100644 --- a/src/storage.h +++ b/src/storage.h @@ -24,9 +24,9 @@ int read_device_alias(const char *src, const char *dst, char *alias, size_t size); int write_device_alias(const char *src, const char *dst, const char *alias); int write_discoverable_timeout(bdaddr_t *bdaddr, int timeout); -int read_discoverable_timeout(bdaddr_t *bdaddr, int *timeout); +int read_discoverable_timeout(const char *src, int *timeout); int write_device_mode(bdaddr_t *bdaddr, const char *mode); -int read_device_mode(bdaddr_t *bdaddr, char *mode, int length); +int read_device_mode(const char *src, char *mode, int length); int read_on_mode(const char *src, char *mode, int length); int write_local_name(bdaddr_t *bdaddr, char *name); int read_local_name(bdaddr_t *bdaddr, char *name); |