#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h> //two no change
#include <linux/netlink.h> //two no change
FILE* fp = NULL;
#define UEVENT_BUFFER_SIZE 2048
#define NETLINK_KOBJECT_UEVENT 15
static int g_usb_state;
enum {
NO_DEV,
MOUNT_DEV,
ADD_DEV,
REMOVE_DEV,
};
static void split_udev(char* str)
{
char* p_pos;
//char action[50] = { 0 };
// char block[50] = { 0 };
char tmp[50] = { 0 };
char dname[50] = { 0 };
char fname[50] = { 0 };
char cmd[200] = { 0 };
if (0 == strncmp(str, "add@", strlen("add@"))) {
printf("\nadd\n");
p_pos = strstr(str, "block");
if (NULL == p_pos) {
printf("block NULL\n");
return;
}
p_pos += strlen("block");
sscanf(p_pos, "/%[^/]/%[^/]", tmp, fname);
printf("block %s %s %s\n", p_pos, tmp, fname);
if (3 < strlen(fname)) {
sprintf(dname, "/dev/%s", fname);
sprintf(cmd, "mount -t vfat %s /mnt/usb", dname);
printf("cmd = %s\n", cmd);
//sleep(2);
system(cmd);
}
g_usb_state = ADD_DEV;
} else if (0 == strncmp(str, "remove@", strlen("remove@"))) {
p_pos = strstr(str, "block");
if (NULL == p_pos) {
printf("block NULL\n");
return;
}
p_pos += strlen("block");
sscanf(p_pos, "/%[^/]/%[^/]", tmp, fname);
printf("block %s %s %s\n", p_pos, tmp, fname);
if (3 < strlen(fname)) {
//sleep(2);
printf(" \n");
system("umount /mnt/usb");
printf("cmd = umount /mnt/usb\n");
fwrite("\ncmd = umount /mnt/usb\n", sizeof(char), strlen("\ncmd = umount /mnt/usb\n"), fp);
g_usb_state = REMOVE_DEV;
}
} else if (0 == strncmp(str, "mount", strlen("mount"))) {
g_usb_state = MOUNT_DEV;
printf("MOUNT_DEV\n");
fwrite("\ncmd = MOUNT_DEV\n", sizeof(char), strlen("\ncmd = MOUNT_DEV\n"), fp);
} else if (0 == strncmp(str, "umount", strlen("umount"))) {
g_usb_state = NO_DEV;
printf("NO_DEV\n");
fwrite("\ncmd = NO_DEV\n", sizeof(char), strlen("\ncmd = NO_DEV\n"), fp);
}
}
int main(void)
{
struct sockaddr_nl client;
struct timeval tv;
int cpp_live, len_rcv, ret;
fd_set fds;
int size_buf = 1024;
fp = fopen("a.txt", "wb");
cpp_live = socket(AF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT);
memset(&client, 0, sizeof(client));
client.nl_family = AF_NETLINK;
client.nl_pid = getpid();
client.nl_groups = 1; /* receive broadcast message*/
setsockopt(cpp_live, SOL_SOCKET, SO_RCVBUF, &size_buf, sizeof(size_buf));
bind(cpp_live, (struct sockaddr*)&client, sizeof(client));
while (1) {
char buf[UEVENT_BUFFER_SIZE] = { 0 };
FD_ZERO(&fds);
FD_SET(cpp_live, &fds);
tv.tv_sec = 0;
tv.tv_usec = 100 * 1000;
ret = select(cpp_live + 1, &fds, NULL, NULL, &tv);
if (ret < 0)
continue;
if (!(ret > 0 && FD_ISSET(cpp_live, &fds)))
continue;
/* receive data */
len_rcv = recv(cpp_live, &buf, sizeof(buf), 0);
if (len_rcv > 0) {
printf("%s\n", buf);
fwrite(buf, sizeof(char), strlen(buf), fp);
split_udev(buf);
/*You can do something here to make the program more perfect!!!*/
}
}
close(cpp_live);
fclose(fp);
return 0;
}