From: Hendrik Sattler <p...@hendrik-sattler.de> --- lib/bluez_compat.h | 2 +- lib/btobex.c | 45 +++++++++++++++++++++++++++------------------ lib/btobex.h | 6 +++++- lib/obex_transport.h | 2 +- 4 files changed, 34 insertions(+), 21 deletions(-)
diff --git a/lib/bluez_compat.h b/lib/bluez_compat.h index b0b97d6..26a6443 100644 --- a/lib/bluez_compat.h +++ b/lib/bluez_compat.h @@ -36,7 +36,7 @@ #define rc_bdaddr btAddr #define rc_channel port #define PF_BLUETOOTH PF_BTH -#define AF_BLUETOOTH PF_BLUETOOTH +#define AF_BLUETOOTH AF_BTH #define BTPROTO_RFCOMM BTHPROTO_RFCOMM /* TODO: should be const */ extern bdaddr_t bluez_compat_bdaddr_any; diff --git a/lib/btobex.c b/lib/btobex.c index 749fefb..810ce91 100644 --- a/lib/btobex.c +++ b/lib/btobex.c @@ -32,10 +32,7 @@ /* Linux/FreeBSD/NetBSD case */ #include <string.h> -#include <unistd.h> -#include <stdio.h> /* perror */ #include <errno.h> /* errno and EADDRNOTAVAIL */ -#include <netinet/in.h> #include <sys/socket.h> #endif /* _WIN32 */ @@ -80,7 +77,7 @@ static void btobex_cleanup (obex_t *self) static int btobex_set_local_addr(obex_t *self, struct sockaddr *addr, size_t len) { - struct btobex_data *data = &self->trans.data.rfcomm; + struct btobex_rfcomm_data *data = &self->trans.data.bt.rfcomm; const struct sockaddr_rc *local = (struct sockaddr_rc *) addr; if (len == sizeof(*local) && local->rc_family == AF_BLUETOOTH) { @@ -93,7 +90,7 @@ static int btobex_set_local_addr(obex_t *self, struct sockaddr *addr, static int btobex_set_remote_addr(obex_t *self, struct sockaddr *addr, size_t len) { - struct btobex_data *data = &self->trans.data.rfcomm; + struct btobex_rfcomm_data *data = &self->trans.data.bt.rfcomm; const struct sockaddr_rc *remote = (struct sockaddr_rc *)addr; if (len == sizeof(*remote) && remote->rc_family == AF_BLUETOOTH) { @@ -113,14 +110,20 @@ static int btobex_set_remote_addr(obex_t *self, struct sockaddr *addr, size_t le void btobex_prepare_connect(obex_t *self, const bdaddr_t *src, const bdaddr_t *dst, uint8_t channel) { - struct sockaddr_rc addr; + struct obex_transport *trans = &self->trans; btobex_prepare_listen(self, src, 0); - addr.rc_family = AF_BLUETOOTH; - bacpy(&addr.rc_bdaddr, dst); - addr.rc_channel = channel; - btobex_set_remote_addr(self, (struct sockaddr *) &addr, sizeof(addr)); + if (trans->type == OBEX_TRANS_BLUETOOTH) { + struct sockaddr_rc addr; + + memset(&addr, 0, sizeof(addr)); + addr.rc_family = AF_BLUETOOTH; + bacpy(&addr.rc_bdaddr, dst); + addr.rc_channel = (uint8_t)(channel & 0xFF); + obex_transport_set_remote_addr(self, (struct sockaddr *) &addr, + sizeof(addr)); + } } /* @@ -131,12 +134,18 @@ void btobex_prepare_connect(obex_t *self, const bdaddr_t *src, */ void btobex_prepare_listen(obex_t *self, const bdaddr_t *src, uint8_t channel) { - struct sockaddr_rc addr; + struct obex_transport *trans = &self->trans; + + if (trans->type == OBEX_TRANS_BLUETOOTH) { + struct sockaddr_rc addr; - addr.rc_family = AF_BLUETOOTH; - bacpy(&addr.rc_bdaddr, src); - addr.rc_channel = channel; - btobex_set_local_addr(self, (struct sockaddr *) &addr, sizeof(addr)); + memset(&addr, 0, sizeof(addr)); + addr.rc_family = AF_BLUETOOTH; + bacpy(&addr.rc_bdaddr, src); + addr.rc_channel = (uint8_t)(channel & 0xFF); + obex_transport_set_local_addr(self, (struct sockaddr *) &addr, + sizeof(addr)); + } } /* @@ -148,7 +157,7 @@ void btobex_prepare_listen(obex_t *self, const bdaddr_t *src, uint8_t channel) static int btobex_listen(obex_t *self) { struct obex_transport *trans = &self->trans; - struct btobex_data *data = &self->trans.data.rfcomm; + struct btobex_rfcomm_data *data = &self->trans.data.bt.rfcomm; DEBUG(3, "\n"); @@ -190,7 +199,7 @@ out_freesock: static int btobex_accept(obex_t *self) { struct obex_transport *trans = &self->trans; - struct btobex_data *data = &self->trans.data.rfcomm; + struct btobex_rfcomm_data *data = &self->trans.data.bt.rfcomm; struct sockaddr *addr = (struct sockaddr *) &data->peer; socklen_t addrlen = sizeof(data->peer); @@ -217,7 +226,7 @@ static int btobex_accept(obex_t *self) static int btobex_connect_request(obex_t *self) { struct obex_transport *trans = &self->trans; - struct btobex_data *data = &self->trans.data.rfcomm; + struct btobex_rfcomm_data *data = &self->trans.data.bt.rfcomm; int ret; int mtu = 0; diff --git a/lib/btobex.h b/lib/btobex.h index d863ecb..4375881 100644 --- a/lib/btobex.h +++ b/lib/btobex.h @@ -30,8 +30,12 @@ void btobex_prepare_connect(obex_t *self, const bdaddr_t *src, const bdaddr_t *dst, uint8_t channel); void btobex_prepare_listen(obex_t *self, const bdaddr_t *src, uint8_t channel); -struct btobex_data { +struct btobex_rfcomm_data { struct sockaddr_rc self; struct sockaddr_rc peer; }; + +union btobex_data { + struct btobex_rfcomm_data rfcomm; +}; #endif diff --git a/lib/obex_transport.h b/lib/obex_transport.h index a39f563..b7a4423 100644 --- a/lib/obex_transport.h +++ b/lib/obex_transport.h @@ -93,7 +93,7 @@ union obex_transport_data { #endif /*HAVE_IRDA*/ struct inobex_data inet; #ifdef HAVE_BLUETOOTH - struct btobex_data rfcomm; + union btobex_data bt; #endif /*HAVE_BLUETOOTH*/ obex_ctrans_t custom; #ifdef HAVE_USB -- 1.7.4.1 ------------------------------------------------------------------------------ Forrester Wave Report - Recovery time is now measured in hours and minutes not days. Key insights are discussed in the 2010 Forrester Wave Report as part of an in-depth evaluation of disaster recovery service providers. Forrester found the best-in-class provider in terms of services and vision. Read this report now! http://p.sf.net/sfu/ibm-webcastpromo _______________________________________________ Openobex-users mailing list Openobex-users@lists.sourceforge.net http://lists.sourceforge.net/lists/listinfo/openobex-users