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