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