summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2006-08-29 22:03:13 +0000
committerMarcel Holtmann <marcel@holtmann.org>2006-08-29 22:03:13 +0000
commita76dc65489dd8959547a97a391e405b2025bbd79 (patch)
tree9420ee14352d8cd43ceb51c5c27b30727ec32ed5
parent453a0cedb6c909047553ffc7145bcef26a3ae94c (diff)
Make sdp_connect() async aware
-rw-r--r--src/sdp.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/sdp.c b/src/sdp.c
index 1d6d65fe..d694fd24 100644
--- a/src/sdp.c
+++ b/src/sdp.c
@@ -3059,8 +3059,10 @@ struct sdp_transaction {
sdp_session_t *sdp_create(int sk, uint32_t flags)
{
+ sdp_session_t *session;
struct sdp_transaction *t;
- sdp_session_t *session = malloc(sizeof(sdp_session_t));
+
+ session = malloc(sizeof(sdp_session_t));
if (!session) {
errno = ENOMEM;
return NULL;
@@ -3605,12 +3607,30 @@ static inline int sdp_is_local(const bdaddr_t *device)
sdp_session_t *sdp_connect(const bdaddr_t *src, const bdaddr_t *dst, uint32_t flags)
{
+ sdp_session_t *session;
+ struct sdp_transaction *t;
int err;
- sdp_session_t *session = malloc(sizeof(sdp_session_t));
+
+ session = malloc(sizeof(sdp_session_t));
if (!session)
return session;
+
memset(session, 0, sizeof(*session));
+
session->flags = flags;
+ session->sock = -1;
+
+ t = malloc(sizeof(struct sdp_transaction));
+ if (!t) {
+ errno = ENOMEM;
+ free(session);
+ return NULL;
+ }
+
+ memset(t, 0, sizeof(*t));
+
+ session->priv = t;
+
if (sdp_is_local(dst)) {
struct sockaddr_un sa;
@@ -3649,10 +3669,13 @@ sdp_session_t *sdp_connect(const bdaddr_t *src, const bdaddr_t *dst, uint32_t fl
while (errno == EBUSY && (flags & SDP_RETRY_IF_BUSY));
}
}
+
fail:
err = errno;
if (session->sock >= 0)
close(session->sock);
+ if (session->priv)
+ free(session->priv);
free(session);
errno = err;
return 0;