6 * Copyright (c) 2006 Maksim Yevmenkin <m_evmenkin@yahoo.com>
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * $Id: session.c,v 1.3 2006/09/07 21:06:53 max Exp $
34 #include <sys/queue.h>
36 #include <bluetooth.h>
45 #include "bthid_config.h"
54 session_open(bthid_server_p srv, hid_device_p const d)
61 if ((s = (bthid_session_p) malloc(sizeof(*s))) == NULL)
65 memcpy(&s->bdaddr, &d->bdaddr, sizeof(s->bdaddr));
70 /* Open /dev/vkbdctl */
71 s->vkbd = open("/dev/vkbdctl", O_RDWR);
73 syslog(LOG_ERR, "Could not open /dev/vkbdctl " \
74 "for %s. %s (%d)", bt_ntoa(&s->bdaddr, NULL),
75 strerror(errno), errno);
84 s->keys1 = bit_alloc(kbd_maxkey());
85 if (s->keys1 == NULL) {
90 s->keys2 = bit_alloc(kbd_maxkey());
91 if (s->keys2 == NULL) {
97 LIST_INSERT_HEAD(&srv->sessions, s, next);
103 * Lookup session by bdaddr
107 session_by_bdaddr(bthid_server_p srv, bdaddr_p bdaddr)
112 assert(bdaddr != NULL);
114 LIST_FOREACH(s, &srv->sessions, next)
115 if (memcmp(&s->bdaddr, bdaddr, sizeof(s->bdaddr)) == 0)
122 * Lookup session by fd
126 session_by_fd(bthid_server_p srv, int32_t fd)
133 LIST_FOREACH(s, &srv->sessions, next)
134 if (s->ctrl == fd || s->intr == fd || s->vkbd == fd)
145 session_close(bthid_session_p s)
148 assert(s->srv != NULL);
150 LIST_REMOVE(s, next);
153 FD_CLR(s->intr, &s->srv->rfdset);
154 FD_CLR(s->intr, &s->srv->wfdset);
157 if (s->srv->maxfd == s->intr)
162 FD_CLR(s->ctrl, &s->srv->rfdset);
163 FD_CLR(s->ctrl, &s->srv->wfdset);
166 if (s->srv->maxfd == s->ctrl)
171 FD_CLR(s->vkbd, &s->srv->rfdset);
174 if (s->srv->maxfd == s->vkbd)
181 memset(s, 0, sizeof(*s));