extern int printargs P((struct tcb *));
extern int addflags P((const struct xlat *, int));
extern int printflags P((const struct xlat *, int, const char *));
+extern const char *sprintflags P((const char *, const struct xlat *, int));
extern int umoven P((struct tcb *, long, int, char *));
extern int umovestr P((struct tcb *, long, int, char *));
extern int upeek P((int, long, long *));
}
#endif
-static const char *
-sprintflags(const struct xlat *xlat, int flags)
-{
- static char outstr[1024];
- const char *sep;
-
- strcpy(outstr, "flags ");
- sep = "";
- for (; xlat->str; xlat++) {
- if ((flags & xlat->val) == xlat->val) {
- sprintf(outstr + strlen(outstr),
- "%s%s", sep, xlat->str);
- sep = "|";
- flags &= ~xlat->val;
- }
- }
- if (flags)
- sprintf(outstr + strlen(outstr),
- "%s%#x", sep, flags);
- return outstr;
-}
-
/*
* low bits of the open(2) flags define access mode,
* other bits are real flags.
case F_GETFD:
if (tcp->u_rval == 0)
return 0;
- tcp->auxstr = sprintflags(fdflags, tcp->u_rval);
+ tcp->auxstr =
+ sprintflags("flags ", fdflags, tcp->u_rval);
return RVAL_HEX|RVAL_STR;
case F_GETFL:
tcp->auxstr = sprint_open_modes(tcp->u_rval);
return n;
}
+/*
+ * Interpret `xlat' as an array of flags/
+ * Print to static string the entries whose bits are on in `flags'
+ * Return static string.
+ */
+const char *
+sprintflags(const char *prefix, const struct xlat *xlat, int flags)
+{
+ static char outstr[1024];
+ int found = 0;
+
+ strcpy(outstr, prefix);
+
+ for (; xlat->str; xlat++) {
+ if ((flags & xlat->val) == xlat->val) {
+ if (found)
+ strcat(outstr, "|");
+ strcat(outstr, xlat->str);
+ flags &= ~xlat->val;
+ found = 1;
+ }
+ }
+ if (flags) {
+ if (found)
+ strcat(outstr, "|");
+ sprintf(outstr + strlen(outstr), "%#x", flags);
+ }
+
+ return outstr;
+}
+
int
printflags(xlat, flags, dflt)
const struct xlat *xlat;