static int init_hotplug_sock(void)
183 {
184
185 struct sockaddr_nl snl;
186 const int buffersize = 16 * 1024 * 1024;
187 int retval;
188
189 memset(&snl, 0x00, sizeof(struct sockaddr_nl));
190 snl.nl_family = AF_NETLINK;
191 snl.nl_pid = getpid();
192 snl.nl_groups = 1;
193
194 int hotplug_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
195 if (hotplug_sock == -1)
196 {
197 printf("error getting socket: %s", strerror(errno));
198 return -1;
199 }
200
201 /* set receive buffersize */
202
203 //setsockopt(hotplug_sock, SOL_SOCKET, SO_RCVBUFFORCE, &buffersize, sizeof(buffersize));
204 retval = bind(hotplug_sock, (struct sockaddr *) &snl, sizeof(struct sockaddr_nl));
205 if (retval < 0) {
206 printf("bind failed: %s", strerror(errno));
207 close(hotplug_sock);
208 hotplug_sock = -1;
209 return -1;
210 }
211 pthread_mutex_init (&mount_mutex,NULL);
212 return hotplug_sock;
213
214 }
if( (hotplug_sock >= 0) && FD_ISSET(hotplug_sock, &fd))
{
char buf[4096] = {0};
recv(hotplug_sock, &buf, sizeof(buf), 0);
}
通过判断buf中的“add”和"remove"得到拔插的状态
Hotplug: add@/devices/platform/brcm-ehci.0/usb1/1-1
Hotplug: add@/devices/platform/brcm-ehci.0/usb1/1-1/usbdev1.4_ep00
Hotplug: add@/devices/platform/brcm-ehci.0/usb1/1-1/1-1:1.0
Hotplug: add@/class/scsi_host/host1
Hotplug: add@/devices/platform/brcm-ehci.0/usb1/1-1/1-1:1.0/usbdev1.4_ep81
Hotplug: add@/devices/platform/brcm-ehci.0/usb1/1-1/1-1:1.0/usbdev1.4_ep02
Hotplug: add@/class/usb_device/usbdev1.4
[cascade_ui.c:372]Message:Pd900 code=20f key_eventkind =0
199997: BrowserSendCustomInput(527)A
Hotplug: add@/devices/platform/brcm-ehci.0/usb1/1-1/1-1:1.0/host1/target1:0:0/1:0:0:0
Hotplug: add@/class/scsi_disk/1:0:0:0
Hotplug: add@/block/sdb
Hotplug: add@/block/sdb/sdb1
Hotplug: add@/class/scsi_device/1:0:0:0
Hotplug: add@/class/scsi_generic/sg0
Hotplug: mount@/block/sdb/sdb1