diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-07-11 03:15:21 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-07-11 03:15:21 +0200 |
commit | cabb0bc6b1a4ec57e108dc99364687d7c4f9670f (patch) | |
tree | 72346552835783c0b7954d7c45473655899dc5a1 /src/libsystemd/sd-login/sd-login.c | |
parent | 2de30868edab5b099cb1e5413e47ed11ded4cc63 (diff) |
nss-mymachines: add new NSS module for automatically resolving addresses of all local containers
Diffstat (limited to 'src/libsystemd/sd-login/sd-login.c')
-rw-r--r-- | src/libsystemd/sd-login/sd-login.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/libsystemd/sd-login/sd-login.c b/src/libsystemd/sd-login/sd-login.c index d1478ddb78..83d6449241 100644 --- a/src/libsystemd/sd-login/sd-login.c +++ b/src/libsystemd/sd-login/sd-login.c @@ -786,6 +786,49 @@ _public_ int sd_machine_get_class(const char *machine, char **class) { return 0; } +_public_ int sd_machine_get_ifindexes(const char *machine, int **ifindexes) { + _cleanup_free_ char *netif = NULL; + size_t l, allocated = 0, nr = 0; + char *w, *state; + int *ni = NULL; + const char *p; + int r; + + assert_return(machine_name_is_valid(machine), -EINVAL); + assert_return(ifindexes, -EINVAL); + + p = strappenda("/run/systemd/machines/", machine); + r = parse_env_file(p, NEWLINE, "NETIF", &netif, NULL); + if (r < 0) + return r; + if (!netif) { + *ifindexes = NULL; + return 0; + } + + FOREACH_WORD(w, l, netif, state) { + char buf[l+1]; + int ifi; + + *(char*) (mempcpy(buf, w, l)) = 0; + + if (safe_atoi(buf, &ifi) < 0) + continue; + if (ifi <= 0) + continue; + + if (!GREEDY_REALLOC(ni, allocated, nr+1)) { + free(ni); + return -ENOMEM; + } + + ni[nr++] = ifi; + } + + *ifindexes = ni; + return nr; +} + static inline int MONITOR_TO_FD(sd_login_monitor *m) { return (int) (unsigned long) m - 1; } |