From 32e6a41f33e5576716b351bd473a27939fe94fa1 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Mon, 15 Dec 2008 15:22:34 +1100 Subject: Initial support for multiple UIs Move the device discovery code from separate udev helpers to a single process to listen on two sockets: one SOCK_DGRAM for incoming udev events, and one SOCK_STREAM for UIs to connect. Initial support for client/server infrastructure, still need to wire-up the udev messages. Signed-off-by: Jeremy Kerr --- ui/common/discover-client.c | 111 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 ui/common/discover-client.c (limited to 'ui/common/discover-client.c') diff --git a/ui/common/discover-client.c b/ui/common/discover-client.c new file mode 100644 index 0000000..bc5a4fa --- /dev/null +++ b/ui/common/discover-client.c @@ -0,0 +1,111 @@ + +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include "ui/common/discover-client.h" +#include "ui/common/device.h" +#include "pb-protocol/pb-protocol.h" + +struct discover_client { + int fd; + struct discover_client_ops ops; +}; + +static int discover_client_destructor(void *arg) +{ + struct discover_client *client = arg; + + if (client->fd >= 0) + close(client->fd); + + return 0; +} + +struct discover_client* discover_client_init(struct discover_client_ops *ops) +{ + struct discover_client *client; + struct sockaddr_un addr; + + client = talloc(NULL, struct discover_client); + if (!client) + return NULL; + + memcpy(&client->ops, ops, sizeof(client->ops)); + + client->fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (!client->fd < 0) { + perror("socket"); + goto out_err; + } + + talloc_set_destructor(client, discover_client_destructor); + + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, PB_SOCKET_PATH); + + if (connect(client->fd, (struct sockaddr *)&addr, sizeof(addr))) { + perror("connect"); + goto out_err; + } + + return client; + +out_err: + talloc_free(client); + return NULL; +} + +int discover_client_get_fd(struct discover_client *client) +{ + return client->fd; +} + +void discover_client_destroy(struct discover_client *client) +{ + talloc_free(client); +} + +int discover_client_process(struct discover_client *client) +{ + struct pb_protocol_message *message; + struct device *dev; + char *dev_id; + + message = pb_protocol_read_message(client, client->fd); + + if (!message) + return 0; + + switch (message->action) { + case PB_PROTOCOL_ACTION_ADD: + dev = pb_protocol_deserialise_device(client, message); + if (!dev) { + printf("no device?\n"); + return 0; + } + client->ops.add_device(dev); + talloc_free(dev); + break; + case PB_PROTOCOL_ACTION_REMOVE: + dev_id = pb_protocol_deserialise_string(client, message); + if (!dev_id) { + printf("no device id?\n"); + return 0; + } + client->ops.remove_device(dev_id); + break; + default: + printf("unknown action %d\n", message->action); + } + + + return 0; +} -- cgit v1.2.1