Deleted Added
full compact
server.c (124758) server.c (153176)
1/*
2 * server.c
3 *
4 * Copyright (c) 2004 Maksim Yevmenkin <m_evmenkin@yahoo.com>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 12 unchanged lines hidden (view full) ---

21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * $Id: server.c,v 1.6 2004/01/13 01:54:39 max Exp $
1/*
2 * server.c
3 *
4 * Copyright (c) 2004 Maksim Yevmenkin <m_evmenkin@yahoo.com>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 12 unchanged lines hidden (view full) ---

21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * $Id: server.c,v 1.6 2004/01/13 01:54:39 max Exp $
29 * $FreeBSD: head/usr.sbin/bluetooth/sdpd/server.c 124758 2004-01-20 20:48:26Z emax $
29 * $FreeBSD: head/usr.sbin/bluetooth/sdpd/server.c 153176 2005-12-06 17:56:36Z emax $
30 */
31
30 */
31
32#include <sys/param.h>
32#include <sys/select.h>
33#include <sys/select.h>
34#include <sys/stat.h>
33#include <sys/queue.h>
35#include <sys/queue.h>
36#include <sys/ucred.h>
34#include <sys/un.h>
35#include <netinet/in.h>
36#include <arpa/inet.h>
37#include <assert.h>
38#include <bluetooth.h>
39#include <errno.h>
37#include <sys/un.h>
38#include <netinet/in.h>
39#include <arpa/inet.h>
40#include <assert.h>
41#include <bluetooth.h>
42#include <errno.h>
43#include <pwd.h>
40#include <sdp.h>
41#include <stdio.h>
42#include <stdlib.h>
43#include <string.h>
44#include <unistd.h>
45#include "log.h"
46#include "profile.h"
47#include "provider.h"

--- 43 unchanged lines hidden (view full) ---

91
92 if (bind(unsock, (struct sockaddr *) &un, sizeof(un)) < 0) {
93 log_crit("Could not bind control socket. %s (%d)",
94 strerror(errno), errno);
95 close(unsock);
96 return (-1);
97 }
98
44#include <sdp.h>
45#include <stdio.h>
46#include <stdlib.h>
47#include <string.h>
48#include <unistd.h>
49#include "log.h"
50#include "profile.h"
51#include "provider.h"

--- 43 unchanged lines hidden (view full) ---

95
96 if (bind(unsock, (struct sockaddr *) &un, sizeof(un)) < 0) {
97 log_crit("Could not bind control socket. %s (%d)",
98 strerror(errno), errno);
99 close(unsock);
100 return (-1);
101 }
102
103 if (chmod(control, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) < 0) {
104 log_crit("Could not change permissions on control socket. " \
105 "%s (%d)", strerror(errno), errno);
106 close(unsock);
107 return (-1);
108 }
109
99 if (listen(unsock, 10) < 0) {
100 log_crit("Could not listen on control socket. %s (%d)",
101 strerror(errno), errno);
102 close(unsock);
103 return (-1);
104 }
105
106 /* Open L2CAP socket */

--- 73 unchanged lines hidden (view full) ---

180
181 FD_ZERO(&srv->fdset);
182 srv->maxfd = (unsock > l2sock)? unsock : l2sock;
183
184 FD_SET(unsock, &srv->fdset);
185 srv->fdidx[unsock].valid = 1;
186 srv->fdidx[unsock].server = 1;
187 srv->fdidx[unsock].control = 1;
110 if (listen(unsock, 10) < 0) {
111 log_crit("Could not listen on control socket. %s (%d)",
112 strerror(errno), errno);
113 close(unsock);
114 return (-1);
115 }
116
117 /* Open L2CAP socket */

--- 73 unchanged lines hidden (view full) ---

