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

#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include 
#include   

#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;
}

你可能感兴趣的:(linux)