diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2011-07-15 11:38:36 +0200 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2011-07-15 11:38:36 +0200 |
commit | b1817e210a434bec5543c574c6846f6e114426a5 (patch) | |
tree | 5cf1c6e1617fbfb3bf15434a9a7afb4d1515dc9b /pingu_iface.c | |
parent | ce876b2ff6d01b5c6f488836dad92807bef735ef (diff) | |
download | pingu-b1817e210a434bec5543c574c6846f6e114426a5.tar.bz2 pingu-b1817e210a434bec5543c574c6846f6e114426a5.tar.xz |
pingu_netlink: pick up primary address for interfaces
Diffstat (limited to 'pingu_iface.c')
-rw-r--r-- | pingu_iface.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/pingu_iface.c b/pingu_iface.c index b5d8355..4de0bc6 100644 --- a/pingu_iface.c +++ b/pingu_iface.c @@ -62,7 +62,7 @@ int pingu_iface_usable(struct pingu_iface *iface) return iface->has_link && iface->has_binding; } -struct pingu_iface *pingu_iface_find(const char *name) +struct pingu_iface *pingu_iface_get_by_name(const char *name) { struct pingu_iface *iface; list_for_each_entry(iface, &iface_list, iface_list_entry) { @@ -75,9 +75,19 @@ struct pingu_iface *pingu_iface_find(const char *name) return NULL; } +struct pingu_iface *pingu_iface_get_by_index(int index) +{ + struct pingu_iface *iface; + list_for_each_entry(iface, &iface_list, iface_list_entry) { + if (iface->index == index) + return iface; + } + return NULL; +} + struct pingu_iface *pingu_iface_find_or_create(struct ev_loop *loop, const char *name) { - struct pingu_iface *iface = pingu_iface_find(name); + struct pingu_iface *iface = pingu_iface_get_by_name(name); if (iface != NULL) return iface; @@ -99,6 +109,25 @@ struct pingu_iface *pingu_iface_find_or_create(struct ev_loop *loop, const char return iface; } +void pingu_iface_set_addr(struct pingu_iface *iface, int family, + void *data, int len) +{ + struct sockaddr_in *sin; + memset(&iface->primary_addr, 0, sizeof(iface->primary_addr)); + if (len <= 0) { + log_debug("%s: address removed", iface->name); + return; + } + iface->primary_addr.sa_family = family; + switch (family) { + case AF_INET: + sin = (struct sockaddr_in *)&iface->primary_addr; + memcpy(&sin->sin_addr, data, len); + log_debug("%s: new address: %s", iface->name, inet_ntoa(sin->sin_addr)); + break; + } +} + int pingu_iface_init(struct ev_loop *loop, struct list_head *host_list) { struct pingu_host *host; |