3 * neard - Near Field Communication manager
5 * Copyright (C) 2011 Intel Corporation. All rights reserved.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
38 /* We check for the tag being present every 2 seconds */
39 #define CHECK_PRESENCE_PERIOD 2
41 static DBusConnection *connection = NULL;
43 static GHashTable *adapter_hash;
45 enum near_adapter_rf_mode {
46 NEAR_ADAPTER_RF_MODE_IDLE = 0,
47 NEAR_ADAPTER_RF_MODE_INITIATOR = 1,
48 NEAR_ADAPTER_RF_MODE_TARGET = 2
51 #define NEAR_ADAPTER_MODE_INITIATOR 0x1
52 #define NEAR_ADAPTER_MODE_TARGET 0x2
53 #define NEAR_ADAPTER_MODE_DUAL 0x3
62 enum near_adapter_rf_mode rf_mode;
70 struct near_tag *tag_link;
74 struct near_device *device_link;
81 guint presence_timeout;
85 struct near_adapter_ioreq {
88 unsigned char buf[1024];
98 static void free_adapter(gpointer data)
100 struct near_adapter *adapter = data;
102 if (adapter->presence_timeout > 0)
103 g_source_remove(adapter->presence_timeout);
105 if (adapter->dep_timer > 0)
106 g_source_remove(adapter->dep_timer);
108 g_free(adapter->name);
109 g_free(adapter->path);
110 g_hash_table_destroy(adapter->tags);
111 g_hash_table_destroy(adapter->devices);
115 static void free_tag(gpointer data)
117 struct near_tag *tag = data;
119 __near_tag_remove(tag);
122 static void free_device(gpointer data)
124 struct near_device *device = data;
126 __near_device_remove(device);
129 static char *rf_mode_to_string(struct near_adapter *adapter)
131 switch (adapter->rf_mode) {
132 case NEAR_ADAPTER_RF_MODE_IDLE:
134 case NEAR_ADAPTER_RF_MODE_INITIATOR:
136 case NEAR_ADAPTER_RF_MODE_TARGET:
143 static void polling_changed(struct near_adapter *adapter)
145 g_dbus_emit_property_changed(connection, adapter->path,
146 NFC_ADAPTER_INTERFACE, "Polling");
149 static void rf_mode_changed(struct near_adapter *adapter)
151 g_dbus_emit_property_changed(connection, adapter->path,
152 NFC_ADAPTER_INTERFACE, "Mode");
155 static int adapter_start_poll(struct near_adapter *adapter)
158 uint32_t im_protos, tm_protos;
160 if (g_hash_table_size(adapter->tags) > 0) {
161 DBG("Clearing tags");
163 g_hash_table_remove_all(adapter->tags);
166 if (g_hash_table_size(adapter->devices) > 0) {
167 DBG("Clearing devices");
169 g_hash_table_remove_all(adapter->devices);
172 DBG("Poll mode 0x%x", adapter->poll_mode);
174 im_protos = tm_protos = 0;
176 if (adapter->poll_mode & NEAR_ADAPTER_MODE_INITIATOR)
177 im_protos = adapter->protocols;
179 if (adapter->poll_mode & NEAR_ADAPTER_MODE_TARGET)
180 tm_protos = adapter->protocols;
182 err = __near_netlink_start_poll(adapter->idx, im_protos, tm_protos);
186 adapter->polling = true;
188 polling_changed(adapter);
193 static gboolean property_get_mode(const GDBusPropertyTable *property,
194 DBusMessageIter *iter, void *user_data)
196 struct near_adapter *adapter = user_data;
199 rf_mode = rf_mode_to_string(adapter);
203 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &rf_mode);
208 static gboolean property_get_polling(const GDBusPropertyTable *property,
209 DBusMessageIter *iter, void *user_data)
211 struct near_adapter *adapter = user_data;
214 val = adapter->polling;
216 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &val);
221 static gboolean property_get_powered(const GDBusPropertyTable *property,
222 DBusMessageIter *iter, void *user_data)
224 struct near_adapter *adapter = user_data;
227 val = adapter->powered;
229 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &val);
234 static void set_powered(GDBusPendingPropertySet id, dbus_bool_t powered,
237 struct near_adapter *adapter = data;
240 err = __near_netlink_adapter_enable(adapter->idx, powered);
242 if (err == -EALREADY) {
244 g_dbus_pending_property_error(id,
245 NFC_ERROR_INTERFACE ".Failed",
246 "Device already enabled");
248 g_dbus_pending_property_error(id,
249 NFC_ERROR_INTERFACE ".Failed",
250 "Device already disabled");
253 g_dbus_pending_property_error(id,
254 NFC_ERROR_INTERFACE ".Failed",
260 g_dbus_pending_property_success(id);
262 adapter->powered = powered;
264 g_dbus_emit_property_changed(connection, adapter->path,
265 NFC_ADAPTER_INTERFACE, "Powered");
268 static void property_set_powered(const GDBusPropertyTable *property,
269 DBusMessageIter *value,
270 GDBusPendingPropertySet id, void *data)
274 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_BOOLEAN) {
275 g_dbus_pending_property_error(id,
276 NFC_ERROR_INTERFACE ".InvalidArguments",
277 "Invalid arguments in method call");
281 dbus_message_iter_get_basic(value, &powered);
283 set_powered(id, powered, data);
286 static void append_protocols(DBusMessageIter *iter,
287 struct near_adapter *adapter)
291 DBG("protocols 0x%x", adapter->protocols);
293 if (adapter->protocols & NFC_PROTO_FELICA_MASK) {
296 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
299 if (adapter->protocols & NFC_PROTO_MIFARE_MASK) {
302 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
305 if (adapter->protocols & NFC_PROTO_JEWEL_MASK) {
308 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
311 if (adapter->protocols & NFC_PROTO_ISO14443_MASK) {
314 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
317 if (adapter->protocols & NFC_PROTO_NFC_DEP_MASK) {
320 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
324 static gboolean property_get_protocols(const GDBusPropertyTable *property,
325 DBusMessageIter *iter, void *user_data)
327 struct near_adapter *adapter = user_data;
328 DBusMessageIter dict;
330 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
331 DBUS_TYPE_STRING_AS_STRING, &dict);
333 append_protocols(&dict, adapter);
335 dbus_message_iter_close_container(iter, &dict);
340 static DBusMessage *start_poll_loop(DBusConnection *conn,
341 DBusMessage *msg, void *data)
343 struct near_adapter *adapter = data;
344 const char *dbus_mode;
347 DBG("conn %p", conn);
349 if (!adapter->powered) {
350 near_error("Adapter is down, can not start polling");
351 return __near_error_failed(msg, ENODEV);
354 dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &dbus_mode,
357 DBG("Mode %s", dbus_mode);
359 if (g_strcmp0(dbus_mode, "Initiator") == 0)
360 adapter->poll_mode = NEAR_ADAPTER_MODE_INITIATOR;
361 else if (g_strcmp0(dbus_mode, "Target") == 0)
362 adapter->poll_mode = NEAR_ADAPTER_MODE_TARGET;
363 else if (g_strcmp0(dbus_mode, "Dual") == 0)
364 adapter->poll_mode = NEAR_ADAPTER_MODE_DUAL;
366 adapter->poll_mode = NEAR_ADAPTER_MODE_INITIATOR;
368 err = adapter_start_poll(adapter);
370 return __near_error_failed(msg, -err);
372 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
375 static DBusMessage *stop_poll_loop(DBusConnection *conn,
376 DBusMessage *msg, void *data)
378 struct near_adapter *adapter = data;
381 DBG("conn %p", conn);
383 if (!adapter->polling)
384 return __near_error_not_polling(msg);
386 err = __near_netlink_stop_poll(adapter->idx);
388 return __near_error_failed(msg, -err);
390 adapter->polling = false;
392 polling_changed(adapter);
394 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
397 static void tag_present_cb(uint32_t adapter_idx, uint32_t target_idx,
400 static gboolean check_presence(gpointer user_data)
402 struct near_adapter *adapter = user_data;
403 struct near_tag *tag;
411 tag = adapter->tag_link;
415 err = __near_tag_check_presence(tag, tag_present_cb);
417 DBG("Could not check target presence");
424 near_adapter_disconnect(adapter->idx);
425 if (adapter->constant_poll)
426 adapter_start_poll(adapter);
431 static gboolean dep_timer(gpointer user_data)
433 struct near_adapter *adapter = user_data;
440 adapter_start_poll(adapter);
445 static void tag_present_cb(uint32_t adapter_idx, uint32_t target_idx,
448 struct near_adapter *adapter;
452 adapter = g_hash_table_lookup(adapter_hash,
453 GINT_TO_POINTER(adapter_idx));
460 near_adapter_disconnect(adapter->idx);
461 if (adapter->constant_poll)
462 adapter_start_poll(adapter);
467 adapter->presence_timeout =
468 g_timeout_add_seconds(CHECK_PRESENCE_PERIOD,
469 check_presence, adapter);
472 void __near_adapter_start_check_presence(uint32_t adapter_idx,
475 struct near_adapter *adapter;
479 adapter = g_hash_table_lookup(adapter_hash,
480 GINT_TO_POINTER(adapter_idx));
484 adapter->presence_timeout =
485 g_timeout_add_seconds(CHECK_PRESENCE_PERIOD,
486 check_presence, adapter);
489 void __near_adapter_stop_check_presence(uint32_t adapter_idx,
492 struct near_adapter *adapter;
496 adapter = g_hash_table_lookup(adapter_hash,
497 GINT_TO_POINTER(adapter_idx));
501 if (adapter->presence_timeout > 0)
502 g_source_remove(adapter->presence_timeout);
505 static const GDBusMethodTable adapter_methods[] = {
506 { GDBUS_METHOD("StartPollLoop", GDBUS_ARGS({"name", "s"}), NULL,
508 { GDBUS_METHOD("StopPollLoop", NULL, NULL, stop_poll_loop) },
512 static const GDBusPropertyTable adapter_properties[] = {
513 { "Mode", "s", property_get_mode },
514 { "Powered", "b", property_get_powered, property_set_powered },
515 { "Polling", "b", property_get_polling },
516 { "Protocols", "as", property_get_protocols },
521 struct near_adapter *__near_adapter_create(uint32_t idx,
522 const char *name, uint32_t protocols, bool powered)
524 struct near_adapter *adapter;
525 bool powered_setting;
527 adapter = g_try_malloc0(sizeof(struct near_adapter));
531 adapter->name = g_strdup(name);
532 if (!adapter->name) {
537 powered_setting = near_setting_get_bool("DefaultPowered");
538 if (powered_setting && !powered &&
539 !__near_netlink_adapter_enable(idx, powered_setting))
542 DBG("Powered %d", powered);
545 adapter->protocols = protocols;
546 adapter->powered = powered;
547 adapter->constant_poll = near_setting_get_bool("ConstantPoll");
548 adapter->dep_up = false;
549 adapter->tags = g_hash_table_new_full(g_direct_hash, g_direct_equal,
551 adapter->tag_sock = -1;
553 adapter->devices = g_hash_table_new_full(g_direct_hash, g_direct_equal,
555 adapter->device_sock = -1;
557 adapter->path = g_strdup_printf("%s/nfc%d", NFC_PATH, idx);
562 void __near_adapter_destroy(struct near_adapter *adapter)
566 free_adapter(adapter);
569 const char *__near_adapter_get_path(struct near_adapter *adapter)
571 return adapter->path;
574 struct near_adapter *__near_adapter_get(uint32_t idx)
576 return g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx));
579 int __near_adapter_set_dep_state(uint32_t idx, bool dep)
581 struct near_adapter *adapter;
585 adapter = g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx));
589 adapter->dep_up = dep;
591 if (!dep && adapter->constant_poll)
592 adapter_start_poll(adapter);
597 target_idx = __neard_device_get_idx(adapter->device_link);
598 __near_adapter_remove_target(idx, target_idx);
600 if (adapter->dep_timer > 0)
601 g_source_remove(adapter->dep_timer);
603 if (!__near_device_register_interface(adapter->device_link))
610 bool __near_adapter_get_dep_state(uint32_t idx)
612 struct near_adapter *adapter;
616 adapter = g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx));
620 return adapter->dep_up;
623 int __near_adapter_add(struct near_adapter *adapter)
625 uint32_t idx = adapter->idx;
627 DBG("%s", adapter->path);
629 if (g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx)))
632 g_hash_table_insert(adapter_hash, GINT_TO_POINTER(idx), adapter);
634 DBG("connection %p", connection);
636 g_dbus_register_interface(connection, adapter->path,
637 NFC_ADAPTER_INTERFACE,
638 adapter_methods, NULL,
639 adapter_properties, adapter, NULL);
644 void __near_adapter_remove(struct near_adapter *adapter)
646 DBG("%s", adapter->path);
648 g_dbus_unregister_interface(connection, adapter->path,
649 NFC_ADAPTER_INTERFACE);
651 g_hash_table_remove(adapter_hash, GINT_TO_POINTER(adapter->idx));
654 static void tag_read_cb(uint32_t adapter_idx, uint32_t target_idx, int status)
656 struct near_adapter *adapter;
658 DBG("status %d", status);
660 adapter = g_hash_table_lookup(adapter_hash,
661 GINT_TO_POINTER(adapter_idx));
666 near_adapter_disconnect(adapter->idx);
667 if (adapter->constant_poll)
668 adapter_start_poll(adapter);
673 adapter->presence_timeout =
674 g_timeout_add_seconds(CHECK_PRESENCE_PERIOD,
675 check_presence, adapter);
678 static void device_read_cb(uint32_t adapter_idx, uint32_t target_idx,
681 struct near_adapter *adapter;
683 DBG("status %d", status);
685 adapter = g_hash_table_lookup(adapter_hash,
686 GINT_TO_POINTER(adapter_idx));
691 if (adapter->device_link) {
692 __near_netlink_dep_link_down(adapter->idx);
693 adapter->device_link = NULL;
696 if (adapter->constant_poll)
697 adapter_start_poll(adapter);
703 static int adapter_add_tag(struct near_adapter *adapter, uint32_t target_idx,
705 uint16_t sens_res, uint8_t sel_res,
706 uint8_t *nfcid, uint8_t nfcid_len)
708 struct near_tag *tag;
712 tag = __near_tag_add(adapter->idx, target_idx, protocols,
718 g_hash_table_insert(adapter->tags, GINT_TO_POINTER(target_idx), tag);
720 tag_type = __near_tag_get_type(tag);
722 err = near_adapter_connect(adapter->idx, target_idx, tag_type);
724 near_error("Could not connect");
728 err = __near_tag_read(tag, tag_read_cb);
730 near_error("Could not read the tag");
732 near_adapter_disconnect(adapter->idx);
733 __near_adapter_remove_target(adapter->idx, target_idx);
739 static int adapter_add_device(struct near_adapter *adapter,
741 uint8_t *nfcid, uint8_t nfcid_len)
743 struct near_device *device;
748 device = __near_device_add(adapter->idx, target_idx, nfcid, nfcid_len);
752 g_hash_table_insert(adapter->devices, GINT_TO_POINTER(target_idx),
755 /* For p2p, reading is listening for an incoming connection */
756 err = __near_device_listen(device, device_read_cb);
758 near_error("Could not read device");
762 adapter->device_link = device;
764 if (adapter->dep_up) {
765 if (!__near_device_register_interface(device))
771 err = __near_netlink_dep_link_up(adapter->idx, target_idx,
772 NFC_COMM_ACTIVE, NFC_RF_INITIATOR);
775 adapter->device_link = NULL;
777 DBG("Starting DEP timer");
779 adapter->dep_timer = g_timeout_add_seconds(1, dep_timer, adapter);
784 int __near_adapter_add_target(uint32_t idx, uint32_t target_idx,
785 uint32_t protocols, uint16_t sens_res, uint8_t sel_res,
786 uint8_t *nfcid, uint8_t nfcid_len)
788 struct near_adapter *adapter;
793 adapter = g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx));
797 adapter->polling = false;
798 polling_changed(adapter);
800 adapter->rf_mode = NEAR_ADAPTER_RF_MODE_INITIATOR;
801 rf_mode_changed(adapter);
803 if (protocols & NFC_PROTO_NFC_DEP_MASK)
804 ret = adapter_add_device(adapter, target_idx,
807 ret = adapter_add_tag(adapter, target_idx, protocols,
808 sens_res, sel_res, nfcid, nfcid_len);
810 if (ret < 0 && adapter->constant_poll)
811 adapter_start_poll(adapter);
816 int __near_adapter_remove_target(uint32_t idx, uint32_t target_idx)
818 struct near_adapter *adapter;
822 adapter = g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx));
826 adapter->rf_mode = NEAR_ADAPTER_RF_MODE_IDLE;
827 rf_mode_changed(adapter);
829 if (g_hash_table_remove(adapter->tags, GINT_TO_POINTER(target_idx)))
832 if (g_hash_table_remove(adapter->devices, GINT_TO_POINTER(target_idx)))
838 static gboolean poll_error(gpointer user_data)
840 struct near_adapter *adapter = user_data;
843 DBG("adapter %d", adapter->idx);
845 reset = near_setting_get_bool("ResetOnError");
847 near_error("Resetting nfc%d", adapter->idx);
848 __near_netlink_adapter_enable(adapter->idx, false);
849 __near_netlink_adapter_enable(adapter->idx, true);
852 adapter_start_poll(adapter);
857 int __near_adapter_get_targets_done(uint32_t idx)
859 struct near_adapter *adapter;
863 adapter = g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx));
867 if (g_hash_table_size(adapter->devices) > 0)
870 if (g_hash_table_size(adapter->tags) > 0)
873 near_error("No targets found - Polling error");
875 adapter->polling = false;
876 polling_changed(adapter);
878 g_idle_add(poll_error, adapter);
883 int __near_adapter_add_device(uint32_t idx, uint8_t *nfcid, uint8_t nfcid_len)
885 struct near_adapter *adapter;
890 adapter = g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx));
894 adapter->polling = false;
895 adapter->dep_up = true;
896 adapter->rf_mode = NEAR_ADAPTER_RF_MODE_TARGET;
897 polling_changed(adapter);
898 rf_mode_changed(adapter);
900 ret = adapter_add_device(adapter, 0, nfcid, nfcid_len);
907 int __near_adapter_remove_device(uint32_t idx)
909 struct near_adapter *adapter;
910 uint32_t device_idx = 0;
914 adapter = g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx));
918 if (!g_hash_table_remove(adapter->devices, GINT_TO_POINTER(device_idx)))
921 adapter->rf_mode = NEAR_ADAPTER_RF_MODE_IDLE;
922 rf_mode_changed(adapter);
924 adapter->dep_up = false;
926 if (adapter->constant_poll)
927 adapter_start_poll(adapter);
932 static void adapter_flush_rx(struct near_adapter *adapter, int error)
936 for (list = adapter->ioreq_list; list; list = list->next) {
937 struct near_adapter_ioreq *req = list->data;
942 req->cb(NULL, error, req->data);
946 g_list_free(adapter->ioreq_list);
947 adapter->ioreq_list = NULL;
950 static gboolean execute_recv_cb(gpointer user_data)
952 struct near_adapter_ioreq *req = user_data;
954 DBG("data %p", req->data);
956 req->cb(req->buf, req->len, req->data);
963 static gboolean adapter_recv_event(GIOChannel *channel, GIOCondition condition,
966 struct near_adapter *adapter = user_data;
967 struct near_adapter_ioreq *req;
971 DBG("condition 0x%x", condition);
973 if (condition & (G_IO_NVAL | G_IO_ERR | G_IO_HUP)) {
974 near_error("Error while reading NFC bytes");
976 adapter_flush_rx(adapter, -EIO);
978 near_adapter_disconnect(adapter->idx);
980 adapter->presence_timeout =
981 g_timeout_add_seconds(2 * CHECK_PRESENCE_PERIOD,
982 check_presence, adapter);
986 sk = g_io_channel_unix_get_fd(channel);
987 first = g_list_first(adapter->ioreq_list);
992 req->len = recv(sk, req->buf, sizeof(req->buf), 0);
994 adapter->ioreq_list = g_list_remove(adapter->ioreq_list, req);
996 g_idle_add(execute_recv_cb, req);
1001 int near_adapter_connect(uint32_t idx, uint32_t target_idx, uint8_t protocol)
1003 struct near_adapter *adapter;
1004 struct near_tag *tag;
1005 struct sockaddr_nfc addr;
1010 adapter = g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx));
1014 if (adapter->tag_sock != -1)
1017 tag = g_hash_table_lookup(adapter->tags,
1018 GINT_TO_POINTER(target_idx));
1022 sock = socket(AF_NFC, SOCK_SEQPACKET, NFC_SOCKPROTO_RAW);
1026 addr.sa_family = AF_NFC;
1028 addr.target_idx = target_idx;
1029 addr.nfc_protocol = protocol;
1031 err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
1037 adapter->tag_sock = sock;
1038 adapter->tag_link = tag;
1040 if (!adapter->channel)
1041 adapter->channel = g_io_channel_unix_new(adapter->tag_sock);
1043 g_io_channel_set_flags(adapter->channel, G_IO_FLAG_NONBLOCK, NULL);
1044 g_io_channel_set_close_on_unref(adapter->channel, TRUE);
1046 if (adapter->watch == 0)
1047 adapter->watch = g_io_add_watch(adapter->channel,
1048 G_IO_IN | G_IO_NVAL | G_IO_ERR | G_IO_HUP,
1049 adapter_recv_event, adapter);
1054 int near_adapter_disconnect(uint32_t idx)
1056 struct near_adapter *adapter;
1057 uint32_t target_idx;
1062 adapter = g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx));
1066 DBG("link %p", adapter->tag_link);
1068 if (!adapter->tag_link)
1071 tag_type = __near_tag_get_type(adapter->tag_link);
1072 target_idx = near_tag_get_target_idx(adapter->tag_link);
1074 DBG("tag type %d", tag_type);
1076 __near_adapter_remove_target(adapter->idx, target_idx);
1078 if (adapter->tag_sock == -1)
1081 if (adapter->watch > 0) {
1082 g_source_remove(adapter->watch);
1086 g_io_channel_unref(adapter->channel);
1087 adapter->channel = NULL;
1088 adapter->tag_sock = -1;
1089 adapter->tag_link = NULL;
1094 int near_adapter_send(uint32_t idx, uint8_t *buf, size_t length,
1095 near_recv cb, void *data, near_release data_rel)
1097 struct near_adapter *adapter;
1098 struct near_adapter_ioreq *req = NULL;
1103 adapter = g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx));
1109 if (adapter->tag_sock == -1 || !adapter->tag_link) {
1114 if (cb && adapter->watch != 0) {
1115 req = g_try_malloc0(sizeof(*req));
1121 DBG("req %p cb %p data %p", req, cb, data);
1123 req->target_idx = near_tag_get_target_idx(adapter->tag_link);
1127 adapter->ioreq_list =
1128 g_list_append(adapter->ioreq_list, req);
1131 err = send(adapter->tag_sock, buf, length, 0);
1139 GList *last = g_list_last(adapter->ioreq_list);
1142 adapter->ioreq_list =
1143 g_list_delete_link(adapter->ioreq_list, last);
1147 return (*data_rel)(err, data);
1152 static void adapter_listen(gpointer key, gpointer value, gpointer user_data)
1154 struct near_adapter *adapter = value;
1155 struct near_device_driver *driver = user_data;
1157 DBG("%s", adapter->path);
1162 driver->listen(adapter->idx, device_read_cb);
1165 void __near_adapter_listen(struct near_device_driver *driver)
1167 g_hash_table_foreach(adapter_hash, adapter_listen, driver);
1170 int __near_adapter_init(void)
1174 connection = near_dbus_get_connection();
1176 adapter_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal,
1177 NULL, free_adapter);
1182 void __near_adapter_cleanup(void)
1186 g_hash_table_destroy(adapter_hash);
1187 adapter_hash = NULL;