1bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann/* 2bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 3bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * BlueZ - Bluetooth protocol stack for Linux 4bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann * 59184e2eeb7b97371c6b83b747c8984e2340d2b47Marcel Holtmann * Copyright (C) 2003-2010 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 380a14f620f8be275db4a8f88a50d12044c9e6cf8aMarcel Holtmann#include "cups.h" 390a14f620f8be275db4a8f88a50d12044c9e6cf8aMarcel Holtmann 40bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmannint sdp_search_hcrp(sdp_session_t *sdp, unsigned short *ctrl_psm, unsigned short *data_psm) 41bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann{ 42bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_list_t *srch, *attrs, *rsp; 43bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann uuid_t svclass; 44bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann uint16_t attr1, attr2; 45bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann int err; 46bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 47bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (!sdp) 48bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return -1; 49bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 50bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_uuid16_create(&svclass, HCR_PRINT_SVCLASS_ID); 51bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann srch = sdp_list_append(NULL, &svclass); 52bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 53bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann attr1 = SDP_ATTR_PROTO_DESC_LIST; 54bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann attrs = sdp_list_append(NULL, &attr1); 55bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann attr2 = SDP_ATTR_ADD_PROTO_DESC_LIST; 56bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann attrs = sdp_list_append(attrs, &attr2); 57bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 58bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann err = sdp_service_search_attr_req(sdp, srch, SDP_ATTR_REQ_INDIVIDUAL, attrs, &rsp); 59bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (err) 60bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return -1; 61bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 62bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann for (; rsp; rsp = rsp->next) { 63bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_record_t *rec = (sdp_record_t *) rsp->data; 64bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_list_t *protos; 65bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 66bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (!sdp_get_access_protos(rec, &protos)) { 67bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann unsigned short psm = sdp_get_proto_port(protos, L2CAP_UUID); 68bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (psm > 0) { 69bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann *ctrl_psm = psm; 70bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 71bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 72bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 73bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (!sdp_get_add_access_protos(rec, &protos)) { 74bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann unsigned short psm = sdp_get_proto_port(protos, L2CAP_UUID); 75bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (psm > 0 && *ctrl_psm > 0) { 76bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann *data_psm = psm; 77bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return 0; 78bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 79bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 80bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 81bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 82bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return -1; 83bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann} 84bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 85bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmannint sdp_search_spp(sdp_session_t *sdp, uint8_t *channel) 86bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann{ 87bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_list_t *srch, *attrs, *rsp; 88bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann uuid_t svclass; 89bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann uint16_t attr; 90bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann int err; 91bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 92bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (!sdp) 93bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return -1; 94bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 95bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_uuid16_create(&svclass, SERIAL_PORT_SVCLASS_ID); 96bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann srch = sdp_list_append(NULL, &svclass); 97bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 98bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann attr = SDP_ATTR_PROTO_DESC_LIST; 99bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann attrs = sdp_list_append(NULL, &attr); 100bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 101bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann err = sdp_service_search_attr_req(sdp, srch, SDP_ATTR_REQ_INDIVIDUAL, attrs, &rsp); 102bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (err) 103bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return -1; 104bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 105bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann for (; rsp; rsp = rsp->next) { 106bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_record_t *rec = (sdp_record_t *) rsp->data; 107bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann sdp_list_t *protos; 108bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 109bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (!sdp_get_access_protos(rec, &protos)) { 110bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann uint8_t ch = sdp_get_proto_port(protos, RFCOMM_UUID); 111bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann if (ch > 0) { 112bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann *channel = ch; 113bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return 0; 114bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 115bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 116bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann } 117bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann 118bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann return -1; 119bc085054220d80e9308fe5f4c2260e7ccc06e7e3Marcel Holtmann} 120