diff options
author | emax <emax@FreeBSD.org> | 2004-11-18 18:05:15 +0000 |
---|---|---|
committer | emax <emax@FreeBSD.org> | 2004-11-18 18:05:15 +0000 |
commit | d4ffd83e778e80db410d375dac46287dfdf6f5f7 (patch) | |
tree | 6cb568181ac09aadbe16376ca328e1bbee9ccd01 /usr.sbin/bluetooth/bthidd/server.c | |
parent | a1fa5f3147516f8fa8066807a6819a4847ed332e (diff) | |
download | FreeBSD-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.c | 51 |
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)); } |