udev-builtin-input_id.c revision d7867b31836173d1a943ecb1cab6484536126411
/*
* compose persistent device path
*
* Copyright (C) 2009 Martin Pitt <martin.pitt@ubuntu.com>
* Portions Copyright (C) 2004 David Zeuthen, <david@fubar.dk>
* Copyright (C) 2011 Kay Sievers <kay.sievers@vrfy.org>
*
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include "udev.h"
/* we must use this kernel-compatible implementation */
#define BITS_PER_LONG (sizeof(unsigned long) * 8)
#define OFF(x) ((x)%BITS_PER_LONG)
#define LONG(x) ((x)/BITS_PER_LONG)
/*
* Read a capability attribute and return bitmask.
* @param dev udev_device
* @param attr sysfs attribute name (e. g. "capabilities/key")
* @param bitmask: Output array which has a sizeof of bitmask_size
*/
bool test)
{
char text[4096];
unsigned i;
char* word;
unsigned long val;
i = 0;
if (i < bitmask_size/sizeof(unsigned long))
else
*word = '\0';
++i;
}
if (i < bitmask_size / sizeof(unsigned long))
else
if (test) {
/* printf pattern with the right unsigned long number of hex chars */
val = bitmask_size / sizeof (unsigned long);
/* skip over leading zeros */
--val;
for (i = 0; i < val; ++i)
}
}
/* pointer devices */
const unsigned long* bitmask_ev,
const unsigned long* bitmask_abs,
const unsigned long* bitmask_key,
const unsigned long* bitmask_rel,
bool test)
{
int is_mouse = 0;
int is_touchpad = 0;
return;
}
is_touchpad = 1;
/* This path is taken by VMware's USB mouse, which has
is_mouse = 1;
}
is_mouse = 1;
if (is_mouse)
if (is_touchpad)
}
/* key like devices */
const unsigned long* bitmask_ev,
const unsigned long* bitmask_key,
bool test)
{
unsigned i;
unsigned long found;
unsigned long mask;
/* do we have any KEY_* capability? */
return;
}
/* only consider KEY_* here, not BTN_* */
found = 0;
for (i = 0; i < BTN_MISC/BITS_PER_LONG; ++i) {
found |= bitmask_key[i];
info(udev, "test_key: checking bit block %lu for any keys; found=%i\n", i*BITS_PER_LONG, found > 0);
}
/* If there are no keys in the lower block, check the higher block */
if (!found) {
for (i = KEY_OK; i < BTN_TRIGGER_HAPPY; ++i) {
if (test_bit (i, bitmask_key)) {
found = 1;
break;
}
}
}
if (found > 0)
/* the first 32 bits are ESC, numbers, and Q to D; if we have all of
* those, consider it a full keyboard; do not test KEY_RESERVED, though */
mask = 0xFFFFFFFE;
}
{
struct udev_device *pdev;
/* walk up the parental chain until we find the real input device; the
* argument is very likely a subdevice of this, like eventN */
/* not an "input" class device */
return EXIT_SUCCESS;
/* Use this as a flag that input devices were detected, so that this
* program doesn't need to be called more than once per device */
return EXIT_SUCCESS;
}
const struct udev_builtin udev_builtin_input_id = {
.name = "input_id",
.cmd = builtin_input_id,
.help = "input device properties",
};