191
192 FD_ZERO(&srv->fdset);
193 srv->maxfd = (unsock > l2sock)? unsock : l2sock;
194
195 FD_SET(unsock, &srv->fdset);
196 srv->fdidx[unsock].valid = 1;
197 srv->fdidx[unsock].server = 1;
198 srv->fdidx[unsock].control = 1;
199 srv->fdidx[unsock].priv = 0;
188 srv->fdidx[unsock].rsp_cs = 0;
189 srv->fdidx[unsock].rsp_size = 0;
190 srv->fdidx[unsock].rsp_limit = 0;
191 srv->fdidx[unsock].omtu = SDP_LOCAL_MTU;
192 srv->fdidx[unsock].rsp = NULL;
193
194 FD_SET(l2sock, &srv->fdset);
195 srv->fdidx[l2sock].valid = 1;
196 srv->fdidx[l2sock].server = 1;
197 srv->fdidx[l2sock].control = 0;
200 srv->fdidx[unsock].rsp_cs = 0;
201 srv->fdidx[unsock].rsp_size = 0;
202 srv->fdidx[unsock].rsp_limit = 0;
203 srv->fdidx[unsock].omtu = SDP_LOCAL_MTU;
204 srv->fdidx[unsock].rsp = NULL;
205
206 FD_SET(l2sock, &srv->fdset);
207 srv->fdidx[l2sock].valid = 1;
208 srv->fdidx[l2sock].server = 1;
209 srv->fdidx[l2sock].control = 0;
210 srv->fdidx[l2sock].priv = 0;
198 srv->fdidx[l2sock].rsp_cs = 0;
199 srv->fdidx[l2sock].rsp_size = 0;
200 srv->fdidx[l2sock].rsp_limit = 0;
201 srv->fdidx[l2sock].omtu = 0; /* unknown */
202 srv->fdidx[l2sock].rsp = NULL;
203
204 return (0);
205}

--- 65 unchanged lines hidden (view full) ---

271/*
272 * Accept new client connection and register it with index
273 */
274
275static void
276server_accept_client(server_p srv, int32_t fd)
277{
278 uint8_t *rsp = NULL;
211 srv->fdidx[l2sock].rsp_cs = 0;
212 srv->fdidx[l2sock].rsp_size = 0;
213 srv->fdidx[l2sock].rsp_limit = 0;
214 srv->fdidx[l2sock].omtu = 0; /* unknown */
215 srv->fdidx[l2sock].rsp = NULL;
216
217 return (0);
218}

--- 65 unchanged lines hidden (view full) ---

