X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=libaltos%2Flibaltos_linux.c;h=2065d74af7648e883b23a596808c983043917d5a;hb=debian;hp=b187bb19c9a948a28c83f261485f15c49836a0f5;hpb=9c6727d39cc1feae3bd0504bcbc910ae832e3651;p=fw%2Faltos diff --git a/libaltos/libaltos_linux.c b/libaltos/libaltos_linux.c index b187bb19..55038ff0 100644 --- a/libaltos/libaltos_linux.c +++ b/libaltos/libaltos_linux.c @@ -501,66 +501,78 @@ altos_bt_fill_in(char *name, char *addr, struct altos_bt_device *device) struct altos_file * altos_bt_open(struct altos_bt_device *device) { - static const uint8_t svc_uuid_int[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0x11, 0x01 - }; - uuid_t svc_uuid; struct sockaddr_rc addr = { 0 }; int status, i; struct altos_file_posix *file; sdp_session_t *session = NULL; - sdp_list_t *search_list, *attrid_list; - sdp_list_t *response_list = NULL, *r; - uint32_t range; - int err; - int channel = 1; + int channel = 0; if (str2ba(device->addr, &addr.rc_bdaddr) < 0) { altos_set_last_posix_error(); goto no_file; } - /* - * Search for the RFCOMM service to get the right channel - */ - session = sdp_connect(BDADDR_ANY, &addr.rc_bdaddr, SDP_RETRY_IF_BUSY); + /* Try the built-in vendor list */ + channel = altos_bt_port(device); - if (session) { - sdp_uuid16_create(&svc_uuid, PUBLIC_BROWSE_GROUP); - search_list = sdp_list_append(NULL, &svc_uuid); - - range = 0x0000ffff; - attrid_list = sdp_list_append(NULL, &range); - - err = sdp_service_search_attr_req(session, search_list, - SDP_ATTR_REQ_RANGE, attrid_list, &response_list); - - if (err >= 0) { - for (r = response_list; r; r = r->next) { - sdp_record_t *rec = (sdp_record_t*) r->data; - sdp_list_t *proto_list; - sdp_list_t *access = NULL; - int proto; - - proto = sdp_uuid_to_proto(&rec->svclass); - - if (proto == SERIAL_PORT_SVCLASS_ID) { - sdp_get_access_protos(rec, &access); - if (access) { - int this_chan = sdp_get_proto_port(access, RFCOMM_UUID); - if (this_chan) - channel = this_chan; + /* Not present, try to discover an RFCOMM service */ + if (channel == 0) { + /* + * Search for the RFCOMM service to get the right channel + */ + session = sdp_connect(BDADDR_ANY, &addr.rc_bdaddr, SDP_RETRY_IF_BUSY); + + if (session) { + static const uint8_t svc_uuid_int[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x11, 0x01 + }; + int err; + uuid_t svc_uuid; + uint32_t range; + sdp_list_t *search_list, *attrid_list; + sdp_list_t *response_list = NULL, *r; + sdp_uuid16_create(&svc_uuid, PUBLIC_BROWSE_GROUP); + search_list = sdp_list_append(NULL, &svc_uuid); + + range = 0x0000ffff; + attrid_list = sdp_list_append(NULL, &range); + + err = sdp_service_search_attr_req(session, search_list, + SDP_ATTR_REQ_RANGE, attrid_list, &response_list); + + if (err >= 0) { + for (r = response_list; r; r = r->next) { + sdp_record_t *rec = (sdp_record_t*) r->data; + sdp_list_t *proto_list; + sdp_list_t *access = NULL; + int proto; + + proto = sdp_uuid_to_proto(&rec->svclass); + + if (proto == SERIAL_PORT_SVCLASS_ID) { + sdp_get_access_protos(rec, &access); + if (access) { + int this_chan = sdp_get_proto_port(access, RFCOMM_UUID); + if (this_chan) { + printf("found service on channel %d\n", this_chan); + channel = this_chan; + } + } } } } - } - /* Leave the session open so we don't disconnect from the device before opening - * the RFCOMM channel - */ + /* Leave the session open so we don't disconnect from the device before opening + * the RFCOMM channel + */ + } } + /* Still nothing, try the default */ + if (channel == 0) + channel = BT_PORT_DEFAULT; + /* Connect to the channel */ file = calloc(1, sizeof (struct altos_file_posix)); if (!file) {