Lines Matching full:srv
56 static void server_accept_client (server_p srv, int32_t fd);
57 static int32_t server_process_request (server_p srv, int32_t fd);
58 static int32_t server_send_error_response (server_p srv, int32_t fd,
60 static void server_close_fd (server_p srv, int32_t fd);
67 server_init(server_p srv, char const *control) in server_init() argument
75 assert(srv != NULL); in server_init()
78 memset(srv, 0, sizeof(*srv)); in server_init()
161 srv->imtu = (imtu > SDP_LOCAL_MTU)? imtu : SDP_LOCAL_MTU; in server_init()
162 srv->req = (uint8_t *) calloc(srv->imtu, sizeof(srv->req[0])); in server_init()
163 if (srv->req == NULL) { in server_init()
171 srv->fdidx = (fd_idx_p) calloc(FD_SETSIZE, sizeof(srv->fdidx[0])); in server_init()
172 if (srv->fdidx == NULL) { in server_init()
174 free(srv->req); in server_init()
183 free(srv->fdidx); in server_init()
184 free(srv->req); in server_init()
195 FD_ZERO(&srv->fdset); in server_init()
196 srv->maxfd = (unsock > l2sock)? unsock : l2sock; in server_init()
198 FD_SET(unsock, &srv->fdset); in server_init()
199 srv->fdidx[unsock].valid = 1; in server_init()
200 srv->fdidx[unsock].server = 1; in server_init()
201 srv->fdidx[unsock].control = 1; in server_init()
202 srv->fdidx[unsock].priv = 0; in server_init()
203 srv->fdidx[unsock].rsp_cs = 0; in server_init()
204 srv->fdidx[unsock].rsp_size = 0; in server_init()
205 srv->fdidx[unsock].rsp_limit = 0; in server_init()
206 srv->fdidx[unsock].omtu = SDP_LOCAL_MTU; in server_init()
207 srv->fdidx[unsock].rsp = NULL; in server_init()
209 FD_SET(l2sock, &srv->fdset); in server_init()
210 srv->fdidx[l2sock].valid = 1; in server_init()
211 srv->fdidx[l2sock].server = 1; in server_init()
212 srv->fdidx[l2sock].control = 0; in server_init()
213 srv->fdidx[l2sock].priv = 0; in server_init()
214 srv->fdidx[l2sock].rsp_cs = 0; in server_init()
215 srv->fdidx[l2sock].rsp_size = 0; in server_init()
216 srv->fdidx[l2sock].rsp_limit = 0; in server_init()
217 srv->fdidx[l2sock].omtu = 0; /* unknown */ in server_init()
218 srv->fdidx[l2sock].rsp = NULL; in server_init()
228 server_shutdown(server_p srv) in server_shutdown() argument
232 assert(srv != NULL); in server_shutdown()
234 for (fd = 0; fd < srv->maxfd + 1; fd ++) in server_shutdown()
235 if (srv->fdidx[fd].valid) in server_shutdown()
236 server_close_fd(srv, fd); in server_shutdown()
238 free(srv->req); in server_shutdown()
239 free(srv->fdidx); in server_shutdown()
241 memset(srv, 0, sizeof(*srv)); in server_shutdown()
249 server_do(server_p srv) in server_do() argument
254 assert(srv != NULL); in server_do()
257 memcpy(&fdset, &srv->fdset, sizeof(fdset)); in server_do()
258 n = select(srv->maxfd + 1, &fdset, NULL, NULL, NULL); in server_do()
264 srv->maxfd + 1, &fdset, strerror(errno), errno); in server_do()
270 for (fd = 0; fd < srv->maxfd + 1 && n > 0; fd ++) { in server_do()
274 assert(srv->fdidx[fd].valid); in server_do()
277 if (srv->fdidx[fd].server) in server_do()
278 server_accept_client(srv, fd); in server_do()
279 else if (server_process_request(srv, fd) != 0) in server_do()
280 server_close_fd(srv, fd); in server_do()
292 server_accept_client(server_p srv, int32_t fd) in server_accept_client() argument
305 srv->fdidx[fd].control? "control" : "L2CAP", in server_accept_client()
310 assert(!FD_ISSET(cfd, &srv->fdset)); in server_accept_client()
311 assert(!srv->fdidx[cfd].valid); in server_accept_client()
315 if (!srv->fdidx[fd].control) { in server_accept_client()
317 size = sizeof(srv->req_sa); in server_accept_client()
318 if (getsockname(cfd,(struct sockaddr*)&srv->req_sa,&size) < 0) { in server_accept_client()
368 memcpy(&srv->req_sa.l2cap_bdaddr, NG_HCI_BDADDR_ANY, in server_accept_client()
369 sizeof(srv->req_sa.l2cap_bdaddr)); in server_accept_client()
371 omtu = srv->fdidx[fd].omtu; in server_accept_client()
387 FD_SET(cfd, &srv->fdset); in server_accept_client()
388 if (srv->maxfd < cfd) in server_accept_client()
389 srv->maxfd = cfd; in server_accept_client()
390 srv->fdidx[cfd].valid = 1; in server_accept_client()
391 srv->fdidx[cfd].server = 0; in server_accept_client()
392 srv->fdidx[cfd].control = srv->fdidx[fd].control; in server_accept_client()
393 srv->fdidx[cfd].priv = priv; in server_accept_client()
394 srv->fdidx[cfd].rsp_cs = 0; in server_accept_client()
395 srv->fdidx[cfd].rsp_size = 0; in server_accept_client()
396 srv->fdidx[cfd].rsp_limit = 0; in server_accept_client()
397 srv->fdidx[cfd].omtu = omtu; in server_accept_client()
398 srv->fdidx[cfd].rsp = rsp; in server_accept_client()
406 server_process_request(server_p srv, int32_t fd) in server_process_request() argument
408 sdp_pdu_p pdu = (sdp_pdu_p) srv->req; in server_process_request()
411 assert(srv->imtu > 0); in server_process_request()
412 assert(srv->req != NULL); in server_process_request()
413 assert(FD_ISSET(fd, &srv->fdset)); in server_process_request()
414 assert(srv->fdidx[fd].valid); in server_process_request()
415 assert(!srv->fdidx[fd].server); in server_process_request()
416 assert(srv->fdidx[fd].rsp != NULL); in server_process_request()
417 assert(srv->fdidx[fd].omtu >= NG_L2CAP_MTU_MINIMUM); in server_process_request()
420 len = read(fd, srv->req, srv->imtu); in server_process_request()
425 srv->fdidx[fd].control? "control" : "L2CAP", in server_process_request()
431 srv->fdidx[fd].control? "control" : "L2CAP"); in server_process_request()
439 error = server_prepare_service_search_response(srv, fd); in server_process_request()
443 error = server_prepare_service_attribute_response(srv, fd); in server_process_request()
447 error = server_prepare_service_search_attribute_response(srv, fd); in server_process_request()
451 error = server_prepare_service_register_response(srv, fd); in server_process_request()
455 error = server_prepare_service_unregister_response(srv, fd); in server_process_request()
459 error = server_prepare_service_change_response(srv, fd); in server_process_request()
472 error = server_send_service_search_response(srv, fd); in server_process_request()
476 error = server_send_service_attribute_response(srv, fd); in server_process_request()
480 error = server_send_service_search_attribute_response(srv, fd); in server_process_request()
484 error = server_send_service_register_response(srv, fd); in server_process_request()
488 error = server_send_service_unregister_response(srv, fd); in server_process_request()
492 error = server_send_service_change_response(srv, fd); in server_process_request()
503 srv->fdidx[fd].control? "control" : "L2CAP", in server_process_request()
509 srv->fdidx[fd].control? "control" : "L2CAP", in server_process_request()
512 error = server_send_error_response(srv, fd, error); in server_process_request()
516 srv->fdidx[fd].control? "control" : "L2CAP", in server_process_request()
522 srv->fdidx[fd].rsp_cs = 0; in server_process_request()
523 srv->fdidx[fd].rsp_size = 0; in server_process_request()
524 srv->fdidx[fd].rsp_limit = 0; in server_process_request()
535 server_send_error_response(server_p srv, int32_t fd, uint16_t error) in server_send_error_response() argument
546 rsp.pdu.tid = ((sdp_pdu_p)(srv->req))->tid; in server_send_error_response()
562 server_close_fd(server_p srv, int32_t fd) in server_close_fd() argument
566 assert(FD_ISSET(fd, &srv->fdset)); in server_close_fd()
567 assert(srv->fdidx[fd].valid); in server_close_fd()
571 FD_CLR(fd, &srv->fdset); in server_close_fd()
572 if (fd == srv->maxfd) in server_close_fd()
573 srv->maxfd --; in server_close_fd()
575 if (srv->fdidx[fd].rsp != NULL) in server_close_fd()
576 free(srv->fdidx[fd].rsp); in server_close_fd()
578 memset(&srv->fdidx[fd], 0, sizeof(srv->fdidx[fd])); in server_close_fd()