284/*
285 * Accept new client connection and register it with index
286 */
287
288static void
289server_accept_client(server_p srv, int32_t fd)
290{
291 uint8_t *rsp = NULL;
279 int32_t cfd, size;
292 int32_t cfd, size, priv;
280 uint16_t omtu;
281
282 do {
283 cfd = accept(fd, NULL, NULL);
284 } while (cfd < 0 && errno == EINTR);
285
286 if (cfd < 0) {
287 log_err("Could not accept connection on %s socket. %s (%d)",
288 srv->fdidx[fd].control? "control" : "L2CAP",
289 strerror(errno), errno);
290 return;
291 }
292
293 assert(!FD_ISSET(cfd, &srv->fdset));
294 assert(!srv->fdidx[cfd].valid);
295
293 uint16_t omtu;
294
295 do {
296 cfd = accept(fd, NULL, NULL);
297 } while (cfd < 0 && errno == EINTR);
298
299 if (cfd < 0) {
300 log_err("Could not accept connection on %s socket. %s (%d)",
301 srv->fdidx[fd].control? "control" : "L2CAP",
302 strerror(errno), errno);
303 return;
304 }
305
306 assert(!FD_ISSET(cfd, &srv->fdset));
307 assert(!srv->fdidx[cfd].valid);
308
309 priv = 0;
310
296 if (!srv->fdidx[fd].control) {
297 /* Get local BD_ADDR */
298 size = sizeof(srv->req_sa);
299 if (getsockname(cfd,(struct sockaddr*)&srv->req_sa,&size) < 0) {
300 log_err("Could not get local BD_ADDR. %s (%d)",
301 strerror(errno), errno);
302 close(cfd);
303 return;

--- 17 unchanged lines hidden (view full) ---

321 */
322
323 if (omtu < NG_L2CAP_MTU_MINIMUM) {
324 log_err("L2CAP OMTU is too small (%d bytes)", omtu);
325 close(cfd);
326 return;
327 }
328 } else {
311 if (!srv->fdidx[fd].control) {
312 /* Get local BD_ADDR */
313 size = sizeof(srv->req_sa);
314 if (getsockname(cfd,(struct sockaddr*)&srv->req_sa,&size) < 0) {
315 log_err("Could not get local BD_ADDR. %s (%d)",
316 strerror(errno), errno);
317 close(cfd);
318 return;

--- 17 unchanged lines hidden (view full) ---

336 */
337
338 if (omtu < NG_L2CAP_MTU_MINIMUM) {
339 log_err("L2CAP OMTU is too small (%d bytes)", omtu);
340 close(cfd);
341 return;
342 }
343 } else {
344 struct xucred cr;
345 struct passwd *pw;
346
347 /* Get peer's credentials */
348 memset(&cr, 0, sizeof(cr));
349 size = sizeof(cr);
350
351 if (getsockopt(cfd, 0, LOCAL_PEERCRED, &cr, &size) < 0) {
352 log_err("Could not get peer's credentials. %s (%d)",
353 strerror(errno), errno);
354 close(cfd);
355 return;
356 }
357
358 /* Check credentials */
359 pw = getpwuid(cr.cr_uid);
360 if (pw != NULL)
361 priv = (strcmp(pw->pw_name, "root") == 0);
362 else
363 log_warning("Could not verify credentials for uid %d",
364 cr.cr_uid);
365
329 memcpy(&srv->req_sa.l2cap_bdaddr, NG_HCI_BDADDR_ANY,
330 sizeof(srv->req_sa.l2cap_bdaddr));
331
332 omtu = srv->fdidx[fd].omtu;
333 }
334
335 /*
336 * Allocate buffer. This is an overkill, but we can not know how

--- 9 unchanged lines hidden (view full) ---

346
347 /* Add client descriptor to the index */
348 FD_SET(cfd, &srv->fdset);
349 if (srv->maxfd < cfd)
350 srv->maxfd = cfd;
351 srv->fdidx[cfd].valid = 1;
352 srv->fdidx[cfd].server = 0;
353 srv->fdidx[cfd].control = srv->fdidx[fd].control;
366 memcpy(&srv->req_sa.l2cap_bdaddr, NG_HCI_BDADDR_ANY,
367 sizeof(srv->req_sa.l2cap_bdaddr));
368
369 omtu = srv->fdidx[fd].omtu;
370 }
371
372 /*
373 * Allocate buffer. This is an overkill, but we can not know how

--- 9 unchanged lines hidden (view full) ---

383
384 /* Add client descriptor to the index */
385 FD_SET(cfd, &srv->fdset);
386 if (srv->maxfd < cfd)
387 srv->maxfd = cfd;
388 srv->fdidx[cfd].valid = 1;
389 srv->fdidx[cfd].server = 0;
390 srv->fdidx[cfd].control = srv->fdidx[fd].control;
391 srv->fdidx[cfd].priv = priv;
354 srv->fdidx[cfd].rsp_cs = 0;
355 srv->fdidx[cfd].rsp_size = 0;
356 srv->fdidx[cfd].rsp_limit = 0;
357 srv->fdidx[cfd].omtu = omtu;
358 srv->fdidx[cfd].rsp = rsp;
359}
360
361/*

--- 186 unchanged lines hidden ---
392 srv->fdidx[cfd].rsp_cs = 0;
393 srv->fdidx[cfd].rsp_size = 0;
394 srv->fdidx[cfd].rsp_limit = 0;
395 srv->fdidx[cfd].omtu = omtu;
396 srv->fdidx[cfd].rsp = rsp;
397}
398
399/*

--- 186 unchanged lines hidden ---