aboutsummaryrefslogtreecommitdiff
path: root/lib/libsysdecode
diff options
context:
space:
mode:
authorDmitry Chagin <dchagin@FreeBSD.org>2022-06-22 10:12:21 +0000
committerDmitry Chagin <dchagin@FreeBSD.org>2022-06-22 10:12:21 +0000
commit9dac609629d4e0ba813df6169f8bd8383fca024f (patch)
treec57d6ae769b34ddf58ce3c821bd8e957bbb0a950 /lib/libsysdecode
parent4f1d91e413d7e05f13f12d43a48178c023150dde (diff)
downloadsrc-9dac609629d4e0ba813df6169f8bd8383fca024f.tar.gz
src-9dac609629d4e0ba813df6169f8bd8383fca024f.zip
libsysdecode: For future use extract common code to a separate files
Reviewed by: jhb, emaste Differential revision: https://reviews.freebsd.org/D35353 MFC after: 2 weeks
Diffstat (limited to 'lib/libsysdecode')
-rw-r--r--lib/libsysdecode/Makefile2
-rw-r--r--lib/libsysdecode/flags.c159
-rw-r--r--lib/libsysdecode/support.c168
-rw-r--r--lib/libsysdecode/support.h62
4 files changed, 232 insertions, 159 deletions
diff --git a/lib/libsysdecode/Makefile b/lib/libsysdecode/Makefile
index 671c23d95a70..7f8175e7bd53 100644
--- a/lib/libsysdecode/Makefile
+++ b/lib/libsysdecode/Makefile
@@ -4,7 +4,7 @@
LIB= sysdecode
-SRCS= errno.c flags.c ioctl.c signal.c syscallnames.c utrace.c
+SRCS= errno.c flags.c ioctl.c signal.c syscallnames.c utrace.c support.c
INCS= sysdecode.h
CFLAGS+= -I${.OBJDIR}
diff --git a/lib/libsysdecode/flags.c b/lib/libsysdecode/flags.c
index f02c8dd8b339..c89c0ab75302 100644
--- a/lib/libsysdecode/flags.c
+++ b/lib/libsysdecode/flags.c
@@ -71,14 +71,7 @@ __FBSDID("$FreeBSD$");
#include <netgraph/bluetooth/include/ng_l2cap.h>
#include <netgraph/bluetooth/include/ng_btsocket.h>
-/*
- * This is taken from the xlat tables originally in truss which were
- * in turn taken from strace.
- */
-struct name_table {
- uintmax_t val;
- const char *str;
-};
+#include "support.h"
#define X(a) { a, #a },
#define XEND { 0, NULL }
@@ -93,156 +86,6 @@ struct name_table {
#undef TABLE_ENTRY
#undef TABLE_END
-/*
- * These are simple support macros. print_or utilizes a variable
- * defined in the calling function to track whether or not it should
- * print a logical-OR character ('|') before a string. if_print_or
- * simply handles the necessary "if" statement used in many lines
- * of this file.
- */
-#define print_or(fp,str,orflag) do { \
- if (orflag) fputc(fp, '|'); else orflag = true; \
- fprintf(fp, str); } \
- while (0)
-#define if_print_or(fp,i,flag,orflag) do { \
- if ((i & flag) == flag) \
- print_or(fp,#flag,orflag); } \
- while (0)
-
-static const char *
-lookup_value(struct name_table *table, uintmax_t val)
-{
-
- for (; table->str != NULL; table++)
- if (table->val == val)
- return (table->str);
- return (NULL);
-}
-
-/*
- * Used when the value maps to a bitmask of #definition values in the
- * table. This is a helper routine which outputs a symbolic mask of
- * matched masks. Multiple masks are separated by a pipe ('|').
- * The value is modified on return to only hold unmatched bits.
- */
-static void
-print_mask_part(FILE *fp, struct name_table *table, uintmax_t *valp,
- bool *printed)
-{
- uintmax_t rem;
-
- rem = *valp;
- for (; table->str != NULL; table++) {
- if ((table->val & rem) == table->val) {
- /*
- * Only print a zero mask if the raw value is
- * zero.
- */
- if (table->val == 0 && *valp != 0)
- continue;
- fprintf(fp, "%s%s", *printed ? "|" : "", table->str);
- *printed = true;
- rem &= ~table->val;
- }
- }
-
- *valp = rem;
-}
-
-/*
- * Used when the value maps to a bitmask of #definition values in the
- * table. The return value is true if something was printed. If
- * rem is not NULL, *rem holds any bits not decoded if something was
- * printed. If nothing was printed and rem is not NULL, *rem holds
- * the original value.
- */
-static bool
-print_mask_int(FILE *fp, struct name_table *table, int ival, int *rem)
-{
- uintmax_t val;
- bool printed;
-
- printed = false;
- val = (unsigned)ival;
- print_mask_part(fp, table, &val, &printed);
- if (rem != NULL)
- *rem = val;
- return (printed);
-}
-
-/*
- * Used for a mask of optional flags where a value of 0 is valid.
- */
-static bool
-print_mask_0(FILE *fp, struct name_table *table, int val, int *rem)
-{
-
- if (val == 0) {
- fputs("0", fp);
- if (rem != NULL)
- *rem = 0;
- return (true);
- }
- return (print_mask_int(fp, table, val, rem));
-}
-
-/*
- * Like print_mask_0 but for a unsigned long instead of an int.
- */
-static bool
-print_mask_0ul(FILE *fp, struct name_table *table, u_long lval, u_long *rem)
-{
- uintmax_t val;
- bool printed;
-
- if (lval == 0) {
- fputs("0", fp);
- if (rem != NULL)
- *rem = 0;
- return (true);
- }
-
- printed = false;
- val = lval;
- print_mask_part(fp, table, &val, &printed);
- if (rem != NULL)
- *rem = val;
- return (printed);
-}
-
-static void
-print_integer(FILE *fp, int val, int base)
-{
-
- switch (base) {
- case 8:
- fprintf(fp, "0%o", val);
- break;
- case 10:
- fprintf(fp, "%d", val);
- break;
- case 16:
- fprintf(fp, "0x%x", val);
- break;
- default:
- abort2("bad base", 0, NULL);
- break;
- }
-}
-
-static bool
-print_value(FILE *fp, struct name_table *table, uintmax_t val)
-{
- const char *str;
-
- str = lookup_value(table, val);
- if (str != NULL) {
- fputs(str, fp);
- return (true);
- }
- return (false);
-}
-
const char *
sysdecode_atfd(int fd)
{
diff --git a/lib/libsysdecode/support.c b/lib/libsysdecode/support.c
new file mode 100644
index 000000000000..0777ab28f52e
--- /dev/null
+++ b/lib/libsysdecode/support.c
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2006 "David Kirchner" <dpk@dpk.net>. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "support.h"
+
+const char *
+lookup_value(struct name_table *table, uintmax_t val)
+{
+
+ for (; table->str != NULL; table++)
+ if (table->val == val)
+ return (table->str);
+ return (NULL);
+}
+
+/*
+ * Used when the value maps to a bitmask of #definition values in the
+ * table. This is a helper routine which outputs a symbolic mask of
+ * matched masks. Multiple masks are separated by a pipe ('|').
+ * The value is modified on return to only hold unmatched bits.
+ */
+void
+print_mask_part(FILE *fp, struct name_table *table, uintmax_t *valp,
+ bool *printed)
+{
+ uintmax_t rem;
+
+ rem = *valp;
+ for (; table->str != NULL; table++) {
+ if ((table->val & rem) == table->val) {
+ /*
+ * Only print a zero mask if the raw value is
+ * zero.
+ */
+ if (table->val == 0 && *valp != 0)
+ continue;
+ fprintf(fp, "%s%s", *printed ? "|" : "", table->str);
+ *printed = true;
+ rem &= ~table->val;
+ }
+ }
+
+ *valp = rem;
+}
+
+/*
+ * Used when the value maps to a bitmask of #definition values in the
+ * table. The return value is true if something was printed. If
+ * rem is not NULL, *rem holds any bits not decoded if something was
+ * printed. If nothing was printed and rem is not NULL, *rem holds
+ * the original value.
+ */
+bool
+print_mask_int(FILE *fp, struct name_table *table, int ival, int *rem)
+{
+ uintmax_t val;
+ bool printed;
+
+ printed = false;
+ val = (unsigned)ival;
+ print_mask_part(fp, table, &val, &printed);
+ if (rem != NULL)
+ *rem = val;
+ return (printed);
+}
+
+/*
+ * Used for a mask of optional flags where a value of 0 is valid.
+ */
+bool
+print_mask_0(FILE *fp, struct name_table *table, int val, int *rem)
+{
+
+ if (val == 0) {
+ fputs("0", fp);
+ if (rem != NULL)
+ *rem = 0;
+ return (true);
+ }
+ return (print_mask_int(fp, table, val, rem));
+}
+
+/*
+ * Like print_mask_0 but for a unsigned long instead of an int.
+ */
+bool
+print_mask_0ul(FILE *fp, struct name_table *table, u_long lval, u_long *rem)
+{
+ uintmax_t val;
+ bool printed;
+
+ if (lval == 0) {
+ fputs("0", fp);
+ if (rem != NULL)
+ *rem = 0;
+ return (true);
+ }
+
+ printed = false;
+ val = lval;
+ print_mask_part(fp, table, &val, &printed);
+ if (rem != NULL)
+ *rem = val;
+ return (printed);
+}
+
+void
+print_integer(FILE *fp, int val, int base)
+{
+
+ switch (base) {
+ case 8:
+ fprintf(fp, "0%o", val);
+ break;
+ case 10:
+ fprintf(fp, "%d", val);
+ break;
+ case 16:
+ fprintf(fp, "0x%x", val);
+ break;
+ default:
+ abort2("bad base", 0, NULL);
+ break;
+ }
+}
+
+bool
+print_value(FILE *fp, struct name_table *table, uintmax_t val)
+{
+ const char *str;
+
+ str = lookup_value(table, val);
+ if (str != NULL) {
+ fputs(str, fp);
+ return (true);
+ }
+ return (false);
+}
diff --git a/lib/libsysdecode/support.h b/lib/libsysdecode/support.h
new file mode 100644
index 000000000000..fecb0bf1bb5e
--- /dev/null
+++ b/lib/libsysdecode/support.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2006 "David Kirchner" <dpk@dpk.net>. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef __SYSDECODE_SUPPORT_H__
+#define __SYSDECODE_SUPPORT_H__
+
+/*
+ * This is taken from the xlat tables originally in truss which were
+ * in turn taken from strace.
+ */
+struct name_table {
+ uintmax_t val;
+ const char *str;
+};
+
+/*
+ * These are simple support macros. print_or utilizes a variable
+ * defined in the calling function to track whether or not it should
+ * print a logical-OR character ('|') before a string. if_print_or
+ * simply handles the necessary "if" statement used in many lines
+ * of this file.
+ */
+#define print_or(fp,str,orflag) do { \
+ if (orflag) fputc(fp, '|'); else orflag = true; \
+ fprintf(fp, str); } \
+ while (0)
+#define if_print_or(fp,i,flag,orflag) do { \
+ if ((i & flag) == flag) \
+ print_or(fp,#flag,orflag); } \
+ while (0)
+
+const char *lookup_value(struct name_table *, uintmax_t);
+void print_integer(FILE *, int, int);
+bool print_mask_0(FILE *, struct name_table *, int, int *);
+bool print_mask_0ul(FILE *, struct name_table *, u_long, u_long *);
+bool print_mask_int(FILE *, struct name_table *, int, int *);
+void print_mask_part(FILE *, struct name_table *, uintmax_t *, bool *);
+bool print_value(FILE *, struct name_table *, uintmax_t);
+
+#endif /* !__SYSDECODE_SUPPORT_H__ */