From: Eugene Syromyatnikov Date: Mon, 27 Aug 2018 13:16:10 +0000 (+0200) Subject: print_ifindex: add public get_ifname method X-Git-Tag: v4.25~34 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9a969eb6704ef0f12f14ddb53bfe01f9a16e287e;p=strace print_ifindex: add public get_ifname method In order to be able to obtain sanitised device name internally. * defs.h (get_ifname): New declaration. * print_ifindex.c (get_ifname): Refactor, leaving out addition of if_nametoindex("") part. (sprint_ifname): New function, adds if_nametoindex("") to get_ifname's output. (print_ifindex): Use sprint_ifname instead of get_ifname. --- diff --git a/defs.h b/defs.h index 394f509e..ec96bf61 100644 --- a/defs.h +++ b/defs.h @@ -949,6 +949,7 @@ fetch_perf_event_attr(struct tcb *const tcp, const kernel_ulong_t addr); extern void print_perf_event_attr(struct tcb *const tcp, const kernel_ulong_t addr); +extern const char *get_ifname(const unsigned int ifindex); extern void print_ifindex(unsigned int); extern void print_bpf_filter_code(const uint16_t code, bool extended); diff --git a/print_ifindex.c b/print_ifindex.c index 2df1e3be..1bdac382 100644 --- a/print_ifindex.c +++ b/print_ifindex.c @@ -31,37 +31,53 @@ #ifdef HAVE_IF_INDEXTONAME # include "xstring.h" -# define INI_PFX "if_nametoindex(" -# define INI_SFX ")" +# define INI_PFX "if_nametoindex(\"" +# define INI_SFX "\")" # define IFNAME_QUOTED_SZ (sizeof(IFNAMSIZ) * 4 + 3) -static const char * +const char * get_ifname(const unsigned int ifindex) { - static char res[IFNAME_QUOTED_SZ + sizeof(INI_PFX INI_SFX)]; - + static char name_quoted_buf[IFNAME_QUOTED_SZ]; char name_buf[IFNAMSIZ]; - char name_quoted_buf[IFNAME_QUOTED_SZ]; - if (if_indextoname(ifindex, name_buf)) { - if (string_quote(name_buf, name_quoted_buf, sizeof(name_buf), - QUOTE_0_TERMINATED, NULL)) - return NULL; + 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); - xsprintf(res, INI_PFX "%s" INI_SFX, name_quoted_buf); + if (!name_quoted) + return NULL; - return res; - } + xsprintf(res, INI_PFX "%s" INI_SFX, name_quoted); - return NULL; + 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, get_ifname(ifindex), XLAT_STYLE_FMT_U); + print_xlat_ex(ifindex, sprint_ifname(ifindex), XLAT_STYLE_FMT_U); #else tprintf("%u", ifindex); #endif