extern int printargs_d(struct tcb *);
extern void addflags(const struct xlat *, uint64_t);
-extern int printflags64(const struct xlat *, uint64_t, const char *);
+extern int printflags_ex(uint64_t, const char *, const struct xlat *, ...)
+ ATTRIBUTE_SENTINEL;
extern const char *sprintflags(const char *, const struct xlat *, uint64_t);
extern const char *sprinttime(long long sec);
extern const char *sprinttime_nsec(long long sec, unsigned long long nsec);
printstr_ex(tcp, addr, -1, QUOTE_0_TERMINATED);
}
+static inline int
+printflags64(const struct xlat *x, uint64_t flags, const char *dflt)
+{
+ return printflags_ex(flags, dflt, x, NULL);
+}
+
static inline int
printflags(const struct xlat *x, unsigned int flags, const char *dflt)
{
static void
decode_nlmsg_flags(const uint16_t flags, const uint16_t type, const int family)
{
- const struct xlat *table = netlink_flags;
+ const struct xlat *table = NULL;
switch (family) {
case NETLINK_SOCK_DIAG:
break;
}
- printflags(table, flags, "NLM_F_???");
+ printflags_ex(flags, "NLM_F_???", netlink_flags, table, NULL);
}
static int
}
int
-printflags64(const struct xlat *xlat, uint64_t flags, const char *dflt)
+printflags_ex(uint64_t flags, const char *dflt, const struct xlat *xlat, ...)
{
- int n;
- const char *sep;
-
- if (flags == 0 && xlat->val == 0 && xlat->str) {
- tprints(xlat->str);
- return 1;
- }
+ unsigned int n = 0;
+ va_list args;
- sep = "";
- for (n = 0; xlat->str; xlat++) {
- if (xlat->val && (flags & xlat->val) == xlat->val) {
- tprintf("%s%s", sep, xlat->str);
- flags &= ~xlat->val;
- sep = "|";
- n++;
+ va_start(args, xlat);
+ for (; xlat; xlat = va_arg(args, const struct xlat *)) {
+ for (; (flags || !n) && xlat->str; ++xlat) {
+ if ((flags == xlat->val) ||
+ (xlat->val && (flags & xlat->val) == xlat->val)) {
+ tprintf("%s%s", (n++ ? "|" : ""), xlat->str);
+ flags &= ~xlat->val;
+ }
+ if (!flags)
+ break;
}
}
+ va_end(args);
if (n) {
if (flags) {
- tprintf("%s%#" PRIx64, sep, flags);
+ tprintf("|%#" PRIx64, flags);
n++;
}
} else {
-NLM_F_REQUEST
-NLM_F_MULTI
-NLM_F_ACK
-NLM_F_ECHO
-NLM_F_DUMP_INTR
-NLM_F_DUMP_FILTERED
-
NLM_F_DUMP
NLM_F_ROOT
NLM_F_MATCH
-NLM_F_REQUEST
-NLM_F_MULTI
-NLM_F_ACK
-NLM_F_ECHO
-NLM_F_DUMP_INTR
-NLM_F_DUMP_FILTERED
-
NLM_F_REPLACE
NLM_F_EXCL
NLM_F_CREATE