77
71
/* Main server structure */
78
72
struct network_server {
73
bdaddr_t src; /* Bluetooth Local Address */
79
74
char *iface; /* DBus interface */
80
75
char *name; /* Server service name */
81
char *range; /* IP Address range */
82
gboolean enable; /* Enable flag */
76
char *bridge; /* Bridge name */
83
77
uint32_t record_id; /* Service record id */
84
78
uint16_t id; /* Service class identifier */
85
79
GSList *sessions; /* Active connections */
86
80
struct network_adapter *na; /* Adapter reference */
81
guint watch_id; /* Client service watch */
89
84
static DBusConnection *connection = NULL;
90
85
static GSList *adapters = NULL;
91
static const char *prefix = NULL;
92
86
static gboolean security = TRUE;
94
static struct network_adapter *find_adapter(GSList *list, const char *path)
88
static struct network_adapter *find_adapter(GSList *list,
89
struct btd_adapter *adapter)
98
93
for (l = list; l; l = l->next) {
99
94
struct network_adapter *na = l->data;
101
if (g_str_equal(na->path, path))
96
if (na->adapter == adapter)
573
570
static inline DBusMessage *failed(DBusMessage *msg, const char *description)
575
572
return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
579
576
static inline DBusMessage *invalid_arguments(DBusMessage *msg,
580
577
const char *description)
582
579
return g_dbus_create_error(msg, ERROR_INTERFACE ".InvalidArguments",
586
static DBusMessage *enable(DBusConnection *conn,
587
DBusMessage *msg, void *data)
589
struct network_server *ns = data;
593
return g_dbus_create_error(msg, ERROR_INTERFACE
595
"Server already enabled");
597
reply = dbus_message_new_method_return(msg);
601
/* Add the service record */
602
ns->record_id = register_server_record(ns);
603
if (!ns->record_id) {
604
dbus_message_unref(reply);
605
return failed(msg, "Service record registration failed");
613
static DBusMessage *disable(DBusConnection *conn,
614
DBusMessage *msg, void *data)
616
struct network_server *ns = data;
619
reply = dbus_message_new_method_return(msg);
624
return failed(msg, "Not enabled");
626
/* Remove the service record */
583
static void server_disconnect(DBusConnection *conn, void *user_data)
585
struct network_server *ns = user_data;
627
589
if (ns->record_id) {
628
590
remove_record_from_server(ns->record_id);
629
591
ns->record_id = 0;
634
g_slist_foreach(ns->sessions, (GFunc) session_free, NULL);
635
g_slist_free(ns->sessions);
640
static DBusMessage *set_name(DBusConnection *conn, DBusMessage *msg,
641
const char *name, void *data)
598
static DBusMessage *register_server(DBusConnection *conn,
599
DBusMessage *msg, void *data)
643
601
struct network_server *ns = data;
644
602
DBusMessage *reply;
603
const char *uuid, *bridge;
605
if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &uuid,
606
DBUS_TYPE_STRING, &bridge, DBUS_TYPE_INVALID))
609
if (g_strcmp0(uuid, "nap"))
610
return failed(msg, "Invalid UUID");
613
return failed(msg, "Already registered");
646
615
reply = dbus_message_new_method_return(msg);
650
if (!name || (strlen(name) == 0))
651
return invalid_arguments(msg, "Invalid name");
655
ns->name = g_strdup(name);
657
if (ns->enable && ns->record_id) {
658
uint32_t handle = register_server_record(ns);
660
dbus_message_unref(reply);
662
"Service record attribute update failed");
665
remove_record_from_server(ns->record_id);
666
ns->record_id = handle;
619
ns->record_id = register_server_record(ns);
621
return failed(msg, "SDP record registration failed");
624
ns->bridge = g_strdup(bridge);
626
ns->watch_id = g_dbus_add_disconnect_watch(conn,
627
dbus_message_get_sender(msg),
628
server_disconnect, ns, NULL);
672
static DBusMessage *get_properties(DBusConnection *conn,
673
DBusMessage *msg, void *data)
633
static DBusMessage *unregister_server(DBusConnection *conn,
634
DBusMessage *msg, void *data)
675
636
struct network_server *ns = data;
676
637
DBusMessage *reply;
677
DBusMessageIter iter;
678
DBusMessageIter dict;
679
638
const char *uuid;
640
if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &uuid,
644
if (g_strcmp0(uuid, "nap"))
645
return failed(msg, "Invalid UUID");
681
647
reply = dbus_message_new_method_return(msg);
685
dbus_message_iter_init_append(reply, &iter);
687
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
688
DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
689
DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
690
DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
692
dict_append_entry(&dict, "Name", DBUS_TYPE_STRING, &ns->name);
694
uuid = bnep_uuid(ns->id);
695
dict_append_entry(&dict, "Uuid", DBUS_TYPE_STRING, &uuid);
697
dict_append_entry(&dict, "Enabled", DBUS_TYPE_BOOLEAN, &ns->enable);
699
dbus_message_iter_close_container(&iter, &dict);
651
g_dbus_remove_watch(conn, ns->watch_id);
653
server_disconnect(conn, ns);
704
static DBusMessage *set_property(DBusConnection *conn,
705
DBusMessage *msg, void *data)
707
DBusMessageIter iter;
709
const char *property;
711
if (!dbus_message_iter_init(msg, &iter))
712
return invalid_arguments(msg, "Not a dict");
714
if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
715
return invalid_arguments(msg, "Key not a string");
717
dbus_message_iter_get_basic(&iter, &property);
718
dbus_message_iter_next(&iter);
720
if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
721
return invalid_arguments(msg, "Value not a variant");
722
dbus_message_iter_recurse(&iter, &sub);
724
if (g_str_equal("Name", property)) {
727
if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING)
728
return invalid_arguments(msg, "Value not string");
729
dbus_message_iter_get_basic(&sub, &name);
731
return set_name(conn, msg, name, data);
732
} else if (g_str_equal("Enabled", property)) {
735
if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
736
return invalid_arguments(msg, "Value not boolean");
737
dbus_message_iter_get_basic(&sub, &enabled);
739
return enabled ? enable(conn, msg, data) :
740
disable(conn, msg, data);
743
return invalid_arguments(msg, "Property does not exist");
746
658
static void adapter_free(struct network_adapter *na)
748
660
if (na->io != NULL) {
802
709
static GDBusMethodTable server_methods[] = {
803
{ "SetProperty", "sv", "", set_property },
804
{ "GetProperties", "", "a{sv}",get_properties },
808
static GDBusSignalTable server_signals[] = {
809
{ "PropertyChanged", "sv" },
813
static struct network_adapter *create_adapter(const char *path, bdaddr_t *src)
710
{ "Register", "ss", "", register_server },
711
{ "Unregister", "s", "", unregister_server },
715
static struct network_adapter *create_adapter(struct btd_adapter *adapter)
815
717
struct network_adapter *na;
816
718
GError *err = NULL;
818
721
na = g_new0(struct network_adapter, 1);
819
na->path = g_strdup(path);
820
bacpy(&na->src, src);
722
na->adapter = btd_adapter_ref(adapter);
724
adapter_get_address(adapter, &src);
822
726
na->io = bt_io_listen(BT_IO_L2CAP, NULL, confirm_event, na,
824
BT_IO_OPT_SOURCE_BDADDR, src,
728
BT_IO_OPT_SOURCE_BDADDR, &src,
825
729
BT_IO_OPT_PSM, BNEP_PSM,
826
730
BT_IO_OPT_OMTU, BNEP_MTU,
827
731
BT_IO_OPT_IMTU, BNEP_MTU,
841
int server_register(const char *path, bdaddr_t *src, uint16_t id)
745
int server_register(struct btd_adapter *adapter)
843
747
struct network_adapter *na;
844
748
struct network_server *ns;
846
na = find_adapter(adapters, path);
751
na = find_adapter(adapters, adapter);
848
na = create_adapter(path, src);
753
na = create_adapter(adapter);
851
756
adapters = g_slist_append(adapters, na);
854
ns = find_server(na->servers, id);
759
ns = find_server(na->servers, BNEP_SVC_NAP);
858
763
ns = g_new0(struct network_server, 1);
862
ns->iface = g_strdup(NETWORK_PEER_INTERFACE);
863
ns->name = g_strdup("BlueZ PANU service");
866
ns->iface = g_strdup(NETWORK_HUB_INTERFACE);
867
ns->name = g_strdup("BlueZ GN service");
870
ns->iface = g_strdup(NETWORK_ROUTER_INTERFACE);
871
ns->name = g_strdup("BlueZ NAP service");
765
ns->iface = g_strdup(NETWORK_SERVER_INTERFACE);
766
ns->name = g_strdup("Network service");
768
path = adapter_get_path(adapter);
875
770
if (!g_dbus_register_interface(connection, path, ns->iface,
876
server_methods, server_signals, NULL,
771
server_methods, NULL, NULL,
877
772
ns, path_unregister)) {
878
773
error("D-Bus failed to register %s interface",