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