static int linux_netlink_read_message(void)
{
    char buffer[1024];	// XXX changed from unsigned char to char because the first argument of linux_netlink_parse is char *
    struct iovec iov = {.iov_base = buffer, .iov_len = sizeof(buffer)};
    struct msghdr meh = { .msg_iov=&iov, .msg_iovlen=1,
               .msg_name=&snl, .msg_namelen=sizeof(snl)
    };
    const char *sys_name = NULL;
    uint8_t busnum, devaddr;
    int detached, r;
    size_t len;

    /* read netlink message */
    memset(buffer, 0, sizeof(buffer));
    len = recvmsg(linux_netlink_socket, &meh, 0);
    if (len < 32) {
        if (errno != EAGAIN)
            usbi_dbg("error recieving message from netlink");
        return -1;
    }

    /* TODO -- authenticate this message is from the kernel or udevd */

    r = linux_netlink_parse(buffer, len, &detached, &sys_name, &busnum, &devaddr);
    if (r)
        return r;

    usbi_dbg("netlink hotplug found device busnum: %hhu, devaddr: %hhu, sys_name: %s, removed: %s",
             busnum, devaddr, sys_name, detached ? "yes" : "no");

    /* signal device is available (or not) to all contexts */
    if (detached)
        linux_device_disconnected(busnum, devaddr, sys_name);
    else
        linux_hotplug_enumerate(busnum, devaddr, sys_name);

    return 0;
}

static void *linux_netlink_event_thread_main(void *arg)
{
    char dummy;
    int r;
    struct pollfd fds[] = {
        {   .fd = netlink_control_pipe[0],
            .events = POLLIN
        },
        {   .fd = linux_netlink_socket,
            .events = POLLIN
        },
    };
static int linux_netlink_read_message(void)
{
	unsigned char buffer[1024];
	struct iovec iov = {.iov_base = buffer, .iov_len = sizeof(buffer)};
	struct msghdr meh = { .msg_iov=&iov, .msg_iovlen=1,
			     .msg_name=&snl, .msg_namelen=sizeof(snl) };
	const char *sys_name = NULL;
	uint8_t busnum, devaddr;
	int detached, r;
	size_t len;

	
	memset(buffer, 0, sizeof(buffer));
	len = recvmsg(linux_netlink_socket, &meh, 0);
	if (len < 32) {
		if (errno != EAGAIN)
			usbi_dbg("error recieving message from netlink");
		return -1;
	}

	

	r = linux_netlink_parse(buffer, len, &detached, &sys_name,
				&busnum, &devaddr);
	if (r)
		return r;

	usbi_dbg("netlink hotplug found device busnum: %hhu, devaddr: %hhu, sys_name: %s, removed: %s",
		 busnum, devaddr, sys_name, detached ? "yes" : "no");

	
	if (detached)
		linux_device_disconnected(busnum, devaddr, sys_name);
	else
		linux_hotplug_enumerate(busnum, devaddr, sys_name);

	return 0;
}

static void *linux_netlink_event_thread_main(void *arg)
{
	char dummy;
	int r;
	struct pollfd fds[] = {
		{ .fd = netlink_control_pipe[0],
		  .events = POLLIN },
		{ .fd = linux_netlink_socket,
		  .events = POLLIN },
	};