diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2006-08-29 22:03:13 +0000 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2006-08-29 22:03:13 +0000 |
commit | a76dc65489dd8959547a97a391e405b2025bbd79 (patch) | |
tree | 9420ee14352d8cd43ceb51c5c27b30727ec32ed5 /src | |
parent | 453a0cedb6c909047553ffc7145bcef26a3ae94c (diff) |
Make sdp_connect() async aware
Diffstat (limited to 'src')
-rw-r--r-- | src/sdp.c | 27 |
1 files changed, 25 insertions, 2 deletions
@@ -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; |