diff --git a/rtnl.c b/rtnl.c index 3419873..cea936b 100644 --- a/rtnl.c +++ b/rtnl.c @@ -43,6 +43,37 @@ int rtnl_close(int fd) return close(fd); } +static void rtnl_get_ts_label_callback(void *ctx, int linkup, int ts_index) +{ + int *dst = ctx; + *dst = ts_index; +} + +int rtnl_get_ts_label(struct interface *iface) +{ + int err, fd; + int ts_index = -1; + + fd = rtnl_open(); + if (fd < 0) + return fd; + + err = rtnl_link_query(fd, iface->name); + if (err) { + goto no_info; + } + + rtnl_link_status(fd, iface->name, rtnl_get_ts_label_callback, &ts_index); + if (ts_index > 0 && if_indextoname(ts_index, iface->ts_label)) + err = 0; + else + err = -1; + +no_info: + rtnl_close(fd); + return err; +} + int rtnl_link_query(int fd, char *device) { struct sockaddr_nl sa; diff --git a/rtnl.h b/rtnl.h index 6eced2d..2906d74 100644 --- a/rtnl.h +++ b/rtnl.h @@ -20,6 +20,8 @@ #ifndef HAVE_RTNL_H #define HAVE_RTNL_H +#include "config.h" + typedef void (*rtnl_callback)(void *ctx, int linkup, int ts_index); /** @@ -29,6 +31,13 @@ typedef void (*rtnl_callback)(void *ctx, int linkup, int ts_index); */ int rtnl_close(int fd); +/** + * Get interface ts_label information + * @param iface struct interface. + * @return Zero on success, or -1 on error. + */ +int rtnl_get_ts_label(struct interface *iface); + /** * Request the link status from the kernel. * @param fd A socket obtained via rtnl_open().