session.c (137868) | session.c (162128) |
---|---|
1/* 2 * session.c | 1/* 2 * session.c |
3 * 4 * Copyright (c) 2004 Maksim Yevmenkin <m_evmenkin@yahoo.com> | 3 */ 4 5/*- 6 * Copyright (c) 2006 Maksim Yevmenkin <m_evmenkin@yahoo.com> |
5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright --- 7 unchanged lines hidden (view full) --- 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 * | 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 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 --- 7 unchanged lines hidden (view full) --- 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 28 * SUCH DAMAGE. 29 * |
28 * $Id: session.c,v 1.2 2004/11/17 21:59:42 max Exp $ 29 * $FreeBSD: head/usr.sbin/bluetooth/bthidd/session.c 137868 2004-11-18 18:05:15Z emax $ | 30 * $Id: session.c,v 1.3 2006/09/07 21:06:53 max Exp $ 31 * $FreeBSD: head/usr.sbin/bluetooth/bthidd/session.c 162128 2006-09-07 21:47:49Z emax $ |
30 */ 31 32#include <sys/queue.h> 33#include <assert.h> 34#include <bluetooth.h> | 32 */ 33 34#include <sys/queue.h> 35#include <assert.h> 36#include <bluetooth.h> |
37#include <errno.h> 38#include <fcntl.h> |
|
35#include <stdio.h> 36#include <stdlib.h> 37#include <string.h> | 39#include <stdio.h> 40#include <stdlib.h> 41#include <string.h> |
42#include <syslog.h> |
|
38#include <unistd.h> | 43#include <unistd.h> |
44#include <usbhid.h> 45#include "bthid_config.h" |
|
39#include "bthidd.h" 40#include "kbd.h" 41 42/* 43 * Create new session 44 */ 45 46bthid_session_p | 46#include "bthidd.h" 47#include "kbd.h" 48 49/* 50 * Create new session 51 */ 52 53bthid_session_p |
47session_open(bthid_server_p srv, bdaddr_p bdaddr) | 54session_open(bthid_server_p srv, hid_device_p const d) |
48{ | 55{ |
49 bthid_session_p s = NULL; | 56 bthid_session_p s; |
50 51 assert(srv != NULL); | 57 58 assert(srv != NULL); |
52 assert(bdaddr != NULL); | 59 assert(d != NULL); |
53 | 60 |
54 if ((s = (bthid_session_p) malloc(sizeof(*s))) != NULL) { 55 s->srv = srv; 56 memcpy(&s->bdaddr, bdaddr, sizeof(s->bdaddr)); 57 s->ctrl = -1; 58 s->intr = -1; 59 s->state = CLOSED; 60 s->keys = bit_alloc(kbd_maxkey()); 61 if (s->keys == NULL) { | 61 if ((s = (bthid_session_p) malloc(sizeof(*s))) == NULL) 62 return (NULL); 63 64 s->srv = srv; 65 memcpy(&s->bdaddr, &d->bdaddr, sizeof(s->bdaddr)); 66 s->ctrl = -1; 67 s->intr = -1; 68 69 if (d->keyboard) { 70 /* Open /dev/vkbdctl */ 71 s->vkbd = open("/dev/vkbdctl", O_RDWR); 72 if (s->vkbd < 0) { 73 syslog(LOG_ERR, "Could not open /dev/vkbdctl " \ 74 "for %s. %s (%d)", bt_ntoa(&s->bdaddr, NULL), 75 strerror(errno), errno); |
62 free(s); | 76 free(s); |
63 s = NULL; 64 } else 65 LIST_INSERT_HEAD(&srv->sessions, s, next); | 77 return (NULL); 78 } 79 } else 80 s->vkbd = -1; 81 82 s->state = CLOSED; 83 84 s->keys1 = bit_alloc(kbd_maxkey()); 85 if (s->keys1 == NULL) { 86 free(s); 87 return (NULL); |
66 } 67 | 88 } 89 |
90 s->keys2 = bit_alloc(kbd_maxkey()); 91 if (s->keys2 == NULL) { 92 free(s->keys1); 93 free(s); 94 return (NULL); 95 } 96 97 LIST_INSERT_HEAD(&srv->sessions, s, next); 98 |
|
68 return (s); 69} 70 71/* 72 * Lookup session by bdaddr 73 */ 74 75bthid_session_p 76session_by_bdaddr(bthid_server_p srv, bdaddr_p bdaddr) 77{ | 99 return (s); 100} 101 102/* 103 * Lookup session by bdaddr 104 */ 105 106bthid_session_p 107session_by_bdaddr(bthid_server_p srv, bdaddr_p bdaddr) 108{ |
78 bthid_session_p s = NULL; | 109 bthid_session_p s; |
79 80 assert(srv != NULL); 81 assert(bdaddr != NULL); 82 83 LIST_FOREACH(s, &srv->sessions, next) 84 if (memcmp(&s->bdaddr, bdaddr, sizeof(s->bdaddr)) == 0) 85 break; 86 87 return (s); 88} 89 90/* 91 * Lookup session by fd 92 */ 93 94bthid_session_p | 110 111 assert(srv != NULL); 112 assert(bdaddr != NULL); 113 114 LIST_FOREACH(s, &srv->sessions, next) 115 if (memcmp(&s->bdaddr, bdaddr, sizeof(s->bdaddr)) == 0) 116 break; 117 118 return (s); 119} 120 121/* 122 * Lookup session by fd 123 */ 124 125bthid_session_p |
95session_by_fd(bthid_server_p srv, int fd) | 126session_by_fd(bthid_server_p srv, int32_t fd) |
96{ | 127{ |
97 bthid_session_p s = NULL; | 128 bthid_session_p s; |
98 99 assert(srv != NULL); 100 assert(fd >= 0); 101 102 LIST_FOREACH(s, &srv->sessions, next) | 129 130 assert(srv != NULL); 131 assert(fd >= 0); 132 133 LIST_FOREACH(s, &srv->sessions, next) |
103 if (s->ctrl == fd || s->intr == fd) | 134 if (s->ctrl == fd || s->intr == fd || s->vkbd == fd) |
104 break; 105 106 return (s); 107} 108 109/* 110 * Close session 111 */ --- 19 unchanged lines hidden (view full) --- 131 FD_CLR(s->ctrl, &s->srv->rfdset); 132 FD_CLR(s->ctrl, &s->srv->wfdset); 133 close(s->ctrl); 134 135 if (s->srv->maxfd == s->ctrl) 136 s->srv->maxfd --; 137 } 138 | 135 break; 136 137 return (s); 138} 139 140/* 141 * Close session 142 */ --- 19 unchanged lines hidden (view full) --- 162 FD_CLR(s->ctrl, &s->srv->rfdset); 163 FD_CLR(s->ctrl, &s->srv->wfdset); 164 close(s->ctrl); 165 166 if (s->srv->maxfd == s->ctrl) 167 s->srv->maxfd --; 168 } 169 |
139 free(s->keys); | 170 if (s->vkbd != -1) { 171 FD_CLR(s->vkbd, &s->srv->rfdset); 172 close(s->vkbd); |
140 | 173 |
174 if (s->srv->maxfd == s->vkbd) 175 s->srv->maxfd --; 176 } 177 178 free(s->keys1); 179 free(s->keys2); 180 |
|
141 memset(s, 0, sizeof(*s)); 142 free(s); 143} 144 | 181 memset(s, 0, sizeof(*s)); 182 free(s); 183} 184 |