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