diff options
Diffstat (limited to 'src/print_ifindex.c')
-rw-r--r-- | src/print_ifindex.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/print_ifindex.c b/src/print_ifindex.c new file mode 100644 index 000000000..b6e5470b3 --- /dev/null +++ b/src/print_ifindex.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2001-2018 The strace developers. + * All rights reserved. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#include "defs.h" +#include <net/if.h> + +#ifdef HAVE_IF_INDEXTONAME +# include "xstring.h" + +# define INI_PFX "if_nametoindex(\"" +# define INI_SFX "\")" +# define IFNAME_QUOTED_SZ (sizeof(IFNAMSIZ) * 4 + 3) + +const char * +get_ifname(const unsigned int ifindex) +{ + static char name_quoted_buf[IFNAME_QUOTED_SZ]; + char name_buf[IFNAMSIZ]; + + if (!if_indextoname(ifindex, name_buf)) + return NULL; + + if (string_quote(name_buf, name_quoted_buf, sizeof(name_buf), + QUOTE_0_TERMINATED | QUOTE_OMIT_LEADING_TRAILING_QUOTES, + NULL)) + return NULL; + + return name_quoted_buf; +} + +static const char * +sprint_ifname(const unsigned int ifindex) +{ + static char res[IFNAME_QUOTED_SZ + sizeof(INI_PFX INI_SFX)]; + + const char *name_quoted = get_ifname(ifindex); + + if (!name_quoted) + return NULL; + + xsprintf(res, INI_PFX "%s" INI_SFX, name_quoted); + + return res; +} + +#else /* !HAVE_IF_INDEXTONAME */ + +const char *get_ifname(const unsigned int ifindex) { return NULL; } + +#endif /* HAVE_IF_INDEXTONAME */ + +void +print_ifindex(const unsigned int ifindex) +{ +#ifdef HAVE_IF_INDEXTONAME + print_xlat_ex(ifindex, sprint_ifname(ifindex), XLAT_STYLE_FMT_U); +#else + tprintf("%u", ifindex); +#endif +} |