summaryrefslogtreecommitdiff
path: root/cras/src/server/cras_server.c
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2021-10-07 16:53:24 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2021-10-07 16:53:24 +0000
commit4f97d6740411fb53a4fb5f6e1af03e1f1b28c1ba (patch)
tree7e0e07b9d8d50fc5dd352d5b36d74fa3cb3427db /cras/src/server/cras_server.c
parent8d2c5b2edb9023b91d79709f2900ee1b643a3127 (diff)
parent8cfb92904b40ff98c82dd5309698999a28c91388 (diff)
downloadadhd-4f97d6740411fb53a4fb5f6e1af03e1f1b28c1ba.tar.gz
Snap for 7803083 from 8cfb92904b40ff98c82dd5309698999a28c91388 to mainline-tzdata2-release
Change-Id: Ice40f0028ec451c06ea7097e88c4152da1105d57
Diffstat (limited to 'cras/src/server/cras_server.c')
-rw-r--r--cras/src/server/cras_server.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/cras/src/server/cras_server.c b/cras/src/server/cras_server.c
index 97c83dfd..5f2ce632 100644
--- a/cras/src/server/cras_server.c
+++ b/cras/src/server/cras_server.c
@@ -79,16 +79,18 @@ struct attached_client {
* to watch file descriptors. The client can then read or write the fd.
* Members:
* fd - The file descriptor passed to select.
- * callack - The funciton to call when fd is ready.
+ * callback - The funciton to call when fd is ready.
* callback_data - Pointer passed to the callback.
* pollfd - Pointer to struct pollfd for this callback.
+ * events - The events to poll for.
*/
struct client_callback {
int select_fd;
- void (*callback)(void *);
+ void (*callback)(void *data, int revents);
void *callback_data;
struct pollfd *pollfd;
int deleted;
+ int events;
struct client_callback *prev, *next;
};
@@ -277,8 +279,8 @@ error:
/* Add a file descriptor to be passed to select in the main loop. This is
* registered with system state so that it is called when any client asks to
* have a callback triggered based on an fd being readable. */
-static int add_select_fd(int fd, void (*cb)(void *data), void *callback_data,
- void *server_data)
+static int add_select_fd(int fd, void (*cb)(void *data, int events),
+ void *callback_data, int events, void *server_data)
{
struct client_callback *new_cb;
struct client_callback *client_cb;
@@ -301,6 +303,7 @@ static int add_select_fd(int fd, void (*cb)(void *data), void *callback_data,
new_cb->callback = cb;
new_cb->callback_data = callback_data;
new_cb->deleted = 0;
+ new_cb->events = events;
new_cb->pollfd = NULL;
DL_APPEND(serv->client_callbacks, new_cb);
@@ -474,7 +477,7 @@ int cras_server_init()
* Returns 0 on success and leaves the created fd and the address information
* in server_socket.
* When error occurs, the created fd will be closed and the file path will be
- * unlinked.
+ * unlinked and returns negative error code.
*/
static int create_and_listen_server_socket(enum CRAS_CONNECTION_TYPE conn_type,
struct server_socket *server_socket)
@@ -508,7 +511,7 @@ static int create_and_listen_server_socket(enum CRAS_CONNECTION_TYPE conn_type,
sizeof(struct sockaddr_un));
if (rc < 0) {
syslog(LOG_ERR, "Bind to server socket failed.");
- rc = errno;
+ rc = -errno;
goto error;
}
@@ -519,7 +522,7 @@ static int create_and_listen_server_socket(enum CRAS_CONNECTION_TYPE conn_type,
if (listen(socket_fd, 5) != 0) {
syslog(LOG_ERR, "Listen on server socket failed.");
- rc = errno;
+ rc = -errno;
goto error;
}
@@ -641,7 +644,7 @@ int cras_server_run(unsigned int profile_disable_mask)
if (client_cb->deleted)
continue;
pollfds[num_pollfds].fd = client_cb->select_fd;
- pollfds[num_pollfds].events = POLLIN;
+ pollfds[num_pollfds].events = client_cb->events;
client_cb->pollfd = &pollfds[num_pollfds];
num_pollfds++;
}
@@ -687,8 +690,9 @@ int cras_server_run(unsigned int profile_disable_mask)
/* Check any client-registered fd/callback pairs. */
DL_FOREACH (server_instance.client_callbacks, client_cb)
if (!client_cb->deleted && client_cb->pollfd &&
- (client_cb->pollfd->revents & POLLIN))
- client_cb->callback(client_cb->callback_data);
+ (client_cb->pollfd->revents & client_cb->events))
+ client_cb->callback(client_cb->callback_data,
+ client_cb->pollfd->revents);
cleanup_select_fds(&server_instance);
@@ -713,4 +717,4 @@ void cras_server_send_to_all_clients(const struct cras_client_message *msg)
DL_FOREACH (server_instance.clients_head, client)
cras_rclient_send_message(client->client, msg, NULL, 0);
-} \ No newline at end of file
+}