static gboolean io_hci_data(GIOChannel *chan, GIOCondition cond, gpointer data) { unsigned char buf[HCI_MAX_FRAME_SIZE], *ptr; int type; ssize_t len; int fd; ptr = buf; fd = g_io_channel_unix_get_fd(chan); len = read(fd, buf, sizeof(buf)); if (len < 0) { if (errno == EAGAIN) return TRUE; syslog(LOG_ERR, "Read failed: %s (%d)", strerror(errno), errno); g_io_channel_unref(chan); g_main_loop_quit(event_loop); return FALSE; } type = *ptr++; write_snoop(vdev.dd, type, 0, buf, len); switch (type) { case HCI_COMMAND_PKT: hci_command(ptr); break; case HCI_ACLDATA_PKT: hci_acl_data(ptr); break; default: syslog(LOG_ERR, "Unknown packet type 0x%2.2x", type); break; } return TRUE; }
static void io_hci_data(void) { unsigned char buf[HCI_MAX_FRAME_SIZE], *ptr; int type; ssize_t len; ptr = buf; len = read(vdev.dev_fd, buf, sizeof(buf)); if (len < 0) { if (errno == EAGAIN) return; syslog(LOG_ERR, "Read failed: %s (%d)", strerror(errno), errno); __io_canceled = 1; return; } type = *ptr++; write_snoop(vdev.dd, type, 0, buf, len); switch (type) { case HCI_COMMAND_PKT: hci_command(ptr); break; case HCI_ACLDATA_PKT: hci_acl_data(ptr); break; default: syslog(LOG_ERR, "Unknown packet type 0x%2.2x", type); break; } }