git: 874cdf6af695 - main - exterr: in verbose mode, print the source file name

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Mon, 29 Dec 2025 01:16:42 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=874cdf6af695c42d561647f7165c99c2d3df0faa

commit 874cdf6af695c42d561647f7165c99c2d3df0faa
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2025-12-28 14:13:49 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2025-12-29 01:16:25 +0000

    exterr: in verbose mode, print the source file name
    
    Reviewed by:    emaste, mckusick
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D54380
---
 lib/libc/gen/uexterr_format.c | 21 +++++++++++++++++----
 sys/sys/exterr_cat.h          | 11 +++++++++++
 2 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/lib/libc/gen/uexterr_format.c b/lib/libc/gen/uexterr_format.c
index 3321fd80616d..8d3b458ca9f2 100644
--- a/lib/libc/gen/uexterr_format.c
+++ b/lib/libc/gen/uexterr_format.c
@@ -8,7 +8,7 @@
  * under sponsorship from the FreeBSD Foundation.
  */
 
-#include <sys/types.h>
+#include <sys/param.h>
 #include <sys/exterrvar.h>
 #include <exterr.h>
 #include <stdbool.h>
@@ -17,6 +17,19 @@
 #include <string.h>
 #include <unistd.h>
 
+static const char * const cat_to_filenames[] = {
+#include "exterr_cat_filenames.h"
+};
+
+static const char *
+cat_to_filename(int category)
+{
+	if (category < 0 || category >= nitems(cat_to_filenames) ||
+	    cat_to_filenames[category] == NULL)
+		return ("unknown");
+	return (cat_to_filenames[category]);
+}
+
 static const char exterror_verbose_name[] = "EXTERROR_VERBOSE";
 enum exterr_verbose_state {
 	EXTERR_VERBOSE_UNKNOWN = 100,
@@ -68,9 +81,9 @@ __uexterr_format(const struct uexterror *ue, char *buf, size_t bufsz)
 		char lbuf[128];
 
 		snprintf(lbuf, sizeof(lbuf),
-		    "errno %d category %u (src line %u) p1 %#jx p2 %#jx",
-		    ue->error, ue->cat, ue->src_line,
-		    (uintmax_t)ue->p1, (uintmax_t)ue->p2);
+		    "errno %d category %u (src sys/%s:%u) p1 %#jx p2 %#jx",
+		    ue->error, ue->cat, cat_to_filename(ue->cat),
+		    ue->src_line, (uintmax_t)ue->p1, (uintmax_t)ue->p2);
 		if (has_msg)
 			strlcat(buf, " ", bufsz);
 		strlcat(buf, lbuf, bufsz);
diff --git a/sys/sys/exterr_cat.h b/sys/sys/exterr_cat.h
index 7492fc31662a..24f07539fe35 100644
--- a/sys/sys/exterr_cat.h
+++ b/sys/sys/exterr_cat.h
@@ -8,6 +8,17 @@
  * under sponsorship from the FreeBSD Foundation.
  */
 
+/*
+ * The category identifiers for the extended errors.
+ * The ids participate in ABI between kernel and libc, so they must
+ * never be reused or changed.  Only new ids can be added.
+ *
+ * After adding a new category id, run
+ * tools/build/make_libc_exterr_cat_filenames.sh
+ * from the top of the source tree, and commit updated file
+ * lib/libc/gen/exterr_cat_filenames.h
+ */
+
 #ifndef _SYS_EXTERR_CAT_H_
 #define	_SYS_EXTERR_CAT_H_