Lines Matching refs:srv

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