From a76dc65489dd8959547a97a391e405b2025bbd79 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 29 Aug 2006 22:03:13 +0000 Subject: Make sdp_connect() async aware --- src/sdp.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'src') 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; -- cgit