sdp.c revision 632a9432774ff3a0c6e556e8f32a565b38890767
1bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann/* 2bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 3bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * BlueZ - Bluetooth protocol stack for Linux 4bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 5632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * Copyright (C) 2003-2005 Marcel Holtmann <marcel@holtmann.org> 6bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 7bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 8bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * This program is free software; you can redistribute it and/or modify 9632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * it under the terms of the GNU General Public License as published by 10632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * the Free Software Foundation; either version 2 of the License, or 11632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * (at your option) any later version. 12bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 13632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * This program is distributed in the hope that it will be useful, 14632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * but WITHOUT ANY WARRANTY; without even the implied warranty of 15632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * GNU General Public License for more details. 17bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 18632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * You should have received a copy of the GNU General Public License 19632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * along with this program; if not, write to the Free Software 20632a9432774ff3a0c6e556e8f32a565b38890767Marcel Holtmann * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 21bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 22bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann */ 23bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 24bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#ifdef HAVE_CONFIG_H 25bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <config.h> 26bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#endif 27bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 28bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <stdio.h> 29bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <errno.h> 30bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <unistd.h> 31bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <signal.h> 32bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <sys/socket.h> 33bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 34bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <bluetooth/bluetooth.h> 35bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <bluetooth/sdp.h> 36bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann#include <bluetooth/sdp_lib.h> 37bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 38bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmannint sdp_search_hcrp(sdp_session_t *sdp, unsigned short *ctrl_psm, unsigned short *data_psm) 39bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann{ 40bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_list_t *srch, *attrs, *rsp; 41bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann uuid_t svclass; 42bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann uint16_t attr1, attr2; 43bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann int err; 44bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 45bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (!sdp) 46bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return -1; 47bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 48bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_uuid16_create(&svclass, HCR_PRINT_SVCLASS_ID); 49bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann srch = sdp_list_append(NULL, &svclass); 50bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 51bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann attr1 = SDP_ATTR_PROTO_DESC_LIST; 52bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann attrs = sdp_list_append(NULL, &attr1); 53bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann attr2 = SDP_ATTR_ADD_PROTO_DESC_LIST; 54bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann attrs = sdp_list_append(attrs, &attr2); 55bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 56bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann err = sdp_service_search_attr_req(sdp, srch, SDP_ATTR_REQ_INDIVIDUAL, attrs, &rsp); 57bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (err) 58bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return -1; 59bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 60bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann for (; rsp; rsp = rsp->next) { 61bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_record_t *rec = (sdp_record_t *) rsp->data; 62bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_list_t *protos; 63bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 64bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (!sdp_get_access_protos(rec, &protos)) { 65bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann unsigned short psm = sdp_get_proto_port(protos, L2CAP_UUID); 66bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (psm > 0) { 67bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann *ctrl_psm = psm; 68bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 69bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 70bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 71bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (!sdp_get_add_access_protos(rec, &protos)) { 72bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann unsigned short psm = sdp_get_proto_port(protos, L2CAP_UUID); 73bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (psm > 0 && *ctrl_psm > 0) { 74bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann *data_psm = psm; 75bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return 0; 76bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 77bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 78bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 79bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 80bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return -1; 81bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann} 82bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 83bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmannint sdp_search_spp(sdp_session_t *sdp, uint8_t *channel) 84bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann{ 85bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_list_t *srch, *attrs, *rsp; 86bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann uuid_t svclass; 87bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann uint16_t attr; 88bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann int err; 89bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 90bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (!sdp) 91bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return -1; 92bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 93bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_uuid16_create(&svclass, SERIAL_PORT_SVCLASS_ID); 94bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann srch = sdp_list_append(NULL, &svclass); 95bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 96bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann attr = SDP_ATTR_PROTO_DESC_LIST; 97bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann attrs = sdp_list_append(NULL, &attr); 98bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 99bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann err = sdp_service_search_attr_req(sdp, srch, SDP_ATTR_REQ_INDIVIDUAL, attrs, &rsp); 100bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (err) 101bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return -1; 102bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 103bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann for (; rsp; rsp = rsp->next) { 104bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_record_t *rec = (sdp_record_t *) rsp->data; 105bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_list_t *protos; 106bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 107bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (!sdp_get_access_protos(rec, &protos)) { 108bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann uint8_t ch = sdp_get_proto_port(protos, RFCOMM_UUID); 109bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (ch > 0) { 110bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann *channel = ch; 111bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return 0; 112bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 113bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 114bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 115bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 116bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return -1; 117bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann} 118