diff options
Diffstat (limited to 'cras/src/server/cras_rclient_util.c')
-rw-r--r-- | cras/src/server/cras_rclient_util.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/cras/src/server/cras_rclient_util.c b/cras/src/server/cras_rclient_util.c index 85a6e0fa..cd0b7f36 100644 --- a/cras/src/server/cras_rclient_util.c +++ b/cras/src/server/cras_rclient_util.c @@ -257,3 +257,52 @@ struct cras_rclient *rclient_generic_create(int fd, size_t id, return client; } + +/* A generic entry point for handling a message from the client. Called from + * the main server context. */ +int rclient_handle_message_from_client(struct cras_rclient *client, + const struct cras_server_message *msg, + int *fds, unsigned int num_fds) +{ + int rc = 0; + assert(client && msg); + + rc = rclient_validate_message_fds(msg, fds, num_fds); + if (rc < 0) { + for (int i = 0; i < (int)num_fds; i++) + if (fds[i] >= 0) + close(fds[i]); + return rc; + } + int fd = num_fds > 0 ? fds[0] : -1; + + switch (msg->id) { + case CRAS_SERVER_CONNECT_STREAM: { + int client_shm_fd = num_fds > 1 ? fds[1] : -1; + struct cras_connect_message cmsg; + if (MSG_LEN_VALID(msg, struct cras_connect_message)) { + rc = rclient_handle_client_stream_connect( + client, + (const struct cras_connect_message *)msg, fd, + client_shm_fd); + } else if (!convert_connect_message_old(msg, &cmsg)) { + rc = rclient_handle_client_stream_connect( + client, &cmsg, fd, client_shm_fd); + } else { + return -EINVAL; + } + break; + } + case CRAS_SERVER_DISCONNECT_STREAM: + if (!MSG_LEN_VALID(msg, struct cras_disconnect_stream_message)) + return -EINVAL; + rc = rclient_handle_client_stream_disconnect( + client, + (const struct cras_disconnect_stream_message *)msg); + break; + default: + break; + } + + return rc; +} |