⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 input-send.c

📁 主要是对Linux输入子系统的一些简单操作 比如lsinput是看有多少输入设备 比如input-events是看输入设备的键值 用来调试输入子系统很好
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <fcntl.h>#include "list.h"#include "input.h"#include "tcp.h"struct connection {	int                      socket;	struct sockaddr_storage  peer;	struct list_head         list;	char                     peerhost[INET6_ADDRSTRLEN+1];	char                     peerserv[33];};/* ------------------------------------------------------------------ */int debug   = 0;int timeout = 10;int slisten;int input;LIST_HEAD(connections);static void conn_new(void){	struct connection  *conn;	int len;	conn = malloc(sizeof(conn));	memset(conn,0,sizeof(conn));	len = sizeof(conn->peer);	conn->socket = accept(slisten,(struct sockaddr*)&conn->peer,&len);	if (-1 == conn->socket) {		if (tcp_verbose)			perror("accept");		free(conn);		return;	}	if (tcp_verbose) {		getnameinfo((struct sockaddr*)&conn->peer,len,			    conn->peerhost,INET6_ADDRSTRLEN,			    conn->peerserv,32,			    NI_NUMERICHOST | NI_NUMERICSERV);		fprintf(stderr,"connect from [%s]\n",conn->peerhost);	}	fcntl(conn->socket,F_SETFL,O_NONBLOCK);	/* FIXME: access control */	list_add_tail(&conn->list,&connections);}static void conn_del(struct connection  *conn){	if (tcp_verbose)		fprintf(stderr,"connection from [%s] closed\n",conn->peerhost);	close(conn->socket);	list_del(&conn->list);	free(conn);}static void input_bcast(struct input_event *ev){	struct connection  *conn;	struct list_head   *item;	struct list_head   *safe;	int rc;	if (debug)		print_event(ev);		/* convert to network byte order ... */	ev->time.tv_sec  = htonl(ev->time.tv_sec);	ev->time.tv_usec = htonl(ev->time.tv_usec);	ev->type         = htons(ev->type);	ev->code         = htons(ev->code);	ev->value        = htonl(ev->value);	/* send out */	list_for_each_safe(item,safe,&connections) {		conn = list_entry(item, struct connection, list);		rc = write(conn->socket,ev,sizeof(*ev));		if (rc != sizeof(*ev))			conn_del(conn);	}}static void loop(void){	struct connection  *conn;	struct list_head   *item;	struct list_head   *safe;	fd_set             set;	struct timeval     tv;	int                max,rc;	for (;;) {		tv.tv_sec  = timeout;		tv.tv_usec = 0;		FD_ZERO(&set);		FD_SET(slisten,&set);		max = slisten;		FD_SET(input,&set);		if (max < input)			max = input;		list_for_each(item,&connections) {			conn = list_entry(item, struct connection, list);			FD_SET(conn->socket,&set);			if (max < conn->socket)				max = conn->socket;		}		rc = select(max+1,&set,NULL,NULL,&tv);		if (rc < 0) {			/* Huh? */			perror("select");			exit(1);		}		if (0 == rc) {			/* timeout */			continue;		}		list_for_each_safe(item,safe,&connections) {			conn = list_entry(item, struct connection, list);			if (FD_ISSET(conn->socket,&set)) {				char dummy[16];				rc = read(conn->socket,dummy,sizeof(dummy));				if (rc <= 0)					conn_del(conn);			}		}		if (FD_ISSET(input,&set)) {			struct input_event ev;			rc = read(input,&ev,sizeof(ev));			if (rc != sizeof(ev))				exit(1);			input_bcast(&ev);		}		if (FD_ISSET(slisten,&set))			conn_new();	}}/* ------------------------------------------------------------------ */static void daemonize(void){        switch (fork()) {        case -1:		perror("fork");		exit(1);        case 0:		close(0); close(1); close(2);		setsid();		open("/dev/null",O_RDWR); dup(0); dup(0);		break;        default:		exit(0);        }}static int usage(char *prog, int error){	fprintf(error ? stderr : stdout,		"usage: %s"		" [ -t <sec> ] [ -g ]"		" devnr\n",		prog);	exit(error);}int main(int argc, char *argv[]){	int grab     =  0;	char *addr   = NULL;	char *port   = "1234";	int c,devnr;	struct addrinfo ask;	memset(&ask,0,sizeof(ask));	ask.ai_family = PF_UNSPEC;	ask.ai_socktype = SOCK_STREAM;	for (;;) {		if (-1 == (c = getopt(argc, argv, "hdgt:")))			break;		switch (c) {		case 'd':			debug = 1;			tcp_verbose = 1;			break;		case 't':			timeout = atoi(optarg);			break;		case 'g':			grab = 1;			break;		case 'h':			usage(argv[0],0);		default:			usage(argv[0],1);		}	}	if (optind == argc)		usage(argv[0],1);	devnr = atoi(argv[optind]);	input = device_open(devnr,debug);	if (-1 == input)		exit(1);	slisten = tcp_listen(&ask,addr,port);	if (-1 == slisten)		exit(1);	if (!debug)		daemonize();	loop();	return 0;}/* --------------------------------------------------------------------- * Local variables: * c-basic-offset: 8 * End: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -