読者です 読者をやめる 読者になる 読者になる

はわわーっ

はわわわわっ

インプットデバイスの情報を表示する

linux c

/dev/input/event* のデバイスの名前とかを表示する。

#include <dirent.h>
#include <fcntl.h>
#include <linux/input.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>


int is_event_device(const struct dirent *dir)
{
	return strncmp("event", dir->d_name, 5) == 0;
}

int main(void)
{
	struct dirent **namelist;
	int i, ndev;

	ndev = scandir("/dev/input", &namelist, is_event_device, alphasort);
	if (ndev <= 0)
		return 0;

	for (i = 0; i < ndev; i++) {
		char fname[64];
		int fd = -1;
		char name[256] = "";
		char phys[256] = "";
		char uniq[256] = "";
		char prop[256] = "";

		snprintf(fname, sizeof(fname), "/dev/input/%s",
				namelist[i]->d_name);
		fd = open(fname, O_RDONLY);
		if (fd < 0)
			continue;

		ioctl(fd, EVIOCGNAME(sizeof(name)), name);
		ioctl(fd, EVIOCGPHYS(sizeof(phys)), phys);
		ioctl(fd, EVIOCGUNIQ(sizeof(uniq)), uniq);
		ioctl(fd, EVIOCGPROP(sizeof(prop)), prop);
		printf("%s:\n", fname);
		printf("\tname: %s\n", name);
		printf("\tphys: %s\n", phys);
		printf("\tuniq: %s\n", uniq);
		printf("\tprop: %s\n", prop);
		close(fd);
		free(namelist[i]);
	}

	return 0;
}

わたしの環境だと出力はこんな感じになった。

/dev/input/event0:
	name: PC Speaker
	phys: isa0061/input0
	uniq: 
	prop: 
/dev/input/event1:
	name: Power Button
	phys: PNP0C0C/button/input0
	uniq: 
	prop: 
/dev/input/event10:
	name: HDA Intel PCH Line
	phys: ALSA
	uniq: 
	prop: 
/dev/input/event11:
	name: HDA Intel PCH Rear Mic
	phys: ALSA
	uniq: 
	prop: 
/dev/input/event12:
	name: HDA Intel PCH Front Mic
	phys: ALSA
	uniq: 
	prop: 
/dev/input/event2:
	name: Power Button
	phys: LNXPWRBN/button/input0
	uniq: 
	prop: 
/dev/input/event3:
	name: Eee PC WMI hotkeys
	phys: eeepc-wmi/input0
	uniq: 
	prop: 
/dev/input/event4:
	name: Logitech USB Optical Mouse
	phys: usb-0000:00:14.0-10/input0
	uniq: 
	prop: 
/dev/input/event5:
	name: Chicony PFU-65 USB Keyboard
	phys: usb-0000:00:14.0-9.1/input0
	uniq: 
	prop: 
/dev/input/event6:
	name: Video Bus
	phys: LNXVIDEO/video/input0
	uniq: 
	prop: 
/dev/input/event7:
	name: HDA Intel MID HDMI/DP,pcm=3
	phys: ALSA
	uniq: 
	prop: 
/dev/input/event8:
	name: HDA Intel PCH Front Headphone
	phys: ALSA
	uniq: 
	prop: 
/dev/input/event9:
	name: HDA Intel PCH Line Out
	phys: ALSA
	uniq: 
	prop: 

uniqとpropは何なんだろう。あと/proc/bus/input/devicesにかいてあるハンドラの情報ってどうやってとってくるんだろうか。