Lines Matching refs:srv
95 server_init(server_t *srv, char const *control, char const *sgroup) in server_init() argument
98 assert(srv != NULL); in server_init()
101 memset(srv, 0, sizeof(*srv)); in server_init()
102 FD_ZERO(&srv->fdset); in server_init()
103 srv->sgroup = sgroup; in server_init()
105 srv->fdmax = -1; in server_init()
106 srv->fdidx = calloc(FD_SETSIZE, sizeof(fd_idx_t)); in server_init()
107 if (srv->fdidx == NULL) { in server_init()
112 srv->ctllen = CMSG_SPACE(SOCKCREDSIZE(MAX_GROUPS)); in server_init()
113 srv->ctlbuf = malloc(srv->ctllen); in server_init()
114 if (srv->ctlbuf == NULL) { in server_init()
115 log_crit("Malloc cmsg buffer (len=%zu) failed.", srv->ctllen); in server_init()
119 srv->imtu = SDP_LOCAL_MTU - sizeof(sdp_pdu_t); in server_init()
120 srv->ibuf = malloc(srv->imtu); in server_init()
121 if (srv->ibuf == NULL) { in server_init()
122 log_crit("Malloc input buffer (imtu=%d) failed.", srv->imtu); in server_init()
126 srv->omtu = L2CAP_MTU_DEFAULT - sizeof(sdp_pdu_t); in server_init()
127 srv->obuf = malloc(srv->omtu); in server_init()
128 if (srv->obuf == NULL) { in server_init()
129 log_crit("Malloc output buffer (omtu=%d) failed.", srv->omtu); in server_init()
133 if (db_init(srv) in server_init()
134 && server_open_control(srv, control) in server_init()
135 && server_open_l2cap(srv)) in server_init()
139 server_shutdown(srv); in server_init()
147 server_open_control(server_t *srv, char const *control) in server_open_control() argument
201 if (fd > srv->fdmax) in server_open_control()
202 srv->fdmax = fd; in server_open_control()
204 FD_SET(fd, &srv->fdset); in server_open_control()
205 srv->fdidx[fd].valid = true; in server_open_control()
206 srv->fdidx[fd].server = true; in server_open_control()
207 srv->fdidx[fd].control = true; in server_open_control()
208 srv->fdidx[fd].priv = false; in server_open_control()
216 server_open_l2cap(server_t *srv) in server_open_l2cap() argument
230 &srv->imtu, sizeof(srv->imtu)) == -1) { in server_open_l2cap()
261 if (fd > srv->fdmax) in server_open_l2cap()
262 srv->fdmax = fd; in server_open_l2cap()
264 FD_SET(fd, &srv->fdset); in server_open_l2cap()
265 srv->fdidx[fd].valid = true; in server_open_l2cap()
266 srv->fdidx[fd].server = true; in server_open_l2cap()
267 srv->fdidx[fd].control = false; in server_open_l2cap()
268 srv->fdidx[fd].priv = false; in server_open_l2cap()
276 server_shutdown(server_t *srv) in server_shutdown() argument
281 assert(srv != NULL); in server_shutdown()
283 while ((r = LIST_FIRST(&srv->rlist)) != NULL) { in server_shutdown()
288 for (fd = 0; fd < srv->fdmax + 1; fd ++) { in server_shutdown()
289 if (srv->fdidx[fd].valid) in server_shutdown()
290 server_close_fd(srv, fd); in server_shutdown()
293 free(srv->fdidx); in server_shutdown()
294 free(srv->ctlbuf); in server_shutdown()
295 free(srv->ibuf); in server_shutdown()
296 free(srv->obuf); in server_shutdown()
298 memset(srv, 0, sizeof(*srv)); in server_shutdown()
305 server_do(server_t *srv) in server_do() argument
310 assert(srv != NULL); in server_do()
312 memcpy(&fdset, &srv->fdset, sizeof(fdset)); in server_do()
313 n = select(srv->fdmax + 1, &fdset, NULL, NULL, NULL); in server_do()
319 srv->fdmax + 1, &fdset, strerror(errno), errno); in server_do()
324 for (fd = 0; fd < srv->fdmax + 1 && n > 0; fd++) { in server_do()
328 assert(srv->fdidx[fd].valid); in server_do()
330 if (srv->fdidx[fd].server) in server_do()
331 server_accept_client(srv, fd); in server_do()
332 else if (!server_process_request(srv, fd)) in server_do()
333 server_close_fd(srv, fd); in server_do()
346 server_accept_client(server_t *srv, int fd) in server_accept_client() argument
359 srv->fdidx[fd].control ? "control" : "L2CAP", in server_accept_client()
371 assert(!FD_ISSET(cfd, &srv->fdset)); in server_accept_client()
372 assert(!srv->fdidx[cfd].valid); in server_accept_client()
375 omtu = srv->omtu; in server_accept_client()
377 if (!srv->fdidx[fd].control) { in server_accept_client()
390 if (cfd > srv->fdmax) in server_accept_client()
391 srv->fdmax = cfd; in server_accept_client()
393 FD_SET(cfd, &srv->fdset); in server_accept_client()
394 srv->fdidx[cfd].valid = true; in server_accept_client()
395 srv->fdidx[cfd].server = false; in server_accept_client()
396 srv->fdidx[cfd].control = srv->fdidx[fd].control; in server_accept_client()
397 srv->fdidx[cfd].priv = false; in server_accept_client()
398 srv->fdidx[cfd].omtu = (omtu > srv->omtu) ? srv->omtu : omtu; in server_accept_client()
399 srv->fdidx[cfd].offset = 0; in server_accept_client()
400 bdaddr_copy(&srv->fdidx[cfd].bdaddr, &sa.bt_bdaddr); in server_accept_client()
403 srv->fdidx[cfd].control ? "control" : "L2CAP", cfd); in server_accept_client()
410 server_process_request(server_t *srv, int fd) in server_process_request() argument
418 assert(FD_ISSET(fd, &srv->fdset)); in server_process_request()
419 assert(srv->fdidx[fd].valid); in server_process_request()
420 assert(!srv->fdidx[fd].server); in server_process_request()
422 iov[0].iov_base = &srv->pdu; in server_process_request()
423 iov[0].iov_len = sizeof(srv->pdu); in server_process_request()
424 iov[1].iov_base = srv->ibuf; in server_process_request()
425 iov[1].iov_len = srv->imtu; in server_process_request()
431 msg.msg_control = srv->ctlbuf; in server_process_request()
432 msg.msg_controllen = srv->ctllen; in server_process_request()
441 srv->fdidx[fd].control ? "control" : "L2CAP", in server_process_request()
449 srv->fdidx[fd].control ? "control" : "L2CAP"); in server_process_request()
456 srv->fdidx[fd].control ? "control" : "L2CAP"); in server_process_request()
462 srv->fdidx[fd].priv = server_auth_check(srv, CMSG_DATA(cmsg)); in server_process_request()
464 srv->pdu.len = be16toh(srv->pdu.len); in server_process_request()
466 if ((uint32_t)len < sizeof(srv->pdu) in server_process_request()
467 || (uint32_t)len != sizeof(srv->pdu) + srv->pdu.len) { in server_process_request()
470 switch (srv->pdu.pid) { in server_process_request()
472 error = service_search_request(srv, fd); in server_process_request()
476 error = service_attribute_request(srv, fd); in server_process_request()
480 error = service_search_attribute_request(srv, fd); in server_process_request()
485 error = compat_register_request(srv, fd); in server_process_request()
489 error = compat_change_request(srv, fd); in server_process_request()
494 error = record_insert_request(srv, fd); in server_process_request()
498 error = record_update_request(srv, fd); in server_process_request()
502 error = record_remove_request(srv, fd); in server_process_request()
512 srv->fdidx[fd].offset = 0; in server_process_request()
513 db_unselect(srv, fd); in server_process_request()
514 srv->pdu.pid = SDP_PDU_ERROR_RESPONSE; in server_process_request()
515 srv->pdu.len = sizeof(error); in server_process_request()
516 be16enc(srv->obuf, error); in server_process_request()
520 iov[0].iov_base = &srv->pdu; in server_process_request()
521 iov[0].iov_len = sizeof(srv->pdu); in server_process_request()
522 iov[1].iov_base = srv->obuf; in server_process_request()
523 iov[1].iov_len = srv->pdu.len; in server_process_request()
525 srv->pdu.len = htobe16(srv->pdu.len); in server_process_request()
541 srv->fdidx[fd].control ? "control" : "L2CAP", in server_process_request()
554 server_close_fd(server_t *srv, int fd) in server_close_fd() argument
557 assert(FD_ISSET(fd, &srv->fdset)); in server_close_fd()
558 assert(srv->fdidx[fd].valid); in server_close_fd()
560 db_unselect(srv, fd); /* release selected records */ in server_close_fd()
561 db_release(srv, fd); /* expire owned records */ in server_close_fd()
564 FD_CLR(fd, &srv->fdset); in server_close_fd()
565 srv->fdidx[fd].valid = false; in server_close_fd()
569 if (fd == srv->fdmax) { in server_close_fd()
570 while (fd > 0 && !srv->fdidx[fd].valid) in server_close_fd()
573 srv->fdmax = fd; in server_close_fd()
581 server_auth_check(server_t *srv, void *data) in server_auth_check() argument
593 if (srv->sgroup == NULL) in server_auth_check()
596 grp = getgrnam(srv->sgroup); in server_auth_check()
598 log_err("No gid for group '%s'", srv->sgroup); in server_auth_check()
599 srv->sgroup = NULL; in server_auth_check()