diff options
author | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2007-05-09 13:09:06 +0000 |
---|---|---|
committer | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2007-05-09 13:09:06 +0000 |
commit | 6f6bdcb3ae048fafa7d711d164757f2c05cbe40f (patch) | |
tree | 846a797a66bd94b3c75194fa5b7afe1833ecd219 | |
parent | ce665805af418b5565eefd961f60a66d1a183a3d (diff) |
serial: missing free the pending_connects list and small code cleanup
-rw-r--r-- | serial/manager.c | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/serial/manager.c b/serial/manager.c index 83f08884..9fbf1f39 100644 --- a/serial/manager.c +++ b/serial/manager.c @@ -71,7 +71,7 @@ struct rfcomm_node { struct pending_connect { DBusConnection *conn; DBusMessage *msg; - char *addr; /* Destination address */ + char *bda; /* Destination address */ char *adapter_path; /* Adapter D-Bus path */ bdaddr_t src; uint8_t channel; @@ -109,8 +109,8 @@ static void pending_connect_free(struct pending_connect *pc) dbus_connection_unref(pc->conn); if (pc->msg) dbus_message_unref(pc->msg); - if (pc->addr) - g_free(pc->addr); + if (pc->bda) + g_free(pc->bda); if (pc->adapter_path) g_free(pc->adapter_path); g_free(pc); @@ -151,7 +151,7 @@ static struct pending_connect *find_pending_connect_by_channel(const char *bda, for (l = pending_connects; l != NULL; l = l->next) { struct pending_connect *pending = l->data; - if (!strcasecmp(bda, pending->addr) && + if (!strcasecmp(bda, pending->bda) && pending->channel == ch) return pending; } @@ -351,8 +351,8 @@ static gboolean rfcomm_connect_cb_continue(struct pending_connect *pc) return TRUE; } - add_rfcomm_node(g_io_channel_unix_new(fd), - pc->id, node_name, pc->conn, owner); + add_rfcomm_node(g_io_channel_unix_new(fd), pc->id, + node_name, pc->conn, owner); /* Reply to the requestor */ reply = dbus_message_new_method_return(pc->msg); @@ -404,7 +404,7 @@ static gboolean rfcomm_connect_cb(GIOChannel *chan, req.dev_id = -1; req.flags = (1 << RFCOMM_REUSE_DLC) | (1 << RFCOMM_RELEASE_ONHUP); bacpy(&req.src, &pc->src); - str2ba(pc->addr, &req.dst); + str2ba(pc->bda, &req.dst); req.channel = pc->channel; pc->id = ioctl(sk, RFCOMMCREATEDEV, &req); @@ -426,7 +426,7 @@ static gboolean rfcomm_connect_cb(GIOChannel *chan, } add_rfcomm_node(g_io_channel_unix_new(fd), pc->id, node_name, - pc->conn, dbus_message_get_sender(pc->msg)); + pc->conn, dbus_message_get_sender(pc->msg)); /* Reply to the requestor */ reply = dbus_message_new_method_return(pc->msg); @@ -469,7 +469,7 @@ static int rfcomm_connect(struct pending_connect *pc) g_io_channel_set_close_on_unref(io, TRUE); addr.rc_family = AF_BLUETOOTH; - str2ba(pc->addr, &addr.rc_bdaddr); + str2ba(pc->bda, &addr.rc_bdaddr); addr.rc_channel = pc->channel; if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { @@ -554,7 +554,7 @@ static void record_reply(DBusPendingCall *call, void *data) goto fail; } - pending = find_pending_connect_by_channel(pc->addr, ch); + pending = find_pending_connect_by_channel(pc->bda, ch); if (pending) { err_connection_in_progress(pc->conn, pc->msg); goto fail; @@ -589,7 +589,7 @@ static int get_record(struct pending_connect *pc, uint32_t handle, return -1; dbus_message_append_args(msg, - DBUS_TYPE_STRING, &pc->addr, + DBUS_TYPE_STRING, &pc->bda, DBUS_TYPE_UINT32, &handle, DBUS_TYPE_INVALID); @@ -665,7 +665,7 @@ static int get_handles(struct pending_connect *pc, const char *uuid, return -1; dbus_message_append_args(msg, - DBUS_TYPE_STRING, &pc->addr, + DBUS_TYPE_STRING, &pc->bda, DBUS_TYPE_STRING, &uuid, DBUS_TYPE_INVALID); @@ -684,21 +684,19 @@ static int get_handles(struct pending_connect *pc, const char *uuid, static DBusHandlerResult connect_service(DBusConnection *conn, DBusMessage *msg, void *data) { + struct pending_connect *pending, *pc; DBusError derr; bdaddr_t src; - struct pending_connect *pending, *pc; - const char *addr, *pattern; + const char *bda, *pattern; char *endptr; long val; int dev_id, err; uint16_t cls; char tmp[37]; - /* FIXME: Check if it already exist or if there is pending connect */ - dbus_error_init(&derr); if (!dbus_message_get_args(msg, &derr, - DBUS_TYPE_STRING, &addr, + DBUS_TYPE_STRING, &bda, DBUS_TYPE_STRING, &pattern, DBUS_TYPE_INVALID)) { err_invalid_args(conn, msg, derr.message); @@ -714,7 +712,7 @@ static DBusHandlerResult connect_service(DBusConnection *conn, bacpy(&pc->src, &src); pc->conn = dbus_connection_ref(conn); pc->msg = dbus_message_ref(msg); - pc->addr = g_strdup(addr); + pc->bda = g_strdup(bda); pc->adapter_path = g_malloc0(16); snprintf(pc->adapter_path, 16, "/org/bluez/hci%d", dev_id); @@ -787,9 +785,7 @@ static DBusHandlerResult connect_service(DBusConnection *conn, "invalid RFCOMM channel"); } - /* FIXME: Check if it is already connected */ - - pending = find_pending_connect_by_channel(addr, val); + pending = find_pending_connect_by_channel(bda, val); if (pending) { pending_connect_free(pc); return err_connection_in_progress(conn, msg); @@ -887,6 +883,13 @@ static void manager_unregister(DBusConnection *conn, void *data) g_slist_free(connected_nodes); connected_nodes = NULL; } + + if (pending_connects) { + g_slist_foreach(pending_connects, + (GFunc) pending_connect_free, NULL); + g_slist_free(pending_connects); + pending_connects = NULL; + } } /* Virtual table to handle manager object path hierarchy */ |