int bnep_connect(struct bnep *session, bnep_connect_cb conn_cb, void *data) { GError *gerr = NULL; int err; if (!session || !conn_cb) return -EINVAL; session->attempts = 0; session->conn_cb = conn_cb; session->conn_data = data; bt_io_get(session->io, &gerr, BT_IO_OPT_DEST_BDADDR, &session->dst_addr, BT_IO_OPT_INVALID); if (gerr) { error("%s", gerr->message); g_error_free(gerr); return -EINVAL; } err = bnep_setup_conn_req(session); if (err < 0) return err; session->setup_to = g_timeout_add_seconds(CON_SETUP_TO, bnep_conn_req_to, session); return 0; }
int bnep_connect(int sk, uint16_t src, uint16_t dst, bnep_connect_cb conn_cb, void *data) { struct bnep_conn *bc; int err; if (!conn_cb) return -EINVAL; bc = g_new0(struct bnep_conn, 1); bc->io = g_io_channel_unix_new(sk); bc->attempts = 0; bc->src = src; bc->dst = dst; bc->conn_cb = conn_cb; bc->data = data; err = bnep_setup_conn_req(bc); if (err < 0) return err; bc->setup_to = g_timeout_add_seconds(CON_SETUP_TO, bnep_conn_req_to, bc); g_io_add_watch(bc->io, G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL, bnep_setup_cb, bc); return 0; }
static gboolean bnep_conn_req_to(gpointer user_data) { struct bnep *session = user_data; if (session->attempts == CON_SETUP_RETRIES) { error("Too many bnep connection attempts"); } else { error("bnep connection setup TO, retrying..."); if (bnep_setup_conn_req(session) == 0) return TRUE; } session->conn_cb(NULL, -ETIMEDOUT, session->conn_data); return FALSE; }
static gboolean bnep_conn_req_to(gpointer user_data) { struct bnep_conn *bc = user_data; if (bc->attempts == CON_SETUP_RETRIES) { error("Too many bnep connection attempts"); } else { error("bnep connection setup TO, retrying..."); if (bnep_setup_conn_req(bc) == 0) return TRUE; } bc->conn_cb(NULL, NULL, -ETIMEDOUT, bc->data); free_bnep_connect(bc); return FALSE; }