summaryrefslogtreecommitdiffstats
path: root/discover
diff options
context:
space:
mode:
Diffstat (limited to 'discover')
-rw-r--r--discover/Makefile.am2
-rw-r--r--discover/discover-server.c33
-rw-r--r--discover/discover-server.h3
-rw-r--r--discover/network.c7
-rw-r--r--discover/pb-discover.c3
-rw-r--r--discover/sysinfo.c64
-rw-r--r--discover/sysinfo.h16
7 files changed, 128 insertions, 0 deletions
diff --git a/discover/Makefile.am b/discover/Makefile.am
index 848816f..1fd8d96 100644
--- a/discover/Makefile.am
+++ b/discover/Makefile.am
@@ -53,6 +53,8 @@ pb_discover_SOURCES = \
pb-discover.h \
resource.c \
resource.h \
+ sysinfo.c \
+ sysinfo.h \
network.c \
network.h \
udev.c \
diff --git a/discover/discover-server.c b/discover/discover-server.c
index 29816ee..25dbd14 100644
--- a/discover/discover-server.c
+++ b/discover/discover-server.c
@@ -19,6 +19,7 @@
#include "device-handler.h"
#include "discover-server.h"
+#include "sysinfo.h"
struct discover_server {
int socket;
@@ -167,6 +168,24 @@ static int write_boot_status_message(struct discover_server *server,
return client_write_message(server, client, message);
}
+static int write_system_info_message(struct discover_server *server,
+ struct client *client, const struct system_info *sysinfo)
+{
+ struct pb_protocol_message *message;
+ int len;
+
+ len = pb_protocol_system_info_len(sysinfo);
+
+ message = pb_protocol_create_message(client,
+ PB_PROTOCOL_ACTION_SYSTEM_INFO, len);
+ if (!message)
+ return -1;
+
+ pb_protocol_serialise_system_info(sysinfo, message->payload, len);
+
+ return client_write_message(server, client, message);
+}
+
static int discover_server_process_message(void *arg)
{
struct pb_protocol_message *message;
@@ -232,6 +251,11 @@ static int discover_server_process_connection(void *arg)
client->fd = fd;
client->server = server;
+ /* send sysinfo to client */
+ rc = write_system_info_message(server, client, system_info_get());
+ if (rc)
+ return 0;
+
/* send existing devices to client */
n_devices = device_handler_get_device_count(server->device_handler);
for (i = 0; i < n_devices; i++) {
@@ -296,6 +320,15 @@ void discover_server_notify_boot_status(struct discover_server *server,
write_boot_status_message(server, client, status);
}
+void discover_server_notify_system_info(struct discover_server *server,
+ const struct system_info *sysinfo)
+{
+ struct client *client;
+
+ list_for_each_entry(&server->clients, client, list)
+ write_system_info_message(server, client, sysinfo);
+}
+
void discover_server_set_device_source(struct discover_server *server,
struct device_handler *handler)
{
diff --git a/discover/discover-server.h b/discover/discover-server.h
index 541afaf..d22fb38 100644
--- a/discover/discover-server.h
+++ b/discover/discover-server.h
@@ -7,6 +7,7 @@ struct discover_server;
struct device_handler;
struct boot_option;
struct boot_status;
+struct system_info;
struct device;
struct discover_server *discover_server_init(struct waitset *waitset);
@@ -24,4 +25,6 @@ void discover_server_notify_device_remove(struct discover_server *server,
struct device *device);
void discover_server_notify_boot_status(struct discover_server *server,
struct boot_status *status);
+void discover_server_notify_system_info(struct discover_server *server,
+ const struct system_info *sysinfo);
#endif /* _DISCOVER_SERVER_H */
diff --git a/discover/network.c b/discover/network.c
index c853a97..9aa9752 100644
--- a/discover/network.c
+++ b/discover/network.c
@@ -20,6 +20,7 @@
#include "file.h"
#include "network.h"
+#include "sysinfo.h"
#include "device-handler.h"
#define HWADDR_SIZE 6
@@ -406,6 +407,12 @@ static int network_handle_nlmsg(struct network *network, struct nlmsghdr *nlmsg)
memcpy(interface->hwaddr, ifaddr, sizeof(interface->hwaddr));
strncpy(interface->name, ifname, sizeof(interface->name) - 1);
add_interface(network, interface);
+
+ /* tell the sysinfo code about this interface */
+ if (strcmp(interface->name, "lo"))
+ system_info_register_interface(
+ sizeof(interface->hwaddr),
+ interface->hwaddr, interface->name);
}
configure_interface(network, interface,
diff --git a/discover/pb-discover.c b/discover/pb-discover.c
index ccd1c7d..9b1f200 100644
--- a/discover/pb-discover.c
+++ b/discover/pb-discover.c
@@ -19,6 +19,7 @@
#include "discover-server.h"
#include "device-handler.h"
#include "network.h"
+#include "sysinfo.h"
static void print_version(void)
{
@@ -172,6 +173,8 @@ int main(int argc, char *argv[])
if (opts.no_autoboot == opt_yes)
config_set_autoboot(false);
+ system_info_init(server);
+
handler = device_handler_init(server, waitset, opts.dry_run == opt_yes);
if (!handler)
return EXIT_FAILURE;
diff --git a/discover/sysinfo.c b/discover/sysinfo.c
new file mode 100644
index 0000000..19dac57
--- /dev/null
+++ b/discover/sysinfo.c
@@ -0,0 +1,64 @@
+
+#include <string.h>
+
+#include <talloc/talloc.h>
+
+#include "discover-server.h"
+#include "sysinfo.h"
+
+static struct system_info *sysinfo;
+static struct discover_server *server;
+
+const struct system_info *system_info_get(void)
+{
+ return sysinfo;
+}
+
+void system_info_register_interface(unsigned int hwaddr_size, uint8_t *hwaddr,
+ const char *name)
+{
+ struct interface_info *if_info;
+ unsigned int i;
+
+ for (i = 0; i < sysinfo->n_interfaces; i++) {
+ if_info = sysinfo->interfaces[i];
+
+ if (if_info->hwaddr_size != hwaddr_size)
+ continue;
+
+ if (memcmp(if_info->hwaddr, hwaddr, hwaddr_size))
+ continue;
+
+ /* update the name and we're done */
+ talloc_free(if_info->name);
+ if_info->name = talloc_strdup(if_info, name);
+ discover_server_notify_system_info(server, sysinfo);
+ return;
+ }
+
+ if_info = talloc_zero(sysinfo, struct interface_info);
+ if_info->hwaddr_size = hwaddr_size;
+ if_info->hwaddr = talloc_memdup(if_info, hwaddr, hwaddr_size);
+ if_info->name = talloc_strdup(if_info, name);
+
+ sysinfo->n_interfaces++;
+ sysinfo->interfaces = talloc_realloc(sysinfo, sysinfo->interfaces,
+ struct interface_info *,
+ sysinfo->n_interfaces);
+ sysinfo->interfaces[sysinfo->n_interfaces - 1] = if_info;
+
+ discover_server_notify_system_info(server, sysinfo);
+}
+
+static void system_info_set_identifier(struct system_info *info
+ __attribute__((unused)))
+{
+ /* todo: call helpers to set type & id */
+}
+
+void system_info_init(struct discover_server *s)
+{
+ sysinfo = talloc_zero(server, struct system_info);
+ server = s;
+ system_info_set_identifier(sysinfo);
+}
diff --git a/discover/sysinfo.h b/discover/sysinfo.h
new file mode 100644
index 0000000..2764784
--- /dev/null
+++ b/discover/sysinfo.h
@@ -0,0 +1,16 @@
+#ifndef SYSINFO_H
+#define SYSINFO_H
+
+#include <types/types.h>
+
+struct discover_server;
+
+const struct system_info *system_info_get(void);
+
+void system_info_register_interface(unsigned hwaddr_size, uint8_t *hwaddr,
+ const char *name);
+
+void system_info_init(struct discover_server *server);
+
+#endif /* SYSINFO_H */
+
OpenPOWER on IntegriCloud