]> granicus.if.org Git - strace/commitdiff
print_ifindex: add public get_ifname method
authorEugene Syromyatnikov <evgsyr@gmail.com>
Mon, 27 Aug 2018 13:16:10 +0000 (15:16 +0200)
committerDmitry V. Levin <ldv@altlinux.org>
Sun, 2 Sep 2018 17:44:26 +0000 (17:44 +0000)
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.

defs.h
print_ifindex.c

diff --git a/defs.h b/defs.h
index 394f509e880b5b8d9cf1aadb42b7cdb506ef7e0a..ec96bf61138bdbf0401e6ac178cf2e88dbe05310 100644 (file)
--- 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);
index 2df1e3be9037160d602760b5b53860d2999f0648..1bdac382deead057b68f7b4cbed0a16f472a8341 100644 (file)
 #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