b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems/***************************************************************************
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems *
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * probe-xkb.c : Probe for keyboard device information
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems *
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * Use is subject to license terms.
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems *
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * Licensed under the Academic Free License version 2.1
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems *
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems **************************************************************************/
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#ifdef HAVE_CONFIG_H
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <config.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#endif
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <errno.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <string.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <strings.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <ctype.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <stdlib.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <stdio.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <sys/ioctl.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <sys/stropts.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <fcntl.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <unistd.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <priv.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <sys/kbd.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <sys/kbio.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <libhal.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <logger.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#define MAXLINELEN 256
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#define COMMENTCHAR '#'
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#define KBD_DEFAULT_DEVICE "/dev/kbd"
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#define XKBTABLE_PATH "/usr/X11/lib/X11/xkb/xkbtable.map"
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsstatic int global_linenumber = 0;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsstatic char line[MAXLINELEN + 1];
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsstatic void
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsdrop_privileges()
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems{
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems priv_set_t *pPrivSet = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems priv_set_t *lPrivSet = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems /*
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * Start with the 'basic' privilege set and then remove any
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * of the 'basic' privileges that will not be needed.
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((pPrivSet = priv_str_to_set("basic", ",", NULL)) == NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems HAL_INFO(("Error in setting the priv"));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems /* Clear privileges we will not need from the 'basic' set */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems (void) priv_delset(pPrivSet, PRIV_FILE_LINK_ANY);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems (void) priv_delset(pPrivSet, PRIV_PROC_INFO);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems (void) priv_delset(pPrivSet, PRIV_PROC_SESSION);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems (void) priv_delset(pPrivSet, PRIV_PROC_EXEC);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems (void) priv_delset(pPrivSet, PRIV_PROC_FORK);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems (void) priv_addset(pPrivSet, PRIV_SYS_DEVICES);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems (void) priv_addset(pPrivSet, PRIV_FILE_DAC_READ);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems /* Set the permitted privilege set. */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (setppriv(PRIV_SET, PRIV_PERMITTED, pPrivSet) != 0) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems /* Clear the limit set. */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((lPrivSet = priv_allocset()) == NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems priv_emptyset(lPrivSet);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (setppriv(PRIV_SET, PRIV_LIMIT, lPrivSet) != 0) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems priv_freeset(lPrivSet);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems priv_freeset(pPrivSet);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems}
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsstatic int
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsget_kbd_layout_type(char *device_file, int *kbd_type, int *kbd_layout)
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems{
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems int ret = 1;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems int fd = -1;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((fd = open(device_file, O_RDONLY | O_NONBLOCK)) < 0) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems HAL_DEBUG(("Cannot open %s: %s", device_file, strerror(errno)));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems goto out;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems /*
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * For usb keyboard devices, we need to first push "usbkbm" module upon
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * the stream.
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (strstr(device_file, "hid") != NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (ioctl(fd, I_FIND, "usbkbm") == 0) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems (void) ioctl(fd, I_PUSH, "usbkbm");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems HAL_DEBUG(("usbkbm module has been pushed %s", strerror(errno)));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (ioctl(fd, KIOCTYPE, kbd_type) < 0) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems HAL_DEBUG(("get keyboard type failed %s: %s",
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems device_file, strerror(errno)));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems goto out;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (ioctl(fd, KIOCLAYOUT, kbd_layout) < 0) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems HAL_DEBUG(("get keyboard layout failed %s: %s",
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems device_file, strerror(errno)));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems goto out;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems ret = 0;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsout: if (fd >= 0) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems close(fd);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return (ret);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems}
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems/* Skips over the white space character in the string. */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsstatic char *
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsskipwhite(char *ptr)
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems{
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems while ((*ptr == ' ') || (*ptr == '\t')) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems ptr++;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems /* This should not occur. but .. */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (*ptr == '\n') {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems ptr = '\0';
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return (ptr);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems}
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsstatic char *
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsgetaline(FILE *fp)
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems{
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char *ptr;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char *tmp;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems int index;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems int c;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems while (1) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems ptr = fgets(line, MAXLINELEN, fp);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (!ptr) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems (void) fclose(fp);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return (NULL);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems global_linenumber++;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems /* Comment line */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (ptr[0] == COMMENTCHAR) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems continue;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems /* Blank line */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (ptr[0] == '\n') {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems continue;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((tmp = strchr(ptr, '#')) != NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems *tmp = '\0';
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (ptr[strlen(ptr) - 1] == '\n') {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems /* get rid of '\n' */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems ptr[strlen(ptr) - 1] = '\0';
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems ptr = skipwhite(ptr);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (*ptr) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems break;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return (ptr);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems}
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsstatic int
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemssun_find_xkbnames(int kb_type, int kb_layout, char **xkb_keymap,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char **xkb_model, char **xkb_layout)
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems{
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems const char *type, *layout;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char *keymap, *defkeymap = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char *model, *defmodel = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char *xkblay, *defxkblay = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems FILE *fp;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems int found_error = 0, found_keytable = 0;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems int ret = 1;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((fp = fopen(XKBTABLE_PATH, "r")) == NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return (ret);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems global_linenumber = 0;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems while (getaline(fp)) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((type = strtok(line, " \t\n")) == NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems found_error = 1;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((layout = strtok(NULL, " \t\n")) == NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems found_error = 1;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((keymap = strtok(NULL, " \t\n")) == NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems found_error = 1;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems /* These two are optional entries */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems model = strtok(NULL, " \t\n");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((model == NULL) || (*model == COMMENTCHAR)) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems model = xkblay = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems } else {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems xkblay = strtok(NULL, " \t\n");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((xkblay != NULL) && (*xkblay == COMMENTCHAR)) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems xkblay = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (found_error) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems found_error = 0;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems continue;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems /* record default entry if/when found */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (*type == '*') {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (defkeymap == NULL) {
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems defkeymap = strdup(keymap);
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems defmodel = strdup(model);
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems defxkblay = strdup(xkblay);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems } else if (atoi(type) == kb_type) {
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems if (*layout == '*') {
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems defkeymap = strdup(keymap);
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems defmodel = strdup(model);
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems defxkblay = strdup(xkblay);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems } else if (atoi(layout) == kb_layout) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems found_keytable = 1;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems break;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems (void) fclose(fp);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (!found_keytable) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems keymap = defkeymap;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems model = defmodel;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems xkblay = defxkblay;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((keymap != NULL) && (strcmp(keymap, "-") != 0)) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems *xkb_keymap = keymap;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((model != NULL) && (strcmp(model, "-") != 0)) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems *xkb_model = model;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((xkblay != NULL) && (strcmp(xkblay, "-") != 0)) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems *xkb_layout = xkblay;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return (0);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems}
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsint
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsmain(int argc, char *argv[])
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems{
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems int ret = 1;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char *udi;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char *device_file;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems LibHalContext *ctx = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems LibHalChangeSet *cs = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems DBusError error;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems int kbd_type, kbd_layout;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char *xkbkeymap = NULL, *xkbmodel = NULL, *xkblayout = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((udi = getenv("UDI")) == NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems goto out;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((device_file = getenv("HAL_PROP_INPUT_DEVICE")) == NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems goto out;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems drop_privileges();
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems setup_logger();
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems dbus_error_init(&error);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((ctx = libhal_ctx_init_direct(&error)) == NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems goto out;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((cs = libhal_device_new_changeset(udi)) == NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems HAL_DEBUG(("Cannot allocate changeset"));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems goto out;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems HAL_DEBUG(("Doing probe-xkb for %s (udi=%s)", device_file, udi));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (get_kbd_layout_type(device_file, &kbd_type, &kbd_layout)) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems goto out;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems /*
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * For some usb keyboard that is not self-identifying, get keyboard's
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * layout and type from system default keyboard device--/dev/kbd.
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((kbd_layout == 0) && (strstr(device_file, "hid") != NULL)) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (get_kbd_layout_type(KBD_DEFAULT_DEVICE,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems &kbd_type, &kbd_layout)) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems goto out;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (sun_find_xkbnames(kbd_type, kbd_layout,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems &xkbkeymap, &xkbmodel, &xkblayout)) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems goto out;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems /*
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems * If doesn't find matching entry in xkbtable.map, using default
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems * values setting in 10-x11-input.fdi
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems */
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems if ((xkbmodel != NULL) && (xkblayout != NULL)) {
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems libhal_changeset_set_property_string(cs,
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems "input.x11_options.XkbModel", xkbmodel);
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems libhal_changeset_set_property_string(cs,
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems "input.x11_options.XkbLayout", xkblayout);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems libhal_device_commit_changeset(ctx, cs, &error);
c7e764a768ca0fd0b1061d79d1d33548a9ad15b4Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems ret = 0;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsout:
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (cs != NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems libhal_device_free_changeset(cs);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (ctx != NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems libhal_ctx_shutdown(ctx, &error);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems libhal_ctx_free(ctx);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (dbus_error_is_set(&error)) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems dbus_error_free(&error);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return (ret);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems}