linux自动挂载U盘 2.6亲测可用

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值