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 --- |