6 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
8 * Copyright (c) 2006 Maksim Yevmenkin <m_evmenkin@yahoo.com>
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * $Id: session.c,v 1.3 2006/09/07 21:06:53 max Exp $
36 #include <sys/queue.h>
38 #define L2CAP_SOCKET_CHECKED
39 #include <bluetooth.h>
48 #include "bthid_config.h"
57 session_open(bthid_server_p srv, hid_device_p const d)
64 if ((s = (bthid_session_p) malloc(sizeof(*s))) == NULL)
68 memcpy(&s->bdaddr, &d->bdaddr, sizeof(s->bdaddr));
73 /* Open /dev/vkbdctl */
74 s->vkbd = open("/dev/vkbdctl", O_RDWR);
76 syslog(LOG_ERR, "Could not open /dev/vkbdctl " \
77 "for %s. %s (%d)", bt_ntoa(&s->bdaddr, NULL),
78 strerror(errno), errno);
87 s->keys1 = bit_alloc(kbd_maxkey());
88 if (s->keys1 == NULL) {
93 s->keys2 = bit_alloc(kbd_maxkey());
94 if (s->keys2 == NULL) {
100 LIST_INSERT_HEAD(&srv->sessions, s, next);
106 * Lookup session by bdaddr
110 session_by_bdaddr(bthid_server_p srv, bdaddr_p bdaddr)
115 assert(bdaddr != NULL);
117 LIST_FOREACH(s, &srv->sessions, next)
118 if (memcmp(&s->bdaddr, bdaddr, sizeof(s->bdaddr)) == 0)
125 * Lookup session by fd
129 session_by_fd(bthid_server_p srv, int32_t fd)
136 LIST_FOREACH(s, &srv->sessions, next)
137 if (s->ctrl == fd || s->intr == fd || s->vkbd == fd)
148 session_close(bthid_session_p s)
151 assert(s->srv != NULL);
153 LIST_REMOVE(s, next);
156 FD_CLR(s->intr, &s->srv->rfdset);
157 FD_CLR(s->intr, &s->srv->wfdset);
160 if (s->srv->maxfd == s->intr)
165 FD_CLR(s->ctrl, &s->srv->rfdset);
166 FD_CLR(s->ctrl, &s->srv->wfdset);
169 if (s->srv->maxfd == s->ctrl)
174 FD_CLR(s->vkbd, &s->srv->rfdset);
177 if (s->srv->maxfd == s->vkbd)
184 memset(s, 0, sizeof(*s));