void start_uevent_polling() { struct sockaddr_nl nls; struct pollfd pfd; char uevent_msg[1024]; // Open hotplug event netlink socket //ALOGI("Starting dongled For UsbModeSwitch Management - Settings:modeswitch.d:%s length:%u debug:%u",hotplug_info.modeswitch_d,hotplug_info.modeswitch_length,hotplug_info.debug); memset(&nls,0,sizeof(struct sockaddr_nl)); nls.nl_family = AF_NETLINK; nls.nl_pid = getpid(); nls.nl_groups = -1; pfd.events = POLLIN; pfd.fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); if (pfd.fd==-1) ALOGE("dongled cannot create socket, are you root?\n"); // Listen to netlink socket if (bind(pfd.fd, (void *)&nls, sizeof(struct sockaddr_nl))) die("bind failed\n"); ALOGD("Give us a go on your UEVENT"); while (-1!=poll(&pfd, 1, -1)) { int uevent_buffer_length = recv(pfd.fd, uevent_msg, sizeof(uevent_msg), MSG_DONTWAIT); if (uevent_buffer_length == -1) die("receive error\n"); struct uevent uevent; parse_uevent(uevent_msg, &uevent); handle_uevent(&uevent); } die("poll error\n"); return; }
int handle_uevent(event_t *event) { char msg[UEVENT_MSG_LEN + 2]; int n, ret = 0; while (true) { struct uevent uevent; n = uevent_kernel_multicast_recv(event->uevent_fd, msg, UEVENT_MSG_LEN); if (n <= 0) break; if (n >= UEVENT_MSG_LEN) continue; msg[n] = '\0'; msg[n+1] = '\0'; parse_uevent(msg, &uevent); ret = process_uevent(event, &uevent); } return ret; }