diff options
Diffstat (limited to 'hidd/main.c')
| -rw-r--r-- | hidd/main.c | 110 | 
1 files changed, 107 insertions, 3 deletions
diff --git a/hidd/main.c b/hidd/main.c index aa2a7b1f..878368df 100644 --- a/hidd/main.c +++ b/hidd/main.c @@ -234,6 +234,42 @@ static void run_server(int ctl, int csk, int isk, int timeout)  	}  } +static char *hidp_state[] = { +	"unknown", +	"connected", +	"open", +	"bound", +	"listening", +	"connecting", +	"connecting", +	"config", +	"disconnecting", +	"closed" +}; + +static void do_show(int ctl) +{ +	struct hidp_connlist_req req; +	struct hidp_conninfo ci[16]; +	char addr[18]; +	int i; + +	req.cnum = 16; +	req.ci   = ci; + +	if (ioctl(ctl, HIDPGETCONNLIST, &req) < 0) { +		perror("Can't get connection list"); +		close(ctl); +		exit(1); +	} + +	for (i = 0; i < req.cnum; i++) { +		ba2str(&ci[i].bdaddr, addr); +		printf("%s %s [%04x:%04x] %s\n", addr, ci[i].name, +			ci[i].vendor, ci[i].product, hidp_state[ci[i].state]); +	} +} +  static void do_connect(int ctl, bdaddr_t *src, bdaddr_t *dst, int timeout)  {  	int csk, isk, err; @@ -309,6 +345,46 @@ static void do_search(int ctl, bdaddr_t *bdaddr, int timeout)  	}  } +static void do_kill(int ctl, bdaddr_t *bdaddr, uint32_t flags) +{ +	struct hidp_conndel_req req; +	struct hidp_connlist_req cl; +	struct hidp_conninfo ci[16]; +	int i; + +	if (!bacmp(bdaddr, BDADDR_ALL)) { +		cl.cnum = 16; +		cl.ci   = ci; + +		if (ioctl(ctl, HIDPGETCONNLIST, &cl) < 0) { +			perror("Can't get connection list"); +			close(ctl); +			exit(1); +		} + +		for (i = 0; i < cl.cnum; i++) { +			bacpy(&req.bdaddr, &ci[i].bdaddr); +			req.flags = flags; + +			if (ioctl(ctl, HIDPCONNDEL, &req) < 0) { +				perror("Can't release connection"); +				close(ctl); +				exit(1); +			} +		} + +	} else { +		bacpy(&req.bdaddr, bdaddr); +		req.flags = flags; + +		if (ioctl(ctl, HIDPCONNDEL, &req) < 0) { +			perror("Can't release connection"); +			close(ctl); +			exit(1); +		} +	} +} +  static void usage(void)  {  	printf("hidd - Bluetooth HID daemon\n\n"); @@ -328,6 +404,9 @@ static void usage(void)  		"\t--server             Start HID server\n"  		"\t--search             Search for HID devices\n"  		"\t--connect <bdaddr>   Connect remote HID device\n" +		"\t--kill <bdaddr>      Terminate HID connection\n" +		"\t--killall            Terminate all connections\n" +		"\t--show               List current HID connections\n"  		"\n");  } @@ -336,10 +415,18 @@ static struct option main_options[] = {  	{ "nodaemon",	0, 0, 'n' },  	{ "timeout",	1, 0, 't' },  	{ "device",	1, 0, 'i' }, +	{ "show",	0, 0, 'l' }, +	{ "list",	0, 0, 'l' },  	{ "server",	0, 0, 'd' },  	{ "listen",	0, 0, 'd' },  	{ "search",	0, 0, 's' }, +	{ "create",	1, 0, 'c' },  	{ "connect",	1, 0, 'c' }, +	{ "disconnect",	1, 0, 'k' }, +	{ "terminate",	1, 0, 'k' }, +	{ "release",	1, 0, 'k' }, +	{ "kill",	1, 0, 'k' }, +	{ "killall",	1, 0, 'K' },  	{ 0, 0, 0, 0 }  }; @@ -354,7 +441,7 @@ int main(int argc, char *argv[])  	bacpy(&bdaddr, BDADDR_ANY); -	while ((opt = getopt_long(argc, argv, "+i:nt:dsc:h", main_options, NULL)) != -1) { +	while ((opt = getopt_long(argc, argv, "+i:nt:ldsc:k:Kh", main_options, NULL)) != -1) {  		switch(opt) {  		case 'i':  			if (!strncasecmp(optarg, "hci", 3)) @@ -368,6 +455,9 @@ int main(int argc, char *argv[])  		case 't':  			timeout = atoi(optarg);  			break; +		case 'l': +			mode = 0; +			break;  		case 'd':  			mode = 1;  			break; @@ -378,6 +468,14 @@ int main(int argc, char *argv[])  			str2ba(optarg, &dev);  			mode = 3;  			break; +		case 'k': +			str2ba(optarg, &dev); +			mode = 4; +			break; +		case 'K': +			bacpy(&dev, BDADDR_ALL); +			mode = 4; +			break;  		case 'h':  			usage();  			exit(0); @@ -422,9 +520,15 @@ int main(int argc, char *argv[])  		close(ctl);  		exit(0); +	case 4: +		do_kill(ctl, &dev, 0); +		close(ctl); +		exit(0); +  	default: -		usage(); -		exit(1); +		do_show(ctl); +		close(ctl); +		exit(0);  	}  	if (daemon) {  | 
