diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2008-12-15 15:22:34 +1100 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2008-12-15 15:22:34 +1100 |
commit | 32e6a41f33e5576716b351bd473a27939fe94fa1 (patch) | |
tree | 0d6b75ac0a02d2496416095405cb9498777c3beb /ui/common | |
parent | 000a92b4fa909c432732ac3ed8f28eeeaeac70ee (diff) | |
download | talos-petitboot-32e6a41f33e5576716b351bd473a27939fe94fa1.tar.gz talos-petitboot-32e6a41f33e5576716b351bd473a27939fe94fa1.zip |
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 <jk@ozlabs.org>
Diffstat (limited to 'ui/common')
-rw-r--r-- | ui/common/discover-client.c | 111 | ||||
-rw-r--r-- | ui/common/discover-client.h | 29 |
2 files changed, 140 insertions, 0 deletions
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 <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <stdint.h> + +#include <sys/socket.h> +#include <sys/un.h> +#include <asm/byteorder.h> + +#include <talloc/talloc.h> + +#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; +} diff --git a/ui/common/discover-client.h b/ui/common/discover-client.h new file mode 100644 index 0000000..3ce745b --- /dev/null +++ b/ui/common/discover-client.h @@ -0,0 +1,29 @@ +#ifndef _DISCOVER_CLIENT_H +#define _DISCOVER_CLIENT_H + +#include <pb-protocol/pb-protocol.h> +#include "ui/common/device.h" + +struct discover_client; + +struct discover_client_ops { + int (*add_device)(struct device *); + void (*remove_device)(char *); +}; + +struct discover_client *discover_client_init(struct discover_client_ops *ops); + +int discover_client_get_fd(struct discover_client *client); + +void discover_client_destroy(struct discover_client *client); + +/** + * Process data from the server. + * + * Will read from the client socket, and call add_device on any discovered + * devices. + * + */ +int discover_client_process(struct discover_client *client); + +#endif |