diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2007-01-13 18:02:10 +0000 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2007-01-13 18:02:10 +0000 |
commit | 3f5e2295dd6b747609ad3a893a76af5ba2146c93 (patch) | |
tree | cd46adc980b419fe057c0909cd3ccce19fcf1bf5 /sdpd/request.c | |
parent | 607695ed109340f4b7a5628420e0a8e8aee34f4e (diff) |
Better integration into a SDP server library
Diffstat (limited to 'sdpd/request.c')
-rw-r--r-- | sdpd/request.c | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/sdpd/request.c b/sdpd/request.c index 2fc4b8b6..2b052863 100644 --- a/sdpd/request.c +++ b/sdpd/request.c @@ -30,10 +30,12 @@ #include <stdio.h> #include <errno.h> +#include <stdlib.h> #include <malloc.h> #include <sys/socket.h> #include <bluetooth/bluetooth.h> +#include <bluetooth/l2cap.h> #include <bluetooth/sdp.h> #include <bluetooth/sdp_lib.h> @@ -765,7 +767,7 @@ done: * function based on request type. Handles service registration * client requests also. */ -void process_request(sdp_req_t *req) +static void process_request(sdp_req_t *req) { sdp_pdu_hdr_t *reqhdr = (sdp_pdu_hdr_t *)req->buf; sdp_pdu_hdr_t *rsphdr; @@ -852,3 +854,39 @@ send_rsp: free(rsp.data); free(req->buf); } + +void handle_request(int sk, uint8_t *data, int len) +{ + struct sockaddr_l2 sa; + socklen_t size; + sdp_req_t req; + + size = sizeof(sa); + if (getpeername(sk, (struct sockaddr *) &sa, &size) < 0) + return; + + if (sa.l2_family == AF_BLUETOOTH) { + struct l2cap_options lo; + memset(&lo, 0, sizeof(lo)); + size = sizeof(lo); + getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &lo, &size); + bacpy(&req.bdaddr, &sa.l2_bdaddr); + req.mtu = lo.omtu; + req.local = 0; + memset(&sa, 0, sizeof(sa)); + size = sizeof(sa); + getsockname(sk, (struct sockaddr *) &sa, &size); + bacpy(&req.device, &sa.l2_bdaddr); + } else { + bacpy(&req.device, BDADDR_ANY); + bacpy(&req.bdaddr, BDADDR_LOCAL); + req.mtu = 2048; + req.local = 1; + } + + req.sock = sk; + req.buf = data; + req.len = len; + + process_request(&req); +} |