Deleted Added
full compact
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