summaryrefslogtreecommitdiffstats
path: root/usr.sbin/bluetooth/bthidd/server.c
diff options
context:
space:
mode:
authoremax <emax@FreeBSD.org>2004-11-18 18:05:15 +0000
committeremax <emax@FreeBSD.org>2004-11-18 18:05:15 +0000
commitd4ffd83e778e80db410d375dac46287dfdf6f5f7 (patch)
tree6cb568181ac09aadbe16376ca328e1bbee9ccd01 /usr.sbin/bluetooth/bthidd/server.c
parenta1fa5f3147516f8fa8066807a6819a4847ed332e (diff)
downloadFreeBSD-src-d4ffd83e778e80db410d375dac46287dfdf6f5f7.zip
FreeBSD-src-d4ffd83e778e80db410d375dac46287dfdf6f5f7.tar.gz
Check in updated bthidd(8). This is still work in progress.
Diffstat (limited to 'usr.sbin/bluetooth/bthidd/server.c')
-rw-r--r--usr.sbin/bluetooth/bthidd/server.c51
1 files changed, 50 insertions, 1 deletions
diff --git a/usr.sbin/bluetooth/bthidd/server.c b/usr.sbin/bluetooth/bthidd/server.c
index d1887db..e2f716e 100644
--- a/usr.sbin/bluetooth/bthidd/server.c
+++ b/usr.sbin/bluetooth/bthidd/server.c
@@ -25,7 +25,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: server.c,v 1.5 2004/02/26 21:43:36 max Exp $
+ * $Id: server.c,v 1.7 2004/11/17 21:59:42 max Exp $
* $FreeBSD$
*/
@@ -42,6 +42,7 @@
#include <usbhid.h>
#include "bthidd.h"
#include "bthid_config.h"
+#include "kbd.h"
#undef max
#define max(x, y) (((x) > (y))? (x) : (y))
@@ -65,6 +66,25 @@ server_init(bthid_server_p srv)
FD_ZERO(&srv->wfdset);
LIST_INIT(&srv->sessions);
+ /* Allocate HID keycodes buffer */
+ srv->keys = bit_alloc(kbd_maxkey());
+ if (srv->keys == NULL) {
+ syslog(LOG_ERR, "Could not allocate HID keys buffer");
+ return (-1);
+ }
+ memset(srv->keys, 0, bitstr_size(kbd_maxkey()));
+
+ /* Get wired keyboard index (if was not specified) */
+ if (srv->windex == -1) {
+ srv->windex = kbd_get_index("/dev/console");
+ if (srv->windex < 0) {
+ syslog(LOG_ERR, "Could not open get wired keyboard " \
+ "index. %s (%d)", strerror(errno), errno);
+ free(srv->keys);
+ return (-1);
+ }
+ }
+
/* Open /dev/consolectl */
srv->cons = open("/dev/consolectl", O_RDWR);
if (srv->cons < 0) {
@@ -73,12 +93,24 @@ server_init(bthid_server_p srv)
return (-1);
}
+ /* Open /dev/vkbdctl */
+ srv->vkbd = open("/dev/vkbdctl", O_RDWR);
+ if (srv->vkbd < 0) {
+ syslog(LOG_ERR, "Could not open /dev/vkbdctl. %s (%d)",
+ strerror(errno), errno);
+ close(srv->cons);
+ free(srv->keys);
+ return (-1);
+ }
+
/* Create control socket */
srv->ctrl = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BLUETOOTH_PROTO_L2CAP);
if (srv->ctrl < 0) {
syslog(LOG_ERR, "Could not create control L2CAP socket. " \
"%s (%d)", strerror(errno), errno);
+ close(srv->vkbd);
close(srv->cons);
+ free(srv->keys);
return (-1);
}
@@ -90,14 +122,20 @@ server_init(bthid_server_p srv)
if (bind(srv->ctrl, (struct sockaddr *) &l2addr, sizeof(l2addr)) < 0) {
syslog(LOG_ERR, "Could not bind control L2CAP socket. " \
"%s (%d)", strerror(errno), errno);
+ close(srv->ctrl);
+ close(srv->vkbd);
close(srv->cons);
+ free(srv->keys);
return (-1);
}
if (listen(srv->ctrl, 10) < 0) {
syslog(LOG_ERR, "Could not listen on control L2CAP socket. " \
"%s (%d)", strerror(errno), errno);
+ close(srv->ctrl);
+ close(srv->vkbd);
close(srv->cons);
+ free(srv->keys);
return (-1);
}
@@ -107,7 +145,9 @@ server_init(bthid_server_p srv)
syslog(LOG_ERR, "Could not create interrupt L2CAP socket. " \
"%s (%d)", strerror(errno), errno);
close(srv->ctrl);
+ close(srv->vkbd);
close(srv->cons);
+ free(srv->keys);
return (-1);
}
@@ -116,16 +156,22 @@ server_init(bthid_server_p srv)
if (bind(srv->intr, (struct sockaddr *) &l2addr, sizeof(l2addr)) < 0) {
syslog(LOG_ERR, "Could not bind interrupt L2CAP socket. " \
"%s (%d)", strerror(errno), errno);
+ close(srv->intr);
close(srv->ctrl);
+ close(srv->vkbd);
close(srv->cons);
+ free(srv->keys);
return (-1);
}
if (listen(srv->intr, 10) < 0) {
syslog(LOG_ERR, "Could not listen on interrupt L2CAP socket. "\
"%s (%d)", strerror(errno), errno);
+ close(srv->intr);
close(srv->ctrl);
+ close(srv->vkbd);
close(srv->cons);
+ free(srv->keys);
return (-1);
}
@@ -146,12 +192,15 @@ server_shutdown(bthid_server_p srv)
assert(srv != NULL);
close(srv->cons);
+ close(srv->vkbd);
close(srv->ctrl);
close(srv->intr);
while (!LIST_EMPTY(&srv->sessions))
session_close(LIST_FIRST(&srv->sessions));
+ free(srv->keys);
+
memset(srv, 0, sizeof(*srv));
}
OpenPOWER on IntegriCloud