static gboolean client_cb(GIOChannel *chan, GIOCondition cond, gpointer data) { char buf[BT_SUGGESTED_BUFFER_SIZE]; bt_audio_msg_header_t *msghdr = (void *) buf; struct unix_client *client = data; int len; const char *type, *name; if (cond & G_IO_NVAL) return FALSE; if (cond & (G_IO_HUP | G_IO_ERR)) { debug("Unix client disconnected (fd=%d)", client->sock); goto failed; } memset(buf, 0, sizeof(buf)); len = recv(client->sock, buf, sizeof(buf), 0); if (len < 0) { error("recv: %s (%d)", strerror(errno), errno); goto failed; } type = bt_audio_strtype(msghdr->type); name = bt_audio_strname(msghdr->name); debug("Audio API: %s <- %s", type, name); if (msghdr->length != len) { error("Invalid message: length mismatch"); goto failed; } switch (msghdr->name) { case BT_GET_CAPABILITIES: handle_getcapabilities_req(client, (struct bt_get_capabilities_req *) msghdr); break; case BT_OPEN: handle_open_req(client, (struct bt_open_req *) msghdr); break; case BT_SET_CONFIGURATION: handle_setconfiguration_req(client, (struct bt_set_configuration_req *) msghdr); break; case BT_START_STREAM: handle_streamstart_req(client, (struct bt_start_stream_req *) msghdr); break; case BT_STOP_STREAM: handle_streamstop_req(client, (struct bt_stop_stream_req *) msghdr); break; case BT_CLOSE: handle_close_req(client, (struct bt_close_req *) msghdr); break; case BT_CONTROL: handle_control_req(client, (struct bt_control_req *) msghdr); break; default: error("Audio API: received unexpected message name %d", msghdr->name); } return TRUE; failed: clients = g_slist_remove(clients, client); start_close(client->dev, client, FALSE); client_free(client); return FALSE; }
static int audioservice_recv(struct bluetooth_data *data, bt_audio_msg_header_t *inmsg) { int err, ret; const char *type, *name; uint16_t length; length = inmsg->length ? inmsg->length : BT_SUGGESTED_BUFFER_SIZE; ret = recv(data->server.fd, inmsg, length, 0); if (ret < 0) { err = -errno; ERR("Error receiving IPC data from bluetoothd: %s (%d)", strerror(errno), errno); //SW3-CONN-DL-TT466_ramdump--[ //if (err == -EPIPE) //SW3-CONN-DL-TT466_ramdump--] //SW3-CONN-DL-TT466_ramdump++[ if (err == -EPIPE || err == -ECONNRESET) { data->server.fd = -1; //SW3-CONN-DL-TT466_ramdump++] bluetooth_close(data); //SW3-CONN-DL-TT466_ramdump++[ } //SW3-CONN-DL-TT466_ramdump++] } else if ((size_t) ret < sizeof(bt_audio_msg_header_t)) { ERR("Too short (%d bytes) IPC packet from bluetoothd", ret); err = -EINVAL; } else if (inmsg->type == BT_ERROR) { bt_audio_error_t *error = (bt_audio_error_t *)inmsg; ret = recv(data->server.fd, &error->posix_errno, sizeof(error->posix_errno), 0); if (ret < 0) { err = -errno; ERR("Error receiving error code for BT_ERROR: %s (%d)", strerror(errno), errno); if (err == -EPIPE) bluetooth_close(data); } else { ERR("%s failed : %s(%d)", bt_audio_strname(error->h.name), strerror(error->posix_errno), error->posix_errno); err = -error->posix_errno; } } else { type = bt_audio_strtype(inmsg->type); name = bt_audio_strname(inmsg->name); if (type && name) { DBG("Received %s - %s", type, name); err = 0; } else { err = -EINVAL; ERR("Bogus message type %d - name %d" " received from audio service", inmsg->type, inmsg->name); } } return err; }