linux c 下获取USB设备的信息并禁止使用USB设备的实现

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <ctype.h>  
#include <sys/un.h>  
#include <sys/ioctl.h>  
#include <sys/socket.h>  
#include <linux/types.h>  
#include <linux/netlink.h>  
#include <errno.h>  
#include <sys/wait.h>  
#include <unistd.h>
#include <pthread.h>  

#define UEVENT_BUFFER_SIZE 2048  

static int init_hotplug_sock(void)  
{  
	struct sockaddr_nl snl;  
	const int buffersize = 16 * 1024 * 1024;  
	int retval;  

	memset(&snl, 0x00, sizeof(struct sockaddr_nl));  
	snl.nl_family = AF_NETLINK;  
	snl.nl_pid = getpid();  
	snl.nl_groups = 1;  
	int hotplug_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);  

	if (hotplug_sock == -1) {  
		printf("error getting socket: %s", strerror(errno));  
		return -1;  
	}  

	/* set receive buffersize */  
	setsockopt(hotplug_sock, SOL_SOCKET, SO_RCVBUFFORCE, &buffersize, sizeof(buffersize));  
	retval = bind(hotplug_sock, (struct sockaddr *) &snl, sizeof(struct sockaddr_nl));  

	if (retval < 0) {  
		printf("bind failed: %s", strerror(errno));  
		close(hotplug_sock);  
		hotplug_sock = -1;  
		return -1;  
	}  

	return hotplug_sock;  
}  
char *get_usb_info(int usb_host_number)
{
	pid_t pid;  
	int ret = 0;  
	int fd[2] = {0};  

	//创建管道  
	ret = pipe(fd);  
	if(ret == -1)  
	{  
		perror("pipe");  
		_exit(1);  
	}   
	
	pid = vfork();  
	if(pid < 0)  
	{  
		perror("vfork");  
	}  
	else if(pid == 0)  
	{  
		dup2(fd[1], 1);
		char str[50]={0};
		sprintf(str, "cat /proc/scsi/usb-storage/%d",usb_host_number);  
		execlp("/bin/sh","sh","-c",str,NULL);  
	}  
	else  
	{  
		char result[300] = "";  
		read(fd[0], result, sizeof(result));
		printf("\t USB Inofmation  \n");
		printf("%s\n",result);  
	} 
	return NULL;
}

char *usb_disable(char *buf_block)
{
	char str[20]={0};
	sprintf(str, "eject /dev%s", buf_block);
	
	//执行两次  保证移动设备成功弹出
	system(str);
	system(str);
	
	printf("USB is forbid\n");
	return NULL;
}
int main(int argc, char* argv[])
{
	int hotplug_sock = init_hotplug_sock();
	char *result = NULL;
	char buf_host[5] = {0};
	char buf_block[10] = {0};
	while(1){
		char buf[UEVENT_BUFFER_SIZE*2] = {0};
		recv(hotplug_sock, &buf, sizeof(buf), 0);
		if(strncmp(buf, "add", 3) == 0){
			if(strstr(buf, "host") && strstr(buf, "block") && (strlen( strstr(buf, "block")) > 10)){
				result = strstr(buf, "host");
				sscanf(result+4, "%[^/]", buf_host);
				get_usb_info(atoi(buf_host));
				
				result = strstr(buf, "block");
				strncpy(buf_block,result+5, 4);
				usb_disable(buf_block);
			}
		}
		if(strncmp(buf, "remove", 6) == 0){
			if(strstr(buf, "host") && strstr(buf, "block") && (strlen( strstr(buf, "block")) > 10)){
				printf("USB Device Is Out \n");
			}
			
		}
	}
	return 0;
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值