summaryrefslogtreecommitdiff
path: root/src/machine
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-07-10 23:12:32 +0200
committerLennart Poettering <lennart@poettering.net>2014-07-10 23:12:32 +0200
commitf48e75cb9a8112d35855c44a156934f2ee0edb2e (patch)
treeced9e25de5a121c1bd823846d16e6726b24b097b /src/machine
parent5aa4bb6b5b0b9dcea524d56cf8664b892a5a976a (diff)
machinectl: show network interface name for containers
Also, append the if indexes as scope field to the addresses we show. That way they may be used for connecting to the containers directly.
Diffstat (limited to 'src/machine')
-rw-r--r--src/machine/machinectl.c75
1 files changed, 64 insertions, 11 deletions
diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c
index 022a4ebe50..04c7c7c670 100644
--- a/src/machine/machinectl.c
+++ b/src/machine/machinectl.c
@@ -29,6 +29,7 @@
#include <fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
+#include <net/if.h>
#include "sd-bus.h"
#include "log.h"
@@ -167,7 +168,7 @@ static int show_unit_cgroup(sd_bus *bus, const char *unit, pid_t leader) {
return 0;
}
-static int print_addresses(sd_bus *bus, const char *name, const char *prefix, const char *prefix2) {
+static int print_addresses(sd_bus *bus, const char *name, int ifi, const char *prefix, const char *prefix2) {
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
int r;
@@ -205,7 +206,11 @@ static int print_addresses(sd_bus *bus, const char *name, const char *prefix, co
if (r < 0)
return bus_log_parse_error(r);
- printf("%s%s\n", prefix, inet_ntop(family, a, buffer, sizeof(buffer)));
+ fputs(prefix, stdout);
+ fputs(inet_ntop(family, a, buffer, sizeof(buffer)), stdout);
+ if (family == AF_INET6 && ifi > 0)
+ printf("%%%i", ifi);
+ fputc('\n', stdout);
r = sd_bus_message_exit_container(reply);
if (r < 0)
@@ -275,11 +280,15 @@ typedef struct MachineStatusInfo {
char *root_directory;
pid_t leader;
usec_t timestamp;
+ int *netif;
+ unsigned n_netif;
} MachineStatusInfo;
static void print_machine_status_info(sd_bus *bus, MachineStatusInfo *i) {
char since1[FORMAT_TIMESTAMP_RELATIVE_MAX], *s1;
char since2[FORMAT_TIMESTAMP_MAX], *s2;
+ int ifi = -1;
+
assert(i);
fputs(strna(i->name), stdout);
@@ -322,7 +331,30 @@ static void print_machine_status_info(sd_bus *bus, MachineStatusInfo *i) {
if (i->root_directory)
printf("\t Root: %s\n", i->root_directory);
- print_addresses(bus, i->name,
+ if (i->n_netif > 0) {
+ unsigned c;
+
+ fputs("\t Iface:", stdout);
+
+ for (c = 0; c < i->n_netif; c++) {
+ char name[IF_NAMESIZE+1] = "";
+
+ if (if_indextoname(i->netif[c], name)) {
+ fputc(' ', stdout);
+ fputs(name, stdout);
+
+ if (ifi < 0)
+ ifi = i->netif[c];
+ else
+ ifi = 0;
+ } else
+ printf(" %i", i->netif[c]);
+ }
+
+ fputc('\n', stdout);
+ }
+
+ print_addresses(bus, i->name, ifi,
"\t Address: ",
"\t ");
@@ -334,17 +366,37 @@ static void print_machine_status_info(sd_bus *bus, MachineStatusInfo *i) {
}
}
+static int map_netif(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
+ MachineStatusInfo *i = userdata;
+ size_t l;
+ const void *v;
+ int r;
+
+ assert_cc(sizeof(int32_t) == sizeof(int));
+ r = sd_bus_message_read_array(m, SD_BUS_TYPE_INT32, &v, &l);
+ if (r < 0)
+ return r;
+
+ i->n_netif = l / sizeof(int32_t);
+ i->netif = memdup(v, l);
+ if (!i->netif)
+ return -ENOMEM;
+
+ return 0;
+}
+
static int show_info(const char *verb, sd_bus *bus, const char *path, bool *new_line) {
static const struct bus_properties_map map[] = {
- { "Name", "s", NULL, offsetof(MachineStatusInfo, name) },
- { "Class", "s", NULL, offsetof(MachineStatusInfo, class) },
- { "Service", "s", NULL, offsetof(MachineStatusInfo, service) },
- { "Unit", "s", NULL, offsetof(MachineStatusInfo, unit) },
- { "RootDirectory", "s", NULL, offsetof(MachineStatusInfo, root_directory) },
- { "Leader", "u", NULL, offsetof(MachineStatusInfo, leader) },
- { "Timestamp", "t", NULL, offsetof(MachineStatusInfo, timestamp) },
- { "Id", "ay", bus_map_id128, offsetof(MachineStatusInfo, id) },
+ { "Name", "s", NULL, offsetof(MachineStatusInfo, name) },
+ { "Class", "s", NULL, offsetof(MachineStatusInfo, class) },
+ { "Service", "s", NULL, offsetof(MachineStatusInfo, service) },
+ { "Unit", "s", NULL, offsetof(MachineStatusInfo, unit) },
+ { "RootDirectory", "s", NULL, offsetof(MachineStatusInfo, root_directory) },
+ { "Leader", "u", NULL, offsetof(MachineStatusInfo, leader) },
+ { "Timestamp", "t", NULL, offsetof(MachineStatusInfo, timestamp) },
+ { "Id", "ay", bus_map_id128, offsetof(MachineStatusInfo, id) },
+ { "NetworkInterfaces", "ai", map_netif, 0 },
{}
};
@@ -375,6 +427,7 @@ static int show_info(const char *verb, sd_bus *bus, const char *path, bool *new_
free(info.service);
free(info.unit);
free(info.root_directory);
+ free(info.netif);
return r;
}